diff options
author | Marc Zyngier <marc.zyngier@arm.com> | 2015-11-23 03:26:05 -0500 |
---|---|---|
committer | Marc Zyngier <marc.zyngier@arm.com> | 2015-12-16 10:29:44 -0500 |
commit | b2eba39bcab9d60a6c3b80c7fc2f3dacb77eeaae (patch) | |
tree | 8f1de22deb5f8492446467b12920ca9c7e9f5b37 | |
parent | c466595c416c04036e1ba36ecdc5fe9072c76228 (diff) |
genirq/msi: Make the .prepare callback reusable
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>
-rw-r--r-- | include/linux/msi.h | 4 | ||||
-rw-r--r-- | kernel/irq/msi.c | 18 |
2 files changed, 19 insertions, 3 deletions
diff --git a/include/linux/msi.h b/include/linux/msi.h index f71a25e5fd25..1c0bb2c0b211 100644 --- a/include/linux/msi.h +++ b/include/linux/msi.h | |||
@@ -279,6 +279,10 @@ struct irq_domain *platform_msi_create_irq_domain(struct fwnode_handle *fwnode, | |||
279 | int platform_msi_domain_alloc_irqs(struct device *dev, unsigned int nvec, | 279 | int platform_msi_domain_alloc_irqs(struct device *dev, unsigned int nvec, |
280 | irq_write_msi_msg_t write_msi_msg); | 280 | irq_write_msi_msg_t write_msi_msg); |
281 | void platform_msi_domain_free_irqs(struct device *dev); | 281 | void platform_msi_domain_free_irqs(struct device *dev); |
282 | |||
283 | /* When an MSI domain is used as an intermediate domain */ | ||
284 | int msi_domain_prepare_irqs(struct irq_domain *domain, struct device *dev, | ||
285 | int nvec, msi_alloc_info_t *args); | ||
282 | #endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */ | 286 | #endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */ |
283 | 287 | ||
284 | #ifdef CONFIG_PCI_MSI_IRQ_DOMAIN | 288 | #ifdef CONFIG_PCI_MSI_IRQ_DOMAIN |
diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c index 6b0c0b74a2a1..9a85613d4227 100644 --- a/kernel/irq/msi.c +++ b/kernel/irq/msi.c | |||
@@ -252,6 +252,20 @@ struct irq_domain *msi_create_irq_domain(struct fwnode_handle *fwnode, | |||
252 | &msi_domain_ops, info); | 252 | &msi_domain_ops, info); |
253 | } | 253 | } |
254 | 254 | ||
255 | int msi_domain_prepare_irqs(struct irq_domain *domain, struct device *dev, | ||
256 | int nvec, msi_alloc_info_t *arg) | ||
257 | { | ||
258 | struct msi_domain_info *info = domain->host_data; | ||
259 | struct msi_domain_ops *ops = info->ops; | ||
260 | int ret; | ||
261 | |||
262 | ret = ops->msi_check(domain, info, dev); | ||
263 | if (ret == 0) | ||
264 | ret = ops->msi_prepare(domain, dev, nvec, arg); | ||
265 | |||
266 | return ret; | ||
267 | } | ||
268 | |||
255 | /** | 269 | /** |
256 | * msi_domain_alloc_irqs - Allocate interrupts from a MSI interrupt domain | 270 | * msi_domain_alloc_irqs - Allocate interrupts from a MSI interrupt domain |
257 | * @domain: The domain to allocate from | 271 | * @domain: The domain to allocate from |
@@ -270,9 +284,7 @@ int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, | |||
270 | struct msi_desc *desc; | 284 | struct msi_desc *desc; |
271 | int i, ret, virq = -1; | 285 | int i, ret, virq = -1; |
272 | 286 | ||
273 | ret = ops->msi_check(domain, info, dev); | 287 | ret = msi_domain_prepare_irqs(domain, dev, nvec, &arg); |
274 | if (ret == 0) | ||
275 | ret = ops->msi_prepare(domain, dev, nvec, &arg); | ||
276 | if (ret) | 288 | if (ret) |
277 | return ret; | 289 | return ret; |
278 | 290 | ||