[PATCH 2/3] iommu/ipmmu-vmsa: Move device initialization to probe_device()

From: Koichiro Den

Date: Wed Nov 04 2026 - 11:44:05 EST


Move the IPMMU instance lookup and private-data setup to
ipmmu_probe_device(), using fwspec->iommu_fwnode. This prepares for
per-device attachment state managed by ipmmu_probe_device() and
ipmmu_release_device().

No functional change intended.

Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Koichiro Den <den@xxxxxxxxxxxxx>
---
drivers/iommu/ipmmu-vmsa.c | 47 +++++++++++++-------------------------
1 file changed, 16 insertions(+), 31 deletions(-)

diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c
index 99586c68ef35..cea9348ac10d 100644
--- a/drivers/iommu/ipmmu-vmsa.c
+++ b/drivers/iommu/ipmmu-vmsa.c
@@ -709,22 +709,6 @@ static phys_addr_t ipmmu_iova_to_phys(struct iommu_domain *io_domain,
return domain->iop->iova_to_phys(domain->iop, iova);
}

-static int ipmmu_init_platform_device(struct device *dev,
- const struct of_phandle_args *args)
-{
- struct platform_device *ipmmu_pdev;
-
- ipmmu_pdev = of_find_device_by_node(args->np);
- if (!ipmmu_pdev)
- return -ENODEV;
-
- dev_iommu_priv_set(dev, platform_get_drvdata(ipmmu_pdev));
-
- put_device(&ipmmu_pdev->dev);
-
- return 0;
-}
-
static const struct soc_device_attribute soc_needs_opt_in[] = {
{ .family = "R-Car Gen3", },
{ .family = "R-Car Gen4", },
@@ -778,20 +762,10 @@ static bool ipmmu_device_is_allowed(struct device *dev)
static int ipmmu_of_xlate(struct device *dev,
const struct of_phandle_args *spec)
{
- int ret;
-
if (!ipmmu_device_is_allowed(dev))
return -ENODEV;

- ret = iommu_fwspec_add_ids(dev, spec->args, 1);
- if (ret)
- return ret;
-
- /* Initialize once - xlate() will call multiple times */
- if (to_ipmmu(dev))
- return 0;
-
- return ipmmu_init_platform_device(dev, spec);
+ return iommu_fwspec_add_ids(dev, spec->args, 1);
}

static int ipmmu_init_arm_mapping(struct device *dev)
@@ -839,14 +813,25 @@ static int ipmmu_init_arm_mapping(struct device *dev)

static struct iommu_device *ipmmu_probe_device(struct device *dev)
{
- struct ipmmu_vmsa_device *mmu = to_ipmmu(dev);
+ struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
+ struct platform_device *ipmmu_pdev;
+ struct ipmmu_vmsa_device *mmu;
+
+ if (!fwspec)
+ return ERR_PTR(-ENODEV);
+
+ ipmmu_pdev = of_find_device_by_node(to_of_node(fwspec->iommu_fwnode));
+ if (!ipmmu_pdev)
+ return ERR_PTR(-ENODEV);
+
+ mmu = platform_get_drvdata(ipmmu_pdev);
+ put_device(&ipmmu_pdev->dev);

- /*
- * Only let through devices that have been verified in xlate()
- */
if (!mmu)
return ERR_PTR(-ENODEV);

+ dev_iommu_priv_set(dev, mmu);
+
return &mmu->iommu;
}

--
2.54.0