Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/drivers/clk/stm32/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 63 kB image not shown  

Quelle  clk-stm32mp25.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (C) STMicroelectronics 2023 - All Rights Reserved
 * Author: Gabriel Fernandez <gabriel.fernandez@foss.st.com> for STMicroelectronics.
 */


#include <linux/bus/stm32_firewall_device.h>
#include <linux/clk-provider.h>
#include <linux/io.h>
#include <linux/platform_device.h>

#include "clk-stm32-core.h"
#include "reset-stm32.h"
#include "stm32mp25_rcc.h"

#include <dt-bindings/clock/st,stm32mp25-rcc.h>
#include <dt-bindings/reset/st,stm32mp25-rcc.h>

/* Clock security definition */
#define SECF_NONE  -1

#define RCC_REG_SIZE 32
#define RCC_SECCFGR(x) (((x) / RCC_REG_SIZE) * 0x4 + RCC_SECCFGR0)
#define RCC_CIDCFGR(x) ((x) * 0x8 + RCC_R0CIDCFGR)
#define RCC_SEMCR(x) ((x) * 0x8 + RCC_R0SEMCR)
#define RCC_CID1 1

/* Register: RIFSC_CIDCFGR */
#define RCC_CIDCFGR_CFEN BIT(0)
#define RCC_CIDCFGR_SEM_EN BIT(1)
#define RCC_CIDCFGR_SEMWLC1_EN BIT(17)
#define RCC_CIDCFGR_SCID_MASK GENMASK(6, 4)

/* Register: RIFSC_SEMCR */
#define RCC_SEMCR_SEMCID_MASK GENMASK(6, 4)

#define MP25_RIF_RCC_IS2M 107
#define MP25_RIF_RCC_MCO1 108
#define MP25_RIF_RCC_MCO2 109

#define SEC_RIFSC_FLAG  BIT(31)
#define SEC_RIFSC(_id)  ((_id) | SEC_RIFSC_FLAG)

enum {
 HSE,
 HSI,
 MSI,
 LSE,
 LSI,
 HSE_DIV2,
 ICN_HS_MCU,
 ICN_LS_MCU,
 ICN_SDMMC,
 ICN_DDR,
 ICN_DISPLAY,
 ICN_HSL,
 ICN_NIC,
 ICN_VID,
 FLEXGEN_07,
 FLEXGEN_08,
 FLEXGEN_09,
 FLEXGEN_10,
 FLEXGEN_11,
 FLEXGEN_12,
 FLEXGEN_13,
 FLEXGEN_14,
 FLEXGEN_15,
 FLEXGEN_16,
 FLEXGEN_17,
 FLEXGEN_18,
 FLEXGEN_19,
 FLEXGEN_20,
 FLEXGEN_21,
 FLEXGEN_22,
 FLEXGEN_23,
 FLEXGEN_24,
 FLEXGEN_25,
 FLEXGEN_26,
 FLEXGEN_27,
 FLEXGEN_28,
 FLEXGEN_29,
 FLEXGEN_30,
 FLEXGEN_31,
 FLEXGEN_32,
 FLEXGEN_33,
 FLEXGEN_34,
 FLEXGEN_35,
 FLEXGEN_36,
 FLEXGEN_37,
 FLEXGEN_38,
 FLEXGEN_39,
 FLEXGEN_40,
 FLEXGEN_41,
 FLEXGEN_42,
 FLEXGEN_43,
 FLEXGEN_44,
 FLEXGEN_45,
 FLEXGEN_46,
 FLEXGEN_47,
 FLEXGEN_48,
 FLEXGEN_49,
 FLEXGEN_50,
 FLEXGEN_51,
 FLEXGEN_52,
 FLEXGEN_53,
 FLEXGEN_54,
 FLEXGEN_55,
 FLEXGEN_56,
 FLEXGEN_57,
 FLEXGEN_58,
 FLEXGEN_59,
 FLEXGEN_60,
 FLEXGEN_61,
 FLEXGEN_62,
 FLEXGEN_63,
 ICN_APB1,
 ICN_APB2,
 ICN_APB3,
 ICN_APB4,
 ICN_APBDBG,
 TIMG1,
 TIMG2,
 PLL3,
 DSI_TXBYTE,
};

static const struct clk_parent_data adc12_src[] = {
 { .index = FLEXGEN_46 },
 { .index = ICN_LS_MCU },
};

static const struct clk_parent_data adc3_src[] = {
 { .index = FLEXGEN_47 },
 { .index = ICN_LS_MCU },
 { .index = FLEXGEN_46 },
};

static const struct clk_parent_data usb2phy1_src[] = {
 { .index = FLEXGEN_57 },
 { .index = HSE_DIV2 },
};

static const struct clk_parent_data usb2phy2_src[] = {
 { .index = FLEXGEN_58 },
 { .index = HSE_DIV2 },
};

static const struct clk_parent_data usb3pciphy_src[] = {
 { .index = FLEXGEN_34 },
 { .index = HSE_DIV2 },
};

static struct clk_stm32_gate ck_ker_ltdc;

static const struct clk_parent_data dsiblane_src[] = {
 { .index = DSI_TXBYTE },
 { .hw = &ck_ker_ltdc.hw },
};

static const struct clk_parent_data dsiphy_src[] = {
 { .index = FLEXGEN_28 },
 { .index = HSE },
};

static const struct clk_parent_data lvdsphy_src[] = {
 { .index = FLEXGEN_32 },
 { .index = HSE },
};

static const struct clk_parent_data dts_src[] = {
 { .index = HSI },
 { .index = HSE },
 { .index = MSI },
};

static const struct clk_parent_data mco1_src[] = {
 { .index = FLEXGEN_61 },
};

static const struct clk_parent_data mco2_src[] = {
 { .index = FLEXGEN_62 },
};

enum enum_mux_cfg {
 MUX_ADC12,
 MUX_ADC3,
 MUX_DSIBLANE,
 MUX_DSIPHY,
 MUX_DTS,
 MUX_LVDSPHY,
 MUX_MCO1,
 MUX_MCO2,
 MUX_USB2PHY1,
 MUX_USB2PHY2,
 MUX_USB3PCIEPHY,
 MUX_NB
};

#define MUX_CFG(id, _offset, _shift, _witdh) \
 [id] = {    \
  .offset  = (_offset), \
  .shift  = (_shift), \
  .width  = (_witdh), \
 }

static const struct stm32_mux_cfg stm32mp25_muxes[MUX_NB] = {
 MUX_CFG(MUX_ADC12,  RCC_ADC12CFGR,  12, 1),
 MUX_CFG(MUX_ADC3,  RCC_ADC3CFGR,  12, 2),
 MUX_CFG(MUX_DSIBLANE,  RCC_DSICFGR,  12, 1),
 MUX_CFG(MUX_DSIPHY,  RCC_DSICFGR,  15, 1),
 MUX_CFG(MUX_DTS,  RCC_DTSCFGR,  12, 2),
 MUX_CFG(MUX_LVDSPHY,  RCC_LVDSCFGR,  15, 1),
 MUX_CFG(MUX_MCO1,  RCC_MCO1CFGR,  0, 1),
 MUX_CFG(MUX_MCO2,  RCC_MCO2CFGR,  0, 1),
 MUX_CFG(MUX_USB2PHY1,  RCC_USB2PHY1CFGR, 15, 1),
 MUX_CFG(MUX_USB2PHY2,  RCC_USB2PHY2CFGR, 15, 1),
 MUX_CFG(MUX_USB3PCIEPHY, RCC_USB3PCIEPHYCFGR, 15, 1),
};

enum enum_gate_cfg {
 GATE_ADC12,
 GATE_ADC3,
 GATE_ADF1,
 GATE_CCI,
 GATE_CRC,
 GATE_CRYP1,
 GATE_CRYP2,
 GATE_CSI,
 GATE_DCMIPP,
 GATE_DSI,
 GATE_DTS,
 GATE_ETH1,
 GATE_ETH1MAC,
 GATE_ETH1RX,
 GATE_ETH1STP,
 GATE_ETH1TX,
 GATE_ETH2,
 GATE_ETH2MAC,
 GATE_ETH2RX,
 GATE_ETH2STP,
 GATE_ETH2TX,
 GATE_ETHSW,
 GATE_ETHSWACMCFG,
 GATE_ETHSWACMMSG,
 GATE_ETHSWMAC,
 GATE_ETHSWREF,
 GATE_FDCAN,
 GATE_GPU,
 GATE_HASH,
 GATE_HDP,
 GATE_I2C1,
 GATE_I2C2,
 GATE_I2C3,
 GATE_I2C4,
 GATE_I2C5,
 GATE_I2C6,
 GATE_I2C7,
 GATE_I2C8,
 GATE_I3C1,
 GATE_I3C2,
 GATE_I3C3,
 GATE_I3C4,
 GATE_IS2M,
 GATE_IWDG1,
 GATE_IWDG2,
 GATE_IWDG3,
 GATE_IWDG4,
 GATE_IWDG5,
 GATE_LPTIM1,
 GATE_LPTIM2,
 GATE_LPTIM3,
 GATE_LPTIM4,
 GATE_LPTIM5,
 GATE_LPUART1,
 GATE_LTDC,
 GATE_LVDS,
 GATE_MCO1,
 GATE_MCO2,
 GATE_MDF1,
 GATE_OSPIIOM,
 GATE_PCIE,
 GATE_PKA,
 GATE_RNG,
 GATE_SAES,
 GATE_SAI1,
 GATE_SAI2,
 GATE_SAI3,
 GATE_SAI4,
 GATE_SDMMC1,
 GATE_SDMMC2,
 GATE_SDMMC3,
 GATE_SERC,
 GATE_SPDIFRX,
 GATE_SPI1,
 GATE_SPI2,
 GATE_SPI3,
 GATE_SPI4,
 GATE_SPI5,
 GATE_SPI6,
 GATE_SPI7,
 GATE_SPI8,
 GATE_TIM1,
 GATE_TIM10,
 GATE_TIM11,
 GATE_TIM12,
 GATE_TIM13,
 GATE_TIM14,
 GATE_TIM15,
 GATE_TIM16,
 GATE_TIM17,
 GATE_TIM2,
 GATE_TIM20,
 GATE_TIM3,
 GATE_TIM4,
 GATE_TIM5,
 GATE_TIM6,
 GATE_TIM7,
 GATE_TIM8,
 GATE_UART4,
 GATE_UART5,
 GATE_UART7,
 GATE_UART8,
 GATE_UART9,
 GATE_USART1,
 GATE_USART2,
 GATE_USART3,
 GATE_USART6,
 GATE_USBH,
 GATE_USB2PHY1,
 GATE_USB2PHY2,
 GATE_USB3DR,
 GATE_USB3PCIEPHY,
 GATE_USBTC,
 GATE_VDEC,
 GATE_VENC,
 GATE_VREF,
 GATE_WWDG1,
 GATE_WWDG2,
 GATE_NB
};

#define GATE_CFG(id, _offset, _bit_idx, _offset_clr) \
 [id] = {     \
  .offset  = (_offset),  \
  .bit_idx = (_bit_idx),  \
  .set_clr = (_offset_clr), \
 }

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_CCI,  RCC_CCICFGR,  1, 0),
 GATE_CFG(GATE_CRC,  RCC_CRCCFGR,  1, 0),
 GATE_CFG(GATE_CRYP1,  RCC_CRYP1CFGR,  1, 0),
 GATE_CFG(GATE_CRYP2,  RCC_CRYP2CFGR,  1, 0),
 GATE_CFG(GATE_CSI,  RCC_CSICFGR,  1, 0),
 GATE_CFG(GATE_DCMIPP,  RCC_DCMIPPCFGR,  1, 0),
 GATE_CFG(GATE_DSI,  RCC_DSICFGR,  1, 0),
 GATE_CFG(GATE_DTS,  RCC_DTSCFGR,  1, 0),
 GATE_CFG(GATE_ETH1,  RCC_ETH1CFGR,  5, 0),
 GATE_CFG(GATE_ETH1MAC,  RCC_ETH1CFGR,  1, 0),
 GATE_CFG(GATE_ETH1RX,  RCC_ETH1CFGR,  10, 0),
 GATE_CFG(GATE_ETH1STP,  RCC_ETH1CFGR,  4, 0),
 GATE_CFG(GATE_ETH1TX,  RCC_ETH1CFGR,  8, 0),
 GATE_CFG(GATE_ETH2,  RCC_ETH2CFGR,  5, 0),
 GATE_CFG(GATE_ETH2MAC,  RCC_ETH2CFGR,  1, 0),
 GATE_CFG(GATE_ETH2RX,  RCC_ETH2CFGR,  10, 0),
 GATE_CFG(GATE_ETH2STP,  RCC_ETH2CFGR,  4, 0),
 GATE_CFG(GATE_ETH2TX,  RCC_ETH2CFGR,  8, 0),
 GATE_CFG(GATE_ETHSW,  RCC_ETHSWCFGR,  5, 0),
 GATE_CFG(GATE_ETHSWACMCFG, RCC_ETHSWACMCFGR, 1, 0),
 GATE_CFG(GATE_ETHSWACMMSG, RCC_ETHSWACMMSGCFGR, 1, 0),
 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_GPU,  RCC_GPUCFGR,  1, 0),
 GATE_CFG(GATE_HASH,  RCC_HASHCFGR,  1, 0),
 GATE_CFG(GATE_HDP,  RCC_HDPCFGR,  1, 0),
 GATE_CFG(GATE_I2C1,  RCC_I2C1CFGR,  1, 0),
 GATE_CFG(GATE_I2C2,  RCC_I2C2CFGR,  1, 0),
 GATE_CFG(GATE_I2C3,  RCC_I2C3CFGR,  1, 0),
 GATE_CFG(GATE_I2C4,  RCC_I2C4CFGR,  1, 0),
 GATE_CFG(GATE_I2C5,  RCC_I2C5CFGR,  1, 0),
 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_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_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_LPTIM1,  RCC_LPTIM1CFGR,  1, 0),
 GATE_CFG(GATE_LPTIM2,  RCC_LPTIM2CFGR,  1, 0),
 GATE_CFG(GATE_LPTIM3,  RCC_LPTIM3CFGR,  1, 0),
 GATE_CFG(GATE_LPTIM4,  RCC_LPTIM4CFGR,  1, 0),
 GATE_CFG(GATE_LPTIM5,  RCC_LPTIM5CFGR,  1, 0),
 GATE_CFG(GATE_LPUART1,  RCC_LPUART1CFGR, 1, 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),
 GATE_CFG(GATE_MCO2,  RCC_MCO2CFGR,  8, 0),
 GATE_CFG(GATE_MDF1,  RCC_MDF1CFGR,  1, 0),
 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_RNG,  RCC_RNGCFGR,  1, 0),
 GATE_CFG(GATE_SAES,  RCC_SAESCFGR,  1, 0),
 GATE_CFG(GATE_SAI1,  RCC_SAI1CFGR,  1, 0),
 GATE_CFG(GATE_SAI2,  RCC_SAI2CFGR,  1, 0),
 GATE_CFG(GATE_SAI3,  RCC_SAI3CFGR,  1, 0),
 GATE_CFG(GATE_SAI4,  RCC_SAI4CFGR,  1, 0),
 GATE_CFG(GATE_SDMMC1,  RCC_SDMMC1CFGR,  1, 0),
 GATE_CFG(GATE_SDMMC2,  RCC_SDMMC2CFGR,  1, 0),
 GATE_CFG(GATE_SDMMC3,  RCC_SDMMC3CFGR,  1, 0),
 GATE_CFG(GATE_SERC,  RCC_SERCCFGR,  1, 0),
 GATE_CFG(GATE_SPDIFRX,  RCC_SPDIFRXCFGR, 1, 0),
 GATE_CFG(GATE_SPI1,  RCC_SPI1CFGR,  1, 0),
 GATE_CFG(GATE_SPI2,  RCC_SPI2CFGR,  1, 0),
 GATE_CFG(GATE_SPI3,  RCC_SPI3CFGR,  1, 0),
 GATE_CFG(GATE_SPI4,  RCC_SPI4CFGR,  1, 0),
 GATE_CFG(GATE_SPI5,  RCC_SPI5CFGR,  1, 0),
 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_TIM1,  RCC_TIM1CFGR,  1, 0),
 GATE_CFG(GATE_TIM10,  RCC_TIM10CFGR,  1, 0),
 GATE_CFG(GATE_TIM11,  RCC_TIM11CFGR,  1, 0),
 GATE_CFG(GATE_TIM12,  RCC_TIM12CFGR,  1, 0),
 GATE_CFG(GATE_TIM13,  RCC_TIM13CFGR,  1, 0),
 GATE_CFG(GATE_TIM14,  RCC_TIM14CFGR,  1, 0),
 GATE_CFG(GATE_TIM15,  RCC_TIM15CFGR,  1, 0),
 GATE_CFG(GATE_TIM16,  RCC_TIM16CFGR,  1, 0),
 GATE_CFG(GATE_TIM17,  RCC_TIM17CFGR,  1, 0),
 GATE_CFG(GATE_TIM2,  RCC_TIM2CFGR,  1, 0),
 GATE_CFG(GATE_TIM20,  RCC_TIM20CFGR,  1, 0),
 GATE_CFG(GATE_TIM3,  RCC_TIM3CFGR,  1, 0),
 GATE_CFG(GATE_TIM4,  RCC_TIM4CFGR,  1, 0),
 GATE_CFG(GATE_TIM5,  RCC_TIM5CFGR,  1, 0),
 GATE_CFG(GATE_TIM6,  RCC_TIM6CFGR,  1, 0),
 GATE_CFG(GATE_TIM7,  RCC_TIM7CFGR,  1, 0),
 GATE_CFG(GATE_TIM8,  RCC_TIM8CFGR,  1, 0),
 GATE_CFG(GATE_UART4,  RCC_UART4CFGR,  1, 0),
 GATE_CFG(GATE_UART5,  RCC_UART5CFGR,  1, 0),
 GATE_CFG(GATE_UART7,  RCC_UART7CFGR,  1, 0),
 GATE_CFG(GATE_UART8,  RCC_UART8CFGR,  1, 0),
 GATE_CFG(GATE_UART9,  RCC_UART9CFGR,  1, 0),
 GATE_CFG(GATE_USART1,  RCC_USART1CFGR,  1, 0),
 GATE_CFG(GATE_USART2,  RCC_USART2CFGR,  1, 0),
 GATE_CFG(GATE_USART3,  RCC_USART3CFGR,  1, 0),
 GATE_CFG(GATE_USART6,  RCC_USART6CFGR,  1, 0),
 GATE_CFG(GATE_USBH,  RCC_USBHCFGR,  1, 0),
 GATE_CFG(GATE_USB2PHY1,  RCC_USB2PHY1CFGR, 1, 0),
 GATE_CFG(GATE_USB2PHY2,  RCC_USB2PHY2CFGR, 1, 0),
 GATE_CFG(GATE_USB3DR,  RCC_USB3DRCFGR,  1, 0),
 GATE_CFG(GATE_USB3PCIEPHY, RCC_USB3PCIEPHYCFGR, 1, 0),
 GATE_CFG(GATE_USBTC,  RCC_USBTCCFGR,  1, 0),
 GATE_CFG(GATE_VDEC,  RCC_VDECCFGR,  1, 0),
 GATE_CFG(GATE_VENC,  RCC_VENCCFGR,  1, 0),
 GATE_CFG(GATE_VREF,  RCC_VREFCFGR,  1, 0),
 GATE_CFG(GATE_WWDG1,  RCC_WWDG1CFGR,  1, 0),
 GATE_CFG(GATE_WWDG2,  RCC_WWDG2CFGR,  1, 0),
};

#define CLK_HW_INIT_INDEX(_name, _parent, _ops, _flags)  \
 (&(struct clk_init_data) {     \
  .flags  = _flags,    \
  .name  = _name,    \
  .parent_data = (const struct clk_parent_data[]) { \
     { .index = _parent },  \
      },     \
  .num_parents = 1,     \
  .ops  = _ops,     \
 })

/* ADC */
static struct clk_stm32_gate ck_icn_p_adc12 = {
 .gate_id = GATE_ADC12,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_adc12", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_composite ck_ker_adc12 = {
 .gate_id = GATE_ADC12,
 .mux_id = MUX_ADC12,
 .div_id = NO_STM32_DIV,
 .hw.init = CLK_HW_INIT_PARENTS_DATA("ck_ker_adc12", adc12_src, &clk_stm32_composite_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_adc3 = {
 .gate_id = GATE_ADC3,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_adc3", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_composite ck_ker_adc3 = {
 .gate_id = GATE_ADC3,
 .mux_id = MUX_ADC3,
 .div_id = NO_STM32_DIV,
 .hw.init = CLK_HW_INIT_PARENTS_DATA("ck_ker_adc3", adc3_src, &clk_stm32_composite_ops, 0),
};

/* ADF */
static struct clk_stm32_gate ck_icn_p_adf1 = {
 .gate_id = GATE_ADF1,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_adf1", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_adf1 = {
 .gate_id = GATE_ADF1,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_adf1", FLEXGEN_42, &clk_stm32_gate_ops, 0),
};

/* DCMI */
static struct clk_stm32_gate ck_icn_p_cci = {
 .gate_id = GATE_CCI,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_cci", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

/* CSI-HOST */
static struct clk_stm32_gate ck_icn_p_csi = {
 .gate_id = GATE_CSI,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_csi", ICN_APB4, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_csi = {
 .gate_id = GATE_CSI,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_csi", FLEXGEN_29, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_csitxesc = {
 .gate_id = GATE_CSI,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_csitxesc", FLEXGEN_30, &clk_stm32_gate_ops, 0),
};

/* CSI-PHY */
static struct clk_stm32_gate ck_ker_csiphy = {
 .gate_id = GATE_CSI,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_csiphy", FLEXGEN_31, &clk_stm32_gate_ops, 0),
};

/* DCMIPP */
static struct clk_stm32_gate ck_icn_p_dcmipp = {
 .gate_id = GATE_DCMIPP,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_dcmipp", ICN_APB4, &clk_stm32_gate_ops, 0),
};

/* CRC */
static struct clk_stm32_gate ck_icn_p_crc = {
 .gate_id = GATE_CRC,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_crc", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

/* CRYP */
static struct clk_stm32_gate ck_icn_p_cryp1 = {
 .gate_id = GATE_CRYP1,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_cryp1", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_cryp2 = {
 .gate_id = GATE_CRYP2,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_cryp2", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

/* DBG & TRACE*/
/* Trace and debug clocks are managed by SCMI */

/* LTDC */
static struct clk_stm32_gate ck_icn_p_ltdc = {
 .gate_id = GATE_LTDC,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_ltdc", ICN_APB4, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_ltdc = {
 .gate_id = GATE_LTDC,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_ltdc", FLEXGEN_27, &clk_stm32_gate_ops,
         CLK_SET_RATE_PARENT),
};

/* DSI */
static struct clk_stm32_gate ck_icn_p_dsi = {
 .gate_id = GATE_DSI,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_dsi", ICN_APB4, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_composite clk_lanebyte = {
 .gate_id = GATE_DSI,
 .mux_id = MUX_DSIBLANE,
 .div_id = NO_STM32_DIV,
 .hw.init = CLK_HW_INIT_PARENTS_DATA("clk_lanebyte", dsiblane_src,
         &clk_stm32_composite_ops, 0),
};

/* LVDS */
static struct clk_stm32_gate ck_icn_p_lvds = {
 .gate_id = GATE_LVDS,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_lvds", ICN_APB4, &clk_stm32_gate_ops, 0),
};

/* DSI PHY */
static struct clk_stm32_composite clk_phy_dsi = {
 .gate_id = GATE_DSI,
 .mux_id = MUX_DSIPHY,
 .div_id = NO_STM32_DIV,
 .hw.init = CLK_HW_INIT_PARENTS_DATA("clk_phy_dsi", dsiphy_src,
         &clk_stm32_composite_ops, 0),
};

/* LVDS PHY */
static struct clk_stm32_composite ck_ker_lvdsphy = {
 .gate_id = GATE_LVDS,
 .mux_id = MUX_LVDSPHY,
 .div_id = NO_STM32_DIV,
 .hw.init = CLK_HW_INIT_PARENTS_DATA("ck_ker_lvdsphy", lvdsphy_src,
         &clk_stm32_composite_ops, 0),
};

/* DTS */
static struct clk_stm32_composite ck_ker_dts = {
 .gate_id = GATE_DTS,
 .mux_id = MUX_DTS,
 .div_id = NO_STM32_DIV,
 .hw.init = CLK_HW_INIT_PARENTS_DATA("ck_ker_dts", dts_src,
         &clk_stm32_composite_ops, 0),
};

/* ETHERNET */
static struct clk_stm32_gate ck_icn_p_eth1 = {
 .gate_id = GATE_ETH1,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_eth1", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_eth1stp = {
 .gate_id = GATE_ETH1STP,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_eth1stp", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_eth1 = {
 .gate_id = GATE_ETH1,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_eth1", FLEXGEN_54, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_eth1ptp = {
 .gate_id = GATE_ETH1,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_eth1ptp", FLEXGEN_56, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_eth1mac = {
 .gate_id = GATE_ETH1MAC,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_eth1mac", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_eth1tx = {
 .gate_id = GATE_ETH1TX,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_eth1tx", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_eth1rx = {
 .gate_id = GATE_ETH1RX,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_eth1rx", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_eth2 = {
 .gate_id = GATE_ETH2,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_eth2", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_eth2stp = {
 .gate_id = GATE_ETH2STP,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_eth2stp", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_eth2 = {
 .gate_id = GATE_ETH2,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_eth2", FLEXGEN_55, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_eth2ptp = {
 .gate_id = GATE_ETH2,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_eth2ptp", FLEXGEN_56, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_eth2mac = {
 .gate_id = GATE_ETH2MAC,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_eth2mac", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_eth2tx = {
 .gate_id = GATE_ETH2TX,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_eth2tx", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_eth2rx = {
 .gate_id = GATE_ETH2RX,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_eth2rx", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_ethsw = {
 .gate_id = GATE_ETHSWMAC,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_ethsw", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_ethsw = {
 .gate_id = GATE_ETHSW,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_ethsw", FLEXGEN_54, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_ethswref = {
 .gate_id = GATE_ETHSWREF,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_ethswref", FLEXGEN_60, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_ethsw_acm_cfg = {
 .gate_id = GATE_ETHSWACMCFG,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_ethsw_acm_cfg", ICN_LS_MCU,
         &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_ethsw_acm_msg = {
 .gate_id = GATE_ETHSWACMMSG,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_ethsw_acm_msg", ICN_LS_MCU,
         &clk_stm32_gate_ops, 0),
};

/* FDCAN */
static struct clk_stm32_gate ck_icn_p_fdcan = {
 .gate_id = GATE_FDCAN,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_fdcan", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_fdcan = {
 .gate_id = GATE_FDCAN,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_fdcan", FLEXGEN_26, &clk_stm32_gate_ops, 0),
};

/* GPU */
static struct clk_stm32_gate ck_icn_m_gpu = {
 .gate_id = GATE_GPU,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_m_gpu", FLEXGEN_59, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_gpu = {
 .gate_id = GATE_GPU,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_gpu", PLL3, &clk_stm32_gate_ops, 0),
};

/* HASH */
static struct clk_stm32_gate ck_icn_p_hash = {
 .gate_id = GATE_HASH,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_hash", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

/* HDP */
static struct clk_stm32_gate ck_icn_p_hdp = {
 .gate_id = GATE_HDP,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_hdp", ICN_APB3, &clk_stm32_gate_ops, 0),
};

/* I2C */
static struct clk_stm32_gate ck_icn_p_i2c8 = {
 .gate_id = GATE_I2C8,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_i2c8", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_i2c1 = {
 .gate_id = GATE_I2C1,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_i2c1", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_i2c2 = {
 .gate_id = GATE_I2C2,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_i2c2", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_i2c3 = {
 .gate_id = GATE_I2C3,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_i2c3", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_i2c4 = {
 .gate_id = GATE_I2C4,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_i2c4", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_i2c5 = {
 .gate_id = GATE_I2C5,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_i2c5", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_i2c6 = {
 .gate_id = GATE_I2C6,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_i2c6", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_i2c7 = {
 .gate_id = GATE_I2C7,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_i2c7", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_i2c1 = {
 .gate_id = GATE_I2C1,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_i2c1", FLEXGEN_12, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_i2c2 = {
 .gate_id = GATE_I2C2,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_i2c2", FLEXGEN_12, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_i2c3 = {
 .gate_id = GATE_I2C3,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_i2c3", FLEXGEN_13, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_i2c5 = {
 .gate_id = GATE_I2C5,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_i2c5", FLEXGEN_13, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_i2c4 = {
 .gate_id = GATE_I2C4,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_i2c4", FLEXGEN_14, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_i2c6 = {
 .gate_id = GATE_I2C6,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_i2c6", FLEXGEN_14, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_i2c7 = {
 .gate_id = GATE_I2C7,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_i2c7", FLEXGEN_15, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_i2c8 = {
 .gate_id = GATE_I2C8,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_i2c8", FLEXGEN_38, &clk_stm32_gate_ops, 0),
};

/* I3C */
static struct clk_stm32_gate ck_icn_p_i3c1 = {
 .gate_id = GATE_I3C1,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_i3c1", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_i3c2 = {
 .gate_id = GATE_I3C2,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_i3c2", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_i3c3 = {
 .gate_id = GATE_I3C3,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_i3c3", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_i3c4 = {
 .gate_id = GATE_I3C4,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_i3c4", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_i3c1 = {
 .gate_id = GATE_I3C1,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_i3c1", FLEXGEN_12, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_i3c2 = {
 .gate_id = GATE_I3C2,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_i3c2", FLEXGEN_12, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_i3c3 = {
 .gate_id = GATE_I3C3,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_i3c3", FLEXGEN_13, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_i3c4 = {
 .gate_id = GATE_I3C4,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_i3c4", FLEXGEN_36, &clk_stm32_gate_ops, 0),
};

/* I2S */
static struct clk_stm32_gate ck_icn_p_is2m = {
 .gate_id = GATE_IS2M,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_is2m", ICN_APB3, &clk_stm32_gate_ops, 0),
};

/* IWDG */
static struct clk_stm32_gate ck_icn_p_iwdg1 = {
 .gate_id = GATE_IWDG1,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_iwdg1", ICN_APB3, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_iwdg2 = {
 .gate_id = GATE_IWDG2,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_iwdg2", ICN_APB3, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_iwdg3 = {
 .gate_id = GATE_IWDG3,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_iwdg3", ICN_APB3, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_iwdg4 = {
 .gate_id = GATE_IWDG4,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_iwdg4", ICN_APB3, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_iwdg5 = {
 .gate_id = GATE_IWDG5,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_iwdg5", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

/* LPTIM */
static struct clk_stm32_gate ck_icn_p_lptim1 = {
 .gate_id = GATE_LPTIM1,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_lptim1", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_lptim2 = {
 .gate_id = GATE_LPTIM2,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_lptim2", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_lptim3 = {
 .gate_id = GATE_LPTIM3,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_lptim3", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_lptim4 = {
 .gate_id = GATE_LPTIM4,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_lptim4", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_lptim5 = {
 .gate_id = GATE_LPTIM5,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_lptim5", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_lptim1 = {
 .gate_id = GATE_LPTIM1,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_lptim1", FLEXGEN_07, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_lptim2 = {
 .gate_id = GATE_LPTIM2,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_lptim2", FLEXGEN_07, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_lptim3 = {
 .gate_id = GATE_LPTIM3,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_lptim3", FLEXGEN_40, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_lptim4 = {
 .gate_id = GATE_LPTIM4,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_lptim4", FLEXGEN_41, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_lptim5 = {
 .gate_id = GATE_LPTIM5,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_lptim5", FLEXGEN_41, &clk_stm32_gate_ops, 0),
};

/* LPUART */
static struct clk_stm32_gate ck_icn_p_lpuart1 = {
 .gate_id = GATE_LPUART1,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_lpuart1", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_lpuart1 = {
 .gate_id = GATE_LPUART1,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_lpuart1", FLEXGEN_39, &clk_stm32_gate_ops, 0),
};

/* MCO1 & MCO2 */
static struct clk_stm32_composite ck_mco1 = {
 .gate_id = GATE_MCO1,
 .mux_id = MUX_MCO1,
 .div_id = NO_STM32_DIV,
 .hw.init = CLK_HW_INIT_PARENTS_DATA("ck_mco1", mco1_src, &clk_stm32_composite_ops, 0),
};

static struct clk_stm32_composite ck_mco2 = {
 .gate_id = GATE_MCO2,
 .mux_id = MUX_MCO2,
 .div_id = NO_STM32_DIV,
 .hw.init = CLK_HW_INIT_PARENTS_DATA("ck_mco2", mco2_src, &clk_stm32_composite_ops, 0),
};

/* MDF */
static struct clk_stm32_gate ck_icn_p_mdf1 = {
 .gate_id = GATE_MDF1,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_mdf1", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_mdf1 = {
 .gate_id = GATE_MDF1,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_mdf1", FLEXGEN_23, &clk_stm32_gate_ops, 0),
};

/* OSPI */
static struct clk_stm32_gate ck_icn_p_ospiiom = {
 .gate_id = GATE_OSPIIOM,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_ospiiom", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

/* PCIE */
static struct clk_stm32_gate ck_icn_p_pcie = {
 .gate_id = GATE_PCIE,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_pcie", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

/* PKA */
static struct clk_stm32_gate ck_icn_p_pka = {
 .gate_id = GATE_PKA,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_pka", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

/* RNG */
static struct clk_stm32_gate ck_icn_p_rng = {
 .gate_id = GATE_RNG,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_rng", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

/* SAES */
static struct clk_stm32_gate ck_icn_p_saes = {
 .gate_id = GATE_SAES,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_saes", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

/* SAI */
static struct clk_stm32_gate ck_icn_p_sai1 = {
 .gate_id = GATE_SAI1,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_sai1", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_sai2 = {
 .gate_id = GATE_SAI2,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_sai2", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_sai3 = {
 .gate_id = GATE_SAI3,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_sai3", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_sai4 = {
 .gate_id = GATE_SAI4,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_sai4", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_sai1 = {
 .gate_id = GATE_SAI1,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_sai1", FLEXGEN_23, &clk_stm32_gate_ops,
         CLK_SET_RATE_PARENT),
};

static struct clk_stm32_gate ck_ker_sai2 = {
 .gate_id = GATE_SAI2,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_sai2", FLEXGEN_24, &clk_stm32_gate_ops,
         CLK_SET_RATE_PARENT),
};

static struct clk_stm32_gate ck_ker_sai3 = {
 .gate_id = GATE_SAI3,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_sai3", FLEXGEN_25, &clk_stm32_gate_ops,
         CLK_SET_RATE_PARENT),
};

static struct clk_stm32_gate ck_ker_sai4 = {
 .gate_id = GATE_SAI4,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_sai4", FLEXGEN_25, &clk_stm32_gate_ops,
         CLK_SET_RATE_PARENT),
};

/* SDMMC */
static struct clk_stm32_gate ck_icn_m_sdmmc1 = {
 .gate_id = GATE_SDMMC1,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_m_sdmmc1", ICN_SDMMC, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_m_sdmmc2 = {
 .gate_id = GATE_SDMMC2,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_m_sdmmc2", ICN_SDMMC, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_m_sdmmc3 = {
 .gate_id = GATE_SDMMC3,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_m_sdmmc3", ICN_SDMMC, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_sdmmc1 = {
 .gate_id = GATE_SDMMC1,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_sdmmc1", FLEXGEN_51, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_sdmmc2 = {
 .gate_id = GATE_SDMMC2,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_sdmmc2", FLEXGEN_52, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_sdmmc3 = {
 .gate_id = GATE_SDMMC3,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_sdmmc3", FLEXGEN_53, &clk_stm32_gate_ops, 0),
};

/* SERC */
static struct clk_stm32_gate ck_icn_p_serc = {
 .gate_id = GATE_SERC,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_serc", ICN_APB3, &clk_stm32_gate_ops, 0),
};

/* SPDIF */
static struct clk_stm32_gate ck_icn_p_spdifrx = {
 .gate_id = GATE_SPDIFRX,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_spdifrx", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_spdifrx = {
 .gate_id = GATE_SPDIFRX,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_spdifrx", FLEXGEN_11, &clk_stm32_gate_ops, 0),
};

/* SPI */
static struct clk_stm32_gate ck_icn_p_spi1 = {
 .gate_id = GATE_SPI1,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_spi1", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_spi2 = {
 .gate_id = GATE_SPI2,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_spi2", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_spi3 = {
 .gate_id = GATE_SPI3,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_spi3", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_spi4 = {
 .gate_id = GATE_SPI4,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_spi4", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_spi5 = {
 .gate_id = GATE_SPI5,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_spi5", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_spi6 = {
 .gate_id = GATE_SPI6,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_spi6", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_spi7 = {
 .gate_id = GATE_SPI7,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_spi7", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_spi8 = {
 .gate_id = GATE_SPI8,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_spi8", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_spi1 = {
 .gate_id = GATE_SPI1,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_spi1", FLEXGEN_16, &clk_stm32_gate_ops,
         CLK_SET_RATE_PARENT),
};

static struct clk_stm32_gate ck_ker_spi2 = {
 .gate_id = GATE_SPI2,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_spi2", FLEXGEN_10, &clk_stm32_gate_ops,
         CLK_SET_RATE_PARENT),
};

static struct clk_stm32_gate ck_ker_spi3 = {
 .gate_id = GATE_SPI3,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_spi3", FLEXGEN_10, &clk_stm32_gate_ops,
         CLK_SET_RATE_PARENT),
};

static struct clk_stm32_gate ck_ker_spi4 = {
 .gate_id = GATE_SPI4,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_spi4", FLEXGEN_17, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_spi5 = {
 .gate_id = GATE_SPI5,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_spi5", FLEXGEN_17, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_spi6 = {
 .gate_id = GATE_SPI6,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_spi6", FLEXGEN_18, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_spi7 = {
 .gate_id = GATE_SPI7,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_spi7", FLEXGEN_18, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_spi8 = {
 .gate_id = GATE_SPI8,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_spi8", FLEXGEN_37, &clk_stm32_gate_ops, 0),
};

/* Timers */
static struct clk_stm32_gate ck_icn_p_tim2 = {
 .gate_id = GATE_TIM2,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_tim2", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_tim3 = {
 .gate_id = GATE_TIM3,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_tim3", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_tim4 = {
 .gate_id = GATE_TIM4,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_tim4", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_tim5 = {
 .gate_id = GATE_TIM5,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_tim5", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_tim6 = {
 .gate_id = GATE_TIM6,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_tim6", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_tim7 = {
 .gate_id = GATE_TIM7,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_tim7", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_tim10 = {
 .gate_id = GATE_TIM10,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_tim10", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_tim11 = {
 .gate_id = GATE_TIM11,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_tim11", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_tim12 = {
 .gate_id = GATE_TIM12,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_tim12", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_tim13 = {
 .gate_id = GATE_TIM13,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_tim13", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_tim14 = {
 .gate_id = GATE_TIM14,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_tim14", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_tim1 = {
 .gate_id = GATE_TIM1,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_tim1", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_tim8 = {
 .gate_id = GATE_TIM8,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_tim8", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_tim15 = {
 .gate_id = GATE_TIM15,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_tim15", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_tim16 = {
 .gate_id = GATE_TIM16,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_tim16", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_tim17 = {
 .gate_id = GATE_TIM17,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_tim17", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_tim20 = {
 .gate_id = GATE_TIM20,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_tim20", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_tim2 = {
 .gate_id = GATE_TIM2,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_tim2", TIMG1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_tim3 = {
 .gate_id = GATE_TIM3,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_tim3", TIMG1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_tim4 = {
 .gate_id = GATE_TIM4,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_tim4", TIMG1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_tim5 = {
 .gate_id = GATE_TIM5,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_tim5", TIMG1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_tim6 = {
 .gate_id = GATE_TIM6,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_tim6", TIMG1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_tim7 = {
 .gate_id = GATE_TIM7,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_tim7", TIMG1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_tim10 = {
 .gate_id = GATE_TIM10,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_tim10", TIMG1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_tim11 = {
 .gate_id = GATE_TIM11,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_tim11", TIMG1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_tim12 = {
 .gate_id = GATE_TIM12,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_tim12", TIMG1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_tim13 = {
 .gate_id = GATE_TIM13,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_tim13", TIMG1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_tim14 = {
 .gate_id = GATE_TIM14,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_tim14", TIMG1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_tim1 = {
 .gate_id = GATE_TIM1,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_tim1", TIMG2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_tim8 = {
 .gate_id = GATE_TIM8,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_tim8", TIMG2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_tim15 = {
 .gate_id = GATE_TIM15,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_tim15", TIMG2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_tim16 = {
 .gate_id = GATE_TIM16,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_tim16", TIMG2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_tim17 = {
 .gate_id = GATE_TIM17,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_tim17", TIMG2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_tim20 = {
 .gate_id = GATE_TIM20,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_tim20", TIMG2, &clk_stm32_gate_ops, 0),
};

/* UART/USART */
static struct clk_stm32_gate ck_icn_p_usart2 = {
 .gate_id = GATE_USART2,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_usart2", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_usart3 = {
 .gate_id = GATE_USART3,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_usart3", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_uart4 = {
 .gate_id = GATE_UART4,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_uart4", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_uart5 = {
 .gate_id = GATE_UART5,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_uart5", ICN_APB1, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_usart1 = {
 .gate_id = GATE_USART1,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_usart1", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_usart6 = {
 .gate_id = GATE_USART6,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_usart6", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_uart7 = {
 .gate_id = GATE_UART7,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_uart7", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_uart8 = {
 .gate_id = GATE_UART8,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_uart8", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_uart9 = {
 .gate_id = GATE_UART9,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_uart9", ICN_APB2, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_usart2 = {
 .gate_id = GATE_USART2,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_usart2", FLEXGEN_08, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_uart4 = {
 .gate_id = GATE_UART4,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_uart4", FLEXGEN_08, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_usart3 = {
 .gate_id = GATE_USART3,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_usart3", FLEXGEN_09, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_uart5 = {
 .gate_id = GATE_UART5,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_uart5", FLEXGEN_09, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_usart1 = {
 .gate_id = GATE_USART1,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_usart1", FLEXGEN_19, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_usart6 = {
 .gate_id = GATE_USART6,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_usart6", FLEXGEN_20, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_uart7 = {
 .gate_id = GATE_UART7,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_uart7", FLEXGEN_21, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_uart8 = {
 .gate_id = GATE_UART8,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_uart8", FLEXGEN_21, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_uart9 = {
 .gate_id = GATE_UART9,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_uart9", FLEXGEN_22, &clk_stm32_gate_ops, 0),
};

/* USB2PHY1 */
static struct clk_stm32_composite ck_ker_usb2phy1 = {
 .gate_id = GATE_USB2PHY1,
 .mux_id = MUX_USB2PHY1,
 .div_id = NO_STM32_DIV,
 .hw.init = CLK_HW_INIT_PARENTS_DATA("ck_ker_usb2phy1", usb2phy1_src,
         &clk_stm32_composite_ops, 0),
};

/* USB2H */
static struct clk_stm32_gate ck_icn_m_usb2ehci = {
 .gate_id = GATE_USBH,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_m_usb2ehci", ICN_HSL, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_m_usb2ohci = {
 .gate_id = GATE_USBH,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_m_usb2ohci", ICN_HSL, &clk_stm32_gate_ops, 0),
};

/* USB2PHY2 */
static struct clk_stm32_composite ck_ker_usb2phy2_en = {
 .gate_id = GATE_USB2PHY2,
 .mux_id = MUX_USB2PHY2,
 .div_id = NO_STM32_DIV,
 .hw.init = CLK_HW_INIT_PARENTS_DATA("ck_ker_usb2phy2_en", usb2phy2_src,
         &clk_stm32_composite_ops, 0),
};

/* USB3 PCIe COMBOPHY */
static struct clk_stm32_gate ck_icn_p_usb3pciephy = {
 .gate_id = GATE_USB3PCIEPHY,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_usb3pciephy", ICN_APB4, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_composite ck_ker_usb3pciephy = {
 .gate_id = GATE_USB3PCIEPHY,
 .mux_id = MUX_USB3PCIEPHY,
 .div_id = NO_STM32_DIV,
 .hw.init = CLK_HW_INIT_PARENTS_DATA("ck_ker_usb3pciephy", usb3pciphy_src,
         &clk_stm32_composite_ops, 0),
};

/* USB3 DRD */
static struct clk_stm32_gate ck_icn_m_usb3dr = {
 .gate_id = GATE_USB3DR,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_m_usb3dr", ICN_HSL, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_usb2phy2 = {
 .gate_id = GATE_USB3DR,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_usb2phy2", FLEXGEN_58, &clk_stm32_gate_ops, 0),
};

/* USBTC */
static struct clk_stm32_gate ck_icn_p_usbtc = {
 .gate_id = GATE_USBTC,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_usbtc", ICN_APB4, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_ker_usbtc = {
 .gate_id = GATE_USBTC,
 .hw.init = CLK_HW_INIT_INDEX("ck_ker_usbtc", FLEXGEN_35, &clk_stm32_gate_ops, 0),
};

/* VDEC / VENC */
static struct clk_stm32_gate ck_icn_p_vdec = {
 .gate_id = GATE_VDEC,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_vdec", ICN_APB4, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_venc = {
 .gate_id = GATE_VENC,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_venc", ICN_APB4, &clk_stm32_gate_ops, 0),
};

/* VREF */
static struct clk_stm32_gate ck_icn_p_vref = {
 .gate_id = GATE_VREF,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_vref", ICN_APB3, &clk_stm32_gate_ops, 0),
};

/* WWDG */
static struct clk_stm32_gate ck_icn_p_wwdg1 = {
 .gate_id = GATE_WWDG1,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_wwdg1", ICN_APB3, &clk_stm32_gate_ops, 0),
};

static struct clk_stm32_gate ck_icn_p_wwdg2 = {
 .gate_id = GATE_WWDG2,
 .hw.init = CLK_HW_INIT_INDEX("ck_icn_p_wwdg2", ICN_LS_MCU, &clk_stm32_gate_ops, 0),
};

static struct stm32_firewall firewall;

static int stm32_rcc_get_access(void __iomem *base, u32 index)
{
 u32 seccfgr, cidcfgr, semcr;
 int bit, cid;

 bit = index % RCC_REG_SIZE;

 seccfgr = readl(base + RCC_SECCFGR(index));
 if (seccfgr & BIT(bit))
  return -EACCES;

 cidcfgr = readl(base + RCC_CIDCFGR(index));
 if (!(cidcfgr & RCC_CIDCFGR_CFEN))
  /* CID filtering is turned off: access granted */
  return 0;

 if (!(cidcfgr & RCC_CIDCFGR_SEM_EN)) {
  /* Static CID mode */
  cid = FIELD_GET(RCC_CIDCFGR_SCID_MASK, cidcfgr);
  if (cid != RCC_CID1)
   return -EACCES;
  return 0;
 }

 /* Pass-list with semaphore mode */
 if (!(cidcfgr & RCC_CIDCFGR_SEMWLC1_EN))
  return -EACCES;

 semcr = readl(base + RCC_SEMCR(index));

 cid = FIELD_GET(RCC_SEMCR_SEMCID_MASK, semcr);
 if (cid != RCC_CID1)
  return -EACCES;

 return 0;
}

static int stm32mp25_check_security(struct device_node *np, void __iomem *base,
        const struct clock_config *cfg)
{
 int ret = 0;

 if (cfg->sec_id != SECF_NONE) {
  u32 index = (u32)cfg->sec_id;

  if (index & SEC_RIFSC_FLAG) {
   ret = stm32_firewall_grant_access_by_id(&firewall, index & ~SEC_RIFSC_FLAG);

   /* If firewall is not present, assume that we have access */
   if (ret == -ENODEV)
    return 0;
  } else {
   ret = stm32_rcc_get_access(base, cfg->sec_id & ~SEC_RIFSC_FLAG);
  }
 }

 return ret;
}

static const struct clock_config stm32mp25_clock_cfg[] = {
 STM32_GATE_CFG(CK_BUS_ETH1,  ck_icn_p_eth1,  SEC_RIFSC(60)),
 STM32_GATE_CFG(CK_BUS_ETH2,  ck_icn_p_eth2,  SEC_RIFSC(61)),
 STM32_GATE_CFG(CK_BUS_PCIE,  ck_icn_p_pcie,  SEC_RIFSC(68)),
 STM32_GATE_CFG(CK_BUS_ETHSW,  ck_icn_p_ethsw,  SEC_RIFSC(70)),
 STM32_GATE_CFG(CK_BUS_ADC12,  ck_icn_p_adc12,  SEC_RIFSC(58)),
 STM32_GATE_CFG(CK_BUS_ADC3,  ck_icn_p_adc3,  SEC_RIFSC(59)),
 STM32_GATE_CFG(CK_BUS_CCI,  ck_icn_p_cci,  SEC_RIFSC(88)),
 STM32_GATE_CFG(CK_BUS_CRC,  ck_icn_p_crc,  SEC_RIFSC(109)),
 STM32_GATE_CFG(CK_BUS_MDF1,  ck_icn_p_mdf1,  SEC_RIFSC(54)),
 STM32_GATE_CFG(CK_BUS_OSPIIOM,  ck_icn_p_ospiiom, SEC_RIFSC(111)),
 STM32_GATE_CFG(CK_BUS_HASH,  ck_icn_p_hash,  SEC_RIFSC(95)),
 STM32_GATE_CFG(CK_BUS_RNG,  ck_icn_p_rng,  SEC_RIFSC(92)),
 STM32_GATE_CFG(CK_BUS_CRYP1,  ck_icn_p_cryp1,  SEC_RIFSC(96)),
 STM32_GATE_CFG(CK_BUS_CRYP2,  ck_icn_p_cryp2,  SEC_RIFSC(97)),
 STM32_GATE_CFG(CK_BUS_SAES,  ck_icn_p_saes,  SEC_RIFSC(94)),
 STM32_GATE_CFG(CK_BUS_PKA,  ck_icn_p_pka,  SEC_RIFSC(93)),
 STM32_GATE_CFG(CK_BUS_ADF1,  ck_icn_p_adf1,  SEC_RIFSC(55)),
 STM32_GATE_CFG(CK_BUS_SPI8,  ck_icn_p_spi8,  SEC_RIFSC(29)),
 STM32_GATE_CFG(CK_BUS_LPUART1,  ck_icn_p_lpuart1, SEC_RIFSC(40)),
 STM32_GATE_CFG(CK_BUS_I2C8,  ck_icn_p_i2c8,  SEC_RIFSC(48)),
 STM32_GATE_CFG(CK_BUS_LPTIM3,  ck_icn_p_lptim3, SEC_RIFSC(19)),
 STM32_GATE_CFG(CK_BUS_LPTIM4,  ck_icn_p_lptim4, SEC_RIFSC(20)),
 STM32_GATE_CFG(CK_BUS_LPTIM5,  ck_icn_p_lptim5, SEC_RIFSC(21)),
 STM32_GATE_CFG(CK_BUS_IWDG5,  ck_icn_p_iwdg5,  SEC_RIFSC(102)),
 STM32_GATE_CFG(CK_BUS_WWDG2,  ck_icn_p_wwdg2,  SEC_RIFSC(104)),
 STM32_GATE_CFG(CK_BUS_I3C4,  ck_icn_p_i3c4,  SEC_RIFSC(117)),
 STM32_GATE_CFG(CK_BUS_SDMMC1,  ck_icn_m_sdmmc1, SEC_RIFSC(76)),
 STM32_GATE_CFG(CK_BUS_SDMMC2,  ck_icn_m_sdmmc2, SEC_RIFSC(77)),
 STM32_GATE_CFG(CK_BUS_SDMMC3,  ck_icn_m_sdmmc3, SEC_RIFSC(78)),
 STM32_GATE_CFG(CK_BUS_USB2OHCI,  ck_icn_m_usb2ohci, SEC_RIFSC(63)),
 STM32_GATE_CFG(CK_BUS_USB2EHCI,  ck_icn_m_usb2ehci, SEC_RIFSC(63)),
 STM32_GATE_CFG(CK_BUS_USB3DR,  ck_icn_m_usb3dr, SEC_RIFSC(66)),
 STM32_GATE_CFG(CK_BUS_TIM2,  ck_icn_p_tim2,  SEC_RIFSC(1)),
 STM32_GATE_CFG(CK_BUS_TIM3,  ck_icn_p_tim3,  SEC_RIFSC(2)),
 STM32_GATE_CFG(CK_BUS_TIM4,  ck_icn_p_tim4,  SEC_RIFSC(3)),
 STM32_GATE_CFG(CK_BUS_TIM5,  ck_icn_p_tim5,  SEC_RIFSC(4)),
 STM32_GATE_CFG(CK_BUS_TIM6,  ck_icn_p_tim6,  SEC_RIFSC(5)),
 STM32_GATE_CFG(CK_BUS_TIM7,  ck_icn_p_tim7,  SEC_RIFSC(6)),
 STM32_GATE_CFG(CK_BUS_TIM10,  ck_icn_p_tim10,  SEC_RIFSC(8)),
 STM32_GATE_CFG(CK_BUS_TIM11,  ck_icn_p_tim11,  SEC_RIFSC(9)),
 STM32_GATE_CFG(CK_BUS_TIM12,  ck_icn_p_tim12,  SEC_RIFSC(10)),
 STM32_GATE_CFG(CK_BUS_TIM13,  ck_icn_p_tim13,  SEC_RIFSC(11)),
 STM32_GATE_CFG(CK_BUS_TIM14,  ck_icn_p_tim14,  SEC_RIFSC(12)),
 STM32_GATE_CFG(CK_BUS_LPTIM1,  ck_icn_p_lptim1, SEC_RIFSC(17)),
 STM32_GATE_CFG(CK_BUS_LPTIM2,  ck_icn_p_lptim2, SEC_RIFSC(18)),
 STM32_GATE_CFG(CK_BUS_SPI2,  ck_icn_p_spi2,  SEC_RIFSC(23)),
 STM32_GATE_CFG(CK_BUS_SPI3,  ck_icn_p_spi3,  SEC_RIFSC(24)),
 STM32_GATE_CFG(CK_BUS_SPDIFRX,  ck_icn_p_spdifrx, SEC_RIFSC(30)),
 STM32_GATE_CFG(CK_BUS_USART2,  ck_icn_p_usart2, SEC_RIFSC(32)),
 STM32_GATE_CFG(CK_BUS_USART3,  ck_icn_p_usart3, SEC_RIFSC(33)),
 STM32_GATE_CFG(CK_BUS_UART4,  ck_icn_p_uart4,  SEC_RIFSC(34)),
 STM32_GATE_CFG(CK_BUS_UART5,  ck_icn_p_uart5,  SEC_RIFSC(35)),
 STM32_GATE_CFG(CK_BUS_I2C1,  ck_icn_p_i2c1,  SEC_RIFSC(41)),
 STM32_GATE_CFG(CK_BUS_I2C2,  ck_icn_p_i2c2,  SEC_RIFSC(42)),
 STM32_GATE_CFG(CK_BUS_I2C3,  ck_icn_p_i2c3,  SEC_RIFSC(43)),
 STM32_GATE_CFG(CK_BUS_I2C4,  ck_icn_p_i2c4,  SEC_RIFSC(44)),
 STM32_GATE_CFG(CK_BUS_I2C5,  ck_icn_p_i2c5,  SEC_RIFSC(45)),
 STM32_GATE_CFG(CK_BUS_I2C6,  ck_icn_p_i2c6,  SEC_RIFSC(46)),
 STM32_GATE_CFG(CK_BUS_I2C7,  ck_icn_p_i2c7,  SEC_RIFSC(47)),
 STM32_GATE_CFG(CK_BUS_I3C1,  ck_icn_p_i3c1,  SEC_RIFSC(114)),
 STM32_GATE_CFG(CK_BUS_I3C2,  ck_icn_p_i3c2,  SEC_RIFSC(115)),
 STM32_GATE_CFG(CK_BUS_I3C3,  ck_icn_p_i3c3,  SEC_RIFSC(116)),
 STM32_GATE_CFG(CK_BUS_TIM1,  ck_icn_p_tim1,  SEC_RIFSC(0)),
 STM32_GATE_CFG(CK_BUS_TIM8,  ck_icn_p_tim8,  SEC_RIFSC(7)),
 STM32_GATE_CFG(CK_BUS_TIM15,  ck_icn_p_tim15,  SEC_RIFSC(13)),
 STM32_GATE_CFG(CK_BUS_TIM16,  ck_icn_p_tim16,  SEC_RIFSC(14)),
 STM32_GATE_CFG(CK_BUS_TIM17,  ck_icn_p_tim17,  SEC_RIFSC(15)),
 STM32_GATE_CFG(CK_BUS_TIM20,  ck_icn_p_tim20,  SEC_RIFSC(16)),
 STM32_GATE_CFG(CK_BUS_SAI1,  ck_icn_p_sai1,  SEC_RIFSC(49)),
 STM32_GATE_CFG(CK_BUS_SAI2,  ck_icn_p_sai2,  SEC_RIFSC(50)),
 STM32_GATE_CFG(CK_BUS_SAI3,  ck_icn_p_sai3,  SEC_RIFSC(51)),
 STM32_GATE_CFG(CK_BUS_SAI4,  ck_icn_p_sai4,  SEC_RIFSC(52)),
 STM32_GATE_CFG(CK_BUS_USART1,  ck_icn_p_usart1, SEC_RIFSC(31)),
 STM32_GATE_CFG(CK_BUS_USART6,  ck_icn_p_usart6, SEC_RIFSC(36)),
 STM32_GATE_CFG(CK_BUS_UART7,  ck_icn_p_uart7,  SEC_RIFSC(37)),
 STM32_GATE_CFG(CK_BUS_UART8,  ck_icn_p_uart8,  SEC_RIFSC(38)),
 STM32_GATE_CFG(CK_BUS_UART9,  ck_icn_p_uart9,  SEC_RIFSC(39)),
 STM32_GATE_CFG(CK_BUS_FDCAN,  ck_icn_p_fdcan,  SEC_RIFSC(56)),
 STM32_GATE_CFG(CK_BUS_SPI1,  ck_icn_p_spi1,  SEC_RIFSC(22)),
 STM32_GATE_CFG(CK_BUS_SPI4,  ck_icn_p_spi4,  SEC_RIFSC(25)),
 STM32_GATE_CFG(CK_BUS_SPI5,  ck_icn_p_spi5,  SEC_RIFSC(26)),
 STM32_GATE_CFG(CK_BUS_SPI6,  ck_icn_p_spi6,  SEC_RIFSC(27)),
 STM32_GATE_CFG(CK_BUS_SPI7,  ck_icn_p_spi7,  SEC_RIFSC(28)),
 STM32_GATE_CFG(CK_BUS_IWDG1,  ck_icn_p_iwdg1,  SEC_RIFSC(98)),
 STM32_GATE_CFG(CK_BUS_IWDG2,  ck_icn_p_iwdg2,  SEC_RIFSC(99)),
 STM32_GATE_CFG(CK_BUS_IWDG3,  ck_icn_p_iwdg3,  SEC_RIFSC(100)),
 STM32_GATE_CFG(CK_BUS_IWDG4,  ck_icn_p_iwdg4,  SEC_RIFSC(101)),
 STM32_GATE_CFG(CK_BUS_WWDG1,  ck_icn_p_wwdg1,  SEC_RIFSC(103)),
 STM32_GATE_CFG(CK_BUS_VREF,  ck_icn_p_vref,  SEC_RIFSC(106)),
 STM32_GATE_CFG(CK_BUS_SERC,  ck_icn_p_serc,  SEC_RIFSC(110)),
 STM32_GATE_CFG(CK_BUS_HDP,  ck_icn_p_hdp,  SEC_RIFSC(57)),
 STM32_GATE_CFG(CK_BUS_IS2M,  ck_icn_p_is2m,  MP25_RIF_RCC_IS2M),
 STM32_GATE_CFG(CK_BUS_DSI,  ck_icn_p_dsi,  SEC_RIFSC(81)),
 STM32_GATE_CFG(CK_BUS_LTDC,  ck_icn_p_ltdc,  SEC_RIFSC(80)),
 STM32_GATE_CFG(CK_BUS_CSI,  ck_icn_p_csi,  SEC_RIFSC(86)),
 STM32_GATE_CFG(CK_BUS_DCMIPP,  ck_icn_p_dcmipp, SEC_RIFSC(87)),
 STM32_GATE_CFG(CK_BUS_LVDS,  ck_icn_p_lvds,  SEC_RIFSC(84)),
 STM32_GATE_CFG(CK_BUS_USBTC,  ck_icn_p_usbtc,  SEC_RIFSC(69)),
 STM32_GATE_CFG(CK_BUS_USB3PCIEPHY, ck_icn_p_usb3pciephy, SEC_RIFSC(67)),
 STM32_GATE_CFG(CK_BUS_VDEC,  ck_icn_p_vdec,  SEC_RIFSC(89)),
 STM32_GATE_CFG(CK_BUS_VENC,  ck_icn_p_venc,  SEC_RIFSC(90)),
 STM32_GATE_CFG(CK_KER_TIM2,  ck_ker_tim2,  SEC_RIFSC(1)),
 STM32_GATE_CFG(CK_KER_TIM3,  ck_ker_tim3,  SEC_RIFSC(2)),
 STM32_GATE_CFG(CK_KER_TIM4,  ck_ker_tim4,  SEC_RIFSC(3)),
 STM32_GATE_CFG(CK_KER_TIM5,  ck_ker_tim5,  SEC_RIFSC(4)),
 STM32_GATE_CFG(CK_KER_TIM6,  ck_ker_tim6,  SEC_RIFSC(5)),
 STM32_GATE_CFG(CK_KER_TIM7,  ck_ker_tim7,  SEC_RIFSC(6)),
 STM32_GATE_CFG(CK_KER_TIM10,  ck_ker_tim10,  SEC_RIFSC(8)),
 STM32_GATE_CFG(CK_KER_TIM11,  ck_ker_tim11,  SEC_RIFSC(9)),
 STM32_GATE_CFG(CK_KER_TIM12,  ck_ker_tim12,  SEC_RIFSC(10)),
 STM32_GATE_CFG(CK_KER_TIM13,  ck_ker_tim13,  SEC_RIFSC(11)),
 STM32_GATE_CFG(CK_KER_TIM14,  ck_ker_tim14,  SEC_RIFSC(12)),
 STM32_GATE_CFG(CK_KER_TIM1,  ck_ker_tim1,  SEC_RIFSC(0)),
 STM32_GATE_CFG(CK_KER_TIM8,  ck_ker_tim8,  SEC_RIFSC(7)),
 STM32_GATE_CFG(CK_KER_TIM15,  ck_ker_tim15,  SEC_RIFSC(13)),
 STM32_GATE_CFG(CK_KER_TIM16,  ck_ker_tim16,  SEC_RIFSC(14)),
 STM32_GATE_CFG(CK_KER_TIM17,  ck_ker_tim17,  SEC_RIFSC(15)),
 STM32_GATE_CFG(CK_KER_TIM20,  ck_ker_tim20,  SEC_RIFSC(16)),
 STM32_GATE_CFG(CK_KER_LPTIM1,  ck_ker_lptim1,  SEC_RIFSC(17)),
 STM32_GATE_CFG(CK_KER_LPTIM2,  ck_ker_lptim2,  SEC_RIFSC(18)),
 STM32_GATE_CFG(CK_KER_USART2,  ck_ker_usart2,  SEC_RIFSC(32)),
 STM32_GATE_CFG(CK_KER_UART4,  ck_ker_uart4,  SEC_RIFSC(34)),
 STM32_GATE_CFG(CK_KER_USART3,  ck_ker_usart3,  SEC_RIFSC(33)),
 STM32_GATE_CFG(CK_KER_UART5,  ck_ker_uart5,  SEC_RIFSC(35)),
 STM32_GATE_CFG(CK_KER_SPI2,  ck_ker_spi2,  SEC_RIFSC(23)),
 STM32_GATE_CFG(CK_KER_SPI3,  ck_ker_spi3,  SEC_RIFSC(24)),
 STM32_GATE_CFG(CK_KER_SPDIFRX,  ck_ker_spdifrx,  SEC_RIFSC(30)),
 STM32_GATE_CFG(CK_KER_I2C1,  ck_ker_i2c1,  SEC_RIFSC(41)),
 STM32_GATE_CFG(CK_KER_I2C2,  ck_ker_i2c2,  SEC_RIFSC(42)),
 STM32_GATE_CFG(CK_KER_I3C1,  ck_ker_i3c1,  SEC_RIFSC(114)),
 STM32_GATE_CFG(CK_KER_I3C2,  ck_ker_i3c2,  SEC_RIFSC(115)),
 STM32_GATE_CFG(CK_KER_I2C3,  ck_ker_i2c3,  SEC_RIFSC(43)),
 STM32_GATE_CFG(CK_KER_I2C5,  ck_ker_i2c5,  SEC_RIFSC(45)),
 STM32_GATE_CFG(CK_KER_I3C3,  ck_ker_i3c3,  SEC_RIFSC(116)),
 STM32_GATE_CFG(CK_KER_I2C4,  ck_ker_i2c4,  SEC_RIFSC(44)),
 STM32_GATE_CFG(CK_KER_I2C6,  ck_ker_i2c6,  SEC_RIFSC(46)),
 STM32_GATE_CFG(CK_KER_I2C7,  ck_ker_i2c7,  SEC_RIFSC(47)),
 STM32_GATE_CFG(CK_KER_SPI1,  ck_ker_spi1,  SEC_RIFSC(22)),
 STM32_GATE_CFG(CK_KER_SPI4,  ck_ker_spi4,  SEC_RIFSC(25)),
 STM32_GATE_CFG(CK_KER_SPI5,  ck_ker_spi5,  SEC_RIFSC(26)),
 STM32_GATE_CFG(CK_KER_SPI6,  ck_ker_spi6,  SEC_RIFSC(27)),
 STM32_GATE_CFG(CK_KER_SPI7,  ck_ker_spi7,  SEC_RIFSC(28)),
 STM32_GATE_CFG(CK_KER_USART1,  ck_ker_usart1,  SEC_RIFSC(31)),
 STM32_GATE_CFG(CK_KER_USART6,  ck_ker_usart6,  SEC_RIFSC(36)),
 STM32_GATE_CFG(CK_KER_UART7,  ck_ker_uart7,  SEC_RIFSC(37)),
 STM32_GATE_CFG(CK_KER_UART8,  ck_ker_uart8,  SEC_RIFSC(38)),
 STM32_GATE_CFG(CK_KER_UART9,  ck_ker_uart9,  SEC_RIFSC(39)),
 STM32_GATE_CFG(CK_KER_MDF1,  ck_ker_mdf1,  SEC_RIFSC(54)),
 STM32_GATE_CFG(CK_KER_SAI1,  ck_ker_sai1,  SEC_RIFSC(49)),
 STM32_GATE_CFG(CK_KER_SAI2,  ck_ker_sai2,  SEC_RIFSC(50)),
 STM32_GATE_CFG(CK_KER_SAI3,  ck_ker_sai3,  SEC_RIFSC(51)),
 STM32_GATE_CFG(CK_KER_SAI4,  ck_ker_sai4,  SEC_RIFSC(52)),
 STM32_GATE_CFG(CK_KER_FDCAN,  ck_ker_fdcan,  SEC_RIFSC(56)),
 STM32_GATE_CFG(CK_KER_CSI,  ck_ker_csi,  SEC_RIFSC(86)),
 STM32_GATE_CFG(CK_KER_CSITXESC,  ck_ker_csitxesc, SEC_RIFSC(86)),
 STM32_GATE_CFG(CK_KER_CSIPHY,  ck_ker_csiphy,  SEC_RIFSC(86)),
 STM32_GATE_CFG(CK_KER_USBTC,  ck_ker_usbtc,  SEC_RIFSC(69)),
 STM32_GATE_CFG(CK_KER_I3C4,  ck_ker_i3c4,  SEC_RIFSC(117)),
 STM32_GATE_CFG(CK_KER_SPI8,  ck_ker_spi8,  SEC_RIFSC(29)),
 STM32_GATE_CFG(CK_KER_I2C8,  ck_ker_i2c8,  SEC_RIFSC(48)),
 STM32_GATE_CFG(CK_KER_LPUART1,  ck_ker_lpuart1,  SEC_RIFSC(40)),
 STM32_GATE_CFG(CK_KER_LPTIM3,  ck_ker_lptim3,  SEC_RIFSC(19)),
 STM32_GATE_CFG(CK_KER_LPTIM4,  ck_ker_lptim4,  SEC_RIFSC(20)),
 STM32_GATE_CFG(CK_KER_LPTIM5,  ck_ker_lptim5,  SEC_RIFSC(21)),
 STM32_GATE_CFG(CK_KER_ADF1,  ck_ker_adf1,  SEC_RIFSC(55)),
 STM32_GATE_CFG(CK_KER_SDMMC1,  ck_ker_sdmmc1,  SEC_RIFSC(76)),
 STM32_GATE_CFG(CK_KER_SDMMC2,  ck_ker_sdmmc2,  SEC_RIFSC(77)),
 STM32_GATE_CFG(CK_KER_SDMMC3,  ck_ker_sdmmc3,  SEC_RIFSC(78)),
 STM32_GATE_CFG(CK_KER_ETH1,  ck_ker_eth1,  SEC_RIFSC(60)),
 STM32_GATE_CFG(CK_ETH1_STP,  ck_ker_eth1stp,  SEC_RIFSC(60)),
 STM32_GATE_CFG(CK_KER_ETHSW,  ck_ker_ethsw,  SEC_RIFSC(70)),
 STM32_GATE_CFG(CK_KER_ETH2,  ck_ker_eth2,  SEC_RIFSC(61)),
 STM32_GATE_CFG(CK_ETH2_STP,  ck_ker_eth2stp,  SEC_RIFSC(61)),
 STM32_GATE_CFG(CK_KER_ETH1PTP,  ck_ker_eth1ptp,  SEC_RIFSC(60)),
 STM32_GATE_CFG(CK_KER_ETH2PTP,  ck_ker_eth2ptp,  SEC_RIFSC(61)),
 STM32_GATE_CFG(CK_BUS_GPU,  ck_icn_m_gpu,  SEC_RIFSC(79)),
 STM32_GATE_CFG(CK_KER_GPU,  ck_ker_gpu,  SEC_RIFSC(79)),
 STM32_GATE_CFG(CK_KER_ETHSWREF,  ck_ker_ethswref, SEC_RIFSC(70)),
 STM32_GATE_CFG(CK_BUS_ETHSWACMCFG, ck_icn_p_ethsw_acm_cfg, SEC_RIFSC(71)),
 STM32_GATE_CFG(CK_BUS_ETHSWACMMSG, ck_icn_p_ethsw_acm_msg, SEC_RIFSC(72)),
 STM32_GATE_CFG(CK_ETH1_MAC,  ck_ker_eth1mac,  SEC_RIFSC(60)),
 STM32_GATE_CFG(CK_ETH1_TX,  ck_ker_eth1tx,  SEC_RIFSC(60)),
 STM32_GATE_CFG(CK_ETH1_RX,  ck_ker_eth1rx,  SEC_RIFSC(60)),
 STM32_GATE_CFG(CK_ETH2_MAC,  ck_ker_eth2mac,  SEC_RIFSC(61)),
 STM32_GATE_CFG(CK_ETH2_TX,  ck_ker_eth2tx,  SEC_RIFSC(61)),
 STM32_GATE_CFG(CK_ETH2_RX,  ck_ker_eth2rx,  SEC_RIFSC(61)),
 STM32_COMPOSITE_CFG(CK_MCO1,  ck_mco1,  MP25_RIF_RCC_MCO1),
 STM32_COMPOSITE_CFG(CK_MCO2,  ck_mco2,  MP25_RIF_RCC_MCO1),
 STM32_COMPOSITE_CFG(CK_KER_ADC12, ck_ker_adc12,  SEC_RIFSC(58)),
 STM32_COMPOSITE_CFG(CK_KER_ADC3, ck_ker_adc3,  SEC_RIFSC(59)),
 STM32_COMPOSITE_CFG(CK_KER_USB2PHY1, ck_ker_usb2phy1, SEC_RIFSC(63)),
 STM32_GATE_CFG(CK_KER_USB2PHY2,  ck_ker_usb2phy2, SEC_RIFSC(63)),
 STM32_COMPOSITE_CFG(CK_KER_USB2PHY2EN, ck_ker_usb2phy2_en, SEC_RIFSC(63)),
 STM32_COMPOSITE_CFG(CK_KER_USB3PCIEPHY, ck_ker_usb3pciephy, SEC_RIFSC(67)),
 STM32_COMPOSITE_CFG(CK_KER_DSIBLANE, clk_lanebyte,  SEC_RIFSC(81)),
 STM32_COMPOSITE_CFG(CK_KER_DSIPHY, clk_phy_dsi,  SEC_RIFSC(81)),
 STM32_COMPOSITE_CFG(CK_KER_LVDSPHY, ck_ker_lvdsphy,  SEC_RIFSC(84)),
 STM32_COMPOSITE_CFG(CK_KER_DTS,  ck_ker_dts,  SEC_RIFSC(107)),
 STM32_GATE_CFG(CK_KER_LTDC,  ck_ker_ltdc,  SEC_RIFSC(80)),
};

#define RESET_MP25(id, _offset, _bit_idx, _set_clr) \
 [id] = &(struct stm32_reset_cfg){  \
  .offset  = (_offset),  \
  .bit_idx = (_bit_idx),  \
  .set_clr = (_set_clr),  \
 }

static const struct stm32_reset_cfg *stm32mp25_reset_cfg[STM32MP25_LAST_RESET] = {
 RESET_MP25(TIM1_R,  RCC_TIM1CFGR,  0, 0),
 RESET_MP25(TIM2_R,  RCC_TIM2CFGR,  0, 0),
 RESET_MP25(TIM3_R,  RCC_TIM3CFGR,  0, 0),
 RESET_MP25(TIM4_R,  RCC_TIM4CFGR,  0, 0),
 RESET_MP25(TIM5_R,  RCC_TIM5CFGR,  0, 0),
 RESET_MP25(TIM6_R,  RCC_TIM6CFGR,  0, 0),
 RESET_MP25(TIM7_R,  RCC_TIM7CFGR,  0, 0),
 RESET_MP25(TIM8_R,  RCC_TIM8CFGR,  0, 0),
 RESET_MP25(TIM10_R,  RCC_TIM10CFGR,  0, 0),
 RESET_MP25(TIM11_R,  RCC_TIM11CFGR,  0, 0),
 RESET_MP25(TIM12_R,  RCC_TIM12CFGR,  0, 0),
 RESET_MP25(TIM13_R,  RCC_TIM13CFGR,  0, 0),
 RESET_MP25(TIM14_R,  RCC_TIM14CFGR,  0, 0),
 RESET_MP25(TIM15_R,  RCC_TIM15CFGR,  0, 0),
 RESET_MP25(TIM16_R,  RCC_TIM16CFGR,  0, 0),
 RESET_MP25(TIM17_R,  RCC_TIM17CFGR,  0, 0),
 RESET_MP25(TIM20_R,  RCC_TIM20CFGR,  0, 0),
 RESET_MP25(LPTIM1_R,  RCC_LPTIM1CFGR,  0, 0),
 RESET_MP25(LPTIM2_R,  RCC_LPTIM2CFGR,  0, 0),
 RESET_MP25(LPTIM3_R,  RCC_LPTIM3CFGR,  0, 0),
 RESET_MP25(LPTIM4_R,  RCC_LPTIM4CFGR,  0, 0),
 RESET_MP25(LPTIM5_R,  RCC_LPTIM5CFGR,  0, 0),
 RESET_MP25(SPI1_R,  RCC_SPI1CFGR,  0, 0),
 RESET_MP25(SPI2_R,  RCC_SPI2CFGR,  0, 0),
 RESET_MP25(SPI3_R,  RCC_SPI3CFGR,  0, 0),
 RESET_MP25(SPI4_R,  RCC_SPI4CFGR,  0, 0),
 RESET_MP25(SPI5_R,  RCC_SPI5CFGR,  0, 0),
 RESET_MP25(SPI6_R,  RCC_SPI6CFGR,  0, 0),
 RESET_MP25(SPI7_R,  RCC_SPI7CFGR,  0, 0),
 RESET_MP25(SPI8_R,  RCC_SPI8CFGR,  0, 0),
 RESET_MP25(SPDIFRX_R,  RCC_SPDIFRXCFGR, 0, 0),
 RESET_MP25(USART1_R,  RCC_USART1CFGR,  0, 0),
 RESET_MP25(USART2_R,  RCC_USART2CFGR,  0, 0),
 RESET_MP25(USART3_R,  RCC_USART3CFGR,  0, 0),
 RESET_MP25(UART4_R,  RCC_UART4CFGR,  0, 0),
 RESET_MP25(UART5_R,  RCC_UART5CFGR,  0, 0),
 RESET_MP25(USART6_R,  RCC_USART6CFGR,  0, 0),
 RESET_MP25(UART7_R,  RCC_UART7CFGR,  0, 0),
 RESET_MP25(UART8_R,  RCC_UART8CFGR,  0, 0),
 RESET_MP25(UART9_R,  RCC_UART9CFGR,  0, 0),
 RESET_MP25(LPUART1_R,  RCC_LPUART1CFGR, 0, 0),
 RESET_MP25(IS2M_R,  RCC_IS2MCFGR,  0, 0),
 RESET_MP25(I2C1_R,  RCC_I2C1CFGR,  0, 0),
 RESET_MP25(I2C2_R,  RCC_I2C2CFGR,  0, 0),
 RESET_MP25(I2C3_R,  RCC_I2C3CFGR,  0, 0),
 RESET_MP25(I2C4_R,  RCC_I2C4CFGR,  0, 0),
 RESET_MP25(I2C5_R,  RCC_I2C5CFGR,  0, 0),
 RESET_MP25(I2C6_R,  RCC_I2C6CFGR,  0, 0),
 RESET_MP25(I2C7_R,  RCC_I2C7CFGR,  0, 0),
 RESET_MP25(I2C8_R,  RCC_I2C8CFGR,  0, 0),
 RESET_MP25(SAI1_R,  RCC_SAI1CFGR,  0, 0),
 RESET_MP25(SAI2_R,  RCC_SAI2CFGR,  0, 0),
 RESET_MP25(SAI3_R,  RCC_SAI3CFGR,  0, 0),
 RESET_MP25(SAI4_R,  RCC_SAI4CFGR,  0, 0),
 RESET_MP25(MDF1_R,  RCC_MDF1CFGR,  0, 0),
 RESET_MP25(MDF2_R,  RCC_ADF1CFGR,  0, 0),
 RESET_MP25(FDCAN_R,  RCC_FDCANCFGR,  0, 0),
 RESET_MP25(HDP_R,  RCC_HDPCFGR,  0, 0),
 RESET_MP25(ADC12_R,  RCC_ADC12CFGR,  0, 0),
 RESET_MP25(ADC3_R,  RCC_ADC3CFGR,  0, 0),
 RESET_MP25(ETH1_R,  RCC_ETH1CFGR,  0, 0),
 RESET_MP25(ETH2_R,  RCC_ETH2CFGR,  0, 0),
 RESET_MP25(USBH_R,  RCC_USBHCFGR,  0, 0),
 RESET_MP25(USB2PHY1_R,  RCC_USB2PHY1CFGR, 0, 0),
 RESET_MP25(USB2PHY2_R,  RCC_USB2PHY2CFGR, 0, 0),
 RESET_MP25(USB3DR_R,  RCC_USB3DRCFGR,  0, 0),
 RESET_MP25(USB3PCIEPHY_R, RCC_USB3PCIEPHYCFGR, 0, 0),
 RESET_MP25(USBTC_R,  RCC_USBTCCFGR,  0, 0),
 RESET_MP25(ETHSW_R,  RCC_ETHSWCFGR,  0, 0),
 RESET_MP25(SDMMC1_R,  RCC_SDMMC1CFGR,  0, 0),
 RESET_MP25(SDMMC1DLL_R,  RCC_SDMMC1CFGR,  16, 0),
 RESET_MP25(SDMMC2_R,  RCC_SDMMC2CFGR,  0, 0),
 RESET_MP25(SDMMC2DLL_R,  RCC_SDMMC2CFGR,  16, 0),
 RESET_MP25(SDMMC3_R,  RCC_SDMMC3CFGR,  0, 0),
 RESET_MP25(SDMMC3DLL_R,  RCC_SDMMC3CFGR,  16, 0),
 RESET_MP25(GPU_R,  RCC_GPUCFGR,  0, 0),
 RESET_MP25(LTDC_R,  RCC_LTDCCFGR,  0, 0),
 RESET_MP25(DSI_R,  RCC_DSICFGR,  0, 0),
 RESET_MP25(LVDS_R,  RCC_LVDSCFGR,  0, 0),
 RESET_MP25(CSI_R,  RCC_CSICFGR,  0, 0),
 RESET_MP25(DCMIPP_R,  RCC_DCMIPPCFGR,  0, 0),
 RESET_MP25(CCI_R,  RCC_CCICFGR,  0, 0),
 RESET_MP25(VDEC_R,  RCC_VDECCFGR,  0, 0),
 RESET_MP25(VENC_R,  RCC_VENCCFGR,  0, 0),
 RESET_MP25(WWDG1_R,  RCC_WWDG1CFGR,  0, 0),
 RESET_MP25(WWDG2_R,  RCC_WWDG2CFGR,  0, 0),
 RESET_MP25(VREF_R,  RCC_VREFCFGR,  0, 0),
 RESET_MP25(DTS_R,  RCC_DTSCFGR,  0, 0),
 RESET_MP25(CRC_R,  RCC_CRCCFGR,  0, 0),
 RESET_MP25(SERC_R,  RCC_SERCCFGR,  0, 0),
 RESET_MP25(OSPIIOM_R,  RCC_OSPIIOMCFGR, 0, 0),
 RESET_MP25(I3C1_R,  RCC_I3C1CFGR,  0, 0),
 RESET_MP25(I3C2_R,  RCC_I3C2CFGR,  0, 0),
 RESET_MP25(I3C3_R,  RCC_I3C3CFGR,  0, 0),
 RESET_MP25(I3C4_R,  RCC_I3C4CFGR,  0, 0),
 RESET_MP25(IWDG2_KER_R,  RCC_IWDGC1CFGSETR, 18, 1),
 RESET_MP25(IWDG4_KER_R,  RCC_IWDGC2CFGSETR, 18, 1),
 RESET_MP25(RNG_R,  RCC_RNGCFGR,  0, 0),
 RESET_MP25(PKA_R,  RCC_PKACFGR,  0, 0),
 RESET_MP25(SAES_R,  RCC_SAESCFGR,  0, 0),
 RESET_MP25(HASH_R,  RCC_HASHCFGR,  0, 0),
 RESET_MP25(CRYP1_R,  RCC_CRYP1CFGR,  0, 0),
 RESET_MP25(CRYP2_R,  RCC_CRYP2CFGR,  0, 0),
 RESET_MP25(PCIE_R,  RCC_PCIECFGR,  0, 0),
};

static u16 stm32mp25_cpt_gate[GATE_NB];

static struct clk_stm32_clock_data stm32mp25_clock_data = {
 .gate_cpt = stm32mp25_cpt_gate,
 .gates  = stm32mp25_gates,
 .muxes  = stm32mp25_muxes,
};

static struct clk_stm32_reset_data stm32mp25_reset_data = {
 .reset_lines = stm32mp25_reset_cfg,
 .nr_lines = ARRAY_SIZE(stm32mp25_reset_cfg),
};

static const struct stm32_rcc_match_data stm32mp25_data = {
 .tab_clocks = stm32mp25_clock_cfg,
 .num_clocks = ARRAY_SIZE(stm32mp25_clock_cfg),
 .maxbinding = STM32MP25_LAST_CLK,
 .clock_data = &stm32mp25_clock_data,
 .reset_data = &stm32mp25_reset_data,
 .check_security = &stm32mp25_check_security,
};

static const struct of_device_id stm32mp25_match_data[] = {
 { .compatible = "st,stm32mp25-rcc", .data = &stm32mp25_data, },
 { }
};
MODULE_DEVICE_TABLE(of, stm32mp25_match_data);

static int stm32mp25_rcc_clocks_probe(struct platform_device *pdev)
{
 struct device *dev = &pdev->dev;
 void __iomem *base;
 int ret;

 base = devm_platform_ioremap_resource(pdev, 0);
 if (IS_ERR(base))
  return PTR_ERR(base);

 ret = stm32_firewall_get_firewall(dev->of_node, &firewall, 1);
 if (ret)
  return ret;

 return stm32_rcc_init(dev, stm32mp25_match_data, base);
}

static struct platform_driver stm32mp25_rcc_clocks_driver = {
 .driver = {
  .name = "stm32mp25_rcc",
  .of_match_table = stm32mp25_match_data,
 },
 .probe = stm32mp25_rcc_clocks_probe,
};

static int __init stm32mp25_clocks_init(void)
{
 return platform_driver_register(&stm32mp25_rcc_clocks_driver);
}

core_initcall(stm32mp25_clocks_init);

Messung V0.5
C=96 H=95 G=95

¤ Dauer der Verarbeitung: 0.23 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.