]> git.karo-electronics.de Git - linux-beck.git/commitdiff
genirq/msi: Make the .prepare callback reusable
authorMarc Zyngier <marc.zyngier@arm.com>
Mon, 23 Nov 2015 08:26:05 +0000 (08:26 +0000)
committerMarc Zyngier <marc.zyngier@arm.com>
Wed, 16 Dec 2015 15:29:44 +0000 (15:29 +0000)
The .prepare callbacks are so far only called from msi_domain_alloc_irqs.
In order to reuse that code, split that code and create a
msi_domain_prepare_irqs function that the existing code can call into.

Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
include/linux/msi.h
kernel/irq/msi.c

index f71a25e5fd25b574bceaf9b397b62e0913419067..1c0bb2c0b211f6132133a1fb43cfdf08fb1f6de8 100644 (file)
@@ -279,6 +279,10 @@ struct irq_domain *platform_msi_create_irq_domain(struct fwnode_handle *fwnode,
 int platform_msi_domain_alloc_irqs(struct device *dev, unsigned int nvec,
                                   irq_write_msi_msg_t write_msi_msg);
 void platform_msi_domain_free_irqs(struct device *dev);
+
+/* When an MSI domain is used as an intermediate domain */
+int msi_domain_prepare_irqs(struct irq_domain *domain, struct device *dev,
+                           int nvec, msi_alloc_info_t *args);
 #endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
 
 #ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
index 6b0c0b74a2a1a88c0d3f81519fea7c520b290967..9a85613d4227a64e51ddfea4f6af1917c01d3cf8 100644 (file)
@@ -252,6 +252,20 @@ struct irq_domain *msi_create_irq_domain(struct fwnode_handle *fwnode,
                                           &msi_domain_ops, info);
 }
 
+int msi_domain_prepare_irqs(struct irq_domain *domain, struct device *dev,
+                           int nvec, msi_alloc_info_t *arg)
+{
+       struct msi_domain_info *info = domain->host_data;
+       struct msi_domain_ops *ops = info->ops;
+       int ret;
+
+       ret = ops->msi_check(domain, info, dev);
+       if (ret == 0)
+               ret = ops->msi_prepare(domain, dev, nvec, arg);
+
+       return ret;
+}
+
 /**
  * msi_domain_alloc_irqs - Allocate interrupts from a MSI interrupt domain
  * @domain:    The domain to allocate from
@@ -270,9 +284,7 @@ int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
        struct msi_desc *desc;
        int i, ret, virq = -1;
 
-       ret = ops->msi_check(domain, info, dev);
-       if (ret == 0)
-               ret = ops->msi_prepare(domain, dev, nvec, &arg);
+       ret = msi_domain_prepare_irqs(domain, dev, nvec, &arg);
        if (ret)
                return ret;