From a1cd991f30bdbae06f9b212102a7d9e9ba1646d3 Mon Sep 17 00:00:00 2001 From: Naveen Yadav Date: Fri, 10 Apr 2020 14:59:01 +0530 Subject: [PATCH 1/2] 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: Naveen Yadav --- drivers/clk/qcom/gdsc-regulator.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/clk/qcom/gdsc-regulator.c b/drivers/clk/qcom/gdsc-regulator.c index 332a964ceb7e..4db1666ea964 100644 --- a/drivers/clk/qcom/gdsc-regulator.c +++ b/drivers/clk/qcom/gdsc-regulator.c @@ -74,6 +74,7 @@ struct gdsc { int reset_count; int root_clk_idx; u32 gds_timeout; + bool skip_disable_before_enable; }; enum gdscr_status { @@ -313,6 +314,7 @@ static int gdsc_enable(struct regulator_dev *rdev) } sc->is_gdsc_enabled = true; + sc->skip_disable_before_enable = false; return ret; } @@ -323,6 +325,16 @@ static int gdsc_disable(struct regulator_dev *rdev) uint32_t regval; int i, ret = 0, parent_enabled; + /* + * 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 (rdev->supply) { regulator_lock(rdev->supply->rdev); parent_enabled = regulator_is_enabled(rdev->supply); @@ -606,6 +618,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"); if (of_find_property(dev->of_node, "qcom,collapse-vote", NULL)) { ret = of_property_count_u32_elems(dev->of_node, From 6cf1bd40649c855b71e7345b2b5ad4e5a053c4ca Mon Sep 17 00:00:00 2001 From: Naveen Yadav Date: Tue, 12 May 2020 19:32:02 +0530 Subject: [PATCH 2/2] clk: qcom: gdsc-regulator: Update support to skip GDSC disable Update gdsc_is_enable and gdsc_enable to return 0 for the GDSC which needs only GDSC disable support from HLOS. Change-Id: Ie1e9faf806f504fc56419c5c557d3063d031d804 Signed-off-by: Naveen Yadav --- drivers/clk/qcom/gdsc-regulator.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/drivers/clk/qcom/gdsc-regulator.c b/drivers/clk/qcom/gdsc-regulator.c index 4db1666ea964..2c5e253f640b 100644 --- a/drivers/clk/qcom/gdsc-regulator.c +++ b/drivers/clk/qcom/gdsc-regulator.c @@ -163,6 +163,9 @@ static int gdsc_is_enabled(struct regulator_dev *rdev) if (!sc->toggle_logic) return !sc->resets_asserted; + if (sc->skip_disable_before_enable) + return false; + return sc->is_gdsc_enabled; } @@ -172,6 +175,9 @@ static int gdsc_enable(struct regulator_dev *rdev) uint32_t regval, hw_ctrl_regval = 0x0; int i, ret = 0; + if (sc->skip_disable_before_enable) + return 0; + if (sc->root_en || sc->force_root_en) { clk_prepare_enable(sc->clocks[sc->root_clk_idx]); sc->is_root_clk_voted = true; @@ -314,7 +320,6 @@ static int gdsc_enable(struct regulator_dev *rdev) } sc->is_gdsc_enabled = true; - sc->skip_disable_before_enable = false; return ret; } @@ -325,16 +330,6 @@ static int gdsc_disable(struct regulator_dev *rdev) uint32_t regval; int i, ret = 0, parent_enabled; - /* - * 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 (rdev->supply) { regulator_lock(rdev->supply->rdev); parent_enabled = regulator_is_enabled(rdev->supply);