irqdomain: Introduce irq_domain_create_legacy() API
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Fri, 30 Oct 2020 16:59:18 +0000 (18:59 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Sat, 7 Nov 2020 10:33:46 +0000 (11:33 +0100)
Introduce irq_domain_create_legacy() API which is functional equivalent
to the existing irq_domain_add_legacy(), but takes a pointer to the struct
fwnode_handle as a parameter.

This is useful for non OF systems.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://lore.kernel.org/r/20201030165919.86234-5-andriy.shevchenko@linux.intel.com
Documentation/core-api/irq/irq-domain.rst
include/linux/irqdomain.h
kernel/irq/irqdomain.c

index 096db12..a77c24c 100644 (file)
@@ -147,6 +147,7 @@ Legacy
        irq_domain_add_simple()
        irq_domain_add_legacy()
        irq_domain_add_legacy_isa()
+       irq_domain_create_legacy()
 
 The Legacy mapping is a special case for drivers that already have a
 range of irq_descs allocated for the hwirqs.  It is used when the
@@ -185,6 +186,11 @@ that the driver using the simple domain call irq_create_mapping()
 before any irq_find_mapping() since the latter will actually work
 for the static IRQ assignment case.
 
+irq_domain_add_legacy() and irq_domain_create_legacy() are functionally
+equivalent, except for the first argument is different - the former
+accepts an Open Firmware specific 'struct device_node', while the latter
+accepts a more general abstraction 'struct fwnode_handle'.
+
 Hierarchy IRQ domain
 --------------------
 
index d21f75d..77bf7d8 100644 (file)
@@ -271,6 +271,12 @@ struct irq_domain *irq_domain_add_legacy(struct device_node *of_node,
                                         irq_hw_number_t first_hwirq,
                                         const struct irq_domain_ops *ops,
                                         void *host_data);
+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);
 extern struct irq_domain *irq_find_matching_fwspec(struct irq_fwspec *fwspec,
                                                   enum irq_domain_bus_token bus_token);
 extern bool irq_domain_check_msi_remap(void);
index 831526f..9c9cb88 100644 (file)
@@ -350,17 +350,28 @@ struct irq_domain *irq_domain_add_legacy(struct device_node *of_node,
                                         irq_hw_number_t first_hwirq,
                                         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