[Linux-stm32] [PATCH v2 5/7] clk: stm32mp25: add clock for D3 peripherals allocation for Cortex-CM0
Brian Masney
masneyb at kernel.org
Wed Nov 4 23:58:29 CET 2026
Hi Gabriel,
> GATE_<IP>AM allows to enable the Autonomous Mode of the D3 peripherals.
> GATE_<IP>C3 allows to enable the allocation of the peripherals to CPU3.
>
> For any D3 peripheral allocated to CPU3 (CPU3 domain is used and AMEN),
> MSIKERON must be set to allow the Stop modes. That is why all the
> autonomous clocks have the MSI KER clock as their parent.
>
> Add the HSI KER, HSE KER and MSI KER clocks as new RCC input clocks and
> register the C3 reset.
>
> Update the number of clocks of the provider to cover the new IDs.
>
> Signed-off-by: Gwenael Treuveur <gwenael.treuveur at foss.st.com>
> Signed-off-by: Gabriel Fernandez <gabriel.fernandez at foss.st.com>
> ---
> drivers/clk/stm32/clk-stm32mp25.c | 176 +++++++++++++++++++++++++++++++++++++-
> 1 file changed, 175 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/clk/stm32/clk-stm32mp25.c b/drivers/clk/stm32/clk-stm32mp25.c
> index 59abac0cc56a..3199cf18f4d3 100644
> --- a/drivers/clk/stm32/clk-stm32mp25.c
> +++ b/drivers/clk/stm32/clk-stm32mp25.c
> @@ -18,7 +18,7 @@
> #include <dt-bindings/reset/st,stm32mp25-rcc.h>
>
> /* Number of clock identifiers of the binding, SCMI ones excluded: highest ID + 1 */
> -#define STM32MP25_LAST_CLK (HSE_DIV2_CK + 1)
> +#define STM32MP25_LAST_CLK (CK_SPI8_AM + 1)
>
> /* Clock security definition */
> #define SECF_NONE -1
> @@ -38,6 +38,7 @@
> /* Register: RIFSC_SEMCR */
> #define RCC_SEMCR_SEMCID_MASK GENMASK(6, 4)
>
> +#define MP25_RIF_RCC_C3 72
> #define MP25_RIF_RCC_IS2M 107
> #define MP25_RIF_RCC_MCO1 108
> #define MP25_RIF_RCC_MCO2 109
> @@ -126,6 +127,9 @@ enum {
> TIMG2,
> PLL3,
> DSI_TXBYTE,
> + HSI_KER_ON,
> + HSE_KER_ON,
> + MSI_KER_ON,
> };
>
> static const struct clk_parent_data adc12_src[] = {
> @@ -225,6 +229,10 @@ enum enum_gate_cfg {
> GATE_ADC12,
> GATE_ADC3,
> GATE_ADF1,
> + GATE_ADF1AM,
> + GATE_ADF1C3,
> + GATE_C3,
> + GATE_C3AM,
> GATE_CCI,
> GATE_CRC,
> GATE_CRYP1,
> @@ -249,6 +257,7 @@ enum enum_gate_cfg {
> GATE_ETHSWMAC,
> GATE_ETHSWREF,
> GATE_FDCAN,
> + GATE_GPIOZC3,
> GATE_GPU,
> GATE_HASH,
> GATE_HDP,
> @@ -260,22 +269,35 @@ enum enum_gate_cfg {
> GATE_I2C6,
> GATE_I2C7,
> GATE_I2C8,
> + GATE_I2C8AM,
> + GATE_I2C8C3,
> GATE_I3C1,
> GATE_I3C2,
> GATE_I3C3,
> GATE_I3C4,
> + GATE_I3C4AM,
> + GATE_I3C4C3,
> GATE_IS2M,
> GATE_IWDG1,
> GATE_IWDG2,
> GATE_IWDG3,
> GATE_IWDG4,
> GATE_IWDG5,
> + GATE_LPDMAC3,
> GATE_LPTIM1,
> GATE_LPTIM2,
> GATE_LPTIM3,
> + GATE_LPTIM3AM,
> + GATE_LPTIM3C3,
> GATE_LPTIM4,
> + GATE_LPTIM4AM,
> + GATE_LPTIM4C3,
> GATE_LPTIM5,
> + GATE_LPTIM5AM,
> + GATE_LPTIM5C3,
> GATE_LPUART1,
> + GATE_LPUART1AM,
> + GATE_LPUART1C3,
> GATE_LTDC,
> GATE_LVDS,
> GATE_MCO1,
> @@ -285,6 +307,7 @@ enum enum_gate_cfg {
> GATE_PCIE,
> GATE_PKA,
> GATE_RNG,
> + GATE_RTCC3,
> GATE_SAES,
> GATE_SAI1,
> GATE_SAI2,
> @@ -303,6 +326,8 @@ enum enum_gate_cfg {
> GATE_SPI6,
> GATE_SPI7,
> GATE_SPI8,
> + GATE_SPI8AM,
> + GATE_SPI8C3,
> GATE_TIM1,
> GATE_TIM10,
> GATE_TIM11,
> @@ -354,6 +379,10 @@ static const struct stm32_gate_cfg stm32mp25_gates[GATE_NB] = {
> GATE_CFG(GATE_ADC12, RCC_ADC12CFGR, 1, 0),
> GATE_CFG(GATE_ADC3, RCC_ADC3CFGR, 1, 0),
> GATE_CFG(GATE_ADF1, RCC_ADF1CFGR, 1, 0),
> + GATE_CFG(GATE_ADF1AM, RCC_ADF1CFGR, 3, 0),
> + GATE_CFG(GATE_ADF1C3, RCC_C3CFGR, 23, 0),
> + GATE_CFG(GATE_C3, RCC_C3CFGR, 1, 0),
> + GATE_CFG(GATE_C3AM, RCC_C3CFGR, 3, 0),
> GATE_CFG(GATE_CCI, RCC_CCICFGR, 1, 0),
> GATE_CFG(GATE_CRC, RCC_CRCCFGR, 1, 0),
> GATE_CFG(GATE_CRYP1, RCC_CRYP1CFGR, 1, 0),
> @@ -378,6 +407,7 @@ static const struct stm32_gate_cfg stm32mp25_gates[GATE_NB] = {
> GATE_CFG(GATE_ETHSWMAC, RCC_ETHSWCFGR, 1, 0),
> GATE_CFG(GATE_ETHSWREF, RCC_ETHSWCFGR, 21, 0),
> GATE_CFG(GATE_FDCAN, RCC_FDCANCFGR, 1, 0),
> + GATE_CFG(GATE_GPIOZC3, RCC_C3CFGR, 24, 0),
> GATE_CFG(GATE_GPU, RCC_GPUCFGR, 1, 0),
> GATE_CFG(GATE_HASH, RCC_HASHCFGR, 1, 0),
> GATE_CFG(GATE_HDP, RCC_HDPCFGR, 1, 0),
> @@ -389,22 +419,35 @@ static const struct stm32_gate_cfg stm32mp25_gates[GATE_NB] = {
> GATE_CFG(GATE_I2C6, RCC_I2C6CFGR, 1, 0),
> GATE_CFG(GATE_I2C7, RCC_I2C7CFGR, 1, 0),
> GATE_CFG(GATE_I2C8, RCC_I2C8CFGR, 1, 0),
> + GATE_CFG(GATE_I2C8AM, RCC_I2C8CFGR, 3, 0),
> + GATE_CFG(GATE_I2C8C3, RCC_C3CFGR, 21, 0),
> GATE_CFG(GATE_I3C1, RCC_I3C1CFGR, 1, 0),
> GATE_CFG(GATE_I3C2, RCC_I3C2CFGR, 1, 0),
> GATE_CFG(GATE_I3C3, RCC_I3C3CFGR, 1, 0),
> GATE_CFG(GATE_I3C4, RCC_I3C4CFGR, 1, 0),
> + GATE_CFG(GATE_I3C4AM, RCC_I3C4CFGR, 3, 0),
> + GATE_CFG(GATE_I3C4C3, RCC_C3CFGR, 27, 0),
> GATE_CFG(GATE_IS2M, RCC_IS2MCFGR, 1, 0),
> GATE_CFG(GATE_IWDG1, RCC_IWDG1CFGR, 1, 0),
> GATE_CFG(GATE_IWDG2, RCC_IWDG2CFGR, 1, 0),
> GATE_CFG(GATE_IWDG3, RCC_IWDG3CFGR, 1, 0),
> GATE_CFG(GATE_IWDG4, RCC_IWDG4CFGR, 1, 0),
> GATE_CFG(GATE_IWDG5, RCC_IWDG5CFGR, 1, 0),
> + GATE_CFG(GATE_LPDMAC3, RCC_C3CFGR, 25, 0),
> GATE_CFG(GATE_LPTIM1, RCC_LPTIM1CFGR, 1, 0),
> GATE_CFG(GATE_LPTIM2, RCC_LPTIM2CFGR, 1, 0),
> GATE_CFG(GATE_LPTIM3, RCC_LPTIM3CFGR, 1, 0),
> + GATE_CFG(GATE_LPTIM3AM, RCC_LPTIM3CFGR, 3, 0),
> + GATE_CFG(GATE_LPTIM3C3, RCC_C3CFGR, 16, 0),
> GATE_CFG(GATE_LPTIM4, RCC_LPTIM4CFGR, 1, 0),
> + GATE_CFG(GATE_LPTIM4AM, RCC_LPTIM4CFGR, 3, 0),
> + GATE_CFG(GATE_LPTIM4C3, RCC_C3CFGR, 17, 0),
> GATE_CFG(GATE_LPTIM5, RCC_LPTIM5CFGR, 1, 0),
> + GATE_CFG(GATE_LPTIM5AM, RCC_LPTIM5CFGR, 3, 0),
> + GATE_CFG(GATE_LPTIM5C3, RCC_C3CFGR, 18, 0),
> GATE_CFG(GATE_LPUART1, RCC_LPUART1CFGR, 1, 0),
> + GATE_CFG(GATE_LPUART1AM, RCC_LPUART1CFGR, 3, 0),
> + GATE_CFG(GATE_LPUART1C3, RCC_C3CFGR, 20, 0),
> GATE_CFG(GATE_LTDC, RCC_LTDCCFGR, 1, 0),
> GATE_CFG(GATE_LVDS, RCC_LVDSCFGR, 1, 0),
> GATE_CFG(GATE_MCO1, RCC_MCO1CFGR, 8, 0),
> @@ -413,6 +456,7 @@ static const struct stm32_gate_cfg stm32mp25_gates[GATE_NB] = {
> GATE_CFG(GATE_OSPIIOM, RCC_OSPIIOMCFGR, 1, 0),
> GATE_CFG(GATE_PCIE, RCC_PCIECFGR, 1, 0),
> GATE_CFG(GATE_PKA, RCC_PKACFGR, 1, 0),
> + GATE_CFG(GATE_RTCC3, RCC_C3CFGR, 26, 0),
In enum_gate_cfg, GATE_RTCC3 comes after GATE_RNG, but here it is
placed before GATE_RNG. Keep the same order.
> GATE_CFG(GATE_RNG, RCC_RNGCFGR, 1, 0),
> GATE_CFG(GATE_SAES, RCC_SAESCFGR, 1, 0),
> GATE_CFG(GATE_SAI1, RCC_SAI1CFGR, 1, 0),
> @@ -432,6 +476,8 @@ static const struct stm32_gate_cfg stm32mp25_gates[GATE_NB] = {
> GATE_CFG(GATE_SPI6, RCC_SPI6CFGR, 1, 0),
> GATE_CFG(GATE_SPI7, RCC_SPI7CFGR, 1, 0),
> GATE_CFG(GATE_SPI8, RCC_SPI8CFGR, 1, 0),
> + GATE_CFG(GATE_SPI8AM, RCC_SPI8CFGR, 3, 0),
> + GATE_CFG(GATE_SPI8C3, RCC_C3CFGR, 19, 0),
> GATE_CFG(GATE_TIM1, RCC_TIM1CFGR, 1, 0),
> GATE_CFG(GATE_TIM10, RCC_TIM10CFGR, 1, 0),
> GATE_CFG(GATE_TIM11, RCC_TIM11CFGR, 1, 0),
> @@ -518,6 +564,77 @@ static struct clk_stm32_gate ck_ker_adf1 = {
> .hw.init = CLK_HW_INIT_INDEX("ck_ker_adf1", FLEXGEN_42, &clk_stm32_gate_ops, 0),
> };
>
> +static struct clk_stm32_gate ck_ker_adf1_am = {
> + .gate_id = GATE_ADF1AM,
> + .hw.init = CLK_HW_INIT_HW("ck_ker_adf1_am", &ck_ker_adf1.hw, &clk_stm32_gate_ops, 0),
> +};
> +
> +/* C3 */
> +static struct clk_stm32_gate ck_cpu3 = {
> + .gate_id = GATE_C3,
> + .hw.init = CLK_HW_INIT_INDEX("ck_cpu3", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
> +};
> +
> +static struct clk_stm32_gate ck_cpu3_am = {
> + .gate_id = GATE_C3AM,
> + .hw.init = CLK_HW_INIT_HW("ck_cpu3_am", &ck_cpu3.hw, &clk_stm32_gate_ops, 0),
Should these two clocks have CLK_IGNORE_UNUSED? set?
Brian
--
Brian Masney <masneyb at kernel.org>
More information about the Linux-stm32
mailing list