summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/iommu/arm-smmu.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index 065379c1397f..f14812fdee6c 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -404,6 +404,7 @@ struct arm_smmu_device {
struct msm_bus_scale_pdata *bus_pdata;
enum tz_smmu_device_id sec_id;
+ int regulator_defer;
};
struct arm_smmu_cfg {
@@ -950,7 +951,8 @@ static int arm_smmu_disable_regulators(struct arm_smmu_device *smmu)
arm_smmu_unprepare_clocks(smmu);
arm_smmu_unrequest_bus(smmu);
if (smmu->gdsc) {
- ret = regulator_disable(smmu->gdsc);
+ ret = regulator_disable_deferred(smmu->gdsc,
+ smmu->regulator_defer);
WARN(ret, "%s: Regulator disable failed\n",
dev_name(smmu->dev));
}
@@ -3610,6 +3612,12 @@ static int arm_smmu_init_regulators(struct arm_smmu_device *smmu)
if (!of_get_property(dev->of_node, "vdd-supply", NULL))
return 0;
+ if (!of_property_read_u32(dev->of_node,
+ "qcom,deferred-regulator-disable-delay",
+ &(smmu->regulator_defer)))
+ dev_info(dev, "regulator defer delay %d\n",
+ smmu->regulator_defer);
+
smmu->gdsc = devm_regulator_get(dev, "vdd");
if (IS_ERR(smmu->gdsc))
return PTR_ERR(smmu->gdsc);