On Wed, 21 Dec 2022 at 18:14, Akhil P Oommen <quic_akhilpo@xxxxxxxxxxx> wrote: > > Add support for the newly added 'synced_poweroff' genpd flag. This allows > some clients (like adreno gpu driver) to request gdsc driver to ensure > a votable gdsc (like gpucc cx gdsc) has collapsed at hardware. > > Signed-off-by: Akhil P Oommen <quic_akhilpo@xxxxxxxxxxx> Reviewed-by: Ulf Hansson <ulf.hansson@xxxxxxxxxx> Kind regards Uffe > --- > > (no changes since v3) > > Changes in v3: > - Rename the var 'force_sync' to 'wait (Stephen) > > drivers/clk/qcom/gdsc.c | 11 ++++++----- > 1 file changed, 6 insertions(+), 5 deletions(-) > > diff --git a/drivers/clk/qcom/gdsc.c b/drivers/clk/qcom/gdsc.c > index 9e4d6ce891aa..5358e28122ab 100644 > --- a/drivers/clk/qcom/gdsc.c > +++ b/drivers/clk/qcom/gdsc.c > @@ -136,7 +136,8 @@ static int gdsc_update_collapse_bit(struct gdsc *sc, bool val) > return 0; > } > > -static int gdsc_toggle_logic(struct gdsc *sc, enum gdsc_status status) > +static int gdsc_toggle_logic(struct gdsc *sc, enum gdsc_status status, > + bool wait) > { > int ret; > > @@ -149,7 +150,7 @@ static int gdsc_toggle_logic(struct gdsc *sc, enum gdsc_status status) > ret = gdsc_update_collapse_bit(sc, status == GDSC_OFF); > > /* If disabling votable gdscs, don't poll on status */ > - if ((sc->flags & VOTABLE) && status == GDSC_OFF) { > + if ((sc->flags & VOTABLE) && status == GDSC_OFF && !wait) { > /* > * Add a short delay here to ensure that an enable > * right after it was disabled does not put it in an > @@ -275,7 +276,7 @@ static int gdsc_enable(struct generic_pm_domain *domain) > gdsc_deassert_clamp_io(sc); > } > > - ret = gdsc_toggle_logic(sc, GDSC_ON); > + ret = gdsc_toggle_logic(sc, GDSC_ON, false); > if (ret) > return ret; > > @@ -352,7 +353,7 @@ static int gdsc_disable(struct generic_pm_domain *domain) > if (sc->pwrsts == PWRSTS_RET_ON) > return 0; > > - ret = gdsc_toggle_logic(sc, GDSC_OFF); > + ret = gdsc_toggle_logic(sc, GDSC_OFF, domain->synced_poweroff); > if (ret) > return ret; > > @@ -392,7 +393,7 @@ static int gdsc_init(struct gdsc *sc) > > /* Force gdsc ON if only ON state is supported */ > if (sc->pwrsts == PWRSTS_ON) { > - ret = gdsc_toggle_logic(sc, GDSC_ON); > + ret = gdsc_toggle_logic(sc, GDSC_ON, false); > if (ret) > return ret; > } > -- > 2.7.4 >