]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
irqdomain: Add device pointer to irq_domain_info and msi_domain_info
authorThomas Gleixner <tglx@linutronix.de>
Thu, 26 Jun 2025 14:48:58 +0000 (16:48 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 3 Jul 2025 13:49:24 +0000 (15:49 +0200)
Add device pointer to irq_domain_info and msi_domain_info, so that the device
can be specified at domain creation time.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Nam Cao <namcao@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/all/943e52403b20cf13c320d55bd4446b4562466aab.1750860131.git.namcao@linutronix.de
include/linux/irqdomain.h
include/linux/msi.h
kernel/irq/irqdomain.c
kernel/irq/msi.c

index 7387d183029b7b83486698249984b6adbb01a30f..266b5e5bb8cede78f4826a385e8c433479d36ece 100644 (file)
@@ -279,6 +279,7 @@ struct irq_domain_chip_generic_info;
  *                     domains are added using same fwnode
  * @ops:               Domain operation callbacks
  * @host_data:         Controller private data pointer
+ * @dev:               Device which creates the domain
  * @dgc_info:          Geneneric chip information structure pointer used to
  *                     create generic chips for the domain if not NULL.
  * @init:              Function called when the domain is created.
@@ -298,6 +299,7 @@ struct irq_domain_info {
        const char                              *name_suffix;
        const struct irq_domain_ops             *ops;
        void                                    *host_data;
+       struct device                           *dev;
 #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
        /**
         * @parent: Pointer to the parent irq domain used in a hierarchy domain
index 6863540f4b71778fe505f65fb6eca5680d035c3b..77227d23ea84b31f1784be8d4c743459a4bb7080 100644 (file)
@@ -488,6 +488,7 @@ struct msi_domain_ops {
  *                     gets initialized to the maximum software index limit
  *                     by the domain creation code.
  * @ops:               The callback data structure
+ * @dev:               Device which creates the domain
  * @chip:              Optional: associated interrupt chip
  * @chip_data:         Optional: associated interrupt chip data
  * @handler:           Optional: associated interrupt flow handler
@@ -501,6 +502,7 @@ struct msi_domain_info {
        enum irq_domain_bus_token       bus_token;
        unsigned int                    hwsize;
        struct msi_domain_ops           *ops;
+       struct device                   *dev;
        struct irq_chip                 *chip;
        void                            *chip_data;
        irq_flow_handler_t              handler;
index c8b6de09047be768624b622a7a31fad1441de6d2..4afbd3ac532fbd3718311e371b46922142b881ed 100644 (file)
@@ -317,6 +317,7 @@ static struct irq_domain *__irq_domain_instantiate(const struct irq_domain_info
 
        domain->flags |= info->domain_flags;
        domain->exit = info->exit;
+       domain->dev = info->dev;
 
 #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
        if (info->parent) {
index 9febe797a5f6afce6ba4dfba9da1eb3e67804db6..9b09ad3f9914cb28d4059f960ba3881e26bfe18d 100644 (file)
@@ -889,6 +889,7 @@ static struct irq_domain *__msi_create_irq_domain(struct fwnode_handle *fwnode,
 
        if (domain) {
                irq_domain_update_bus_token(domain, info->bus_token);
+               domain->dev = info->dev;
                if (info->flags & MSI_FLAG_PARENT_PM_DEV)
                        domain->pm_dev = parent->pm_dev;
        }
@@ -1051,6 +1052,7 @@ bool msi_create_device_irq_domain(struct device *dev, unsigned int domid,
        bundle->info.data = domain_data;
        bundle->info.chip_data = chip_data;
        bundle->info.alloc_data = &bundle->alloc_info;
+       bundle->info.dev = dev;
 
        pops = parent->msi_parent_ops;
        snprintf(bundle->name, sizeof(bundle->name), "%s%s-%s",
@@ -1089,7 +1091,6 @@ bool msi_create_device_irq_domain(struct device *dev, unsigned int domid,
        if (!domain)
                return false;
 
-       domain->dev = dev;
        dev->msi.data->__domains[domid].domain = domain;
 
        if (msi_domain_prepare_irqs(domain, dev, hwsize, &bundle->alloc_info)) {