Messages in this thread Patch in this message | | | From | Marc Zyngier <> | Subject | [PATCH 21/39] irqdomain: Introduce irq_resolve_mapping() | Date | Thu, 20 May 2021 17:37:33 +0100 |
| |
Rework irq_find_mapping() to return an irq_desc pointer, and rename the result to irq_resolve_mapping().
irq_find_mapping() is then rewritten in terms of ir_resolve_mapping().
Signed-off-by: Marc Zyngier <maz@kernel.org> --- include/linux/irqdomain.h | 18 +++++++++++++++--- kernel/irq/irqdomain.c | 22 ++++++++++++++-------- 2 files changed, 29 insertions(+), 11 deletions(-)
diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h index 2b696c9bcaaf..189f559fb26c 100644 --- a/include/linux/irqdomain.h +++ b/include/linux/irqdomain.h @@ -31,7 +31,8 @@ #define _LINUX_IRQDOMAIN_H #include <linux/types.h> -#include <linux/irqhandler.h> +#include <linux/irq.h> +#include <linux/irqdesc.h> #include <linux/of.h> #include <linux/mutex.h> #include <linux/radix-tree.h> @@ -401,13 +402,24 @@ static inline unsigned int irq_create_mapping(struct irq_domain *host, return irq_create_mapping_affinity(host, hwirq, NULL); } +extern struct irq_desc *irq_resolve_mapping(struct irq_domain *domain, + irq_hw_number_t hwirq); + /** * irq_find_mapping() - Find a linux irq from a hw irq number. * @domain: domain owning this hardware interrupt * @hwirq: hardware irq number in that domain space */ -extern unsigned int irq_find_mapping(struct irq_domain *host, - irq_hw_number_t hwirq); +static inline unsigned int irq_find_mapping(struct irq_domain *domain, + irq_hw_number_t hwirq) +{ + struct irq_desc *desc = irq_resolve_mapping(domain, hwirq); + + if (unlikely(!desc)) + return 0; + + return irq_desc_get_irq(desc); +} static inline unsigned int irq_linear_revmap(struct irq_domain *domain, irq_hw_number_t hwirq) diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c index 8e55bb8c3073..13a3021e9370 100644 --- a/kernel/irq/irqdomain.c +++ b/kernel/irq/irqdomain.c @@ -876,29 +876,32 @@ void irq_dispose_mapping(unsigned int virq) EXPORT_SYMBOL_GPL(irq_dispose_mapping); /** - * irq_find_mapping() - Find a linux irq from a hw irq number. + * irq_resolve_mapping() - Find a linux irq from a hw irq number. * @domain: domain owning this hardware interrupt * @hwirq: hardware irq number in that domain space + * + * Returns the interrupt descriptor. */ -unsigned int irq_find_mapping(struct irq_domain *domain, - irq_hw_number_t hwirq) +struct irq_desc *irq_resolve_mapping(struct irq_domain *domain, + irq_hw_number_t hwirq) { + struct irq_desc *desc = NULL; struct irq_data *data; /* Look for default domain if necessary */ if (domain == NULL) domain = irq_default_domain; if (domain == NULL) - return 0; + return desc; if (irq_domain_is_nomap(domain)) { if (hwirq < domain->revmap_size) { data = irq_domain_get_irq_data(domain, hwirq); if (data && data->hwirq == hwirq) - return hwirq; + desc = irq_data_to_desc(data); } - return 0; + return desc; } rcu_read_lock(); @@ -907,10 +910,13 @@ unsigned int irq_find_mapping(struct irq_domain *domain, data = rcu_dereference(domain->revmap[hwirq]); else data = radix_tree_lookup(&domain->revmap_tree, hwirq); + + if (likely(data)) + desc = irq_data_to_desc(data); rcu_read_unlock(); - return data ? data->irq : 0; + return desc; } -EXPORT_SYMBOL_GPL(irq_find_mapping); +EXPORT_SYMBOL_GPL(irq_resolve_mapping); /** * irq_domain_xlate_onecell() - Generic xlate for direct one cell bindings -- 2.30.2
| |