[PATCH] ARM: at91: pm: switch backup area to vbat in backup mode

Nicolas Ferre nicolas.ferre at microchip.com
Tue Sep 14 07:58:08 PDT 2021


On 30/08/2021 at 12:09, Claudiu Beznea wrote:
> Backup area is now switched to VDDIN33 at boot (with the help of
> bootloader). When switching to backup mode we need to switch backup area
> to VBAT as all the other power sources are cut off. The resuming from
> backup mode is done with the help of bootloader, so there is no need to
> do something particular in Linux to restore backup area power source.
> 
> Signed-off-by: Claudiu Beznea <claudiu.beznea at microchip.com>

Acked-by: Nicolas Ferre <nicolas.ferre at microchip.com>

And queued to at91-fixes for 5.15.

Best regards,
   Nicolas


> ---
> 
> Hi Nicolas,
> 
> This applies clean on top of patch with title
> "ARM: at91: pm: do not panic if ram controllers are not enabled"
> 
> Thank you,
> Claudiu Beznea
> 
>   arch/arm/mach-at91/pm.c | 52 +++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 52 insertions(+)
> 
> diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c
> index d92afca64b49..8711d6824c1f 100644
> --- a/arch/arm/mach-at91/pm.c
> +++ b/arch/arm/mach-at91/pm.c
> @@ -47,12 +47,26 @@ struct at91_pm_bu {
>   	unsigned long ddr_phy_calibration[BACKUP_DDR_PHY_CALIBRATION];
>   };
>   
> +/*
> + * struct at91_pm_sfrbu_offsets: registers mapping for SFRBU
> + * @pswbu: power switch BU control registers
> + */
> +struct at91_pm_sfrbu_regs {
> +	struct {
> +		u32 key;
> +		u32 ctrl;
> +		u32 state;
> +		u32 softsw;
> +	} pswbu;
> +};
> +
>   /**
>    * struct at91_soc_pm - AT91 SoC power management data structure
>    * @config_shdwc_ws: wakeup sources configuration function for SHDWC
>    * @config_pmc_ws: wakeup srouces configuration function for PMC
>    * @ws_ids: wakup sources of_device_id array
>    * @data: PM data to be used on last phase of suspend
> + * @sfrbu_regs: SFRBU registers mapping
>    * @bu: backup unit mapped data (for backup mode)
>    * @memcs: memory chip select
>    */
> @@ -62,6 +76,7 @@ struct at91_soc_pm {
>   	const struct of_device_id *ws_ids;
>   	struct at91_pm_bu *bu;
>   	struct at91_pm_data data;
> +	struct at91_pm_sfrbu_regs sfrbu_regs;
>   	void *memcs;
>   };
>   
> @@ -356,9 +371,36 @@ static int at91_suspend_finish(unsigned long val)
>   	return 0;
>   }
>   
> +static void at91_pm_switch_ba_to_vbat(void)
> +{
> +	unsigned int offset = offsetof(struct at91_pm_sfrbu_regs, pswbu);
> +	unsigned int val;
> +
> +	/* Just for safety. */
> +	if (!soc_pm.data.sfrbu)
> +		return;
> +
> +	val = readl(soc_pm.data.sfrbu + offset);
> +
> +	/* Already on VBAT. */
> +	if (!(val & soc_pm.sfrbu_regs.pswbu.state))
> +		return;
> +
> +	val &= ~soc_pm.sfrbu_regs.pswbu.softsw;
> +	val |= soc_pm.sfrbu_regs.pswbu.key | soc_pm.sfrbu_regs.pswbu.ctrl;
> +	writel(val, soc_pm.data.sfrbu + offset);
> +
> +	/* Wait for update. */
> +	val = readl(soc_pm.data.sfrbu + offset);
> +	while (val & soc_pm.sfrbu_regs.pswbu.state)
> +		val = readl(soc_pm.data.sfrbu + offset);
> +}
> +
>   static void at91_pm_suspend(suspend_state_t state)
>   {
>   	if (soc_pm.data.mode == AT91_PM_BACKUP) {
> +		at91_pm_switch_ba_to_vbat();
> +
>   		cpu_suspend(0, at91_suspend_finish);
>   
>   		/* The SRAM is lost between suspend cycles */
> @@ -1155,6 +1197,11 @@ void __init sama5d2_pm_init(void)
>   	soc_pm.ws_ids = sama5d2_ws_ids;
>   	soc_pm.config_shdwc_ws = at91_sama5d2_config_shdwc_ws;
>   	soc_pm.config_pmc_ws = at91_sama5d2_config_pmc_ws;
> +
> +	soc_pm.sfrbu_regs.pswbu.key = (0x4BD20C << 8);
> +	soc_pm.sfrbu_regs.pswbu.ctrl = BIT(0);
> +	soc_pm.sfrbu_regs.pswbu.softsw = BIT(1);
> +	soc_pm.sfrbu_regs.pswbu.state = BIT(3);
>   }
>   
>   void __init sama7_pm_init(void)
> @@ -1185,6 +1232,11 @@ void __init sama7_pm_init(void)
>   
>   	soc_pm.ws_ids = sama7g5_ws_ids;
>   	soc_pm.config_pmc_ws = at91_sam9x60_config_pmc_ws;
> +
> +	soc_pm.sfrbu_regs.pswbu.key = (0x4BD20C << 8);
> +	soc_pm.sfrbu_regs.pswbu.ctrl = BIT(0);
> +	soc_pm.sfrbu_regs.pswbu.softsw = BIT(1);
> +	soc_pm.sfrbu_regs.pswbu.state = BIT(2);
>   }
>   
>   static int __init at91_pm_modes_select(char *str)
> 


-- 
Nicolas Ferre



More information about the linux-arm-kernel mailing list