[PATCH AUTOSEL 6.17-5.10] ARM: at91: pm: save and restore ACR during PLL disable/enable

Sasha Levin sashal at kernel.org
Sun Oct 26 07:48:55 PDT 2025


From: Nicolas Ferre <nicolas.ferre at microchip.com>

[ Upstream commit 0c01fe49651d387776abed6a28541e80c8a93319 ]

Add a new word in assembly to store ACR value during the calls
to at91_plla_disable/at91_plla_enable macros and use it.

Signed-off-by: Nicolas Ferre <nicolas.ferre at microchip.com>
[cristian.birsan at microchip.com: remove ACR_DEFAULT_PLLA loading]
Signed-off-by: Cristian Birsan <cristian.birsan at microchip.com>
Link: https://lore.kernel.org/r/20250827145427.46819-4-nicolas.ferre@microchip.com
Reviewed-by: Alexandre Belloni <alexandre.belloni at bootlin.com>
Signed-off-by: Claudiu Beznea <claudiu.beznea at tuxon.dev>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---

LLM Generated explanations, may be completely bogus:

YES – the patch fixes a real suspend/resume regression on the
SAM9X60-style PLLs and is safe to backport.

- `arch/arm/mach-at91/pm_suspend.S:693-767` now snapshots the PMC PLL
  Analog Control Register before disabling PLLA and restores that exact
  value when the PLL comes back up, instead of blindly reloading the
  legacy default `0x00020010`. Without this, every suspend cycle
  overwrote any board-/SoC-specific analog tuning done at boot, so PLLA
  resumed with the wrong charge-pump/loop-filter settings.
- The saved word added at `arch/arm/mach-at91/pm_suspend.S:1214-1215` is
  the only state needed; no other logic changes are introduced.
- Multiple SAM9X60-family clock descriptions (for example
  `drivers/clk/at91/sama7g5.c:110-126`,
  `drivers/clk/at91/sam9x60.c:39-52`) program PLL-specific `acr` values
  via `clk-sam9x60-pll.c`, and that driver explicitly writes those
  values into PMC_PLL_ACR before enabling the PLL
  (`drivers/clk/at91/clk-sam9x60-pll.c:106-134`). After suspend, the old
  code immediately replaced them with `AT91_PMC_PLL_ACR_DEFAULT_PLLA`,
  undoing the driver’s configuration and risking unlock or unstable
  clocks on affected boards.
- The regression has existed since the original SAM9X60 PLL support
  (`4fd36e458392`), so every stable kernel that supports these SoCs can
  lose PLL configuration across low-power transitions. The fix is
  minimal, architecture-local, and does not alter behaviour on older PMC
  version 1 platforms because the new code is gated by both the PMC
  version check and `CONFIG_HAVE_AT91_SAM9X60_PLL`.

Given the clear bug fix, confined scope, and lack of risky side effects,
this change fits the stable backport criteria. A good follow-up when
backporting is to run a suspend/resume cycle on a SAM9X60/SAMA7 board to
confirm PLL lock persists.

 arch/arm/mach-at91/pm_suspend.S | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-at91/pm_suspend.S b/arch/arm/mach-at91/pm_suspend.S
index 7e6c94f8edeef..aad53ec9e957b 100644
--- a/arch/arm/mach-at91/pm_suspend.S
+++ b/arch/arm/mach-at91/pm_suspend.S
@@ -689,6 +689,10 @@ sr_dis_exit:
 	bic	tmp2, tmp2, #AT91_PMC_PLL_UPDT_ID
 	str	tmp2, [pmc, #AT91_PMC_PLL_UPDT]
 
+	/* save acr */
+	ldr	tmp2, [pmc, #AT91_PMC_PLL_ACR]
+	str	tmp2, .saved_acr
+
 	/* save div. */
 	mov	tmp1, #0
 	ldr	tmp2, [pmc, #AT91_PMC_PLL_CTRL0]
@@ -758,7 +762,7 @@ sr_dis_exit:
 	str	tmp1, [pmc, #AT91_PMC_PLL_UPDT]
 
 	/* step 2. */
-	ldr	tmp1, =AT91_PMC_PLL_ACR_DEFAULT_PLLA
+	ldr	tmp1, .saved_acr
 	str	tmp1, [pmc, #AT91_PMC_PLL_ACR]
 
 	/* step 3. */
@@ -1207,6 +1211,8 @@ ENDPROC(at91_pm_suspend_in_sram)
 #endif
 .saved_mckr:
 	.word 0
+.saved_acr:
+	.word 0
 .saved_pllar:
 	.word 0
 .saved_sam9_lpr:
-- 
2.51.0




More information about the linux-arm-kernel mailing list