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

Commit b44989e5 authored by Naveen Yadav's avatar Naveen Yadav Committed by Gerrit - the friendly Code Review server
Browse files

clk: qcom: gdsc-regulator: Add support to skip GDSC disable



Add check to skip gdsc disable when disable call comes before
the gdsc enable. In case if the gdsc is enabled by entity external
to HLOS then skip disable call.

Change-Id: I14ba8a24fb4403a1805cba23967bb22a82ac6e7f
Signed-off-by: default avatarNaveen Yadav <naveenky@codeaurora.org>
parent fbad67d3
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
 */

#include <linux/kernel.h>
@@ -74,6 +74,7 @@ struct gdsc {
	int			reset_count;
	int			root_clk_idx;
	u32			gds_timeout;
	bool			skip_disable_before_enable;
};

enum gdscr_status {
@@ -366,6 +367,7 @@ static int gdsc_enable(struct regulator_dev *rdev)
		clk_disable_unprepare(sc->clocks[sc->root_clk_idx]);

	sc->is_gdsc_enabled = true;
	sc->skip_disable_before_enable = false;
end:
	if (ret && sc->bus_handle) {
		msm_bus_scale_client_update_request(sc->bus_handle, 0);
@@ -384,6 +386,16 @@ static int gdsc_disable(struct regulator_dev *rdev)
	uint32_t regval;
	int i, ret = 0;

	/*
	 * Protect GDSC against late_init disabling when the GDSC is enabled
	 * by an entity outside external to HLOS.
	 */
	if (sc->skip_disable_before_enable) {
		dev_dbg(&rdev->dev, "Skip Disabling: %s\n", sc->rdesc.name);
		sc->skip_disable_before_enable = false;
		return 0;
	}

	if (sc->force_root_en)
		clk_prepare_enable(sc->clocks[sc->root_clk_idx]);

@@ -670,6 +682,8 @@ static int gdsc_parse_dt_data(struct gdsc *sc, struct device *dev,
					"qcom,no-status-check-on-disable");
	sc->retain_ff_enable = of_property_read_bool(dev->of_node,
						"qcom,retain-regs");
	sc->skip_disable_before_enable = of_property_read_bool(dev->of_node,
					"qcom,skip-disable-before-sw-enable");

	sc->toggle_logic = !of_property_read_bool(dev->of_node,
						"qcom,skip-logic-collapse");