* [PATCH v4 0/4] Support spread spectrum clocking for stm32f{4,7} platforms
@ 2025-01-14 18:19 Dario Binacchi
2025-01-14 18:19 ` [PATCH v4 1/4] dt-bindings: clock: convert stm32 rcc bindings to json-schema Dario Binacchi
` (3 more replies)
0 siblings, 4 replies; 11+ messages in thread
From: Dario Binacchi @ 2025-01-14 18:19 UTC (permalink / raw)
To: linux-kernel
Cc: linux-amarula, Dario Binacchi, Alexandre Torgue, Conor Dooley,
Krzysztof Kozlowski, Maxime Coquelin, Michael Turquette,
Philipp Zabel, Rob Herring, Stephen Boyd, devicetree,
linux-arm-kernel, linux-clk, linux-stm32
The series adds support for spread spectrum clocking for stm32f{4,7}
main PLL.
To achieve this, it was considered necessary to also apply patches to
improve the documentation (conversion of `st,stm32-rcc.txt` according to
the json-schema) and the code (use of FIELD helpers).
The series has been tested on the STM32F469I-DISCO board.
Changes in v4:
- Improve the compatible property in patch 1/4 "dt-bindings: clock:
convert stm32 rcc bindings to json-schema"
Changes in v3:
- Changes to patch 4/4 "clk: stm32f4: support spread spectrum clock generation"
according to Stephen Boyd's suggestions.
Changes in v2:
- Fixup patches:
2/6 dt-bindings: reset: st,stm32-rcc: update reference due to rename
3/6 dt-bindings: clock: stm32fx: update reference due to rename
to
1/6 dt-bindings: clock: convert stm32 rcc bindings to json-schema
- Changes to dt-bindings: clock: convert stm32 rcc bindings to json-schema
- Changes to dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking
Dario Binacchi (4):
dt-bindings: clock: convert stm32 rcc bindings to json-schema
dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking
clk: stm32f4: use FIELD helpers to access the PLLCFGR fields
clk: stm32f4: support spread spectrum clock generation
.../bindings/clock/st,stm32-rcc.txt | 138 ----------------
.../bindings/clock/st,stm32-rcc.yaml | 144 ++++++++++++++++
.../bindings/reset/st,stm32-rcc.txt | 2 +-
drivers/clk/clk-stm32f4.c | 155 +++++++++++++++++-
include/dt-bindings/clock/stm32fx-clock.h | 2 +-
5 files changed, 295 insertions(+), 146 deletions(-)
delete mode 100644 Documentation/devicetree/bindings/clock/st,stm32-rcc.txt
create mode 100644 Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
--
2.43.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v4 1/4] dt-bindings: clock: convert stm32 rcc bindings to json-schema
2025-01-14 18:19 [PATCH v4 0/4] Support spread spectrum clocking for stm32f{4,7} platforms Dario Binacchi
@ 2025-01-14 18:19 ` Dario Binacchi
2025-01-15 23:22 ` Stephen Boyd
2025-01-14 18:19 ` [PATCH v4 2/4] dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking Dario Binacchi
` (2 subsequent siblings)
3 siblings, 1 reply; 11+ messages in thread
From: Dario Binacchi @ 2025-01-14 18:19 UTC (permalink / raw)
To: linux-kernel
Cc: linux-amarula, Dario Binacchi, Krzysztof Kozlowski,
Alexandre Torgue, Conor Dooley, Krzysztof Kozlowski,
Maxime Coquelin, Michael Turquette, Philipp Zabel, Rob Herring,
Stephen Boyd, devicetree, linux-arm-kernel, linux-clk,
linux-stm32
The patch converts st,stm32-rcc.txt to the JSON schema, but it does more
than that. The old bindings, in fact, only covered the stm32f{4,7}
platforms and not the stm32h7. Therefore, to avoid patch submission tests
failing, it was necessary to add the corresponding compatible (i. e.
st,stm32h743-rcc) and specify that, in this case, 3 are the clocks instead
of the 2 required for the stm32f{4,7} platforms.
Additionally, the old bindings made no mention of the st,syscfg property,
which is used by both the stm32f{4,7} and the stm32h7 platforms.
The patch also fixes the files referencing to the old st,stm32-rcc.txt.
Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
Changes in v4:
- Put st,stm32f746-rcc and st,stm32h743-rcc under the enum of first
group.
Changes in v3:
- Add 'Reviewed-by' tag of Krzysztof Kozlowski
Changes in v2:
- Fixup patches:
2/6 dt-bindings: reset: st,stm32-rcc: update reference due to rename
3/6 dt-bindings: clock: stm32fx: update reference due to rename
- Update the commit message
- Reduce the description section of the yaml file
- List the items with description for the clocks property
- Use only one example
- Rename rcc to clock-controller@58024400 for the node of the example
.../bindings/clock/st,stm32-rcc.txt | 138 ------------------
.../bindings/clock/st,stm32-rcc.yaml | 108 ++++++++++++++
.../bindings/reset/st,stm32-rcc.txt | 2 +-
include/dt-bindings/clock/stm32fx-clock.h | 2 +-
4 files changed, 110 insertions(+), 140 deletions(-)
delete mode 100644 Documentation/devicetree/bindings/clock/st,stm32-rcc.txt
create mode 100644 Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
diff --git a/Documentation/devicetree/bindings/clock/st,stm32-rcc.txt b/Documentation/devicetree/bindings/clock/st,stm32-rcc.txt
deleted file mode 100644
index cfa04b614d8a..000000000000
--- a/Documentation/devicetree/bindings/clock/st,stm32-rcc.txt
+++ /dev/null
@@ -1,138 +0,0 @@
-STMicroelectronics STM32 Reset and Clock Controller
-===================================================
-
-The RCC IP is both a reset and a clock controller.
-
-Please refer to clock-bindings.txt for common clock controller binding usage.
-Please also refer to reset.txt for common reset controller binding usage.
-
-Required properties:
-- compatible: Should be:
- "st,stm32f42xx-rcc"
- "st,stm32f469-rcc"
- "st,stm32f746-rcc"
- "st,stm32f769-rcc"
-
-- reg: should be register base and length as documented in the
- datasheet
-- #reset-cells: 1, see below
-- #clock-cells: 2, device nodes should specify the clock in their "clocks"
- property, containing a phandle to the clock device node, an index selecting
- between gated clocks and other clocks and an index specifying the clock to
- use.
-- clocks: External oscillator clock phandle
- - high speed external clock signal (HSE)
- - external I2S clock (I2S_CKIN)
-
-Example:
-
- rcc: rcc@40023800 {
- #reset-cells = <1>;
- #clock-cells = <2>
- compatible = "st,stm32f42xx-rcc", "st,stm32-rcc";
- reg = <0x40023800 0x400>;
- clocks = <&clk_hse>, <&clk_i2s_ckin>;
- };
-
-Specifying gated clocks
-=======================
-
-The primary index must be set to 0.
-
-The secondary index is the bit number within the RCC register bank, starting
-from the first RCC clock enable register (RCC_AHB1ENR, address offset 0x30).
-
-It is calculated as: index = register_offset / 4 * 32 + bit_offset.
-Where bit_offset is the bit offset within the register (LSB is 0, MSB is 31).
-
-To simplify the usage and to share bit definition with the reset and clock
-drivers of the RCC IP, macros are available to generate the index in
-human-readble format.
-
-For STM32F4 series, the macro are available here:
- - include/dt-bindings/mfd/stm32f4-rcc.h
-
-Example:
-
- /* Gated clock, AHB1 bit 0 (GPIOA) */
- ... {
- clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOA)>
- };
-
- /* Gated clock, AHB2 bit 4 (CRYP) */
- ... {
- clocks = <&rcc 0 STM32F4_AHB2_CLOCK(CRYP)>
- };
-
-Specifying other clocks
-=======================
-
-The primary index must be set to 1.
-
-The secondary index is bound with the following magic numbers:
-
- 0 SYSTICK
- 1 FCLK
- 2 CLK_LSI (low-power clock source)
- 3 CLK_LSE (generated from a 32.768 kHz low-speed external
- crystal or ceramic resonator)
- 4 CLK_HSE_RTC (HSE division factor for RTC clock)
- 5 CLK_RTC (real-time clock)
- 6 PLL_VCO_I2S (vco frequency of I2S pll)
- 7 PLL_VCO_SAI (vco frequency of SAI pll)
- 8 CLK_LCD (LCD-TFT)
- 9 CLK_I2S (I2S clocks)
- 10 CLK_SAI1 (audio clocks)
- 11 CLK_SAI2
- 12 CLK_I2SQ_PDIV (post divisor of pll i2s q divisor)
- 13 CLK_SAIQ_PDIV (post divisor of pll sai q divisor)
-
- 14 CLK_HSI (Internal ocscillator clock)
- 15 CLK_SYSCLK (System Clock)
- 16 CLK_HDMI_CEC (HDMI-CEC clock)
- 17 CLK_SPDIF (SPDIF-Rx clock)
- 18 CLK_USART1 (U(s)arts clocks)
- 19 CLK_USART2
- 20 CLK_USART3
- 21 CLK_UART4
- 22 CLK_UART5
- 23 CLK_USART6
- 24 CLK_UART7
- 25 CLK_UART8
- 26 CLK_I2C1 (I2S clocks)
- 27 CLK_I2C2
- 28 CLK_I2C3
- 29 CLK_I2C4
- 30 CLK_LPTIMER (LPTimer1 clock)
- 31 CLK_PLL_SRC
- 32 CLK_DFSDM1
- 33 CLK_ADFSDM1
- 34 CLK_F769_DSI
-)
-
-Example:
-
- /* Misc clock, FCLK */
- ... {
- clocks = <&rcc 1 STM32F4_APB1_CLOCK(TIM2)>
- };
-
-
-Specifying softreset control of devices
-=======================================
-
-Device nodes should specify the reset channel required in their "resets"
-property, containing a phandle to the reset device node and an index specifying
-which channel to use.
-The index is the bit number within the RCC registers bank, starting from RCC
-base address.
-It is calculated as: index = register_offset / 4 * 32 + bit_offset.
-Where bit_offset is the bit offset within the register.
-For example, for CRC reset:
- crc = AHB1RSTR_offset / 4 * 32 + CRCRST_bit_offset = 0x10 / 4 * 32 + 12 = 140
-
-example:
-
- timer2 {
- resets = <&rcc STM32F4_APB1_RESET(TIM2)>;
- };
diff --git a/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml b/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
new file mode 100644
index 000000000000..8f2494a0b28e
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
@@ -0,0 +1,108 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/st,stm32-rcc.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: STMicroelectronics STM32 Reset Clock Controller
+
+maintainers:
+ - Dario Binacchi <dario.binacchi@amarulasolutions.com>
+
+description: |
+ The RCC IP is both a reset and a clock controller.
+ The reset phandle argument is the bit number within the RCC registers bank,
+ starting from RCC base address.
+
+properties:
+ compatible:
+ oneOf:
+ - items:
+ - enum:
+ - st,stm32f42xx-rcc
+ - st,stm32f746-rcc
+ - st,stm32h743-rcc
+ - const: st,stm32-rcc
+ - items:
+ - enum:
+ - st,stm32f469-rcc
+ - const: st,stm32f42xx-rcc
+ - const: st,stm32-rcc
+ - items:
+ - enum:
+ - st,stm32f769-rcc
+ - const: st,stm32f746-rcc
+ - const: st,stm32-rcc
+
+ reg:
+ maxItems: 1
+
+ '#reset-cells':
+ const: 1
+
+ '#clock-cells':
+ enum: [1, 2]
+
+ clocks:
+ minItems: 2
+ maxItems: 3
+
+ st,syscfg:
+ $ref: /schemas/types.yaml#/definitions/phandle
+ description:
+ Phandle to system configuration controller. It can be used to control the
+ power domain circuitry.
+
+required:
+ - compatible
+ - reg
+ - '#reset-cells'
+ - '#clock-cells'
+ - clocks
+ - st,syscfg
+
+allOf:
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: st,stm32h743-rcc
+ then:
+ properties:
+ '#clock-cells':
+ const: 1
+ description: |
+ The clock index for the specified type.
+ clocks:
+ items:
+ - description: high speed external (HSE) clock input
+ - description: low speed external (LSE) clock input
+ - description: Inter-IC sound (I2S) clock input
+ else:
+ properties:
+ '#clock-cells':
+ const: 2
+ description: |
+ - The first cell is the clock type, possible values are 0 for
+ gated clocks and 1 otherwise.
+ - The second cell is the clock index for the specified type.
+ clocks:
+ items:
+ - description: high speed external (HSE) clock input
+ - description: Inter-IC sound (I2S) clock input
+
+additionalProperties: false
+
+examples:
+ # Reset and Clock Control Module node:
+ - |
+ clock-controller@58024400 {
+ compatible = "st,stm32h743-rcc", "st,stm32-rcc";
+ reg = <0x58024400 0x400>;
+ #clock-cells = <1>;
+ #reset-cells = <1>;
+ clocks = <&clk_hse>, <&clk_lse>, <&clk_i2s>;
+ st,syscfg = <&pwrcfg>;
+ };
+
+...
diff --git a/Documentation/devicetree/bindings/reset/st,stm32-rcc.txt b/Documentation/devicetree/bindings/reset/st,stm32-rcc.txt
index 01db34375192..384035e8e60b 100644
--- a/Documentation/devicetree/bindings/reset/st,stm32-rcc.txt
+++ b/Documentation/devicetree/bindings/reset/st,stm32-rcc.txt
@@ -3,4 +3,4 @@ STMicroelectronics STM32 Peripheral Reset Controller
The RCC IP is both a reset and a clock controller.
-Please see Documentation/devicetree/bindings/clock/st,stm32-rcc.txt
+Please see Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
diff --git a/include/dt-bindings/clock/stm32fx-clock.h b/include/dt-bindings/clock/stm32fx-clock.h
index e5dad050d518..b6ff9c68cb3f 100644
--- a/include/dt-bindings/clock/stm32fx-clock.h
+++ b/include/dt-bindings/clock/stm32fx-clock.h
@@ -10,7 +10,7 @@
* List of clocks which are not derived from system clock (SYSCLOCK)
*
* The index of these clocks is the secondary index of DT bindings
- * (see Documentation/devicetree/bindings/clock/st,stm32-rcc.txt)
+ * (see Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml)
*
* e.g:
<assigned-clocks = <&rcc 1 CLK_LSE>;
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v4 2/4] dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking
2025-01-14 18:19 [PATCH v4 0/4] Support spread spectrum clocking for stm32f{4,7} platforms Dario Binacchi
2025-01-14 18:19 ` [PATCH v4 1/4] dt-bindings: clock: convert stm32 rcc bindings to json-schema Dario Binacchi
@ 2025-01-14 18:19 ` Dario Binacchi
2025-01-15 23:22 ` Stephen Boyd
2025-01-14 18:19 ` [PATCH v4 3/4] clk: stm32f4: use FIELD helpers to access the PLLCFGR fields Dario Binacchi
2025-01-14 18:19 ` [PATCH v4 4/4] clk: stm32f4: support spread spectrum clock generation Dario Binacchi
3 siblings, 1 reply; 11+ messages in thread
From: Dario Binacchi @ 2025-01-14 18:19 UTC (permalink / raw)
To: linux-kernel
Cc: linux-amarula, Dario Binacchi, Krzysztof Kozlowski,
Alexandre Torgue, Conor Dooley, Krzysztof Kozlowski,
Maxime Coquelin, Michael Turquette, Rob Herring, Stephen Boyd,
devicetree, linux-arm-kernel, linux-clk, linux-stm32
The addition of DT bindings for enabling and tuning spread spectrum
clocking generation is available only for the main PLL of stm32f{4,7}
platforms.
Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
(no changes since v3)
Changes in v3:
- Add 'Reviewed-by' tag of Krzysztof Kozlowski
Changes in v2:
- Update the commit message
- Change st,ssc-modmethod type from non-unique-string-array to string
.../bindings/clock/st,stm32-rcc.yaml | 36 +++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml b/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
index 8f2494a0b28e..f83a6120d65a 100644
--- a/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
+++ b/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
@@ -53,6 +53,26 @@ properties:
Phandle to system configuration controller. It can be used to control the
power domain circuitry.
+ st,ssc-modfreq-hz:
+ description:
+ The modulation frequency for main PLL (in Hz)
+
+ st,ssc-moddepth-permyriad:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description:
+ The modulation rate for main PLL (in permyriad, i.e. 0.01%)
+ minimum: 25
+ maximum: 200
+
+ st,ssc-modmethod:
+ $ref: /schemas/types.yaml#/definitions/string
+ description:
+ The modulation techniques for main PLL.
+ items:
+ enum:
+ - center-spread
+ - down-spread
+
required:
- compatible
- reg
@@ -78,6 +98,10 @@ allOf:
- description: high speed external (HSE) clock input
- description: low speed external (LSE) clock input
- description: Inter-IC sound (I2S) clock input
+ st,ssc-modfreq-hz: false
+ st,ssc-moddepth-permyriad: false
+ st,ssc-modmethod: false
+
else:
properties:
'#clock-cells':
@@ -95,6 +119,18 @@ additionalProperties: false
examples:
# Reset and Clock Control Module node:
+ - |
+ clock-controller@40023800 {
+ compatible = "st,stm32f42xx-rcc", "st,stm32-rcc";
+ reg = <0x40023800 0x400>;
+ #clock-cells = <2>;
+ #reset-cells = <1>;
+ clocks = <&clk_hse>, <&clk_i2s_ckin>;
+ st,syscfg = <&pwrcfg>;
+ st,ssc-modfreq-hz = <10000>;
+ st,ssc-moddepth-permyriad = <200>;
+ st,ssc-modmethod = "center-spread";
+ };
- |
clock-controller@58024400 {
compatible = "st,stm32h743-rcc", "st,stm32-rcc";
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v4 3/4] clk: stm32f4: use FIELD helpers to access the PLLCFGR fields
2025-01-14 18:19 [PATCH v4 0/4] Support spread spectrum clocking for stm32f{4,7} platforms Dario Binacchi
2025-01-14 18:19 ` [PATCH v4 1/4] dt-bindings: clock: convert stm32 rcc bindings to json-schema Dario Binacchi
2025-01-14 18:19 ` [PATCH v4 2/4] dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking Dario Binacchi
@ 2025-01-14 18:19 ` Dario Binacchi
2025-01-15 23:23 ` Stephen Boyd
2025-01-14 18:19 ` [PATCH v4 4/4] clk: stm32f4: support spread spectrum clock generation Dario Binacchi
3 siblings, 1 reply; 11+ messages in thread
From: Dario Binacchi @ 2025-01-14 18:19 UTC (permalink / raw)
To: linux-kernel
Cc: linux-amarula, Dario Binacchi, Alexandre Torgue, Maxime Coquelin,
Michael Turquette, Stephen Boyd, linux-arm-kernel, linux-clk,
linux-stm32
Use GENMASK() along with FIELD_GET() and FIELD_PREP() helpers to access
the PLLCFGR fields instead of manually masking and shifting.
Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
---
(no changes since v1)
drivers/clk/clk-stm32f4.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/drivers/clk/clk-stm32f4.c b/drivers/clk/clk-stm32f4.c
index 07c13ebe327d..db1c56c8d54f 100644
--- a/drivers/clk/clk-stm32f4.c
+++ b/drivers/clk/clk-stm32f4.c
@@ -5,6 +5,7 @@
* Inspired by clk-asm9260.c .
*/
+#include <linux/bitfield.h>
#include <linux/clk-provider.h>
#include <linux/err.h>
#include <linux/io.h>
@@ -39,6 +40,8 @@
#define STM32F4_RCC_DCKCFGR 0x8c
#define STM32F7_RCC_DCKCFGR2 0x90
+#define STM32F4_RCC_PLLCFGR_N_MASK GENMASK(14, 6)
+
#define NONE -1
#define NO_IDX NONE
#define NO_MUX NONE
@@ -632,9 +635,11 @@ static unsigned long stm32f4_pll_recalc(struct clk_hw *hw,
{
struct clk_gate *gate = to_clk_gate(hw);
struct stm32f4_pll *pll = to_stm32f4_pll(gate);
+ unsigned long val;
unsigned long n;
- n = (readl(base + pll->offset) >> 6) & 0x1ff;
+ val = readl(base + pll->offset);
+ n = FIELD_GET(STM32F4_RCC_PLLCFGR_N_MASK, val);
return parent_rate * n;
}
@@ -673,9 +678,10 @@ static int stm32f4_pll_set_rate(struct clk_hw *hw, unsigned long rate,
n = rate / parent_rate;
- val = readl(base + pll->offset) & ~(0x1ff << 6);
+ val = readl(base + pll->offset) & ~STM32F4_RCC_PLLCFGR_N_MASK;
+ val |= FIELD_PREP(STM32F4_RCC_PLLCFGR_N_MASK, n);
- writel(val | ((n & 0x1ff) << 6), base + pll->offset);
+ writel(val, base + pll->offset);
if (pll_state)
stm32f4_pll_enable(hw);
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v4 4/4] clk: stm32f4: support spread spectrum clock generation
2025-01-14 18:19 [PATCH v4 0/4] Support spread spectrum clocking for stm32f{4,7} platforms Dario Binacchi
` (2 preceding siblings ...)
2025-01-14 18:19 ` [PATCH v4 3/4] clk: stm32f4: use FIELD helpers to access the PLLCFGR fields Dario Binacchi
@ 2025-01-14 18:19 ` Dario Binacchi
2025-01-15 23:23 ` Stephen Boyd
3 siblings, 1 reply; 11+ messages in thread
From: Dario Binacchi @ 2025-01-14 18:19 UTC (permalink / raw)
To: linux-kernel
Cc: linux-amarula, Dario Binacchi, Alexandre Torgue, Maxime Coquelin,
Michael Turquette, Stephen Boyd, linux-arm-kernel, linux-clk,
linux-stm32
Support spread spectrum clock generation for the main PLL, the only one
for which this functionality is available.
Tested on the STM32F469I-DISCO board.
Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
---
Changes in v4:
- Improve the compatible property in patch 1/4 "dt-bindings: clock:
convert stm32 rcc bindings to json-schema"
Changes in v3:
- Changes to patch 4/4 "clk: stm32f4: support spread spectrum clock generation"
according to Stephen Boyd's suggestions.
- Drop pr_debug() from stm32f4_pll_set_ssc()
- Add __init to stm32f4_pll_init_ssc() and stm32f4_pll_ssc_parse_dt().
- Add const to conf parameter of stm32f4_pll_init_ssc().
- Use fwnode_property_match_property_string() to parse the
st,ssc-modmethod dts property.
Changes in v2:
- Fixup patches:
2/6 dt-bindings: reset: st,stm32-rcc: update reference due to rename
3/6 dt-bindings: clock: stm32fx: update reference due to rename
to
1/6 dt-bindings: clock: convert stm32 rcc bindings to json-schema
- Changes to dt-bindings: clock: convert stm32 rcc bindings to json-schema
- Changes to dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking
drivers/clk/clk-stm32f4.c | 143 +++++++++++++++++++++++++++++++++++++-
1 file changed, 140 insertions(+), 3 deletions(-)
diff --git a/drivers/clk/clk-stm32f4.c b/drivers/clk/clk-stm32f4.c
index db1c56c8d54f..f476883bc93b 100644
--- a/drivers/clk/clk-stm32f4.c
+++ b/drivers/clk/clk-stm32f4.c
@@ -35,6 +35,7 @@
#define STM32F4_RCC_APB2ENR 0x44
#define STM32F4_RCC_BDCR 0x70
#define STM32F4_RCC_CSR 0x74
+#define STM32F4_RCC_SSCGR 0x80
#define STM32F4_RCC_PLLI2SCFGR 0x84
#define STM32F4_RCC_PLLSAICFGR 0x88
#define STM32F4_RCC_DCKCFGR 0x8c
@@ -42,6 +43,12 @@
#define STM32F4_RCC_PLLCFGR_N_MASK GENMASK(14, 6)
+#define STM32F4_RCC_SSCGR_SSCGEN BIT(31)
+#define STM32F4_RCC_SSCGR_SPREADSEL BIT(30)
+#define STM32F4_RCC_SSCGR_RESERVED_MASK GENMASK(29, 28)
+#define STM32F4_RCC_SSCGR_INCSTEP_MASK GENMASK(27, 13)
+#define STM32F4_RCC_SSCGR_MODPER_MASK GENMASK(12, 0)
+
#define NONE -1
#define NO_IDX NONE
#define NO_MUX NONE
@@ -367,6 +374,16 @@ static const struct stm32f4_gate_data stm32f769_gates[] __initconst = {
{ STM32F4_RCC_APB2ENR, 30, "mdio", "apb2_div" },
};
+enum stm32f4_pll_ssc_mod_type {
+ STM32F4_PLL_SSC_CENTER_SPREAD,
+ STM32F4_PLL_SSC_DOWN_SPREAD,
+};
+
+static const char * const stm32f4_ssc_mod_methods[] __initconst = {
+ [STM32F4_PLL_SSC_DOWN_SPREAD] = "down-spread",
+ [STM32F4_PLL_SSC_CENTER_SPREAD] = "center-spread",
+};
+
/*
* This bitmask tells us which bit offsets (0..192) on STM32F4[23]xxx
* have gate bits associated with them. Its combined hweight is 71.
@@ -512,6 +529,12 @@ static const struct clk_div_table pll_divr_table[] = {
{ 2, 2 }, { 3, 3 }, { 4, 4 }, { 5, 5 }, { 6, 6 }, { 7, 7 }, { 0 }
};
+struct stm32f4_pll_ssc {
+ unsigned int mod_freq;
+ unsigned int mod_depth;
+ enum stm32f4_pll_ssc_mod_type mod_type;
+};
+
struct stm32f4_pll {
spinlock_t *lock;
struct clk_gate gate;
@@ -519,6 +542,8 @@ struct stm32f4_pll {
u8 bit_rdy_idx;
u8 status;
u8 n_start;
+ bool ssc_enable;
+ struct stm32f4_pll_ssc ssc_conf;
};
#define to_stm32f4_pll(_gate) container_of(_gate, struct stm32f4_pll, gate)
@@ -541,6 +566,7 @@ struct stm32f4_vco_data {
u8 offset;
u8 bit_idx;
u8 bit_rdy_idx;
+ bool sscg;
};
static const struct stm32f4_vco_data vco_data[] = {
@@ -661,6 +687,32 @@ static long stm32f4_pll_round_rate(struct clk_hw *hw, unsigned long rate,
return *prate * n;
}
+static void stm32f4_pll_set_ssc(struct clk_hw *hw, unsigned long parent_rate,
+ unsigned int ndiv)
+{
+ struct clk_gate *gate = to_clk_gate(hw);
+ struct stm32f4_pll *pll = to_stm32f4_pll(gate);
+ struct stm32f4_pll_ssc *ssc = &pll->ssc_conf;
+ u32 modeper, incstep;
+ u32 sscgr;
+
+ sscgr = readl(base + STM32F4_RCC_SSCGR);
+ /* reserved field must be kept at reset value */
+ sscgr &= STM32F4_RCC_SSCGR_RESERVED_MASK;
+
+ modeper = DIV_ROUND_CLOSEST(parent_rate, 4 * ssc->mod_freq);
+ incstep = DIV_ROUND_CLOSEST(((1 << 15) - 1) * ssc->mod_depth * ndiv,
+ 5 * 10000 * modeper);
+ sscgr |= STM32F4_RCC_SSCGR_SSCGEN |
+ FIELD_PREP(STM32F4_RCC_SSCGR_INCSTEP_MASK, incstep) |
+ FIELD_PREP(STM32F4_RCC_SSCGR_MODPER_MASK, modeper);
+
+ if (ssc->mod_type)
+ sscgr |= STM32F4_RCC_SSCGR_SPREADSEL;
+
+ writel(sscgr, base + STM32F4_RCC_SSCGR);
+}
+
static int stm32f4_pll_set_rate(struct clk_hw *hw, unsigned long rate,
unsigned long parent_rate)
{
@@ -683,6 +735,9 @@ static int stm32f4_pll_set_rate(struct clk_hw *hw, unsigned long rate,
writel(val, base + pll->offset);
+ if (pll->ssc_enable)
+ stm32f4_pll_set_ssc(hw, parent_rate, n);
+
if (pll_state)
stm32f4_pll_enable(hw);
@@ -788,6 +843,84 @@ static struct clk_hw *clk_register_pll_div(const char *name,
return hw;
}
+static int __init stm32f4_pll_init_ssc(struct clk_hw *hw,
+ const struct stm32f4_pll_ssc *conf)
+{
+ struct clk_gate *gate = to_clk_gate(hw);
+ struct stm32f4_pll *pll = to_stm32f4_pll(gate);
+ struct clk_hw *parent;
+ unsigned long parent_rate;
+ int pll_state;
+ unsigned long n, val;
+
+ parent = clk_hw_get_parent(hw);
+ if (!parent) {
+ pr_err("%s: failed to get clock parent\n", __func__);
+ return -ENODEV;
+ }
+
+ parent_rate = clk_hw_get_rate(parent);
+
+ pll->ssc_enable = true;
+ memcpy(&pll->ssc_conf, conf, sizeof(pll->ssc_conf));
+
+ pll_state = stm32f4_pll_is_enabled(hw);
+
+ if (pll_state)
+ stm32f4_pll_disable(hw);
+
+ val = readl(base + pll->offset);
+ n = FIELD_GET(STM32F4_RCC_PLLCFGR_N_MASK, val);
+
+ pr_debug("%s: pll: %s, parent: %s, parent-rate: %lu, n: %lu\n",
+ __func__, clk_hw_get_name(hw), clk_hw_get_name(parent),
+ parent_rate, n);
+
+ stm32f4_pll_set_ssc(hw, parent_rate, n);
+
+ if (pll_state)
+ stm32f4_pll_enable(hw);
+
+ return 0;
+}
+
+static int __init stm32f4_pll_ssc_parse_dt(struct device_node *np,
+ struct stm32f4_pll_ssc *conf)
+{
+ int ret;
+ const char *s;
+
+ if (!conf)
+ return -EINVAL;
+
+ ret = of_property_read_u32(np, "st,ssc-modfreq-hz", &conf->mod_freq);
+ if (ret)
+ return ret;
+
+ ret = of_property_read_u32(np, "st,ssc-moddepth-permyriad",
+ &conf->mod_depth);
+ if (ret) {
+ pr_err("%pOF: missing st,ssc-moddepth-permyriad\n", np);
+ return ret;
+ }
+
+ ret = fwnode_property_match_property_string(of_fwnode_handle(np),
+ "st,ssc-modmethod",
+ stm32f4_ssc_mod_methods,
+ ARRAY_SIZE(stm32f4_ssc_mod_methods));
+ if (ret < 0) {
+ pr_err("%pOF: failed to get st,ssc-modmethod\n", np);
+ return ret;
+ }
+
+ conf->mod_type = ret;
+
+ pr_debug("%pOF: SSCG settings: mod_freq: %d, mod_depth: %d mod_method: %s [%d]\n",
+ np, conf->mod_freq, conf->mod_depth, s, conf->mod_type);
+
+ return 0;
+}
+
static struct clk_hw *stm32f4_rcc_register_pll(const char *pllsrc,
const struct stm32f4_pll_data *data, spinlock_t *lock)
{
@@ -1695,7 +1828,8 @@ static void __init stm32f4_rcc_init(struct device_node *np)
const struct of_device_id *match;
const struct stm32f4_clk_data *data;
unsigned long pllm;
- struct clk_hw *pll_src_hw;
+ struct clk_hw *pll_src_hw, *pll_vco_hw;
+ struct stm32f4_pll_ssc ssc_conf;
base = of_iomap(np, 0);
if (!base) {
@@ -1754,8 +1888,8 @@ static void __init stm32f4_rcc_init(struct device_node *np)
clk_hw_register_fixed_factor(NULL, "vco_in", pll_src,
0, 1, pllm);
- stm32f4_rcc_register_pll("vco_in", &data->pll_data[0],
- &stm32f4_clk_lock);
+ pll_vco_hw = stm32f4_rcc_register_pll("vco_in", &data->pll_data[0],
+ &stm32f4_clk_lock);
clks[PLL_VCO_I2S] = stm32f4_rcc_register_pll("vco_in",
&data->pll_data[1], &stm32f4_clk_lock);
@@ -1900,6 +2034,9 @@ static void __init stm32f4_rcc_init(struct device_node *np)
of_clk_add_hw_provider(np, stm32f4_rcc_lookup_clk, NULL);
+ if (!stm32f4_pll_ssc_parse_dt(np, &ssc_conf))
+ stm32f4_pll_init_ssc(pll_vco_hw, &ssc_conf);
+
return;
fail:
kfree(clks);
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v4 1/4] dt-bindings: clock: convert stm32 rcc bindings to json-schema
2025-01-14 18:19 ` [PATCH v4 1/4] dt-bindings: clock: convert stm32 rcc bindings to json-schema Dario Binacchi
@ 2025-01-15 23:22 ` Stephen Boyd
0 siblings, 0 replies; 11+ messages in thread
From: Stephen Boyd @ 2025-01-15 23:22 UTC (permalink / raw)
To: Dario Binacchi, linux-kernel
Cc: linux-amarula, Dario Binacchi, Krzysztof Kozlowski,
Alexandre Torgue, Conor Dooley, Krzysztof Kozlowski,
Maxime Coquelin, Michael Turquette, Philipp Zabel, Rob Herring,
devicetree, linux-arm-kernel, linux-clk, linux-stm32
Quoting Dario Binacchi (2025-01-14 10:19:46)
> The patch converts st,stm32-rcc.txt to the JSON schema, but it does more
> than that. The old bindings, in fact, only covered the stm32f{4,7}
> platforms and not the stm32h7. Therefore, to avoid patch submission tests
> failing, it was necessary to add the corresponding compatible (i. e.
> st,stm32h743-rcc) and specify that, in this case, 3 are the clocks instead
> of the 2 required for the stm32f{4,7} platforms.
> Additionally, the old bindings made no mention of the st,syscfg property,
> which is used by both the stm32f{4,7} and the stm32h7 platforms.
>
> The patch also fixes the files referencing to the old st,stm32-rcc.txt.
>
> Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
> Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
>
> ---
Applied to clk-next
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4 2/4] dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking
2025-01-14 18:19 ` [PATCH v4 2/4] dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking Dario Binacchi
@ 2025-01-15 23:22 ` Stephen Boyd
2025-01-24 13:45 ` Krzysztof Kozlowski
0 siblings, 1 reply; 11+ messages in thread
From: Stephen Boyd @ 2025-01-15 23:22 UTC (permalink / raw)
To: Dario Binacchi, linux-kernel
Cc: linux-amarula, Dario Binacchi, Krzysztof Kozlowski,
Alexandre Torgue, Conor Dooley, Krzysztof Kozlowski,
Maxime Coquelin, Michael Turquette, Rob Herring, devicetree,
linux-arm-kernel, linux-clk, linux-stm32
Quoting Dario Binacchi (2025-01-14 10:19:47)
> The addition of DT bindings for enabling and tuning spread spectrum
> clocking generation is available only for the main PLL of stm32f{4,7}
> platforms.
>
> Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
> Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
>
> ---
Applied to clk-next
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4 3/4] clk: stm32f4: use FIELD helpers to access the PLLCFGR fields
2025-01-14 18:19 ` [PATCH v4 3/4] clk: stm32f4: use FIELD helpers to access the PLLCFGR fields Dario Binacchi
@ 2025-01-15 23:23 ` Stephen Boyd
0 siblings, 0 replies; 11+ messages in thread
From: Stephen Boyd @ 2025-01-15 23:23 UTC (permalink / raw)
To: Dario Binacchi, linux-kernel
Cc: linux-amarula, Dario Binacchi, Alexandre Torgue, Maxime Coquelin,
Michael Turquette, linux-arm-kernel, linux-clk, linux-stm32
Quoting Dario Binacchi (2025-01-14 10:19:48)
> Use GENMASK() along with FIELD_GET() and FIELD_PREP() helpers to access
> the PLLCFGR fields instead of manually masking and shifting.
>
> Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
> ---
Applied to clk-next
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4 4/4] clk: stm32f4: support spread spectrum clock generation
2025-01-14 18:19 ` [PATCH v4 4/4] clk: stm32f4: support spread spectrum clock generation Dario Binacchi
@ 2025-01-15 23:23 ` Stephen Boyd
0 siblings, 0 replies; 11+ messages in thread
From: Stephen Boyd @ 2025-01-15 23:23 UTC (permalink / raw)
To: Dario Binacchi, linux-kernel
Cc: linux-amarula, Dario Binacchi, Alexandre Torgue, Maxime Coquelin,
Michael Turquette, linux-arm-kernel, linux-clk, linux-stm32
Quoting Dario Binacchi (2025-01-14 10:19:49)
> Support spread spectrum clock generation for the main PLL, the only one
> for which this functionality is available.
>
> Tested on the STM32F469I-DISCO board.
>
> Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
>
> ---
Applied to clk-next
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4 2/4] dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking
2025-01-15 23:22 ` Stephen Boyd
@ 2025-01-24 13:45 ` Krzysztof Kozlowski
2025-01-25 13:21 ` Dario Binacchi
0 siblings, 1 reply; 11+ messages in thread
From: Krzysztof Kozlowski @ 2025-01-24 13:45 UTC (permalink / raw)
To: Stephen Boyd, Dario Binacchi, linux-kernel
Cc: linux-amarula, Krzysztof Kozlowski, Alexandre Torgue,
Conor Dooley, Krzysztof Kozlowski, Maxime Coquelin,
Michael Turquette, Rob Herring, devicetree, linux-arm-kernel,
linux-clk, linux-stm32
On 16/01/2025 00:22, Stephen Boyd wrote:
> Quoting Dario Binacchi (2025-01-14 10:19:47)
>> The addition of DT bindings for enabling and tuning spread spectrum
>> clocking generation is available only for the main PLL of stm32f{4,7}
>> platforms.
>>
>> Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
>> Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
>>
>> ---
>
> Applied to clk-next
Unlucky timing. NXP just sent this:
https://github.com/devicetree-org/dt-schema/pull/154
which makes these bindings obsolete.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4 2/4] dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking
2025-01-24 13:45 ` Krzysztof Kozlowski
@ 2025-01-25 13:21 ` Dario Binacchi
0 siblings, 0 replies; 11+ messages in thread
From: Dario Binacchi @ 2025-01-25 13:21 UTC (permalink / raw)
To: Krzysztof Kozlowski, Stephen Boyd
Cc: linux-kernel, linux-amarula, Krzysztof Kozlowski,
Alexandre Torgue, Conor Dooley, Krzysztof Kozlowski,
Maxime Coquelin, Michael Turquette, Rob Herring, devicetree,
linux-arm-kernel, linux-clk, linux-stm32
On Fri, Jan 24, 2025 at 2:45 PM Krzysztof Kozlowski <krzk@kernel.org> wrote:
>
> On 16/01/2025 00:22, Stephen Boyd wrote:
> > Quoting Dario Binacchi (2025-01-14 10:19:47)
> >> The addition of DT bindings for enabling and tuning spread spectrum
> >> clocking generation is available only for the main PLL of stm32f{4,7}
> >> platforms.
> >>
> >> Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
> >> Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
> >>
> >> ---
> >
> > Applied to clk-next
>
> Unlucky timing. NXP just sent this:
>
> https://github.com/devicetree-org/dt-schema/pull/154
>
> which makes these bindings obsolete.
>
Why have the DT bindings already become obsolete even though the PR
has not yet been accepted? The series has already been merged into
the kernel. Please let me know if and when I need to make the changes.
This is the first time I find myself in such a situation.
Thanks and regards,
Dario
> Best regards,
> Krzysztof
--
Dario Binacchi
Senior Embedded Linux Developer
dario.binacchi@amarulasolutions.com
__________________________________
Amarula Solutions SRL
Via Le Canevare 30, 31100 Treviso, Veneto, IT
T. +39 042 243 5310
info@amarulasolutions.com
www.amarulasolutions.com
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2025-01-25 13:23 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-14 18:19 [PATCH v4 0/4] Support spread spectrum clocking for stm32f{4,7} platforms Dario Binacchi
2025-01-14 18:19 ` [PATCH v4 1/4] dt-bindings: clock: convert stm32 rcc bindings to json-schema Dario Binacchi
2025-01-15 23:22 ` Stephen Boyd
2025-01-14 18:19 ` [PATCH v4 2/4] dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking Dario Binacchi
2025-01-15 23:22 ` Stephen Boyd
2025-01-24 13:45 ` Krzysztof Kozlowski
2025-01-25 13:21 ` Dario Binacchi
2025-01-14 18:19 ` [PATCH v4 3/4] clk: stm32f4: use FIELD helpers to access the PLLCFGR fields Dario Binacchi
2025-01-15 23:23 ` Stephen Boyd
2025-01-14 18:19 ` [PATCH v4 4/4] clk: stm32f4: support spread spectrum clock generation Dario Binacchi
2025-01-15 23:23 ` Stephen Boyd
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).