Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2af01acb authored by Taniya Das's avatar Taniya Das Committed by Gerrit - the friendly Code Review server
Browse files

clk: qcom: gdsc: Remove global mutex lock in enable/disable callbacks



The global mutex lock which was introduced to correct a droop issue on
certain devices during multiple enable/disable of GDSCs is no longer a
requirement, so remove the same to avoid the GDSC lock being acquired
while holding clock global lock causing the deadlock scenario.

Change-Id: Idc674dea06935509524afb89602599902dd03c56
Signed-off-by: default avatarOdelu Kukatla <okukatla@codeaurora.org>
parent 47906484
Loading
Loading
Loading
Loading
+4 −35
Original line number Diff line number Diff line
@@ -95,8 +95,6 @@ enum gdscr_status {
	DISABLED,
};

static DEFINE_MUTEX(gdsc_seq_lock);

static inline u32 gdsc_mb(struct gdsc *gds)
{
	u32 reg;
@@ -260,16 +258,12 @@ static int gdsc_enable(struct regulator_dev *rdev)
	uint32_t regval, hw_ctrl_regval = 0x0;
	int i, ret = 0;

	mutex_lock(&gdsc_seq_lock);

	if (sc->parent_regulator) {
		ret = regulator_set_voltage(sc->parent_regulator,
				RPMH_REGULATOR_LEVEL_LOW_SVS, INT_MAX);
		if (ret) {
			mutex_unlock(&gdsc_seq_lock);
		if (ret)
			return ret;
	}
	}

	if (sc->bus_handle) {
		ret = msm_bus_scale_client_update_request(sc->bus_handle, 1);
@@ -431,8 +425,6 @@ static int gdsc_enable(struct regulator_dev *rdev)
	if (sc->parent_regulator)
		regulator_set_voltage(sc->parent_regulator, 0, INT_MAX);

	mutex_unlock(&gdsc_seq_lock);

	return ret;
}

@@ -442,16 +434,12 @@ static int gdsc_disable(struct regulator_dev *rdev)
	uint32_t regval;
	int i, ret = 0;

	mutex_lock(&gdsc_seq_lock);

	if (sc->parent_regulator) {
		ret = regulator_set_voltage(sc->parent_regulator,
				RPMH_REGULATOR_LEVEL_LOW_SVS, INT_MAX);
		if (ret) {
			mutex_unlock(&gdsc_seq_lock);
		if (ret)
			return ret;
	}
	}

	if (sc->force_root_en)
		clk_prepare_enable(sc->clocks[sc->root_clk_idx]);
@@ -528,8 +516,6 @@ static int gdsc_disable(struct regulator_dev *rdev)

	sc->is_gdsc_enabled = false;

	mutex_unlock(&gdsc_seq_lock);

	return ret;
}

@@ -545,20 +531,15 @@ static unsigned int gdsc_get_mode(struct regulator_dev *rdev)
		return REGULATOR_MODE_NORMAL;
	}

	mutex_lock(&gdsc_seq_lock);

	if (sc->parent_regulator) {
		ret = regulator_set_voltage(sc->parent_regulator,
					RPMH_REGULATOR_LEVEL_LOW_SVS, INT_MAX);
		if (ret) {
			mutex_unlock(&gdsc_seq_lock);
		if (ret)
			return ret;
		}

		ret = regulator_enable(sc->parent_regulator);
		if (ret) {
			regulator_set_voltage(sc->parent_regulator, 0, INT_MAX);
			mutex_unlock(&gdsc_seq_lock);
			return ret;
		}
	}
@@ -573,7 +554,6 @@ static unsigned int gdsc_get_mode(struct regulator_dev *rdev)
				regulator_set_voltage(sc->parent_regulator, 0,
							INT_MAX);
			}
			mutex_unlock(&gdsc_seq_lock);
			return ret;
		}
	}
@@ -588,8 +568,6 @@ static unsigned int gdsc_get_mode(struct regulator_dev *rdev)
		regulator_set_voltage(sc->parent_regulator, 0, INT_MAX);
	}

	mutex_unlock(&gdsc_seq_lock);

	if (regval & HW_CONTROL_MASK)
		return REGULATOR_MODE_FAST;

@@ -602,8 +580,6 @@ static int gdsc_set_mode(struct regulator_dev *rdev, unsigned int mode)
	uint32_t regval;
	int ret = 0;

	mutex_lock(&gdsc_seq_lock);

	if (sc->skip_disable) {
		switch (mode) {
		case REGULATOR_MODE_IDLE:
@@ -617,22 +593,18 @@ static int gdsc_set_mode(struct regulator_dev *rdev, unsigned int mode)
			break;
		}

		mutex_unlock(&gdsc_seq_lock);
		return ret;
	}

	if (sc->parent_regulator) {
		ret = regulator_set_voltage(sc->parent_regulator,
				RPMH_REGULATOR_LEVEL_LOW_SVS, INT_MAX);
		if (ret) {
			mutex_unlock(&gdsc_seq_lock);
		if (ret)
			return ret;
		}

		ret = regulator_enable(sc->parent_regulator);
		if (ret) {
			regulator_set_voltage(sc->parent_regulator, 0, INT_MAX);
			mutex_unlock(&gdsc_seq_lock);
			return ret;
		}
	}
@@ -647,7 +619,6 @@ static int gdsc_set_mode(struct regulator_dev *rdev, unsigned int mode)
				regulator_set_voltage(sc->parent_regulator, 0,
							INT_MAX);
			}
			mutex_unlock(&gdsc_seq_lock);
			return ret;
		}
	}
@@ -697,8 +668,6 @@ static int gdsc_set_mode(struct regulator_dev *rdev, unsigned int mode)
		regulator_set_voltage(sc->parent_regulator, 0, INT_MAX);
	}

	mutex_unlock(&gdsc_seq_lock);

	return ret;
}