[PATCH RFC 09/11] iommu/arm-smmu: Add arm-smmu IRQ mapping -EPROBE_DEFER handling

From: Lorenzo Pieralisi

Date: Fri Sep 25 2026 - 03:52:48 EST


With the advent of GICv5, IRQs mapping can fail if the interrupt
controller the wired SMMU interrupts are routed to has not probed
yet when the SMMU driver probes.

Handle -EPROBE_DEFER gracefully for IRQ mappings failures.

Signed-off-by: Lorenzo Pieralisi <lpieralisi@xxxxxxxxxx>
Cc: Will Deacon <will@xxxxxxxxxx>
Cc: Robin Murphy <robin.murphy@xxxxxxx>
---
drivers/iommu/arm/arm-smmu/arm-smmu.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu.c b/drivers/iommu/arm/arm-smmu/arm-smmu.c
index 889a0966d36c..a111b80553da 100644
--- a/drivers/iommu/arm/arm-smmu/arm-smmu.c
+++ b/drivers/iommu/arm/arm-smmu/arm-smmu.c
@@ -2154,6 +2154,8 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
return PTR_ERR(smmu);

num_irqs = platform_irq_count(pdev);
+ if (num_irqs < 0)
+ return dev_err_probe(dev, num_irqs, "IRQ count failed\n");

smmu->num_context_irqs = num_irqs - global_irqs - pmu_irqs;
if (smmu->num_context_irqs <= 0)
@@ -2171,7 +2173,7 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
int irq = platform_get_irq(pdev, global_irqs + pmu_irqs + i);

if (irq < 0)
- return irq;
+ return dev_err_probe(dev, irq, "failed to get context IRQ\n");
smmu->irqs[i] = irq;
}

@@ -2211,7 +2213,7 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
int irq = platform_get_irq(pdev, i);

if (irq < 0)
- return irq;
+ return dev_err_probe(dev, irq, "failed to get global IRQ\n");

err = devm_request_irq(dev, irq, global_fault, IRQF_SHARED,
"arm-smmu global fault", smmu);

--
2.54.0