These days the core code will free the fwspec if probe fails, no reason
for any driver to call this on a probe failure path.

Reviewed-by: Jerry Snitselaar <jsnit...@redhat.com>
Signed-off-by: Jason Gunthorpe <j...@nvidia.com>
---
 drivers/iommu/arm/arm-smmu/arm-smmu.c | 14 +++++---------
 drivers/iommu/tegra-smmu.c            |  1 -
 2 files changed, 5 insertions(+), 10 deletions(-)

diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu.c 
b/drivers/iommu/arm/arm-smmu/arm-smmu.c
index d6d1a2a55cc069..854efcb1b84ddf 100644
--- a/drivers/iommu/arm/arm-smmu/arm-smmu.c
+++ b/drivers/iommu/arm/arm-smmu/arm-smmu.c
@@ -1348,6 +1348,8 @@ static struct iommu_device *arm_smmu_probe_device(struct 
device *dev)
 
        if (using_legacy_binding) {
                ret = arm_smmu_register_legacy_master(dev, &smmu);
+               if (ret)
+                       return ERR_PTR(ret);
 
                /*
                 * If dev->iommu_fwspec is initally NULL, 
arm_smmu_register_legacy_master()
@@ -1355,15 +1357,12 @@ static struct iommu_device 
*arm_smmu_probe_device(struct device *dev)
                 * later use.
                 */
                fwspec = dev_iommu_fwspec_get(dev);
-               if (ret)
-                       goto out_free;
        } else if (fwspec && fwspec->ops == &arm_smmu_ops) {
                smmu = arm_smmu_get_by_fwnode(fwspec->iommu_fwnode);
        } else {
                return ERR_PTR(-ENODEV);
        }
 
-       ret = -EINVAL;
        for (i = 0; i < fwspec->num_ids; i++) {
                u16 sid = FIELD_GET(ARM_SMMU_SMR_ID, fwspec->ids[i]);
                u16 mask = FIELD_GET(ARM_SMMU_SMR_MASK, fwspec->ids[i]);
@@ -1371,20 +1370,19 @@ static struct iommu_device 
*arm_smmu_probe_device(struct device *dev)
                if (sid & ~smmu->streamid_mask) {
                        dev_err(dev, "stream ID 0x%x out of range for SMMU 
(0x%x)\n",
                                sid, smmu->streamid_mask);
-                       goto out_free;
+                       return ERR_PTR(-EINVAL);
                }
                if (mask & ~smmu->smr_mask_mask) {
                        dev_err(dev, "SMR mask 0x%x out of range for SMMU 
(0x%x)\n",
                                mask, smmu->smr_mask_mask);
-                       goto out_free;
+                       return ERR_PTR(-EINVAL);
                }
        }
 
-       ret = -ENOMEM;
        cfg = kzalloc(offsetof(struct arm_smmu_master_cfg, smendx[i]),
                      GFP_KERNEL);
        if (!cfg)
-               goto out_free;
+               return ERR_PTR(-ENOMEM);
 
        cfg->smmu = smmu;
        dev_iommu_priv_set(dev, cfg);
@@ -1408,8 +1406,6 @@ static struct iommu_device *arm_smmu_probe_device(struct 
device *dev)
 
 out_cfg_free:
        kfree(cfg);
-out_free:
-       iommu_fwspec_free(dev);
        return ERR_PTR(ret);
 }
 
diff --git a/drivers/iommu/tegra-smmu.c b/drivers/iommu/tegra-smmu.c
index 310871728ab4b6..e3101aa2f35689 100644
--- a/drivers/iommu/tegra-smmu.c
+++ b/drivers/iommu/tegra-smmu.c
@@ -844,7 +844,6 @@ static int tegra_smmu_configure(struct tegra_smmu *smmu, 
struct device *dev,
        err = ops->of_xlate(dev, args);
        if (err < 0) {
                dev_err(dev, "failed to parse SW group ID: %d\n", err);
-               iommu_fwspec_free(dev);
                return err;
        }
 
-- 
2.42.0


Reply via email to