diff options
| -rw-r--r-- | kernel/irq/irqdomain.c | 62 | 
1 files changed, 43 insertions, 19 deletions
| diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c index df0cbad1b0d7..a6d1b108b8f7 100644 --- a/kernel/irq/irqdomain.c +++ b/kernel/irq/irqdomain.c @@ -126,23 +126,12 @@ void irq_domain_free_fwnode(struct fwnode_handle *fwnode)  }  EXPORT_SYMBOL_GPL(irq_domain_free_fwnode); -/** - * __irq_domain_add() - Allocate a new irq_domain data structure - * @fwnode: firmware node for the interrupt controller - * @size: Size of linear map; 0 for radix mapping only - * @hwirq_max: Maximum number of interrupts supported by controller - * @direct_max: Maximum value of direct maps; Use ~0 for no limit; 0 for no - *              direct mapping - * @ops: domain callbacks - * @host_data: Controller private data pointer - * - * Allocates and initializes an irq_domain structure. - * Returns pointer to IRQ domain, or NULL on failure. - */ -struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, unsigned int size, -				    irq_hw_number_t hwirq_max, int direct_max, -				    const struct irq_domain_ops *ops, -				    void *host_data) +static struct irq_domain *__irq_domain_create(struct fwnode_handle *fwnode, +					      unsigned int size, +					      irq_hw_number_t hwirq_max, +					      int direct_max, +					      const struct irq_domain_ops *ops, +					      void *host_data)  {  	struct irqchip_fwid *fwid;  	struct irq_domain *domain; @@ -230,12 +219,44 @@ struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, unsigned int s  	irq_domain_check_hierarchy(domain); +	return domain; +} + +static void __irq_domain_publish(struct irq_domain *domain) +{  	mutex_lock(&irq_domain_mutex);  	debugfs_add_domain_dir(domain);  	list_add(&domain->link, &irq_domain_list);  	mutex_unlock(&irq_domain_mutex);  	pr_debug("Added domain %s\n", domain->name); +} + +/** + * __irq_domain_add() - Allocate a new irq_domain data structure + * @fwnode: firmware node for the interrupt controller + * @size: Size of linear map; 0 for radix mapping only + * @hwirq_max: Maximum number of interrupts supported by controller + * @direct_max: Maximum value of direct maps; Use ~0 for no limit; 0 for no + *              direct mapping + * @ops: domain callbacks + * @host_data: Controller private data pointer + * + * Allocates and initializes an irq_domain structure. + * Returns pointer to IRQ domain, or NULL on failure. + */ +struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, unsigned int size, +				    irq_hw_number_t hwirq_max, int direct_max, +				    const struct irq_domain_ops *ops, +				    void *host_data) +{ +	struct irq_domain *domain; + +	domain = __irq_domain_create(fwnode, size, hwirq_max, direct_max, +				     ops, host_data); +	if (domain) +		__irq_domain_publish(domain); +  	return domain;  }  EXPORT_SYMBOL_GPL(__irq_domain_add); @@ -1138,12 +1159,15 @@ struct irq_domain *irq_domain_create_hierarchy(struct irq_domain *parent,  	struct irq_domain *domain;  	if (size) -		domain = irq_domain_create_linear(fwnode, size, ops, host_data); +		domain = __irq_domain_create(fwnode, size, size, 0, ops, host_data);  	else -		domain = irq_domain_create_tree(fwnode, ops, host_data); +		domain = __irq_domain_create(fwnode, 0, ~0, 0, ops, host_data); +  	if (domain) {  		domain->parent = parent;  		domain->flags |= flags; + +		__irq_domain_publish(domain);  	}  	return domain; | 
