iommu/omap: Convert to generic_single_device_group()
authorJason Gunthorpe <jgg@nvidia.com>
Tue, 22 Aug 2023 16:16:02 +0000 (13:16 -0300)
committerJoerg Roedel <jroedel@suse.de>
Mon, 25 Sep 2023 09:52:08 +0000 (11:52 +0200)
Use the new helper.

For some reason omap will probe its driver even if it doesn't load an
iommu driver. Keep this working by keeping a bool to track if the iommu
driver was started.

Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/7-v1-c869a95191f2+5e8-iommu_single_grp_jgg@nvidia.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/omap-iommu.c
drivers/iommu/omap-iommu.h

index fcf99bd195b32e9b6a86ef63af41fe78932dbe87..0f7d226f5573102c047a467fdc58e5e565ce6af5 100644 (file)
@@ -1225,18 +1225,15 @@ static int omap_iommu_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, obj);
 
        if (omap_iommu_can_register(pdev)) {
-               obj->group = iommu_group_alloc();
-               if (IS_ERR(obj->group))
-                       return PTR_ERR(obj->group);
-
                err = iommu_device_sysfs_add(&obj->iommu, obj->dev, NULL,
                                             obj->name);
                if (err)
-                       goto out_group;
+                       return err;
 
                err = iommu_device_register(&obj->iommu, &omap_iommu_ops, &pdev->dev);
                if (err)
                        goto out_sysfs;
+               obj->has_iommu_driver = true;
        }
 
        pm_runtime_enable(obj->dev);
@@ -1252,8 +1249,6 @@ static int omap_iommu_probe(struct platform_device *pdev)
 
 out_sysfs:
        iommu_device_sysfs_remove(&obj->iommu);
-out_group:
-       iommu_group_put(obj->group);
        return err;
 }
 
@@ -1261,10 +1256,7 @@ static void omap_iommu_remove(struct platform_device *pdev)
 {
        struct omap_iommu *obj = platform_get_drvdata(pdev);
 
-       if (obj->group) {
-               iommu_group_put(obj->group);
-               obj->group = NULL;
-
+       if (obj->has_iommu_driver) {
                iommu_device_sysfs_remove(&obj->iommu);
                iommu_device_unregister(&obj->iommu);
        }
@@ -1729,26 +1721,12 @@ static void omap_iommu_release_device(struct device *dev)
 
 }
 
-static struct iommu_group *omap_iommu_device_group(struct device *dev)
-{
-       struct omap_iommu_arch_data *arch_data = dev_iommu_priv_get(dev);
-       struct iommu_group *group = ERR_PTR(-EINVAL);
-
-       if (!arch_data)
-               return ERR_PTR(-ENODEV);
-
-       if (arch_data->iommu_dev)
-               group = iommu_group_ref_get(arch_data->iommu_dev->group);
-
-       return group;
-}
-
 static const struct iommu_ops omap_iommu_ops = {
        .identity_domain = &omap_iommu_identity_domain,
        .domain_alloc_paging = omap_iommu_domain_alloc_paging,
        .probe_device   = omap_iommu_probe_device,
        .release_device = omap_iommu_release_device,
-       .device_group   = omap_iommu_device_group,
+       .device_group   = generic_single_device_group,
        .pgsize_bitmap  = OMAP_IOMMU_PGSIZES,
        .default_domain_ops = &(const struct iommu_domain_ops) {
                .attach_dev     = omap_iommu_attach_dev,
index 18ee713ede784d16c884b9cca19ed8ce240706d4..27697109ec79a55953dd933302a27a76210a9858 100644 (file)
@@ -80,7 +80,7 @@ struct omap_iommu {
        u32 id;
 
        struct iommu_device iommu;
-       struct iommu_group *group;
+       bool has_iommu_driver;
 
        u8 pwrst;
 };