aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVivek Gautam <vivek.gautam@codeaurora.org>2017-07-06 05:37:00 -0400
committerWill Deacon <will.deacon@arm.com>2017-07-20 05:30:28 -0400
commitc54451a5e2415948274bc71f469e5349469addcc (patch)
tree0318cee60c8394a7bb616d58f8a21034fd580eda
parent2984f7f3bb5a82df763c2d81444573ed86f36eb8 (diff)
iommu/arm-smmu: Fix the error path in arm_smmu_add_device
fwspec->iommu_priv is available only after arm_smmu_master_cfg instance has been allocated. We shouldn't free it before that. Also it's logical to free the master cfg itself without checking for fwspec. Signed-off-by: Vivek Gautam <vivek.gautam@codeaurora.org> [will: remove redundant assignment to fwspec] Signed-off-by: Will Deacon <will.deacon@arm.com>
-rw-r--r--drivers/iommu/arm-smmu.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index 98ff462b5992..b97188acc4f1 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -1519,7 +1519,6 @@ static int arm_smmu_add_device(struct device *dev)
1519 1519
1520 if (using_legacy_binding) { 1520 if (using_legacy_binding) {
1521 ret = arm_smmu_register_legacy_master(dev, &smmu); 1521 ret = arm_smmu_register_legacy_master(dev, &smmu);
1522 fwspec = dev->iommu_fwspec;
1523 if (ret) 1522 if (ret)
1524 goto out_free; 1523 goto out_free;
1525 } else if (fwspec && fwspec->ops == &arm_smmu_ops) { 1524 } else if (fwspec && fwspec->ops == &arm_smmu_ops) {
@@ -1558,15 +1557,15 @@ static int arm_smmu_add_device(struct device *dev)
1558 1557
1559 ret = arm_smmu_master_alloc_smes(dev); 1558 ret = arm_smmu_master_alloc_smes(dev);
1560 if (ret) 1559 if (ret)
1561 goto out_free; 1560 goto out_cfg_free;
1562 1561
1563 iommu_device_link(&smmu->iommu, dev); 1562 iommu_device_link(&smmu->iommu, dev);
1564 1563
1565 return 0; 1564 return 0;
1566 1565
1566out_cfg_free:
1567 kfree(cfg);
1567out_free: 1568out_free:
1568 if (fwspec)
1569 kfree(fwspec->iommu_priv);
1570 iommu_fwspec_free(dev); 1569 iommu_fwspec_free(dev);
1571 return ret; 1570 return ret;
1572} 1571}