[PATCH v4 05/16] clk: at91: Allow enabling main_rc_osc through DT

From: Alexander Dahl

Date: Thu Nov 05 2026 - 07:15:21 EST


SAM9X60 Datasheet (DS60001579G) Section "23.4 Product Dependencies"
states:

"The OTPC is clocked through the Power Management Controller (PMC).
The user must power on the main RC oscillator and enable the
peripheral clock of the OTPC prior to reading or writing the OTP
memory."

The code for enabling/disabling the main rc oscillator clock is already
present, however, after the at91 clock device tree binding rework in
2018 (kernel v4.19), it was no longer possible to hook it up via DT.

Export the main RC oscillator for all SoCs featuring an OTPC controller
where the main RC oscillator is required for proper operation.

Signed-off-by: Alexander Dahl <ada@xxxxxxxxxxx>
---

Notes:
v4:
- reword commit message

v3:
- no changes

v2:
- split out dt-bindings changes into separate patch
- extend to drivers for other SoCs providing the OTPC

drivers/clk/at91/sam9x60.c | 1 +
drivers/clk/at91/sam9x7.c | 1 +
drivers/clk/at91/sama7d65.c | 1 +
drivers/clk/at91/sama7g5.c | 1 +
4 files changed, 4 insertions(+)

diff --git a/drivers/clk/at91/sam9x60.c b/drivers/clk/at91/sam9x60.c
index eba6e8c16044d..4a7ff559522eb 100644
--- a/drivers/clk/at91/sam9x60.c
+++ b/drivers/clk/at91/sam9x60.c
@@ -227,6 +227,7 @@ static void __init sam9x60_pmc_setup(struct device_node *np)
50000000);
if (IS_ERR(hw))
goto err_free;
+ sam9x60_pmc->chws[SAM9X60_PMC_MAIN_RC] = hw;

hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, NULL, 0);
if (IS_ERR(hw))
diff --git a/drivers/clk/at91/sam9x7.c b/drivers/clk/at91/sam9x7.c
index 1fc4b01a04abf..194a8e44aa0ec 100644
--- a/drivers/clk/at91/sam9x7.c
+++ b/drivers/clk/at91/sam9x7.c
@@ -763,6 +763,7 @@ static void __init sam9x7_pmc_setup(struct device_node *np)
50000000);
if (IS_ERR(hw))
goto err_free;
+ sam9x7_pmc->chws[SAM9X7_PMC_MAIN_RC] = hw;

hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, NULL, 0);
if (IS_ERR(hw))
diff --git a/drivers/clk/at91/sama7d65.c b/drivers/clk/at91/sama7d65.c
index 0b5356467fa52..ef54d2fa6cf40 100644
--- a/drivers/clk/at91/sama7d65.c
+++ b/drivers/clk/at91/sama7d65.c
@@ -1138,6 +1138,7 @@ static void __init sama7d65_pmc_setup(struct device_node *np)
50000000);
if (IS_ERR(main_rc_hw))
goto err_free;
+ sama7d65_pmc->chws[SAMA7D65_PMC_MAIN_RC] = hw;

bypass = of_property_read_bool(np, "atmel,osc-bypass");

diff --git a/drivers/clk/at91/sama7g5.c b/drivers/clk/at91/sama7g5.c
index 99b4c1d9bdcca..9a6f0f30b2b7e 100644
--- a/drivers/clk/at91/sama7g5.c
+++ b/drivers/clk/at91/sama7g5.c
@@ -1014,6 +1014,7 @@ static void __init sama7g5_pmc_setup(struct device_node *np)
50000000);
if (IS_ERR(main_rc_hw))
goto err_free;
+ sama7g5_pmc->chws[SAMA7G5_PMC_MAIN_RC] = hw;

bypass = of_property_read_bool(np, "atmel,osc-bypass");

--
2.47.3