On Fri, May 31, 2024 at 05:11:48PM GMT, Taniya Das wrote: > In the cases where the power domain connected to logics is allowed to > transition from a level(L)-->power collapse(0)-->retention(1) or > vice versa retention(1)-->power collapse(0)-->level(L) will cause the > logic to lose the configurations. The ARC does not support retention > to collapse transition on MxC rails. > > The targets from SM8450 onwards the PLL logics of clock controllers are > connected to MxC rails and the recommended configurations are carried > out during the clock controller probes. The MxC transition as mentioned > above should be skipped to ensure the PLL settings are intact across > clock controller power on & off. > > On older generation of targets which supports only Mx the logic is never > collapsed and it is parked always at RETENTION, thus this issue is never > observed on those targets. > Cc: stable@xxxxxxxxxxxxxxx # v5.17 Reviewed-by: Bjorn Andersson <andersson@xxxxxxxxxx> Regards, Bjorn > Signed-off-by: Taniya Das <quic_tdas@xxxxxxxxxxx> > --- > drivers/pmdomain/qcom/rpmhpd.c | 7 +++++++ > 1 file changed, 7 insertions(+) > --- > drivers/pmdomain/qcom/rpmhpd.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/drivers/pmdomain/qcom/rpmhpd.c b/drivers/pmdomain/qcom/rpmhpd.c > index de9121ef4216..d2cb4271a1ca 100644 > --- a/drivers/pmdomain/qcom/rpmhpd.c > +++ b/drivers/pmdomain/qcom/rpmhpd.c > @@ -40,6 +40,7 @@ > * @addr: Resource address as looped up using resource name from > * cmd-db > * @state_synced: Indicator that sync_state has been invoked for the rpmhpd resource > + * @skip_retention_level: Indicate that retention level should not be used for the power domain > */ > struct rpmhpd { > struct device *dev; > @@ -56,6 +57,7 @@ struct rpmhpd { > const char *res_name; > u32 addr; > bool state_synced; > + bool skip_retention_level; > }; > > struct rpmhpd_desc { > @@ -173,6 +175,7 @@ static struct rpmhpd mxc = { > .pd = { .name = "mxc", }, > .peer = &mxc_ao, > .res_name = "mxc.lvl", > + .skip_retention_level = true, > }; > > static struct rpmhpd mxc_ao = { > @@ -180,6 +183,7 @@ static struct rpmhpd mxc_ao = { > .active_only = true, > .peer = &mxc, > .res_name = "mxc.lvl", > + .skip_retention_level = true, > }; > > static struct rpmhpd nsp = { > @@ -819,6 +823,9 @@ static int rpmhpd_update_level_mapping(struct rpmhpd *rpmhpd) > return -EINVAL; > > for (i = 0; i < rpmhpd->level_count; i++) { > + if (rpmhpd->skip_retention_level && buf[i] == RPMH_REGULATOR_LEVEL_RETENTION) > + continue; > + > rpmhpd->level[i] = buf[i]; > > /* Remember the first corner with non-zero level */ > -- > 2.17.1 >