* [PATCH 0/6] Support spread spectrum clocking for stm32f{4,7} platforms
@ 2025-01-05 18:14 Dario Binacchi
2025-01-05 18:14 ` [PATCH 1/6] dt-bindings: clock: convert stm32 rcc bindings to json-schema Dario Binacchi
` (5 more replies)
0 siblings, 6 replies; 12+ messages in thread
From: Dario Binacchi @ 2025-01-05 18:14 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.
Dario Binacchi (6):
dt-bindings: clock: convert stm32 rcc bindings to json-schema
dt-bindings: reset: st,stm32-rcc: update reference due to rename
dt-bindings: clock: stm32fx: update reference due to rename
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 | 170 ++++++++++++++++++
.../bindings/reset/st,stm32-rcc.txt | 2 +-
drivers/clk/clk-stm32f4.c | 155 +++++++++++++++-
include/dt-bindings/clock/stm32fx-clock.h | 2 +-
5 files changed, 321 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] 12+ messages in thread
* [PATCH 1/6] dt-bindings: clock: convert stm32 rcc bindings to json-schema
2025-01-05 18:14 [PATCH 0/6] Support spread spectrum clocking for stm32f{4,7} platforms Dario Binacchi
@ 2025-01-05 18:14 ` Dario Binacchi
2025-01-07 7:08 ` Krzysztof Kozlowski
2025-01-05 18:14 ` [PATCH 2/6] dt-bindings: reset: st,stm32-rcc: update reference due to rename Dario Binacchi
` (4 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Dario Binacchi @ 2025-01-05 18:14 UTC (permalink / raw)
To: linux-kernel
Cc: linux-amarula, Dario Binacchi, Alexandre Torgue, Conor Dooley,
Krzysztof Kozlowski, Maxime Coquelin, Michael Turquette,
Rob Herring, Stephen Boyd, devicetree, linux-arm-kernel,
linux-clk, linux-stm32
The patch not only performs the conversion according to the JSON-schema
but also adds the missing parts:
- st,syscfg phandle
- st,stm32h743-rcc compatible
that were not documented but are still used by the drivers and must
therefore be included to ensure the patch submission tests do not fail.
Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
---
.../bindings/clock/st,stm32-rcc.txt | 138 -----------------
.../bindings/clock/st,stm32-rcc.yaml | 143 ++++++++++++++++++
2 files changed, 143 insertions(+), 138 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..ae9e5b26d876
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
@@ -0,0 +1,143 @@
+# 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.
+
+ This binding uses common clock and reset bindings
+ Documentation/devicetree/bindings/clock/clock-bindings.txt
+ Documentation/devicetree/bindings/reset/reset.txt
+
+ 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
+
+ The list of valid indices is available in:
+ - include/dt-bindings/mfd/stm32f4-rcc.h for STM32F4 series
+ - include/dt-bindings/mfd/stm32f7-rcc.h for STM32F7 series
+ - include/dt-bindings/mfd/stm32h7-rcc.h for STM32H7 series
+
+properties:
+ compatible:
+ oneOf:
+ - items:
+ - const: st,stm32f42xx-rcc
+ - const: st,stm32-rcc
+ - items:
+ - enum:
+ - st,stm32f469-rcc
+ - const: st,stm32f42xx-rcc
+ - const: st,stm32-rcc
+ - items:
+ - const: st,stm32f746-rcc
+ - const: st,stm32-rcc
+ - items:
+ - enum:
+ - st,stm32f769-rcc
+ - const: st,stm32f746-rcc
+ - const: st,stm32-rcc
+ - items:
+ - const: st,stm32h743-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.
+ 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.
+
+additionalProperties: false
+
+examples:
+ # Reset and Clock Control Module node:
+ - |
+ rcc@40023800 {
+ #reset-cells = <1>;
+ #clock-cells = <2>;
+ compatible = "st,stm32f42xx-rcc", "st,stm32-rcc";
+ reg = <0x40023800 0x400>;
+ clocks = <&clk_hse>, <&clk_i2s_ckin>;
+ st,syscfg = <&pwrcfg>;
+ };
+
+ - |
+ rcc@40023800 {
+ #reset-cells = <1>;
+ #clock-cells = <2>;
+ compatible = "st,stm32f746-rcc", "st,stm32-rcc";
+ reg = <0x40023800 0x400>;
+ clocks = <&clk_hse>, <&clk_i2s_ckin>;
+ st,syscfg = <&pwrcfg>;
+ };
+
+ - |
+ rcc@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>;
+ };
+
+...
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 2/6] dt-bindings: reset: st,stm32-rcc: update reference due to rename
2025-01-05 18:14 [PATCH 0/6] Support spread spectrum clocking for stm32f{4,7} platforms Dario Binacchi
2025-01-05 18:14 ` [PATCH 1/6] dt-bindings: clock: convert stm32 rcc bindings to json-schema Dario Binacchi
@ 2025-01-05 18:14 ` Dario Binacchi
2025-01-06 7:21 ` Krzysztof Kozlowski
2025-01-05 18:14 ` [PATCH 3/6] dt-bindings: clock: stm32fx: " Dario Binacchi
` (3 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Dario Binacchi @ 2025-01-05 18:14 UTC (permalink / raw)
To: linux-kernel
Cc: linux-amarula, Dario Binacchi, Alexandre Torgue, Conor Dooley,
Krzysztof Kozlowski, Maxime Coquelin, Philipp Zabel, Rob Herring,
devicetree, linux-arm-kernel, linux-stm32
With the conversion of Documentation/devicetree/bindings/clock/st,stm32-rcc.txt
to JSON schema, the reference to st,stm32-rcc.txt is now broken. Therefore,
let's fix it.
Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
---
Documentation/devicetree/bindings/reset/st,stm32-rcc.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 3/6] dt-bindings: clock: stm32fx: update reference due to rename
2025-01-05 18:14 [PATCH 0/6] Support spread spectrum clocking for stm32f{4,7} platforms Dario Binacchi
2025-01-05 18:14 ` [PATCH 1/6] dt-bindings: clock: convert stm32 rcc bindings to json-schema Dario Binacchi
2025-01-05 18:14 ` [PATCH 2/6] dt-bindings: reset: st,stm32-rcc: update reference due to rename Dario Binacchi
@ 2025-01-05 18:14 ` Dario Binacchi
2025-01-06 7:21 ` Krzysztof Kozlowski
2025-01-05 18:14 ` [PATCH 4/6] dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking Dario Binacchi
` (2 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Dario Binacchi @ 2025-01-05 18:14 UTC (permalink / raw)
To: linux-kernel
Cc: linux-amarula, Dario Binacchi, Alexandre Torgue, Conor Dooley,
Krzysztof Kozlowski, Maxime Coquelin, Michael Turquette,
Rob Herring, Stephen Boyd, devicetree, linux-arm-kernel,
linux-clk, linux-stm32
With the conversion of Documentation/devicetree/bindings/clock/st,stm32-rcc.txt
to JSON schema, the reference to st,stm32-rcc.txt is now broken. Therefore,
let's fix it.
Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
---
include/dt-bindings/clock/stm32fx-clock.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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] 12+ messages in thread
* [PATCH 4/6] dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking
2025-01-05 18:14 [PATCH 0/6] Support spread spectrum clocking for stm32f{4,7} platforms Dario Binacchi
` (2 preceding siblings ...)
2025-01-05 18:14 ` [PATCH 3/6] dt-bindings: clock: stm32fx: " Dario Binacchi
@ 2025-01-05 18:14 ` Dario Binacchi
2025-01-08 23:48 ` Rob Herring
2025-01-05 18:14 ` [PATCH 5/6] clk: stm32f4: use FIELD helpers to access the PLLCFGR fields Dario Binacchi
2025-01-05 18:14 ` [PATCH 6/6] clk: stm32f4: support spread spectrum clock generation Dario Binacchi
5 siblings, 1 reply; 12+ messages in thread
From: Dario Binacchi @ 2025-01-05 18:14 UTC (permalink / raw)
To: linux-kernel
Cc: linux-amarula, Dario Binacchi, 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.
Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
---
.../bindings/clock/st,stm32-rcc.yaml | 27 +++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml b/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
index ae9e5b26d876..c345d3ff3fc4 100644
--- a/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
+++ b/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
@@ -77,6 +77,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/non-unique-string-array
+ description:
+ The modulation techniques for main PLL.
+ items:
+ enum:
+ - center-spread
+ - down-spread
+
required:
- compatible
- reg
@@ -97,6 +117,10 @@ allOf:
const: 1
description: |
The clock index for the specified type.
+ st,ssc-modfreq-hz: false
+ st,ssc-moddepth-permyriad: false
+ st,ssc-modmethod: false
+
else:
properties:
'#clock-cells':
@@ -118,6 +142,9 @@ examples:
reg = <0x40023800 0x400>;
clocks = <&clk_hse>, <&clk_i2s_ckin>;
st,syscfg = <&pwrcfg>;
+ st,ssc-modfreq-hz = <10000>;
+ st,ssc-moddepth-permyriad = <200>;
+ st,ssc-modmethod = "center-spread";
};
- |
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 5/6] clk: stm32f4: use FIELD helpers to access the PLLCFGR fields
2025-01-05 18:14 [PATCH 0/6] Support spread spectrum clocking for stm32f{4,7} platforms Dario Binacchi
` (3 preceding siblings ...)
2025-01-05 18:14 ` [PATCH 4/6] dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking Dario Binacchi
@ 2025-01-05 18:14 ` Dario Binacchi
2025-01-05 18:14 ` [PATCH 6/6] clk: stm32f4: support spread spectrum clock generation Dario Binacchi
5 siblings, 0 replies; 12+ messages in thread
From: Dario Binacchi @ 2025-01-05 18:14 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>
---
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] 12+ messages in thread
* [PATCH 6/6] clk: stm32f4: support spread spectrum clock generation
2025-01-05 18:14 [PATCH 0/6] Support spread spectrum clocking for stm32f{4,7} platforms Dario Binacchi
` (4 preceding siblings ...)
2025-01-05 18:14 ` [PATCH 5/6] clk: stm32f4: use FIELD helpers to access the PLLCFGR fields Dario Binacchi
@ 2025-01-05 18:14 ` Dario Binacchi
5 siblings, 0 replies; 12+ messages in thread
From: Dario Binacchi @ 2025-01-05 18:14 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>
---
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..6c80c0dbb0a3 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
@@ -512,6 +519,17 @@ static const struct clk_div_table pll_divr_table[] = {
{ 2, 2 }, { 3, 3 }, { 4, 4 }, { 5, 5 }, { 6, 6 }, { 7, 7 }, { 0 }
};
+enum stm32f4_pll_ssc_mod_type {
+ STM32F4_PLL_SSC_CENTER_SPREAD,
+ STM32F4_PLL_SSC_DOWN_SPREAD,
+};
+
+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 +537,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 +561,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 +682,34 @@ 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;
+
+ pr_debug("%s: pll: %s: modeper: %d, incstep: %d, sscgr: 0x%08x\n",
+ __func__, clk_hw_get_name(hw), modeper, incstep, sscgr);
+ 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 +732,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 +840,87 @@ static struct clk_hw *clk_register_pll_div(const char *name,
return hw;
}
+static int stm32f4_pll_init_ssc(struct clk_hw *hw, 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 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 = of_property_read_string(np, "st,ssc-modmethod", &s);
+ if (ret) {
+ pr_err("%pOF: missing st,ssc-modmethod\n", np);
+ return ret;
+ }
+
+ if (!strcmp(s, "down-spread")) {
+ conf->mod_type = STM32F4_PLL_SSC_DOWN_SPREAD;
+ } else if (!strcmp(s, "center-spread")) {
+ conf->mod_type = STM32F4_PLL_SSC_CENTER_SPREAD;
+ } else {
+ pr_err("%pOF: wrong value (%s) for fsl,ssc-modmethod\n", np, s);
+ return -EINVAL;
+ }
+
+ 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] 12+ messages in thread
* Re: [PATCH 2/6] dt-bindings: reset: st,stm32-rcc: update reference due to rename
2025-01-05 18:14 ` [PATCH 2/6] dt-bindings: reset: st,stm32-rcc: update reference due to rename Dario Binacchi
@ 2025-01-06 7:21 ` Krzysztof Kozlowski
0 siblings, 0 replies; 12+ messages in thread
From: Krzysztof Kozlowski @ 2025-01-06 7:21 UTC (permalink / raw)
To: Dario Binacchi
Cc: linux-kernel, linux-amarula, Alexandre Torgue, Conor Dooley,
Krzysztof Kozlowski, Maxime Coquelin, Philipp Zabel, Rob Herring,
devicetree, linux-arm-kernel, linux-stm32
On Sun, Jan 05, 2025 at 07:14:14PM +0100, Dario Binacchi wrote:
> With the conversion of Documentation/devicetree/bindings/clock/st,stm32-rcc.txt
> to JSON schema, the reference to st,stm32-rcc.txt is now broken. Therefore,
So you introduce broken code to fix it in next patch?
> let's fix it.
Please stop splitting patches in some weird, either non-bisectable
or artificial way. How this can be a separate patch?
It's the second patchset recently doing such incorrect splits.
Please read submitting patches how to organize your patchset.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 3/6] dt-bindings: clock: stm32fx: update reference due to rename
2025-01-05 18:14 ` [PATCH 3/6] dt-bindings: clock: stm32fx: " Dario Binacchi
@ 2025-01-06 7:21 ` Krzysztof Kozlowski
0 siblings, 0 replies; 12+ messages in thread
From: Krzysztof Kozlowski @ 2025-01-06 7:21 UTC (permalink / raw)
To: Dario Binacchi
Cc: linux-kernel, linux-amarula, Alexandre Torgue, Conor Dooley,
Krzysztof Kozlowski, Maxime Coquelin, Michael Turquette,
Rob Herring, Stephen Boyd, devicetree, linux-arm-kernel,
linux-clk, linux-stm32
On Sun, Jan 05, 2025 at 07:14:15PM +0100, Dario Binacchi wrote:
> With the conversion of Documentation/devicetree/bindings/clock/st,stm32-rcc.txt
> to JSON schema, the reference to st,stm32-rcc.txt is now broken. Therefore,
> let's fix it.
>
> Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
> ---
>
> include/dt-bindings/clock/stm32fx-clock.h | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
NAK, you introduce bugs and then immediately fix them just to have some
patch count?
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/6] dt-bindings: clock: convert stm32 rcc bindings to json-schema
2025-01-05 18:14 ` [PATCH 1/6] dt-bindings: clock: convert stm32 rcc bindings to json-schema Dario Binacchi
@ 2025-01-07 7:08 ` Krzysztof Kozlowski
0 siblings, 0 replies; 12+ messages in thread
From: Krzysztof Kozlowski @ 2025-01-07 7:08 UTC (permalink / raw)
To: Dario Binacchi
Cc: linux-kernel, linux-amarula, Alexandre Torgue, Conor Dooley,
Krzysztof Kozlowski, Maxime Coquelin, Michael Turquette,
Rob Herring, Stephen Boyd, devicetree, linux-arm-kernel,
linux-clk, linux-stm32
On Sun, Jan 05, 2025 at 07:14:13PM +0100, Dario Binacchi wrote:
> 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..ae9e5b26d876
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
> @@ -0,0 +1,143 @@
> +# 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.
> +
> + This binding uses common clock and reset bindings
> + Documentation/devicetree/bindings/clock/clock-bindings.txt
> + Documentation/devicetree/bindings/reset/reset.txt
Drop paragraph.
> +
> + 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.
Drop paragraph and rephrase it that reset phandle argument is "... the bit
number within the RCC...."
> + 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
> +
> + The list of valid indices is available in:
> + - include/dt-bindings/mfd/stm32f4-rcc.h for STM32F4 series
> + - include/dt-bindings/mfd/stm32f7-rcc.h for STM32F7 series
> + - include/dt-bindings/mfd/stm32h7-rcc.h for STM32H7 series
> +
> +properties:
> + compatible:
> + oneOf:
> + - items:
> + - const: st,stm32f42xx-rcc
> + - const: st,stm32-rcc
> + - items:
> + - enum:
> + - st,stm32f469-rcc
> + - const: st,stm32f42xx-rcc
> + - const: st,stm32-rcc
> + - items:
> + - const: st,stm32f746-rcc
> + - const: st,stm32-rcc
> + - items:
> + - enum:
> + - st,stm32f769-rcc
> + - const: st,stm32f746-rcc
> + - const: st,stm32-rcc
> + - items:
> + - const: st,stm32h743-rcc
> + - const: st,stm32-rcc
Old binding did not mention any fallbacks, so you need to explain this
in commit msg. You only said "st,stm32h743-rcc"
> +
> + reg:
> + maxItems: 1
> +
> + '#reset-cells':
> + const: 1
> +
> + '#clock-cells':
> + enum: [1, 2]
> +
> + clocks:
> + minItems: 2
> + maxItems: 3
You need to list the items with description. Narrow the clock numbers
per varian in allOf:if:then and explain this in commit msg (old binding
did not say three clocks, so that's another change).
> +
> + 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.
> + 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.
> +
> +additionalProperties: false
> +
> +examples:
> + # Reset and Clock Control Module node:
> + - |
> + rcc@40023800 {
> + #reset-cells = <1>;
> + #clock-cells = <2>;
> + compatible = "st,stm32f42xx-rcc", "st,stm32-rcc";
> + reg = <0x40023800 0x400>;
compatible and reg are alwys the first.
> + clocks = <&clk_hse>, <&clk_i2s_ckin>;
> + st,syscfg = <&pwrcfg>;
Only one example.
> + };
> +
> + - |
> + rcc@40023800 {
> + #reset-cells = <1>;
> + #clock-cells = <2>;
> + compatible = "st,stm32f746-rcc", "st,stm32-rcc";
> + reg = <0x40023800 0x400>;
> + clocks = <&clk_hse>, <&clk_i2s_ckin>;
> + st,syscfg = <&pwrcfg>;
> + };
> +
> + - |
> + rcc@58024400 {
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>;
So maybe just keep this example only.
> + };
> +
> +...
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 4/6] dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking
2025-01-05 18:14 ` [PATCH 4/6] dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking Dario Binacchi
@ 2025-01-08 23:48 ` Rob Herring
2025-01-09 21:18 ` Dario Binacchi
0 siblings, 1 reply; 12+ messages in thread
From: Rob Herring @ 2025-01-08 23:48 UTC (permalink / raw)
To: Dario Binacchi
Cc: linux-kernel, linux-amarula, Alexandre Torgue, Conor Dooley,
Krzysztof Kozlowski, Maxime Coquelin, Michael Turquette,
Stephen Boyd, devicetree, linux-arm-kernel, linux-clk,
linux-stm32
On Sun, Jan 05, 2025 at 07:14:16PM +0100, Dario Binacchi wrote:
> The addition of DT bindings for enabling and tuning spread spectrum
> clocking generation is available only for the main PLL.
>
> Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
> ---
>
> .../bindings/clock/st,stm32-rcc.yaml | 27 +++++++++++++++++++
> 1 file changed, 27 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml b/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
> index ae9e5b26d876..c345d3ff3fc4 100644
> --- a/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
> +++ b/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
> @@ -77,6 +77,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)
No constraints?
> +
> + 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/non-unique-string-array
> + description:
> + The modulation techniques for main PLL.
> + items:
> + enum:
> + - center-spread
> + - down-spread
What's the default? If there's only 2 possibilities, then you can use a
boolean instead. Though I assume you want to support spread-spectrum
disabled.
Are there dependencies between these properties?
> +
> required:
> - compatible
> - reg
> @@ -97,6 +117,10 @@ allOf:
> const: 1
> description: |
> The clock index for the specified type.
> + st,ssc-modfreq-hz: false
> + st,ssc-moddepth-permyriad: false
> + st,ssc-modmethod: false
> +
> else:
> properties:
> '#clock-cells':
> @@ -118,6 +142,9 @@ examples:
> reg = <0x40023800 0x400>;
> clocks = <&clk_hse>, <&clk_i2s_ckin>;
> st,syscfg = <&pwrcfg>;
> + st,ssc-modfreq-hz = <10000>;
> + st,ssc-moddepth-permyriad = <200>;
> + st,ssc-modmethod = "center-spread";
> };
>
> - |
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 4/6] dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking
2025-01-08 23:48 ` Rob Herring
@ 2025-01-09 21:18 ` Dario Binacchi
0 siblings, 0 replies; 12+ messages in thread
From: Dario Binacchi @ 2025-01-09 21:18 UTC (permalink / raw)
To: Rob Herring
Cc: linux-kernel, linux-amarula, Alexandre Torgue, Conor Dooley,
Krzysztof Kozlowski, Maxime Coquelin, Michael Turquette,
Stephen Boyd, devicetree, linux-arm-kernel, linux-clk,
linux-stm32
Hello Rob,
On Thu, Jan 9, 2025 at 12:48 AM Rob Herring <robh@kernel.org> wrote:
>
> On Sun, Jan 05, 2025 at 07:14:16PM +0100, Dario Binacchi wrote:
> > The addition of DT bindings for enabling and tuning spread spectrum
> > clocking generation is available only for the main PLL.
> >
> > Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
> > ---
> >
> > .../bindings/clock/st,stm32-rcc.yaml | 27 +++++++++++++++++++
> > 1 file changed, 27 insertions(+)
> >
> > diff --git a/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml b/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
> > index ae9e5b26d876..c345d3ff3fc4 100644
> > --- a/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
> > +++ b/Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml
> > @@ -77,6 +77,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)
>
> No constraints?
They vary depending on the HSE clock frequency used.
>
> > +
> > + 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/non-unique-string-array
> > + description:
> > + The modulation techniques for main PLL.
> > + items:
> > + enum:
> > + - center-spread
> > + - down-spread
>
> What's the default? If there's only 2 possibilities, then you can use a
> boolean instead. Though I assume you want to support spread-spectrum
> disabled.
Generally, there can also be more than two options. For example, in
the case of the imx8m platform, there are three possibilities:
- down-spread
- center-spread
- up-spread
In our case, using a boolean would hide one of the two pieces of information,
meaning that if I'm not using center-spread, what am I using?
IMHO, I would keep the string type, changing it from
on-unique-string-array to string.
>
> Are there dependencies between these properties?
The values moddepth and modfreq are used to calculate, according to specific
relationships, two values MODPER and INCSTEP, which are bit fields of
a suitable
register for managing the SSCG. There is a constraint between these two values,
namely that MODPER * INCSTEP < 32768. This constraint will be managed
at the driver level.
Thanks and regards,
Dario
>
> > +
> > required:
> > - compatible
> > - reg
> > @@ -97,6 +117,10 @@ allOf:
> > const: 1
> > description: |
> > The clock index for the specified type.
> > + st,ssc-modfreq-hz: false
> > + st,ssc-moddepth-permyriad: false
> > + st,ssc-modmethod: false
> > +
> > else:
> > properties:
> > '#clock-cells':
> > @@ -118,6 +142,9 @@ examples:
> > reg = <0x40023800 0x400>;
> > clocks = <&clk_hse>, <&clk_i2s_ckin>;
> > st,syscfg = <&pwrcfg>;
> > + st,ssc-modfreq-hz = <10000>;
> > + st,ssc-moddepth-permyriad = <200>;
> > + st,ssc-modmethod = "center-spread";
> > };
> >
> > - |
> > --
> > 2.43.0
> >
--
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] 12+ messages in thread
end of thread, other threads:[~2025-01-09 21:19 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-05 18:14 [PATCH 0/6] Support spread spectrum clocking for stm32f{4,7} platforms Dario Binacchi
2025-01-05 18:14 ` [PATCH 1/6] dt-bindings: clock: convert stm32 rcc bindings to json-schema Dario Binacchi
2025-01-07 7:08 ` Krzysztof Kozlowski
2025-01-05 18:14 ` [PATCH 2/6] dt-bindings: reset: st,stm32-rcc: update reference due to rename Dario Binacchi
2025-01-06 7:21 ` Krzysztof Kozlowski
2025-01-05 18:14 ` [PATCH 3/6] dt-bindings: clock: stm32fx: " Dario Binacchi
2025-01-06 7:21 ` Krzysztof Kozlowski
2025-01-05 18:14 ` [PATCH 4/6] dt-bindings: clock: st,stm32-rcc: support spread spectrum clocking Dario Binacchi
2025-01-08 23:48 ` Rob Herring
2025-01-09 21:18 ` Dario Binacchi
2025-01-05 18:14 ` [PATCH 5/6] clk: stm32f4: use FIELD helpers to access the PLLCFGR fields Dario Binacchi
2025-01-05 18:14 ` [PATCH 6/6] clk: stm32f4: support spread spectrum clock generation Dario Binacchi
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).