iommu: arm-smmu: Remove regulator_bulk_enable call
Regulator bulk enable schedules a workqueue, and waits for the work to
complete. This results in decreased performance compared to
regulator_enable().
Change-Id: Ia4943a59afde6e448c3afcc0c6baa7d4341ab9f7
Signed-off-by: Patrick Daly <pdaly@codeaurora.org>
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index bf93b91..bdde006 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -790,6 +790,28 @@
WARN_ON(msm_bus_scale_client_update_request(pwr->bus_client, 0));
}
+static int arm_smmu_enable_regulators(struct arm_smmu_power_resources *pwr)
+{
+ struct regulator_bulk_data *consumers;
+ int num_consumers, ret;
+ int i;
+
+ num_consumers = pwr->num_gdscs;
+ consumers = pwr->gdscs;
+ for (i = 0; i < num_consumers; i++) {
+ ret = regulator_enable(consumers[i].consumer);
+ if (ret)
+ goto out;
+ }
+ return 0;
+
+out:
+ i -= 1;
+ for (; i >= 0; i--)
+ regulator_disable(consumers[i].consumer);
+ return ret;
+}
+
static int arm_smmu_disable_regulators(struct arm_smmu_power_resources *pwr)
{
struct regulator_bulk_data *consumers;
@@ -878,7 +900,7 @@
if (ret)
goto out_unlock;
- ret = regulator_bulk_enable(pwr->num_gdscs, pwr->gdscs);
+ ret = arm_smmu_enable_regulators(pwr);
if (ret)
goto out_disable_bus;