[PATCH v2] ram: stm32mp1: Conditionally enable ASR
Patrice CHOTARD
patrice.chotard at foss.st.com
Tue May 10 09:48:30 CEST 2022
On 4/26/22 16:37, Marek Vasut wrote:
> Enable DRAM ASR, auto self-refresh, conditionally, based on DT PWRCTL
> register bits. While ASR does save considerable amount of power at
> runtime automatically, it also causes LTDC underruns on large panels.
> Let user select whether or not ASR is required or not, generally ASR
> should be enabled on portable and battery operated devices.
>
> Signed-off-by: Marek Vasut <marex at denx.de>
> Cc: Patrick Delaunay <patrick.delaunay at foss.st.com>
> Cc: Patrice Chotard <patrice.chotard at foss.st.com>
> ---
> V2: Infer ASR settings from DT PWRCTL
> ---
> drivers/ram/stm32mp1/stm32mp1_ddr.c | 14 +++++++++++---
> 1 file changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/ram/stm32mp1/stm32mp1_ddr.c b/drivers/ram/stm32mp1/stm32mp1_ddr.c
> index 528a171b454..ab913a68761 100644
> --- a/drivers/ram/stm32mp1/stm32mp1_ddr.c
> +++ b/drivers/ram/stm32mp1/stm32mp1_ddr.c
> @@ -653,10 +653,14 @@ static void stm32mp1_refresh_restore(struct stm32mp1_ddrctl *ctl,
> wait_sw_done_ack(ctl);
> }
>
> -static void stm32mp1_asr_enable(struct ddr_info *priv)
> +static void stm32mp1_asr_enable(struct ddr_info *priv, const u32 pwrctl)
> {
> struct stm32mp1_ddrctl *ctl = priv->ctl;
>
> + /* SSR is the best we can do. */
> + if (!(pwrctl & DDRCTRL_PWRCTL_EN_DFI_DRAM_CLK_DISABLE))
> + return;
> +
> clrsetbits_le32(priv->rcc + RCC_DDRITFCR, RCC_DDRITFCR_DDRCKMOD_MASK,
> RCC_DDRITFCR_DDRCKMOD_ASR);
>
> @@ -666,8 +670,12 @@ static void stm32mp1_asr_enable(struct ddr_info *priv)
> writel(DDRCTRL_PWRTMG_POWERDOWN_TO_X32(0x10) |
> DDRCTRL_PWRTMG_SELFREF_TO_X32(0x01),
> &ctl->pwrtmg);
> +
> + /* HSR we can do. */
> setbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_EN_DFI_DRAM_CLK_DISABLE);
> - setbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_SELFREF_EN);
> +
> + if (pwrctl & DDRCTRL_PWRCTL_SELFREF_EN) /* ASR we can do. */
> + setbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_SELFREF_EN);
>
> setbits_le32(&ctl->dfimisc, DDRCTRL_DFIMISC_DFI_INIT_COMPLETE_EN);
> wait_sw_done_ack(ctl);
> @@ -845,7 +853,7 @@ start:
> config->c_reg.pwrctl);
>
> /* Enable auto-self-refresh, which saves a bit of power at runtime. */
> - stm32mp1_asr_enable(priv);
> + stm32mp1_asr_enable(priv, config->c_reg.pwrctl);
>
> /* enable uMCTL2 AXI port 0 and 1 */
> setbits_le32(&priv->ctl->pctrl_0, DDRCTRL_PCTRL_N_PORT_EN);
Applied to u-boot-stm32
Thanks
Patrice
More information about the U-Boot
mailing list