aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSricharan R <sricharan@codeaurora.org>2017-03-09 21:05:48 +0530
committerSrinivas Kandagatla <srinivas.kandagatla@linaro.org>2018-06-18 13:54:45 +0100
commit47145ee642ead2bd1199a8703235c1a860d5cca6 (patch)
tree927392c113087e76b29693d5af06b204107571cd
parentbe708e2b6ec04ac223fe1b61ae845a9a88d8e10f (diff)
iommu/arm-smmu: Add the device_link between masters and smmu
Finally add the device link between the master device and smmu, so that the smmu gets runtime enabled/disabled only when the master needs it. This is done from add_device callback which gets called once when the master is added to the smmu. Signed-off-by: Sricharan R <sricharan@codeaurora.org> Signed-off-by: Vivek Gautam <vivek.gautam@codeaurora.org> Reviewed-by: Tomasz Figa <tfiga@chromium.org>
-rw-r--r--drivers/iommu/arm-smmu.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index 406a5590e575..7e1c1a2f3c24 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -1461,8 +1461,20 @@ static int arm_smmu_add_device(struct device *dev)
iommu_device_link(&smmu->iommu, dev);
+ if (pm_runtime_enabled(smmu->dev) &&
+ !device_link_add(dev, smmu->dev,
+ DL_FLAG_PM_RUNTIME | DL_FLAG_AUTOREMOVE_S)) {
+ dev_err(smmu->dev, "Unable to add link to the consumer %s\n",
+ dev_name(dev));
+ ret = -ENODEV;
+ goto out_unlink;
+ }
+
return 0;
+out_unlink:
+ iommu_device_unlink(&smmu->iommu, dev);
+ arm_smmu_master_free_smes(fwspec);
out_cfg_free:
kfree(cfg);
out_free: