Message ID | 20240625-avoid_mxc_retention-v2-1-af9c2f549a5f@quicinc.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | [v2] pmdomain: qcom: rpmhpd: Skip retention level for Power Domains | expand |
On Tue, 25 Jun 2024 at 06:33, Taniya Das <quic_tdas@quicinc.com> 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 targets that do not split MX into MxA and MxC does not collapse > the logic and it is parked always at RETENTION, thus this issue is never > observed on those targets. > > Cc: stable@vger.kernel.org # v5.17 > Reviewed-by: Bjorn Andersson <andersson@kernel.org> > Signed-off-by: Taniya Das <quic_tdas@quicinc.com> Applied for fixes, thanks! Kind regards Uffe > --- > [Changes in v2]: Incorporate the comments in the commit text. > --- > 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 */ > > --- > base-commit: 62c97045b8f720c2eac807a5f38e26c9ed512371 > change-id: 20240625-avoid_mxc_retention-b095a761d981 > > Best regards, > -- > Taniya Das <quic_tdas@quicinc.com> >
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 */