Skip to content

Commit 00885a7

Browse files
miquelraynalMarc Zyngier
authored andcommitted
irqchip/irq-mvebu-icu: Disociate ICU and NSR
NSR (non-secure interrupts) are handled in the ICU driver like if there was only this type of interrupt in the ICU. Change this behavior to prepare the introduction of SEI (System Error Interrupts) support by moving the NSR code in a separate function. This is done under the form of a 'probe' function to ease future migration to NSR/SEI being platform devices part of the ICU. The 'icu' structure is passed as driver data and not as a parameter for the same reason. Reviewed-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
1 parent 9770c66 commit 00885a7

File tree

1 file changed

+32
-25
lines changed

1 file changed

+32
-25
lines changed

drivers/irqchip/irq-mvebu-icu.c

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
struct mvebu_icu {
4040
struct irq_chip irq_chip;
4141
void __iomem *base;
42-
struct irq_domain *domain;
4342
struct device *dev;
4443
atomic_t initialized;
4544
};
@@ -204,11 +203,39 @@ static const struct irq_domain_ops mvebu_icu_domain_ops = {
204203
.free = mvebu_icu_irq_domain_free,
205204
};
206205

206+
static int mvebu_icu_subset_probe(struct platform_device *pdev)
207+
{
208+
struct device_node *msi_parent_dn;
209+
struct device *dev = &pdev->dev;
210+
struct irq_domain *irq_domain;
211+
struct mvebu_icu *icu;
212+
213+
icu = dev_get_drvdata(dev);
214+
215+
dev->msi_domain = of_msi_get_domain(dev, dev->of_node,
216+
DOMAIN_BUS_PLATFORM_MSI);
217+
if (!dev->msi_domain)
218+
return -EPROBE_DEFER;
219+
220+
msi_parent_dn = irq_domain_get_of_node(dev->msi_domain);
221+
if (!msi_parent_dn)
222+
return -ENODEV;
223+
224+
irq_domain = platform_msi_create_device_tree_domain(dev, ICU_MAX_IRQS,
225+
mvebu_icu_write_msg,
226+
&mvebu_icu_domain_ops,
227+
icu);
228+
if (!irq_domain) {
229+
dev_err(dev, "Failed to create ICU MSI domain\n");
230+
return -ENOMEM;
231+
}
232+
233+
return 0;
234+
}
235+
207236
static int mvebu_icu_probe(struct platform_device *pdev)
208237
{
209238
struct mvebu_icu *icu;
210-
struct device_node *node = pdev->dev.of_node;
211-
struct device_node *gicp_dn;
212239
struct resource *res;
213240
int i;
214241

@@ -240,19 +267,6 @@ static int mvebu_icu_probe(struct platform_device *pdev)
240267
icu->irq_chip.irq_set_affinity = irq_chip_set_affinity_parent;
241268
#endif
242269

243-
/*
244-
* We're probed after MSI domains have been resolved, so force
245-
* resolution here.
246-
*/
247-
pdev->dev.msi_domain = of_msi_get_domain(&pdev->dev, node,
248-
DOMAIN_BUS_PLATFORM_MSI);
249-
if (!pdev->dev.msi_domain)
250-
return -EPROBE_DEFER;
251-
252-
gicp_dn = irq_domain_get_of_node(pdev->dev.msi_domain);
253-
if (!gicp_dn)
254-
return -ENODEV;
255-
256270
/*
257271
* Clean all ICU interrupts with type SPI_NSR, required to
258272
* avoid unpredictable SPI assignments done by firmware.
@@ -267,16 +281,9 @@ static int mvebu_icu_probe(struct platform_device *pdev)
267281
writel_relaxed(0x0, icu->base + ICU_INT_CFG(i));
268282
}
269283

270-
icu->domain =
271-
platform_msi_create_device_domain(&pdev->dev, ICU_MAX_IRQS,
272-
mvebu_icu_write_msg,
273-
&mvebu_icu_domain_ops, icu);
274-
if (!icu->domain) {
275-
dev_err(&pdev->dev, "Failed to create ICU domain\n");
276-
return -ENOMEM;
277-
}
284+
platform_set_drvdata(pdev, icu);
278285

279-
return 0;
286+
return mvebu_icu_subset_probe(pdev);
280287
}
281288

282289
static const struct of_device_id mvebu_icu_of_match[] = {

0 commit comments

Comments
 (0)