[PATCH AUTOSEL 6.17-5.15] clk: at91: clk-master: Add check for divide by 3
Sasha Levin
sashal at kernel.org
Sun Oct 26 07:48:57 PDT 2025
From: Ryan Wanner <Ryan.Wanner at microchip.com>
[ Upstream commit e0237f5635727d64635ec6665e1de9f4cacce35c ]
A potential divider for the master clock is div/3. The register
configuration for div/3 is MASTER_PRES_MAX. The current bit shifting
method does not work for this case. Checking for MASTER_PRES_MAX will
ensure the correct decimal value is stored in the system.
Signed-off-by: Ryan Wanner <Ryan.Wanner at microchip.com>
Signed-off-by: Nicolas Ferre <nicolas.ferre at microchip.com>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---
LLM Generated explanations, may be completely bogus:
YES – the change fixes a real bug in the sama7g5 master clock code with
minimal risk.
- `clk_sama7g5_master_recalc_rate()` now treats the special register
value used for divide-by-3, returning `parent_rate / 3` instead of
wrongly shifting by `1 << 7` and reporting a 1/128 rate
(drivers/clk/at91/clk-master.c:583). This corrects `clk_get_rate()`
for every consumer of the master clock when that divider is active.
- The rest of the sama7g5 clock logic already maps the same register
value to divide-by-3 (e.g. `clk_sama7g5_master_set_rate()` stores
`MASTER_PRES_MAX` for a /3 request), so the fix restores consistency
in the clock framework and prevents child clocks from inheriting a
bogus rate (drivers/clk/at91/clk-master.c:732).
- Other SoCs using the generic master clock ops are unaffected; the new
branch lives only in the sama7g5-specific implementation and matches
existing handling of this divider elsewhere in the driver
(drivers/clk/at91/clk-master.c:392).
Because the bug misreports hardware frequencies and can break downstream
rate selection, and the fix is self-contained and low risk, this commit
is a good candidate for stable backporting.
drivers/clk/at91/clk-master.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/clk/at91/clk-master.c b/drivers/clk/at91/clk-master.c
index 7a544e429d34e..d5ea2069ec83a 100644
--- a/drivers/clk/at91/clk-master.c
+++ b/drivers/clk/at91/clk-master.c
@@ -580,6 +580,9 @@ clk_sama7g5_master_recalc_rate(struct clk_hw *hw,
{
struct clk_master *master = to_clk_master(hw);
+ if (master->div == MASTER_PRES_MAX)
+ return DIV_ROUND_CLOSEST_ULL(parent_rate, 3);
+
return DIV_ROUND_CLOSEST_ULL(parent_rate, (1 << master->div));
}
--
2.51.0
More information about the linux-arm-kernel
mailing list