diff options
Diffstat (limited to 'kernel/irq/irqdomain.c')
| -rw-r--r-- | kernel/irq/irqdomain.c | 32 | 
1 files changed, 25 insertions, 7 deletions
| diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c index a21acac9a71a..6aacd342cd14 100644 --- a/kernel/irq/irqdomain.c +++ b/kernel/irq/irqdomain.c @@ -360,16 +360,27 @@ struct irq_domain *irq_domain_add_legacy(struct device_node *of_node,  					 const struct irq_domain_ops *ops,  					 void *host_data)  { +	return irq_domain_create_legacy(of_node_to_fwnode(of_node), size, +					first_irq, first_hwirq, ops, host_data); +} +EXPORT_SYMBOL_GPL(irq_domain_add_legacy); + +struct irq_domain *irq_domain_create_legacy(struct fwnode_handle *fwnode, +					 unsigned int size, +					 unsigned int first_irq, +					 irq_hw_number_t first_hwirq, +					 const struct irq_domain_ops *ops, +					 void *host_data) +{  	struct irq_domain *domain; -	domain = __irq_domain_add(of_node_to_fwnode(of_node), first_hwirq + size, -				  first_hwirq + size, 0, ops, host_data); +	domain = __irq_domain_add(fwnode, first_hwirq + size, first_hwirq + size, 0, ops, host_data);  	if (domain)  		irq_domain_associate_many(domain, first_irq, first_hwirq, size);  	return domain;  } -EXPORT_SYMBOL_GPL(irq_domain_add_legacy); +EXPORT_SYMBOL_GPL(irq_domain_create_legacy);  /**   * irq_find_matching_fwspec() - Locates a domain for a given fwspec @@ -494,7 +505,7 @@ static void irq_domain_set_mapping(struct irq_domain *domain,  	}  } -void irq_domain_disassociate(struct irq_domain *domain, unsigned int irq) +static void irq_domain_disassociate(struct irq_domain *domain, unsigned int irq)  {  	struct irq_data *irq_data = irq_get_irq_data(irq);  	irq_hw_number_t hwirq; @@ -749,7 +760,7 @@ static void of_phandle_args_to_fwspec(struct device_node *np, const u32 *args,  {  	int i; -	fwspec->fwnode = np ? &np->fwnode : NULL; +	fwspec->fwnode = of_node_to_fwnode(np);  	fwspec->param_count = count;  	for (i = 0; i < count; i++) @@ -1382,8 +1393,15 @@ static void irq_domain_free_irqs_hierarchy(struct irq_domain *domain,  					   unsigned int irq_base,  					   unsigned int nr_irqs)  { -	if (domain->ops->free) -		domain->ops->free(domain, irq_base, nr_irqs); +	unsigned int i; + +	if (!domain->ops->free) +		return; + +	for (i = 0; i < nr_irqs; i++) { +		if (irq_domain_get_irq_data(domain, irq_base + i)) +			domain->ops->free(domain, irq_base + i, 1); +	}  }  int irq_domain_alloc_irqs_hierarchy(struct irq_domain *domain, | 
