cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

clk-stm32mp1.c (63600B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Copyright (C) STMicroelectronics 2018 - All Rights Reserved
      4 * Author: Olivier Bideau <olivier.bideau@st.com> for STMicroelectronics.
      5 * Author: Gabriel Fernandez <gabriel.fernandez@st.com> for STMicroelectronics.
      6 */
      7
      8#include <linux/clk.h>
      9#include <linux/clk-provider.h>
     10#include <linux/delay.h>
     11#include <linux/err.h>
     12#include <linux/io.h>
     13#include <linux/module.h>
     14#include <linux/of.h>
     15#include <linux/of_address.h>
     16#include <linux/platform_device.h>
     17#include <linux/reset-controller.h>
     18#include <linux/slab.h>
     19#include <linux/spinlock.h>
     20
     21#include <dt-bindings/clock/stm32mp1-clks.h>
     22
     23static DEFINE_SPINLOCK(rlock);
     24
     25#define RCC_OCENSETR		0x0C
     26#define RCC_HSICFGR		0x18
     27#define RCC_RDLSICR		0x144
     28#define RCC_PLL1CR		0x80
     29#define RCC_PLL1CFGR1		0x84
     30#define RCC_PLL1CFGR2		0x88
     31#define RCC_PLL2CR		0x94
     32#define RCC_PLL2CFGR1		0x98
     33#define RCC_PLL2CFGR2		0x9C
     34#define RCC_PLL3CR		0x880
     35#define RCC_PLL3CFGR1		0x884
     36#define RCC_PLL3CFGR2		0x888
     37#define RCC_PLL4CR		0x894
     38#define RCC_PLL4CFGR1		0x898
     39#define RCC_PLL4CFGR2		0x89C
     40#define RCC_APB1ENSETR		0xA00
     41#define RCC_APB2ENSETR		0xA08
     42#define RCC_APB3ENSETR		0xA10
     43#define RCC_APB4ENSETR		0x200
     44#define RCC_APB5ENSETR		0x208
     45#define RCC_AHB2ENSETR		0xA18
     46#define RCC_AHB3ENSETR		0xA20
     47#define RCC_AHB4ENSETR		0xA28
     48#define RCC_AHB5ENSETR		0x210
     49#define RCC_AHB6ENSETR		0x218
     50#define RCC_AHB6LPENSETR	0x318
     51#define RCC_RCK12SELR		0x28
     52#define RCC_RCK3SELR		0x820
     53#define RCC_RCK4SELR		0x824
     54#define RCC_MPCKSELR		0x20
     55#define RCC_ASSCKSELR		0x24
     56#define RCC_MSSCKSELR		0x48
     57#define RCC_SPI6CKSELR		0xC4
     58#define RCC_SDMMC12CKSELR	0x8F4
     59#define RCC_SDMMC3CKSELR	0x8F8
     60#define RCC_FMCCKSELR		0x904
     61#define RCC_I2C46CKSELR		0xC0
     62#define RCC_I2C12CKSELR		0x8C0
     63#define RCC_I2C35CKSELR		0x8C4
     64#define RCC_UART1CKSELR		0xC8
     65#define RCC_QSPICKSELR		0x900
     66#define RCC_ETHCKSELR		0x8FC
     67#define RCC_RNG1CKSELR		0xCC
     68#define RCC_RNG2CKSELR		0x920
     69#define RCC_GPUCKSELR		0x938
     70#define RCC_USBCKSELR		0x91C
     71#define RCC_STGENCKSELR		0xD4
     72#define RCC_SPDIFCKSELR		0x914
     73#define RCC_SPI2S1CKSELR	0x8D8
     74#define RCC_SPI2S23CKSELR	0x8DC
     75#define RCC_SPI2S45CKSELR	0x8E0
     76#define RCC_CECCKSELR		0x918
     77#define RCC_LPTIM1CKSELR	0x934
     78#define RCC_LPTIM23CKSELR	0x930
     79#define RCC_LPTIM45CKSELR	0x92C
     80#define RCC_UART24CKSELR	0x8E8
     81#define RCC_UART35CKSELR	0x8EC
     82#define RCC_UART6CKSELR		0x8E4
     83#define RCC_UART78CKSELR	0x8F0
     84#define RCC_FDCANCKSELR		0x90C
     85#define RCC_SAI1CKSELR		0x8C8
     86#define RCC_SAI2CKSELR		0x8CC
     87#define RCC_SAI3CKSELR		0x8D0
     88#define RCC_SAI4CKSELR		0x8D4
     89#define RCC_ADCCKSELR		0x928
     90#define RCC_MPCKDIVR		0x2C
     91#define RCC_DSICKSELR		0x924
     92#define RCC_CPERCKSELR		0xD0
     93#define RCC_MCO1CFGR		0x800
     94#define RCC_MCO2CFGR		0x804
     95#define RCC_BDCR		0x140
     96#define RCC_AXIDIVR		0x30
     97#define RCC_MCUDIVR		0x830
     98#define RCC_APB1DIVR		0x834
     99#define RCC_APB2DIVR		0x838
    100#define RCC_APB3DIVR		0x83C
    101#define RCC_APB4DIVR		0x3C
    102#define RCC_APB5DIVR		0x40
    103#define RCC_TIMG1PRER		0x828
    104#define RCC_TIMG2PRER		0x82C
    105#define RCC_RTCDIVR		0x44
    106#define RCC_DBGCFGR		0x80C
    107
    108#define RCC_CLR	0x4
    109
    110static const char * const ref12_parents[] = {
    111	"ck_hsi", "ck_hse"
    112};
    113
    114static const char * const ref3_parents[] = {
    115	"ck_hsi", "ck_hse", "ck_csi"
    116};
    117
    118static const char * const ref4_parents[] = {
    119	"ck_hsi", "ck_hse", "ck_csi"
    120};
    121
    122static const char * const cpu_src[] = {
    123	"ck_hsi", "ck_hse", "pll1_p"
    124};
    125
    126static const char * const axi_src[] = {
    127	"ck_hsi", "ck_hse", "pll2_p"
    128};
    129
    130static const char * const per_src[] = {
    131	"ck_hsi", "ck_csi", "ck_hse"
    132};
    133
    134static const char * const mcu_src[] = {
    135	"ck_hsi", "ck_hse", "ck_csi", "pll3_p"
    136};
    137
    138static const char * const sdmmc12_src[] = {
    139	"ck_axi", "pll3_r", "pll4_p", "ck_hsi"
    140};
    141
    142static const char * const sdmmc3_src[] = {
    143	"ck_mcu", "pll3_r", "pll4_p", "ck_hsi"
    144};
    145
    146static const char * const fmc_src[] = {
    147	"ck_axi", "pll3_r", "pll4_p", "ck_per"
    148};
    149
    150static const char * const qspi_src[] = {
    151	"ck_axi", "pll3_r", "pll4_p", "ck_per"
    152};
    153
    154static const char * const eth_src[] = {
    155	"pll4_p", "pll3_q"
    156};
    157
    158const struct clk_parent_data ethrx_src[] = {
    159	{ .name = "ethck_k", .fw_name = "ETH_RX_CLK/ETH_REF_CLK" },
    160};
    161
    162static const char * const rng_src[] = {
    163	"ck_csi", "pll4_r", "ck_lse", "ck_lsi"
    164};
    165
    166static const char * const usbphy_src[] = {
    167	"ck_hse", "pll4_r", "clk-hse-div2"
    168};
    169
    170static const char * const usbo_src[] = {
    171	"pll4_r", "ck_usbo_48m"
    172};
    173
    174static const char * const stgen_src[] = {
    175	"ck_hsi", "ck_hse"
    176};
    177
    178static const char * const spdif_src[] = {
    179	"pll4_p", "pll3_q", "ck_hsi"
    180};
    181
    182static const char * const spi123_src[] = {
    183	"pll4_p", "pll3_q", "i2s_ckin", "ck_per", "pll3_r"
    184};
    185
    186static const char * const spi45_src[] = {
    187	"pclk2", "pll4_q", "ck_hsi", "ck_csi", "ck_hse"
    188};
    189
    190static const char * const spi6_src[] = {
    191	"pclk5", "pll4_q", "ck_hsi", "ck_csi", "ck_hse", "pll3_q"
    192};
    193
    194static const char * const cec_src[] = {
    195	"ck_lse", "ck_lsi", "ck_csi"
    196};
    197
    198static const char * const i2c12_src[] = {
    199	"pclk1", "pll4_r", "ck_hsi", "ck_csi"
    200};
    201
    202static const char * const i2c35_src[] = {
    203	"pclk1", "pll4_r", "ck_hsi", "ck_csi"
    204};
    205
    206static const char * const i2c46_src[] = {
    207	"pclk5", "pll3_q", "ck_hsi", "ck_csi"
    208};
    209
    210static const char * const lptim1_src[] = {
    211	"pclk1", "pll4_p", "pll3_q", "ck_lse", "ck_lsi", "ck_per"
    212};
    213
    214static const char * const lptim23_src[] = {
    215	"pclk3", "pll4_q", "ck_per", "ck_lse", "ck_lsi"
    216};
    217
    218static const char * const lptim45_src[] = {
    219	"pclk3", "pll4_p", "pll3_q", "ck_lse", "ck_lsi", "ck_per"
    220};
    221
    222static const char * const usart1_src[] = {
    223	"pclk5", "pll3_q", "ck_hsi", "ck_csi", "pll4_q", "ck_hse"
    224};
    225
    226static const char * const usart234578_src[] = {
    227	"pclk1", "pll4_q", "ck_hsi", "ck_csi", "ck_hse"
    228};
    229
    230static const char * const usart6_src[] = {
    231	"pclk2", "pll4_q", "ck_hsi", "ck_csi", "ck_hse"
    232};
    233
    234static const char * const fdcan_src[] = {
    235	"ck_hse", "pll3_q", "pll4_q", "pll4_r"
    236};
    237
    238static const char * const sai_src[] = {
    239	"pll4_q", "pll3_q", "i2s_ckin", "ck_per", "pll3_r"
    240};
    241
    242static const char * const sai2_src[] = {
    243	"pll4_q", "pll3_q", "i2s_ckin", "ck_per", "spdif_ck_symb", "pll3_r"
    244};
    245
    246static const char * const adc12_src[] = {
    247	"pll4_r", "ck_per", "pll3_q"
    248};
    249
    250static const char * const dsi_src[] = {
    251	"ck_dsi_phy", "pll4_p"
    252};
    253
    254static const char * const rtc_src[] = {
    255	"off", "ck_lse", "ck_lsi", "ck_hse"
    256};
    257
    258static const char * const mco1_src[] = {
    259	"ck_hsi", "ck_hse", "ck_csi", "ck_lsi", "ck_lse"
    260};
    261
    262static const char * const mco2_src[] = {
    263	"ck_mpu", "ck_axi", "ck_mcu", "pll4_p", "ck_hse", "ck_hsi"
    264};
    265
    266static const char * const ck_trace_src[] = {
    267	"ck_axi"
    268};
    269
    270static const struct clk_div_table axi_div_table[] = {
    271	{ 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 },
    272	{ 4, 4 }, { 5, 4 }, { 6, 4 }, { 7, 4 },
    273	{ 0 },
    274};
    275
    276static const struct clk_div_table mcu_div_table[] = {
    277	{ 0, 1 }, { 1, 2 }, { 2, 4 }, { 3, 8 },
    278	{ 4, 16 }, { 5, 32 }, { 6, 64 }, { 7, 128 },
    279	{ 8, 256 }, { 9, 512 }, { 10, 512}, { 11, 512 },
    280	{ 12, 512 }, { 13, 512 }, { 14, 512}, { 15, 512 },
    281	{ 0 },
    282};
    283
    284static const struct clk_div_table apb_div_table[] = {
    285	{ 0, 1 }, { 1, 2 }, { 2, 4 }, { 3, 8 },
    286	{ 4, 16 }, { 5, 16 }, { 6, 16 }, { 7, 16 },
    287	{ 0 },
    288};
    289
    290static const struct clk_div_table ck_trace_div_table[] = {
    291	{ 0, 1 }, { 1, 2 }, { 2, 4 }, { 3, 8 },
    292	{ 4, 16 }, { 5, 16 }, { 6, 16 }, { 7, 16 },
    293	{ 0 },
    294};
    295
    296#define MAX_MUX_CLK 2
    297
    298struct stm32_mmux {
    299	u8 nbr_clk;
    300	struct clk_hw *hws[MAX_MUX_CLK];
    301};
    302
    303struct stm32_clk_mmux {
    304	struct clk_mux mux;
    305	struct stm32_mmux *mmux;
    306};
    307
    308struct stm32_mgate {
    309	u8 nbr_clk;
    310	u32 flag;
    311};
    312
    313struct stm32_clk_mgate {
    314	struct clk_gate gate;
    315	struct stm32_mgate *mgate;
    316	u32 mask;
    317};
    318
    319struct clock_config {
    320	u32 id;
    321	const char *name;
    322	const char *parent_name;
    323	const char * const *parent_names;
    324	const struct clk_parent_data *parent_data;
    325	int num_parents;
    326	unsigned long flags;
    327	void *cfg;
    328	struct clk_hw * (*func)(struct device *dev,
    329				struct clk_hw_onecell_data *clk_data,
    330				void __iomem *base, spinlock_t *lock,
    331				const struct clock_config *cfg);
    332};
    333
    334#define NO_ID ~0
    335
    336struct gate_cfg {
    337	u32 reg_off;
    338	u8 bit_idx;
    339	u8 gate_flags;
    340};
    341
    342struct fixed_factor_cfg {
    343	unsigned int mult;
    344	unsigned int div;
    345};
    346
    347struct div_cfg {
    348	u32 reg_off;
    349	u8 shift;
    350	u8 width;
    351	u8 div_flags;
    352	const struct clk_div_table *table;
    353};
    354
    355struct mux_cfg {
    356	u32 reg_off;
    357	u8 shift;
    358	u8 width;
    359	u8 mux_flags;
    360	u32 *table;
    361};
    362
    363struct stm32_gate_cfg {
    364	struct gate_cfg		*gate;
    365	struct stm32_mgate	*mgate;
    366	const struct clk_ops	*ops;
    367};
    368
    369struct stm32_div_cfg {
    370	struct div_cfg		*div;
    371	const struct clk_ops	*ops;
    372};
    373
    374struct stm32_mux_cfg {
    375	struct mux_cfg		*mux;
    376	struct stm32_mmux	*mmux;
    377	const struct clk_ops	*ops;
    378};
    379
    380/* STM32 Composite clock */
    381struct stm32_composite_cfg {
    382	const struct stm32_gate_cfg	*gate;
    383	const struct stm32_div_cfg	*div;
    384	const struct stm32_mux_cfg	*mux;
    385};
    386
    387static struct clk_hw *
    388_clk_hw_register_gate(struct device *dev,
    389		      struct clk_hw_onecell_data *clk_data,
    390		      void __iomem *base, spinlock_t *lock,
    391		      const struct clock_config *cfg)
    392{
    393	struct gate_cfg *gate_cfg = cfg->cfg;
    394
    395	return clk_hw_register_gate(dev,
    396				    cfg->name,
    397				    cfg->parent_name,
    398				    cfg->flags,
    399				    gate_cfg->reg_off + base,
    400				    gate_cfg->bit_idx,
    401				    gate_cfg->gate_flags,
    402				    lock);
    403}
    404
    405static struct clk_hw *
    406_clk_hw_register_fixed_factor(struct device *dev,
    407			      struct clk_hw_onecell_data *clk_data,
    408			      void __iomem *base, spinlock_t *lock,
    409			      const struct clock_config *cfg)
    410{
    411	struct fixed_factor_cfg *ff_cfg = cfg->cfg;
    412
    413	return clk_hw_register_fixed_factor(dev, cfg->name, cfg->parent_name,
    414					    cfg->flags, ff_cfg->mult,
    415					    ff_cfg->div);
    416}
    417
    418static struct clk_hw *
    419_clk_hw_register_divider_table(struct device *dev,
    420			       struct clk_hw_onecell_data *clk_data,
    421			       void __iomem *base, spinlock_t *lock,
    422			       const struct clock_config *cfg)
    423{
    424	struct div_cfg *div_cfg = cfg->cfg;
    425
    426	return clk_hw_register_divider_table(dev,
    427					     cfg->name,
    428					     cfg->parent_name,
    429					     cfg->flags,
    430					     div_cfg->reg_off + base,
    431					     div_cfg->shift,
    432					     div_cfg->width,
    433					     div_cfg->div_flags,
    434					     div_cfg->table,
    435					     lock);
    436}
    437
    438static struct clk_hw *
    439_clk_hw_register_mux(struct device *dev,
    440		     struct clk_hw_onecell_data *clk_data,
    441		     void __iomem *base, spinlock_t *lock,
    442		     const struct clock_config *cfg)
    443{
    444	struct mux_cfg *mux_cfg = cfg->cfg;
    445
    446	return clk_hw_register_mux(dev, cfg->name, cfg->parent_names,
    447				   cfg->num_parents, cfg->flags,
    448				   mux_cfg->reg_off + base, mux_cfg->shift,
    449				   mux_cfg->width, mux_cfg->mux_flags, lock);
    450}
    451
    452/* MP1 Gate clock with set & clear registers */
    453
    454static int mp1_gate_clk_enable(struct clk_hw *hw)
    455{
    456	if (!clk_gate_ops.is_enabled(hw))
    457		clk_gate_ops.enable(hw);
    458
    459	return 0;
    460}
    461
    462static void mp1_gate_clk_disable(struct clk_hw *hw)
    463{
    464	struct clk_gate *gate = to_clk_gate(hw);
    465	unsigned long flags = 0;
    466
    467	if (clk_gate_ops.is_enabled(hw)) {
    468		spin_lock_irqsave(gate->lock, flags);
    469		writel_relaxed(BIT(gate->bit_idx), gate->reg + RCC_CLR);
    470		spin_unlock_irqrestore(gate->lock, flags);
    471	}
    472}
    473
    474static const struct clk_ops mp1_gate_clk_ops = {
    475	.enable		= mp1_gate_clk_enable,
    476	.disable	= mp1_gate_clk_disable,
    477	.is_enabled	= clk_gate_is_enabled,
    478};
    479
    480static struct clk_hw *_get_stm32_mux(struct device *dev, void __iomem *base,
    481				     const struct stm32_mux_cfg *cfg,
    482				     spinlock_t *lock)
    483{
    484	struct stm32_clk_mmux *mmux;
    485	struct clk_mux *mux;
    486	struct clk_hw *mux_hw;
    487
    488	if (cfg->mmux) {
    489		mmux = devm_kzalloc(dev, sizeof(*mmux), GFP_KERNEL);
    490		if (!mmux)
    491			return ERR_PTR(-ENOMEM);
    492
    493		mmux->mux.reg = cfg->mux->reg_off + base;
    494		mmux->mux.shift = cfg->mux->shift;
    495		mmux->mux.mask = (1 << cfg->mux->width) - 1;
    496		mmux->mux.flags = cfg->mux->mux_flags;
    497		mmux->mux.table = cfg->mux->table;
    498		mmux->mux.lock = lock;
    499		mmux->mmux = cfg->mmux;
    500		mux_hw = &mmux->mux.hw;
    501		cfg->mmux->hws[cfg->mmux->nbr_clk++] = mux_hw;
    502
    503	} else {
    504		mux = devm_kzalloc(dev, sizeof(*mux), GFP_KERNEL);
    505		if (!mux)
    506			return ERR_PTR(-ENOMEM);
    507
    508		mux->reg = cfg->mux->reg_off + base;
    509		mux->shift = cfg->mux->shift;
    510		mux->mask = (1 << cfg->mux->width) - 1;
    511		mux->flags = cfg->mux->mux_flags;
    512		mux->table = cfg->mux->table;
    513		mux->lock = lock;
    514		mux_hw = &mux->hw;
    515	}
    516
    517	return mux_hw;
    518}
    519
    520static struct clk_hw *_get_stm32_div(struct device *dev, void __iomem *base,
    521				     const struct stm32_div_cfg *cfg,
    522				     spinlock_t *lock)
    523{
    524	struct clk_divider *div;
    525
    526	div = devm_kzalloc(dev, sizeof(*div), GFP_KERNEL);
    527
    528	if (!div)
    529		return ERR_PTR(-ENOMEM);
    530
    531	div->reg = cfg->div->reg_off + base;
    532	div->shift = cfg->div->shift;
    533	div->width = cfg->div->width;
    534	div->flags = cfg->div->div_flags;
    535	div->table = cfg->div->table;
    536	div->lock = lock;
    537
    538	return &div->hw;
    539}
    540
    541static struct clk_hw *_get_stm32_gate(struct device *dev, void __iomem *base,
    542				      const struct stm32_gate_cfg *cfg,
    543				      spinlock_t *lock)
    544{
    545	struct stm32_clk_mgate *mgate;
    546	struct clk_gate *gate;
    547	struct clk_hw *gate_hw;
    548
    549	if (cfg->mgate) {
    550		mgate = devm_kzalloc(dev, sizeof(*mgate), GFP_KERNEL);
    551		if (!mgate)
    552			return ERR_PTR(-ENOMEM);
    553
    554		mgate->gate.reg = cfg->gate->reg_off + base;
    555		mgate->gate.bit_idx = cfg->gate->bit_idx;
    556		mgate->gate.flags = cfg->gate->gate_flags;
    557		mgate->gate.lock = lock;
    558		mgate->mask = BIT(cfg->mgate->nbr_clk++);
    559
    560		mgate->mgate = cfg->mgate;
    561
    562		gate_hw = &mgate->gate.hw;
    563
    564	} else {
    565		gate = devm_kzalloc(dev, sizeof(*gate), GFP_KERNEL);
    566		if (!gate)
    567			return ERR_PTR(-ENOMEM);
    568
    569		gate->reg = cfg->gate->reg_off + base;
    570		gate->bit_idx = cfg->gate->bit_idx;
    571		gate->flags = cfg->gate->gate_flags;
    572		gate->lock = lock;
    573
    574		gate_hw = &gate->hw;
    575	}
    576
    577	return gate_hw;
    578}
    579
    580static struct clk_hw *
    581clk_stm32_register_gate_ops(struct device *dev,
    582			    const char *name,
    583			    const char *parent_name,
    584			    const struct clk_parent_data *parent_data,
    585			    unsigned long flags,
    586			    void __iomem *base,
    587			    const struct stm32_gate_cfg *cfg,
    588			    spinlock_t *lock)
    589{
    590	struct clk_init_data init = { NULL };
    591	struct clk_hw *hw;
    592	int ret;
    593
    594	init.name = name;
    595	if (parent_name)
    596		init.parent_names = &parent_name;
    597	if (parent_data)
    598		init.parent_data = parent_data;
    599	init.num_parents = 1;
    600	init.flags = flags;
    601
    602	init.ops = &clk_gate_ops;
    603
    604	if (cfg->ops)
    605		init.ops = cfg->ops;
    606
    607	hw = _get_stm32_gate(dev, base, cfg, lock);
    608	if (IS_ERR(hw))
    609		return ERR_PTR(-ENOMEM);
    610
    611	hw->init = &init;
    612
    613	ret = clk_hw_register(dev, hw);
    614	if (ret)
    615		hw = ERR_PTR(ret);
    616
    617	return hw;
    618}
    619
    620static struct clk_hw *
    621clk_stm32_register_composite(struct device *dev,
    622			     const char *name, const char * const *parent_names,
    623			     const struct clk_parent_data *parent_data,
    624			     int num_parents, void __iomem *base,
    625			     const struct stm32_composite_cfg *cfg,
    626			     unsigned long flags, spinlock_t *lock)
    627{
    628	const struct clk_ops *mux_ops, *div_ops, *gate_ops;
    629	struct clk_hw *mux_hw, *div_hw, *gate_hw;
    630
    631	mux_hw = NULL;
    632	div_hw = NULL;
    633	gate_hw = NULL;
    634	mux_ops = NULL;
    635	div_ops = NULL;
    636	gate_ops = NULL;
    637
    638	if (cfg->mux) {
    639		mux_hw = _get_stm32_mux(dev, base, cfg->mux, lock);
    640
    641		if (!IS_ERR(mux_hw)) {
    642			mux_ops = &clk_mux_ops;
    643
    644			if (cfg->mux->ops)
    645				mux_ops = cfg->mux->ops;
    646		}
    647	}
    648
    649	if (cfg->div) {
    650		div_hw = _get_stm32_div(dev, base, cfg->div, lock);
    651
    652		if (!IS_ERR(div_hw)) {
    653			div_ops = &clk_divider_ops;
    654
    655			if (cfg->div->ops)
    656				div_ops = cfg->div->ops;
    657		}
    658	}
    659
    660	if (cfg->gate) {
    661		gate_hw = _get_stm32_gate(dev, base, cfg->gate, lock);
    662
    663		if (!IS_ERR(gate_hw)) {
    664			gate_ops = &clk_gate_ops;
    665
    666			if (cfg->gate->ops)
    667				gate_ops = cfg->gate->ops;
    668		}
    669	}
    670
    671	return clk_hw_register_composite(dev, name, parent_names, num_parents,
    672				       mux_hw, mux_ops, div_hw, div_ops,
    673				       gate_hw, gate_ops, flags);
    674}
    675
    676#define to_clk_mgate(_gate) container_of(_gate, struct stm32_clk_mgate, gate)
    677
    678static int mp1_mgate_clk_enable(struct clk_hw *hw)
    679{
    680	struct clk_gate *gate = to_clk_gate(hw);
    681	struct stm32_clk_mgate *clk_mgate = to_clk_mgate(gate);
    682
    683	clk_mgate->mgate->flag |= clk_mgate->mask;
    684
    685	mp1_gate_clk_enable(hw);
    686
    687	return  0;
    688}
    689
    690static void mp1_mgate_clk_disable(struct clk_hw *hw)
    691{
    692	struct clk_gate *gate = to_clk_gate(hw);
    693	struct stm32_clk_mgate *clk_mgate = to_clk_mgate(gate);
    694
    695	clk_mgate->mgate->flag &= ~clk_mgate->mask;
    696
    697	if (clk_mgate->mgate->flag == 0)
    698		mp1_gate_clk_disable(hw);
    699}
    700
    701static const struct clk_ops mp1_mgate_clk_ops = {
    702	.enable		= mp1_mgate_clk_enable,
    703	.disable	= mp1_mgate_clk_disable,
    704	.is_enabled	= clk_gate_is_enabled,
    705
    706};
    707
    708#define to_clk_mmux(_mux) container_of(_mux, struct stm32_clk_mmux, mux)
    709
    710static u8 clk_mmux_get_parent(struct clk_hw *hw)
    711{
    712	return clk_mux_ops.get_parent(hw);
    713}
    714
    715static int clk_mmux_set_parent(struct clk_hw *hw, u8 index)
    716{
    717	struct clk_mux *mux = to_clk_mux(hw);
    718	struct stm32_clk_mmux *clk_mmux = to_clk_mmux(mux);
    719	struct clk_hw *hwp;
    720	int ret, n;
    721
    722	ret = clk_mux_ops.set_parent(hw, index);
    723	if (ret)
    724		return ret;
    725
    726	hwp = clk_hw_get_parent(hw);
    727
    728	for (n = 0; n < clk_mmux->mmux->nbr_clk; n++)
    729		if (clk_mmux->mmux->hws[n] != hw)
    730			clk_hw_reparent(clk_mmux->mmux->hws[n], hwp);
    731
    732	return 0;
    733}
    734
    735static const struct clk_ops clk_mmux_ops = {
    736	.get_parent	= clk_mmux_get_parent,
    737	.set_parent	= clk_mmux_set_parent,
    738	.determine_rate	= __clk_mux_determine_rate,
    739};
    740
    741/* STM32 PLL */
    742struct stm32_pll_obj {
    743	/* lock pll enable/disable registers */
    744	spinlock_t *lock;
    745	void __iomem *reg;
    746	struct clk_hw hw;
    747	struct clk_mux mux;
    748};
    749
    750#define to_pll(_hw) container_of(_hw, struct stm32_pll_obj, hw)
    751
    752#define PLL_ON		BIT(0)
    753#define PLL_RDY		BIT(1)
    754#define DIVN_MASK	0x1FF
    755#define DIVM_MASK	0x3F
    756#define DIVM_SHIFT	16
    757#define DIVN_SHIFT	0
    758#define FRAC_OFFSET	0xC
    759#define FRAC_MASK	0x1FFF
    760#define FRAC_SHIFT	3
    761#define FRACLE		BIT(16)
    762#define PLL_MUX_SHIFT	0
    763#define PLL_MUX_MASK	3
    764
    765static int __pll_is_enabled(struct clk_hw *hw)
    766{
    767	struct stm32_pll_obj *clk_elem = to_pll(hw);
    768
    769	return readl_relaxed(clk_elem->reg) & PLL_ON;
    770}
    771
    772#define TIMEOUT 5
    773
    774static int pll_enable(struct clk_hw *hw)
    775{
    776	struct stm32_pll_obj *clk_elem = to_pll(hw);
    777	u32 reg;
    778	unsigned long flags = 0;
    779	unsigned int timeout = TIMEOUT;
    780	int bit_status = 0;
    781
    782	spin_lock_irqsave(clk_elem->lock, flags);
    783
    784	if (__pll_is_enabled(hw))
    785		goto unlock;
    786
    787	reg = readl_relaxed(clk_elem->reg);
    788	reg |= PLL_ON;
    789	writel_relaxed(reg, clk_elem->reg);
    790
    791	/* We can't use readl_poll_timeout() because we can be blocked if
    792	 * someone enables this clock before clocksource changes.
    793	 * Only jiffies counter is available. Jiffies are incremented by
    794	 * interruptions and enable op does not allow to be interrupted.
    795	 */
    796	do {
    797		bit_status = !(readl_relaxed(clk_elem->reg) & PLL_RDY);
    798
    799		if (bit_status)
    800			udelay(120);
    801
    802	} while (bit_status && --timeout);
    803
    804unlock:
    805	spin_unlock_irqrestore(clk_elem->lock, flags);
    806
    807	return bit_status;
    808}
    809
    810static void pll_disable(struct clk_hw *hw)
    811{
    812	struct stm32_pll_obj *clk_elem = to_pll(hw);
    813	u32 reg;
    814	unsigned long flags = 0;
    815
    816	spin_lock_irqsave(clk_elem->lock, flags);
    817
    818	reg = readl_relaxed(clk_elem->reg);
    819	reg &= ~PLL_ON;
    820	writel_relaxed(reg, clk_elem->reg);
    821
    822	spin_unlock_irqrestore(clk_elem->lock, flags);
    823}
    824
    825static u32 pll_frac_val(struct clk_hw *hw)
    826{
    827	struct stm32_pll_obj *clk_elem = to_pll(hw);
    828	u32 reg, frac = 0;
    829
    830	reg = readl_relaxed(clk_elem->reg + FRAC_OFFSET);
    831	if (reg & FRACLE)
    832		frac = (reg >> FRAC_SHIFT) & FRAC_MASK;
    833
    834	return frac;
    835}
    836
    837static unsigned long pll_recalc_rate(struct clk_hw *hw,
    838				     unsigned long parent_rate)
    839{
    840	struct stm32_pll_obj *clk_elem = to_pll(hw);
    841	u32 reg;
    842	u32 frac, divm, divn;
    843	u64 rate, rate_frac = 0;
    844
    845	reg = readl_relaxed(clk_elem->reg + 4);
    846
    847	divm = ((reg >> DIVM_SHIFT) & DIVM_MASK) + 1;
    848	divn = ((reg >> DIVN_SHIFT) & DIVN_MASK) + 1;
    849	rate = (u64)parent_rate * divn;
    850
    851	do_div(rate, divm);
    852
    853	frac = pll_frac_val(hw);
    854	if (frac) {
    855		rate_frac = (u64)parent_rate * (u64)frac;
    856		do_div(rate_frac, (divm * 8192));
    857	}
    858
    859	return rate + rate_frac;
    860}
    861
    862static int pll_is_enabled(struct clk_hw *hw)
    863{
    864	struct stm32_pll_obj *clk_elem = to_pll(hw);
    865	unsigned long flags = 0;
    866	int ret;
    867
    868	spin_lock_irqsave(clk_elem->lock, flags);
    869	ret = __pll_is_enabled(hw);
    870	spin_unlock_irqrestore(clk_elem->lock, flags);
    871
    872	return ret;
    873}
    874
    875static u8 pll_get_parent(struct clk_hw *hw)
    876{
    877	struct stm32_pll_obj *clk_elem = to_pll(hw);
    878	struct clk_hw *mux_hw = &clk_elem->mux.hw;
    879
    880	__clk_hw_set_clk(mux_hw, hw);
    881
    882	return clk_mux_ops.get_parent(mux_hw);
    883}
    884
    885static const struct clk_ops pll_ops = {
    886	.enable		= pll_enable,
    887	.disable	= pll_disable,
    888	.recalc_rate	= pll_recalc_rate,
    889	.is_enabled	= pll_is_enabled,
    890	.get_parent	= pll_get_parent,
    891};
    892
    893static struct clk_hw *clk_register_pll(struct device *dev, const char *name,
    894				       const char * const *parent_names,
    895				       int num_parents,
    896				       void __iomem *reg,
    897				       void __iomem *mux_reg,
    898				       unsigned long flags,
    899				       spinlock_t *lock)
    900{
    901	struct stm32_pll_obj *element;
    902	struct clk_init_data init;
    903	struct clk_hw *hw;
    904	int err;
    905
    906	element = devm_kzalloc(dev, sizeof(*element), GFP_KERNEL);
    907	if (!element)
    908		return ERR_PTR(-ENOMEM);
    909
    910	init.name = name;
    911	init.ops = &pll_ops;
    912	init.flags = flags;
    913	init.parent_names = parent_names;
    914	init.num_parents = num_parents;
    915
    916	element->mux.lock = lock;
    917	element->mux.reg =  mux_reg;
    918	element->mux.shift = PLL_MUX_SHIFT;
    919	element->mux.mask =  PLL_MUX_MASK;
    920	element->mux.flags =  CLK_MUX_READ_ONLY;
    921	element->mux.reg =  mux_reg;
    922
    923	element->hw.init = &init;
    924	element->reg = reg;
    925	element->lock = lock;
    926
    927	hw = &element->hw;
    928	err = clk_hw_register(dev, hw);
    929
    930	if (err)
    931		return ERR_PTR(err);
    932
    933	return hw;
    934}
    935
    936/* Kernel Timer */
    937struct timer_cker {
    938	/* lock the kernel output divider register */
    939	spinlock_t *lock;
    940	void __iomem *apbdiv;
    941	void __iomem *timpre;
    942	struct clk_hw hw;
    943};
    944
    945#define to_timer_cker(_hw) container_of(_hw, struct timer_cker, hw)
    946
    947#define APB_DIV_MASK 0x07
    948#define TIM_PRE_MASK 0x01
    949
    950static unsigned long __bestmult(struct clk_hw *hw, unsigned long rate,
    951				unsigned long parent_rate)
    952{
    953	struct timer_cker *tim_ker = to_timer_cker(hw);
    954	u32 prescaler;
    955	unsigned int mult = 0;
    956
    957	prescaler = readl_relaxed(tim_ker->apbdiv) & APB_DIV_MASK;
    958	if (prescaler < 2)
    959		return 1;
    960
    961	mult = 2;
    962
    963	if (rate / parent_rate >= 4)
    964		mult = 4;
    965
    966	return mult;
    967}
    968
    969static long timer_ker_round_rate(struct clk_hw *hw, unsigned long rate,
    970				 unsigned long *parent_rate)
    971{
    972	unsigned long factor = __bestmult(hw, rate, *parent_rate);
    973
    974	return *parent_rate * factor;
    975}
    976
    977static int timer_ker_set_rate(struct clk_hw *hw, unsigned long rate,
    978			      unsigned long parent_rate)
    979{
    980	struct timer_cker *tim_ker = to_timer_cker(hw);
    981	unsigned long flags = 0;
    982	unsigned long factor = __bestmult(hw, rate, parent_rate);
    983	int ret = 0;
    984
    985	spin_lock_irqsave(tim_ker->lock, flags);
    986
    987	switch (factor) {
    988	case 1:
    989		break;
    990	case 2:
    991		writel_relaxed(0, tim_ker->timpre);
    992		break;
    993	case 4:
    994		writel_relaxed(1, tim_ker->timpre);
    995		break;
    996	default:
    997		ret = -EINVAL;
    998	}
    999	spin_unlock_irqrestore(tim_ker->lock, flags);
   1000
   1001	return ret;
   1002}
   1003
   1004static unsigned long timer_ker_recalc_rate(struct clk_hw *hw,
   1005					   unsigned long parent_rate)
   1006{
   1007	struct timer_cker *tim_ker = to_timer_cker(hw);
   1008	u32 prescaler, timpre;
   1009	u32 mul;
   1010
   1011	prescaler = readl_relaxed(tim_ker->apbdiv) & APB_DIV_MASK;
   1012
   1013	timpre = readl_relaxed(tim_ker->timpre) & TIM_PRE_MASK;
   1014
   1015	if (!prescaler)
   1016		return parent_rate;
   1017
   1018	mul = (timpre + 1) * 2;
   1019
   1020	return parent_rate * mul;
   1021}
   1022
   1023static const struct clk_ops timer_ker_ops = {
   1024	.recalc_rate	= timer_ker_recalc_rate,
   1025	.round_rate	= timer_ker_round_rate,
   1026	.set_rate	= timer_ker_set_rate,
   1027
   1028};
   1029
   1030static struct clk_hw *clk_register_cktim(struct device *dev, const char *name,
   1031					 const char *parent_name,
   1032					 unsigned long flags,
   1033					 void __iomem *apbdiv,
   1034					 void __iomem *timpre,
   1035					 spinlock_t *lock)
   1036{
   1037	struct timer_cker *tim_ker;
   1038	struct clk_init_data init;
   1039	struct clk_hw *hw;
   1040	int err;
   1041
   1042	tim_ker = devm_kzalloc(dev, sizeof(*tim_ker), GFP_KERNEL);
   1043	if (!tim_ker)
   1044		return ERR_PTR(-ENOMEM);
   1045
   1046	init.name = name;
   1047	init.ops = &timer_ker_ops;
   1048	init.flags = flags;
   1049	init.parent_names = &parent_name;
   1050	init.num_parents = 1;
   1051
   1052	tim_ker->hw.init = &init;
   1053	tim_ker->lock = lock;
   1054	tim_ker->apbdiv = apbdiv;
   1055	tim_ker->timpre = timpre;
   1056
   1057	hw = &tim_ker->hw;
   1058	err = clk_hw_register(dev, hw);
   1059
   1060	if (err)
   1061		return ERR_PTR(err);
   1062
   1063	return hw;
   1064}
   1065
   1066/* The divider of RTC clock concerns only ck_hse clock */
   1067#define HSE_RTC 3
   1068
   1069static unsigned long clk_divider_rtc_recalc_rate(struct clk_hw *hw,
   1070						 unsigned long parent_rate)
   1071{
   1072	if (clk_hw_get_parent(hw) == clk_hw_get_parent_by_index(hw, HSE_RTC))
   1073		return clk_divider_ops.recalc_rate(hw, parent_rate);
   1074
   1075	return parent_rate;
   1076}
   1077
   1078static int clk_divider_rtc_set_rate(struct clk_hw *hw, unsigned long rate,
   1079				    unsigned long parent_rate)
   1080{
   1081	if (clk_hw_get_parent(hw) == clk_hw_get_parent_by_index(hw, HSE_RTC))
   1082		return clk_divider_ops.set_rate(hw, rate, parent_rate);
   1083
   1084	return parent_rate;
   1085}
   1086
   1087static int clk_divider_rtc_determine_rate(struct clk_hw *hw, struct clk_rate_request *req)
   1088{
   1089	if (req->best_parent_hw == clk_hw_get_parent_by_index(hw, HSE_RTC))
   1090		return clk_divider_ops.determine_rate(hw, req);
   1091
   1092	req->rate = req->best_parent_rate;
   1093
   1094	return 0;
   1095}
   1096
   1097static const struct clk_ops rtc_div_clk_ops = {
   1098	.recalc_rate	= clk_divider_rtc_recalc_rate,
   1099	.set_rate	= clk_divider_rtc_set_rate,
   1100	.determine_rate = clk_divider_rtc_determine_rate
   1101};
   1102
   1103struct stm32_pll_cfg {
   1104	u32 offset;
   1105	u32 muxoff;
   1106};
   1107
   1108static struct clk_hw *_clk_register_pll(struct device *dev,
   1109					struct clk_hw_onecell_data *clk_data,
   1110					void __iomem *base, spinlock_t *lock,
   1111					const struct clock_config *cfg)
   1112{
   1113	struct stm32_pll_cfg *stm_pll_cfg = cfg->cfg;
   1114
   1115	return clk_register_pll(dev, cfg->name, cfg->parent_names,
   1116				cfg->num_parents,
   1117				base + stm_pll_cfg->offset,
   1118				base + stm_pll_cfg->muxoff,
   1119				cfg->flags, lock);
   1120}
   1121
   1122struct stm32_cktim_cfg {
   1123	u32 offset_apbdiv;
   1124	u32 offset_timpre;
   1125};
   1126
   1127static struct clk_hw *_clk_register_cktim(struct device *dev,
   1128					  struct clk_hw_onecell_data *clk_data,
   1129					  void __iomem *base, spinlock_t *lock,
   1130					  const struct clock_config *cfg)
   1131{
   1132	struct stm32_cktim_cfg *cktim_cfg = cfg->cfg;
   1133
   1134	return clk_register_cktim(dev, cfg->name, cfg->parent_name, cfg->flags,
   1135				  cktim_cfg->offset_apbdiv + base,
   1136				  cktim_cfg->offset_timpre + base, lock);
   1137}
   1138
   1139static struct clk_hw *
   1140_clk_stm32_register_gate(struct device *dev,
   1141			 struct clk_hw_onecell_data *clk_data,
   1142			 void __iomem *base, spinlock_t *lock,
   1143			 const struct clock_config *cfg)
   1144{
   1145	return clk_stm32_register_gate_ops(dev,
   1146				    cfg->name,
   1147				    cfg->parent_name,
   1148				    cfg->parent_data,
   1149				    cfg->flags,
   1150				    base,
   1151				    cfg->cfg,
   1152				    lock);
   1153}
   1154
   1155static struct clk_hw *
   1156_clk_stm32_register_composite(struct device *dev,
   1157			      struct clk_hw_onecell_data *clk_data,
   1158			      void __iomem *base, spinlock_t *lock,
   1159			      const struct clock_config *cfg)
   1160{
   1161	return clk_stm32_register_composite(dev, cfg->name, cfg->parent_names,
   1162					    cfg->parent_data, cfg->num_parents,
   1163					    base, cfg->cfg, cfg->flags, lock);
   1164}
   1165
   1166#define GATE(_id, _name, _parent, _flags, _offset, _bit_idx, _gate_flags)\
   1167{\
   1168	.id		= _id,\
   1169	.name		= _name,\
   1170	.parent_name	= _parent,\
   1171	.flags		= _flags,\
   1172	.cfg		=  &(struct gate_cfg) {\
   1173		.reg_off	= _offset,\
   1174		.bit_idx	= _bit_idx,\
   1175		.gate_flags	= _gate_flags,\
   1176	},\
   1177	.func		= _clk_hw_register_gate,\
   1178}
   1179
   1180#define FIXED_FACTOR(_id, _name, _parent, _flags, _mult, _div)\
   1181{\
   1182	.id		= _id,\
   1183	.name		= _name,\
   1184	.parent_name	= _parent,\
   1185	.flags		= _flags,\
   1186	.cfg		=  &(struct fixed_factor_cfg) {\
   1187		.mult = _mult,\
   1188		.div = _div,\
   1189	},\
   1190	.func		= _clk_hw_register_fixed_factor,\
   1191}
   1192
   1193#define DIV_TABLE(_id, _name, _parent, _flags, _offset, _shift, _width,\
   1194		  _div_flags, _div_table)\
   1195{\
   1196	.id		= _id,\
   1197	.name		= _name,\
   1198	.parent_name	= _parent,\
   1199	.flags		= _flags,\
   1200	.cfg		=  &(struct div_cfg) {\
   1201		.reg_off	= _offset,\
   1202		.shift		= _shift,\
   1203		.width		= _width,\
   1204		.div_flags	= _div_flags,\
   1205		.table		= _div_table,\
   1206	},\
   1207	.func		= _clk_hw_register_divider_table,\
   1208}
   1209
   1210#define DIV(_id, _name, _parent, _flags, _offset, _shift, _width, _div_flags)\
   1211	DIV_TABLE(_id, _name, _parent, _flags, _offset, _shift, _width,\
   1212		  _div_flags, NULL)
   1213
   1214#define MUX(_id, _name, _parents, _flags, _offset, _shift, _width, _mux_flags)\
   1215{\
   1216	.id		= _id,\
   1217	.name		= _name,\
   1218	.parent_names	= _parents,\
   1219	.num_parents	= ARRAY_SIZE(_parents),\
   1220	.flags		= _flags,\
   1221	.cfg		=  &(struct mux_cfg) {\
   1222		.reg_off	= _offset,\
   1223		.shift		= _shift,\
   1224		.width		= _width,\
   1225		.mux_flags	= _mux_flags,\
   1226	},\
   1227	.func		= _clk_hw_register_mux,\
   1228}
   1229
   1230#define PLL(_id, _name, _parents, _flags, _offset_p, _offset_mux)\
   1231{\
   1232	.id		= _id,\
   1233	.name		= _name,\
   1234	.parent_names	= _parents,\
   1235	.num_parents	= ARRAY_SIZE(_parents),\
   1236	.flags		= CLK_IGNORE_UNUSED | (_flags),\
   1237	.cfg		=  &(struct stm32_pll_cfg) {\
   1238		.offset = _offset_p,\
   1239		.muxoff = _offset_mux,\
   1240	},\
   1241	.func		= _clk_register_pll,\
   1242}
   1243
   1244#define STM32_CKTIM(_name, _parent, _flags, _offset_apbdiv, _offset_timpre)\
   1245{\
   1246	.id		= NO_ID,\
   1247	.name		= _name,\
   1248	.parent_name	= _parent,\
   1249	.flags		= _flags,\
   1250	.cfg		=  &(struct stm32_cktim_cfg) {\
   1251		.offset_apbdiv = _offset_apbdiv,\
   1252		.offset_timpre = _offset_timpre,\
   1253	},\
   1254	.func		= _clk_register_cktim,\
   1255}
   1256
   1257#define STM32_TIM(_id, _name, _parent, _offset_set, _bit_idx)\
   1258		  GATE_MP1(_id, _name, _parent, CLK_SET_RATE_PARENT,\
   1259			   _offset_set, _bit_idx, 0)
   1260
   1261/* STM32 GATE */
   1262#define STM32_GATE(_id, _name, _parent, _flags, _gate)\
   1263{\
   1264	.id		= _id,\
   1265	.name		= _name,\
   1266	.parent_name	= _parent,\
   1267	.flags		= _flags,\
   1268	.cfg		= (struct stm32_gate_cfg *) {_gate},\
   1269	.func		= _clk_stm32_register_gate,\
   1270}
   1271
   1272#define STM32_GATE_PDATA(_id, _name, _parent, _flags, _gate)\
   1273{\
   1274	.id		= _id,\
   1275	.name		= _name,\
   1276	.parent_data	= _parent,\
   1277	.flags		= _flags,\
   1278	.cfg		= (struct stm32_gate_cfg *) {_gate},\
   1279	.func		= _clk_stm32_register_gate,\
   1280}
   1281
   1282#define _STM32_GATE(_gate_offset, _gate_bit_idx, _gate_flags, _mgate, _ops)\
   1283	(&(struct stm32_gate_cfg) {\
   1284		&(struct gate_cfg) {\
   1285			.reg_off	= _gate_offset,\
   1286			.bit_idx	= _gate_bit_idx,\
   1287			.gate_flags	= _gate_flags,\
   1288		},\
   1289		.mgate		= _mgate,\
   1290		.ops		= _ops,\
   1291	})
   1292
   1293#define _STM32_MGATE(_mgate)\
   1294	(&per_gate_cfg[_mgate])
   1295
   1296#define _GATE(_gate_offset, _gate_bit_idx, _gate_flags)\
   1297	_STM32_GATE(_gate_offset, _gate_bit_idx, _gate_flags,\
   1298		    NULL, NULL)\
   1299
   1300#define _GATE_MP1(_gate_offset, _gate_bit_idx, _gate_flags)\
   1301	_STM32_GATE(_gate_offset, _gate_bit_idx, _gate_flags,\
   1302		    NULL, &mp1_gate_clk_ops)\
   1303
   1304#define _MGATE_MP1(_mgate)\
   1305	.gate = &per_gate_cfg[_mgate]
   1306
   1307#define GATE_MP1(_id, _name, _parent, _flags, _offset, _bit_idx, _gate_flags)\
   1308	STM32_GATE(_id, _name, _parent, _flags,\
   1309		   _GATE_MP1(_offset, _bit_idx, _gate_flags))
   1310
   1311#define MGATE_MP1(_id, _name, _parent, _flags, _mgate)\
   1312	STM32_GATE(_id, _name, _parent, _flags,\
   1313		   _STM32_MGATE(_mgate))
   1314
   1315#define MGATE_MP1_PDATA(_id, _name, _parent, _flags, _mgate)\
   1316	STM32_GATE_PDATA(_id, _name, _parent, _flags,\
   1317		   _STM32_MGATE(_mgate))
   1318
   1319#define _STM32_DIV(_div_offset, _div_shift, _div_width,\
   1320		   _div_flags, _div_table, _ops)\
   1321	.div = &(struct stm32_div_cfg) {\
   1322		&(struct div_cfg) {\
   1323			.reg_off	= _div_offset,\
   1324			.shift		= _div_shift,\
   1325			.width		= _div_width,\
   1326			.div_flags	= _div_flags,\
   1327			.table		= _div_table,\
   1328		},\
   1329		.ops		= _ops,\
   1330	}
   1331
   1332#define _DIV(_div_offset, _div_shift, _div_width, _div_flags, _div_table)\
   1333	_STM32_DIV(_div_offset, _div_shift, _div_width,\
   1334		   _div_flags, _div_table, NULL)\
   1335
   1336#define _DIV_RTC(_div_offset, _div_shift, _div_width, _div_flags, _div_table)\
   1337	_STM32_DIV(_div_offset, _div_shift, _div_width,\
   1338		   _div_flags, _div_table, &rtc_div_clk_ops)
   1339
   1340#define _STM32_MUX(_offset, _shift, _width, _mux_flags, _mmux, _ops)\
   1341	.mux = &(struct stm32_mux_cfg) {\
   1342		&(struct mux_cfg) {\
   1343			.reg_off	= _offset,\
   1344			.shift		= _shift,\
   1345			.width		= _width,\
   1346			.mux_flags	= _mux_flags,\
   1347			.table		= NULL,\
   1348		},\
   1349		.mmux		= _mmux,\
   1350		.ops		= _ops,\
   1351	}
   1352
   1353#define _MUX(_offset, _shift, _width, _mux_flags)\
   1354	_STM32_MUX(_offset, _shift, _width, _mux_flags, NULL, NULL)\
   1355
   1356#define _MMUX(_mmux) .mux = &ker_mux_cfg[_mmux]
   1357
   1358#define PARENT(_parent) ((const char *[]) { _parent})
   1359
   1360#define _NO_MUX .mux = NULL
   1361#define _NO_DIV .div = NULL
   1362#define _NO_GATE .gate = NULL
   1363
   1364#define COMPOSITE(_id, _name, _parents, _flags, _gate, _mux, _div)\
   1365{\
   1366	.id		= _id,\
   1367	.name		= _name,\
   1368	.parent_names	= _parents,\
   1369	.num_parents	= ARRAY_SIZE(_parents),\
   1370	.flags		= _flags,\
   1371	.cfg		= &(struct stm32_composite_cfg) {\
   1372		_gate,\
   1373		_mux,\
   1374		_div,\
   1375	},\
   1376	.func		= _clk_stm32_register_composite,\
   1377}
   1378
   1379#define PCLK(_id, _name, _parent, _flags, _mgate)\
   1380	MGATE_MP1(_id, _name, _parent, _flags, _mgate)
   1381
   1382#define PCLK_PDATA(_id, _name, _parent, _flags, _mgate)\
   1383	MGATE_MP1_PDATA(_id, _name, _parent, _flags, _mgate)
   1384
   1385#define KCLK(_id, _name, _parents, _flags, _mgate, _mmux)\
   1386	     COMPOSITE(_id, _name, _parents, CLK_OPS_PARENT_ENABLE |\
   1387		       CLK_SET_RATE_NO_REPARENT | _flags,\
   1388		       _MGATE_MP1(_mgate),\
   1389		       _MMUX(_mmux),\
   1390		       _NO_DIV)
   1391
   1392enum {
   1393	G_SAI1,
   1394	G_SAI2,
   1395	G_SAI3,
   1396	G_SAI4,
   1397	G_SPI1,
   1398	G_SPI2,
   1399	G_SPI3,
   1400	G_SPI4,
   1401	G_SPI5,
   1402	G_SPI6,
   1403	G_SPDIF,
   1404	G_I2C1,
   1405	G_I2C2,
   1406	G_I2C3,
   1407	G_I2C4,
   1408	G_I2C5,
   1409	G_I2C6,
   1410	G_USART2,
   1411	G_UART4,
   1412	G_USART3,
   1413	G_UART5,
   1414	G_USART1,
   1415	G_USART6,
   1416	G_UART7,
   1417	G_UART8,
   1418	G_LPTIM1,
   1419	G_LPTIM2,
   1420	G_LPTIM3,
   1421	G_LPTIM4,
   1422	G_LPTIM5,
   1423	G_LTDC,
   1424	G_DSI,
   1425	G_QSPI,
   1426	G_FMC,
   1427	G_SDMMC1,
   1428	G_SDMMC2,
   1429	G_SDMMC3,
   1430	G_USBO,
   1431	G_USBPHY,
   1432	G_RNG1,
   1433	G_RNG2,
   1434	G_FDCAN,
   1435	G_DAC12,
   1436	G_CEC,
   1437	G_ADC12,
   1438	G_GPU,
   1439	G_STGEN,
   1440	G_DFSDM,
   1441	G_ADFSDM,
   1442	G_TIM2,
   1443	G_TIM3,
   1444	G_TIM4,
   1445	G_TIM5,
   1446	G_TIM6,
   1447	G_TIM7,
   1448	G_TIM12,
   1449	G_TIM13,
   1450	G_TIM14,
   1451	G_MDIO,
   1452	G_TIM1,
   1453	G_TIM8,
   1454	G_TIM15,
   1455	G_TIM16,
   1456	G_TIM17,
   1457	G_SYSCFG,
   1458	G_VREF,
   1459	G_TMPSENS,
   1460	G_PMBCTRL,
   1461	G_HDP,
   1462	G_IWDG2,
   1463	G_STGENRO,
   1464	G_DMA1,
   1465	G_DMA2,
   1466	G_DMAMUX,
   1467	G_DCMI,
   1468	G_CRYP2,
   1469	G_HASH2,
   1470	G_CRC2,
   1471	G_HSEM,
   1472	G_IPCC,
   1473	G_GPIOA,
   1474	G_GPIOB,
   1475	G_GPIOC,
   1476	G_GPIOD,
   1477	G_GPIOE,
   1478	G_GPIOF,
   1479	G_GPIOG,
   1480	G_GPIOH,
   1481	G_GPIOI,
   1482	G_GPIOJ,
   1483	G_GPIOK,
   1484	G_MDMA,
   1485	G_ETHCK,
   1486	G_ETHTX,
   1487	G_ETHRX,
   1488	G_ETHMAC,
   1489	G_CRC1,
   1490	G_USBH,
   1491	G_ETHSTP,
   1492	G_RTCAPB,
   1493	G_TZC1,
   1494	G_TZC2,
   1495	G_TZPC,
   1496	G_IWDG1,
   1497	G_BSEC,
   1498	G_GPIOZ,
   1499	G_CRYP1,
   1500	G_HASH1,
   1501	G_BKPSRAM,
   1502	G_DDRPERFM,
   1503
   1504	G_LAST
   1505};
   1506
   1507static struct stm32_mgate mp1_mgate[G_LAST];
   1508
   1509#define _K_GATE(_id, _gate_offset, _gate_bit_idx, _gate_flags,\
   1510	       _mgate, _ops)\
   1511	[_id] = {\
   1512		&(struct gate_cfg) {\
   1513			.reg_off	= _gate_offset,\
   1514			.bit_idx	= _gate_bit_idx,\
   1515			.gate_flags	= _gate_flags,\
   1516		},\
   1517		.mgate		= _mgate,\
   1518		.ops		= _ops,\
   1519	}
   1520
   1521#define K_GATE(_id, _gate_offset, _gate_bit_idx, _gate_flags)\
   1522	_K_GATE(_id, _gate_offset, _gate_bit_idx, _gate_flags,\
   1523	       NULL, &mp1_gate_clk_ops)
   1524
   1525#define K_MGATE(_id, _gate_offset, _gate_bit_idx, _gate_flags)\
   1526	_K_GATE(_id, _gate_offset, _gate_bit_idx, _gate_flags,\
   1527	       &mp1_mgate[_id], &mp1_mgate_clk_ops)
   1528
   1529/* Peripheral gates */
   1530static struct stm32_gate_cfg per_gate_cfg[G_LAST] = {
   1531	/* Multi gates */
   1532	K_GATE(G_MDIO,		RCC_APB1ENSETR, 31, 0),
   1533	K_MGATE(G_DAC12,	RCC_APB1ENSETR, 29, 0),
   1534	K_MGATE(G_CEC,		RCC_APB1ENSETR, 27, 0),
   1535	K_MGATE(G_SPDIF,	RCC_APB1ENSETR, 26, 0),
   1536	K_MGATE(G_I2C5,		RCC_APB1ENSETR, 24, 0),
   1537	K_MGATE(G_I2C3,		RCC_APB1ENSETR, 23, 0),
   1538	K_MGATE(G_I2C2,		RCC_APB1ENSETR, 22, 0),
   1539	K_MGATE(G_I2C1,		RCC_APB1ENSETR, 21, 0),
   1540	K_MGATE(G_UART8,	RCC_APB1ENSETR, 19, 0),
   1541	K_MGATE(G_UART7,	RCC_APB1ENSETR, 18, 0),
   1542	K_MGATE(G_UART5,	RCC_APB1ENSETR, 17, 0),
   1543	K_MGATE(G_UART4,	RCC_APB1ENSETR, 16, 0),
   1544	K_MGATE(G_USART3,	RCC_APB1ENSETR, 15, 0),
   1545	K_MGATE(G_USART2,	RCC_APB1ENSETR, 14, 0),
   1546	K_MGATE(G_SPI3,		RCC_APB1ENSETR, 12, 0),
   1547	K_MGATE(G_SPI2,		RCC_APB1ENSETR, 11, 0),
   1548	K_MGATE(G_LPTIM1,	RCC_APB1ENSETR, 9, 0),
   1549	K_GATE(G_TIM14,		RCC_APB1ENSETR, 8, 0),
   1550	K_GATE(G_TIM13,		RCC_APB1ENSETR, 7, 0),
   1551	K_GATE(G_TIM12,		RCC_APB1ENSETR, 6, 0),
   1552	K_GATE(G_TIM7,		RCC_APB1ENSETR, 5, 0),
   1553	K_GATE(G_TIM6,		RCC_APB1ENSETR, 4, 0),
   1554	K_GATE(G_TIM5,		RCC_APB1ENSETR, 3, 0),
   1555	K_GATE(G_TIM4,		RCC_APB1ENSETR, 2, 0),
   1556	K_GATE(G_TIM3,		RCC_APB1ENSETR, 1, 0),
   1557	K_GATE(G_TIM2,		RCC_APB1ENSETR, 0, 0),
   1558
   1559	K_MGATE(G_FDCAN,	RCC_APB2ENSETR, 24, 0),
   1560	K_GATE(G_ADFSDM,	RCC_APB2ENSETR, 21, 0),
   1561	K_GATE(G_DFSDM,		RCC_APB2ENSETR, 20, 0),
   1562	K_MGATE(G_SAI3,		RCC_APB2ENSETR, 18, 0),
   1563	K_MGATE(G_SAI2,		RCC_APB2ENSETR, 17, 0),
   1564	K_MGATE(G_SAI1,		RCC_APB2ENSETR, 16, 0),
   1565	K_MGATE(G_USART6,	RCC_APB2ENSETR, 13, 0),
   1566	K_MGATE(G_SPI5,		RCC_APB2ENSETR, 10, 0),
   1567	K_MGATE(G_SPI4,		RCC_APB2ENSETR, 9, 0),
   1568	K_MGATE(G_SPI1,		RCC_APB2ENSETR, 8, 0),
   1569	K_GATE(G_TIM17,		RCC_APB2ENSETR, 4, 0),
   1570	K_GATE(G_TIM16,		RCC_APB2ENSETR, 3, 0),
   1571	K_GATE(G_TIM15,		RCC_APB2ENSETR, 2, 0),
   1572	K_GATE(G_TIM8,		RCC_APB2ENSETR, 1, 0),
   1573	K_GATE(G_TIM1,		RCC_APB2ENSETR, 0, 0),
   1574
   1575	K_GATE(G_HDP,		RCC_APB3ENSETR, 20, 0),
   1576	K_GATE(G_PMBCTRL,	RCC_APB3ENSETR, 17, 0),
   1577	K_GATE(G_TMPSENS,	RCC_APB3ENSETR, 16, 0),
   1578	K_GATE(G_VREF,		RCC_APB3ENSETR, 13, 0),
   1579	K_GATE(G_SYSCFG,	RCC_APB3ENSETR, 11, 0),
   1580	K_MGATE(G_SAI4,		RCC_APB3ENSETR, 8, 0),
   1581	K_MGATE(G_LPTIM5,	RCC_APB3ENSETR, 3, 0),
   1582	K_MGATE(G_LPTIM4,	RCC_APB3ENSETR, 2, 0),
   1583	K_MGATE(G_LPTIM3,	RCC_APB3ENSETR, 1, 0),
   1584	K_MGATE(G_LPTIM2,	RCC_APB3ENSETR, 0, 0),
   1585
   1586	K_GATE(G_STGENRO,	RCC_APB4ENSETR, 20, 0),
   1587	K_MGATE(G_USBPHY,	RCC_APB4ENSETR, 16, 0),
   1588	K_GATE(G_IWDG2,		RCC_APB4ENSETR, 15, 0),
   1589	K_GATE(G_DDRPERFM,	RCC_APB4ENSETR, 8, 0),
   1590	K_MGATE(G_DSI,		RCC_APB4ENSETR, 4, 0),
   1591	K_MGATE(G_LTDC,		RCC_APB4ENSETR, 0, 0),
   1592
   1593	K_GATE(G_STGEN,		RCC_APB5ENSETR, 20, 0),
   1594	K_GATE(G_BSEC,		RCC_APB5ENSETR, 16, 0),
   1595	K_GATE(G_IWDG1,		RCC_APB5ENSETR, 15, 0),
   1596	K_GATE(G_TZPC,		RCC_APB5ENSETR, 13, 0),
   1597	K_GATE(G_TZC2,		RCC_APB5ENSETR, 12, 0),
   1598	K_GATE(G_TZC1,		RCC_APB5ENSETR, 11, 0),
   1599	K_GATE(G_RTCAPB,	RCC_APB5ENSETR, 8, 0),
   1600	K_MGATE(G_USART1,	RCC_APB5ENSETR, 4, 0),
   1601	K_MGATE(G_I2C6,		RCC_APB5ENSETR, 3, 0),
   1602	K_MGATE(G_I2C4,		RCC_APB5ENSETR, 2, 0),
   1603	K_MGATE(G_SPI6,		RCC_APB5ENSETR, 0, 0),
   1604
   1605	K_MGATE(G_SDMMC3,	RCC_AHB2ENSETR, 16, 0),
   1606	K_MGATE(G_USBO,		RCC_AHB2ENSETR, 8, 0),
   1607	K_MGATE(G_ADC12,	RCC_AHB2ENSETR, 5, 0),
   1608	K_GATE(G_DMAMUX,	RCC_AHB2ENSETR, 2, 0),
   1609	K_GATE(G_DMA2,		RCC_AHB2ENSETR, 1, 0),
   1610	K_GATE(G_DMA1,		RCC_AHB2ENSETR, 0, 0),
   1611
   1612	K_GATE(G_IPCC,		RCC_AHB3ENSETR, 12, 0),
   1613	K_GATE(G_HSEM,		RCC_AHB3ENSETR, 11, 0),
   1614	K_GATE(G_CRC2,		RCC_AHB3ENSETR, 7, 0),
   1615	K_MGATE(G_RNG2,		RCC_AHB3ENSETR, 6, 0),
   1616	K_GATE(G_HASH2,		RCC_AHB3ENSETR, 5, 0),
   1617	K_GATE(G_CRYP2,		RCC_AHB3ENSETR, 4, 0),
   1618	K_GATE(G_DCMI,		RCC_AHB3ENSETR, 0, 0),
   1619
   1620	K_GATE(G_GPIOK,		RCC_AHB4ENSETR, 10, 0),
   1621	K_GATE(G_GPIOJ,		RCC_AHB4ENSETR, 9, 0),
   1622	K_GATE(G_GPIOI,		RCC_AHB4ENSETR, 8, 0),
   1623	K_GATE(G_GPIOH,		RCC_AHB4ENSETR, 7, 0),
   1624	K_GATE(G_GPIOG,		RCC_AHB4ENSETR, 6, 0),
   1625	K_GATE(G_GPIOF,		RCC_AHB4ENSETR, 5, 0),
   1626	K_GATE(G_GPIOE,		RCC_AHB4ENSETR, 4, 0),
   1627	K_GATE(G_GPIOD,		RCC_AHB4ENSETR, 3, 0),
   1628	K_GATE(G_GPIOC,		RCC_AHB4ENSETR, 2, 0),
   1629	K_GATE(G_GPIOB,		RCC_AHB4ENSETR, 1, 0),
   1630	K_GATE(G_GPIOA,		RCC_AHB4ENSETR, 0, 0),
   1631
   1632	K_GATE(G_BKPSRAM,	RCC_AHB5ENSETR, 8, 0),
   1633	K_MGATE(G_RNG1,		RCC_AHB5ENSETR, 6, 0),
   1634	K_GATE(G_HASH1,		RCC_AHB5ENSETR, 5, 0),
   1635	K_GATE(G_CRYP1,		RCC_AHB5ENSETR, 4, 0),
   1636	K_GATE(G_GPIOZ,		RCC_AHB5ENSETR, 0, 0),
   1637
   1638	K_GATE(G_USBH,		RCC_AHB6ENSETR, 24, 0),
   1639	K_GATE(G_CRC1,		RCC_AHB6ENSETR, 20, 0),
   1640	K_MGATE(G_SDMMC2,	RCC_AHB6ENSETR, 17, 0),
   1641	K_MGATE(G_SDMMC1,	RCC_AHB6ENSETR, 16, 0),
   1642	K_MGATE(G_QSPI,		RCC_AHB6ENSETR, 14, 0),
   1643	K_MGATE(G_FMC,		RCC_AHB6ENSETR, 12, 0),
   1644	K_GATE(G_ETHMAC,	RCC_AHB6ENSETR, 10, 0),
   1645	K_GATE(G_ETHRX,		RCC_AHB6ENSETR, 9, 0),
   1646	K_GATE(G_ETHTX,		RCC_AHB6ENSETR, 8, 0),
   1647	K_GATE(G_ETHCK,		RCC_AHB6ENSETR, 7, 0),
   1648	K_MGATE(G_GPU,		RCC_AHB6ENSETR, 5, 0),
   1649	K_GATE(G_MDMA,		RCC_AHB6ENSETR, 0, 0),
   1650	K_GATE(G_ETHSTP,	RCC_AHB6LPENSETR, 11, 0),
   1651};
   1652
   1653enum {
   1654	M_SDMMC12,
   1655	M_SDMMC3,
   1656	M_FMC,
   1657	M_QSPI,
   1658	M_RNG1,
   1659	M_RNG2,
   1660	M_USBPHY,
   1661	M_USBO,
   1662	M_STGEN,
   1663	M_SPDIF,
   1664	M_SPI1,
   1665	M_SPI23,
   1666	M_SPI45,
   1667	M_SPI6,
   1668	M_CEC,
   1669	M_I2C12,
   1670	M_I2C35,
   1671	M_I2C46,
   1672	M_LPTIM1,
   1673	M_LPTIM23,
   1674	M_LPTIM45,
   1675	M_USART1,
   1676	M_UART24,
   1677	M_UART35,
   1678	M_USART6,
   1679	M_UART78,
   1680	M_SAI1,
   1681	M_SAI2,
   1682	M_SAI3,
   1683	M_SAI4,
   1684	M_DSI,
   1685	M_FDCAN,
   1686	M_ADC12,
   1687	M_ETHCK,
   1688	M_CKPER,
   1689	M_LAST
   1690};
   1691
   1692static struct stm32_mmux ker_mux[M_LAST];
   1693
   1694#define _K_MUX(_id, _offset, _shift, _width, _mux_flags, _mmux, _ops)\
   1695	[_id] = {\
   1696		&(struct mux_cfg) {\
   1697			.reg_off	= _offset,\
   1698			.shift		= _shift,\
   1699			.width		= _width,\
   1700			.mux_flags	= _mux_flags,\
   1701			.table		= NULL,\
   1702		},\
   1703		.mmux		= _mmux,\
   1704		.ops		= _ops,\
   1705	}
   1706
   1707#define K_MUX(_id, _offset, _shift, _width, _mux_flags)\
   1708	_K_MUX(_id, _offset, _shift, _width, _mux_flags,\
   1709			NULL, NULL)
   1710
   1711#define K_MMUX(_id, _offset, _shift, _width, _mux_flags)\
   1712	_K_MUX(_id, _offset, _shift, _width, _mux_flags,\
   1713			&ker_mux[_id], &clk_mmux_ops)
   1714
   1715static const struct stm32_mux_cfg ker_mux_cfg[M_LAST] = {
   1716	/* Kernel multi mux */
   1717	K_MMUX(M_SDMMC12, RCC_SDMMC12CKSELR, 0, 3, 0),
   1718	K_MMUX(M_SPI23, RCC_SPI2S23CKSELR, 0, 3, 0),
   1719	K_MMUX(M_SPI45, RCC_SPI2S45CKSELR, 0, 3, 0),
   1720	K_MMUX(M_I2C12, RCC_I2C12CKSELR, 0, 3, 0),
   1721	K_MMUX(M_I2C35, RCC_I2C35CKSELR, 0, 3, 0),
   1722	K_MMUX(M_LPTIM23, RCC_LPTIM23CKSELR, 0, 3, 0),
   1723	K_MMUX(M_LPTIM45, RCC_LPTIM45CKSELR, 0, 3, 0),
   1724	K_MMUX(M_UART24, RCC_UART24CKSELR, 0, 3, 0),
   1725	K_MMUX(M_UART35, RCC_UART35CKSELR, 0, 3, 0),
   1726	K_MMUX(M_UART78, RCC_UART78CKSELR, 0, 3, 0),
   1727	K_MMUX(M_SAI1, RCC_SAI1CKSELR, 0, 3, 0),
   1728	K_MMUX(M_ETHCK, RCC_ETHCKSELR, 0, 2, 0),
   1729	K_MMUX(M_I2C46, RCC_I2C46CKSELR, 0, 3, 0),
   1730
   1731	/*  Kernel simple mux */
   1732	K_MUX(M_RNG2, RCC_RNG2CKSELR, 0, 2, 0),
   1733	K_MUX(M_SDMMC3, RCC_SDMMC3CKSELR, 0, 3, 0),
   1734	K_MUX(M_FMC, RCC_FMCCKSELR, 0, 2, 0),
   1735	K_MUX(M_QSPI, RCC_QSPICKSELR, 0, 2, 0),
   1736	K_MUX(M_USBPHY, RCC_USBCKSELR, 0, 2, 0),
   1737	K_MUX(M_USBO, RCC_USBCKSELR, 4, 1, 0),
   1738	K_MUX(M_SPDIF, RCC_SPDIFCKSELR, 0, 2, 0),
   1739	K_MUX(M_SPI1, RCC_SPI2S1CKSELR, 0, 3, 0),
   1740	K_MUX(M_CEC, RCC_CECCKSELR, 0, 2, 0),
   1741	K_MUX(M_LPTIM1, RCC_LPTIM1CKSELR, 0, 3, 0),
   1742	K_MUX(M_USART6, RCC_UART6CKSELR, 0, 3, 0),
   1743	K_MUX(M_FDCAN, RCC_FDCANCKSELR, 0, 2, 0),
   1744	K_MUX(M_SAI2, RCC_SAI2CKSELR, 0, 3, 0),
   1745	K_MUX(M_SAI3, RCC_SAI3CKSELR, 0, 3, 0),
   1746	K_MUX(M_SAI4, RCC_SAI4CKSELR, 0, 3, 0),
   1747	K_MUX(M_ADC12, RCC_ADCCKSELR, 0, 2, 0),
   1748	K_MUX(M_DSI, RCC_DSICKSELR, 0, 1, 0),
   1749	K_MUX(M_CKPER, RCC_CPERCKSELR, 0, 2, 0),
   1750	K_MUX(M_RNG1, RCC_RNG1CKSELR, 0, 2, 0),
   1751	K_MUX(M_STGEN, RCC_STGENCKSELR, 0, 2, 0),
   1752	K_MUX(M_USART1, RCC_UART1CKSELR, 0, 3, 0),
   1753	K_MUX(M_SPI6, RCC_SPI6CKSELR, 0, 3, 0),
   1754};
   1755
   1756static const struct clock_config stm32mp1_clock_cfg[] = {
   1757	/*  External / Internal Oscillators */
   1758	GATE_MP1(CK_HSE, "ck_hse", "clk-hse", 0, RCC_OCENSETR, 8, 0),
   1759	/* ck_csi is used by IO compensation and should be critical */
   1760	GATE_MP1(CK_CSI, "ck_csi", "clk-csi", CLK_IS_CRITICAL,
   1761		 RCC_OCENSETR, 4, 0),
   1762	COMPOSITE(CK_HSI, "ck_hsi", PARENT("clk-hsi"), 0,
   1763		  _GATE_MP1(RCC_OCENSETR, 0, 0),
   1764		  _NO_MUX,
   1765		  _DIV(RCC_HSICFGR, 0, 2, CLK_DIVIDER_POWER_OF_TWO |
   1766		       CLK_DIVIDER_READ_ONLY, NULL)),
   1767	GATE(CK_LSI, "ck_lsi", "clk-lsi", 0, RCC_RDLSICR, 0, 0),
   1768	GATE(CK_LSE, "ck_lse", "clk-lse", 0, RCC_BDCR, 0, 0),
   1769
   1770	FIXED_FACTOR(CK_HSE_DIV2, "clk-hse-div2", "ck_hse", 0, 1, 2),
   1771
   1772	/* PLLs */
   1773	PLL(PLL1, "pll1", ref12_parents, 0, RCC_PLL1CR, RCC_RCK12SELR),
   1774	PLL(PLL2, "pll2", ref12_parents, 0, RCC_PLL2CR, RCC_RCK12SELR),
   1775	PLL(PLL3, "pll3", ref3_parents, 0, RCC_PLL3CR, RCC_RCK3SELR),
   1776	PLL(PLL4, "pll4", ref4_parents, 0, RCC_PLL4CR, RCC_RCK4SELR),
   1777
   1778	/* ODF */
   1779	COMPOSITE(PLL1_P, "pll1_p", PARENT("pll1"), 0,
   1780		  _GATE(RCC_PLL1CR, 4, 0),
   1781		  _NO_MUX,
   1782		  _DIV(RCC_PLL1CFGR2, 0, 7, 0, NULL)),
   1783
   1784	COMPOSITE(PLL2_P, "pll2_p", PARENT("pll2"), 0,
   1785		  _GATE(RCC_PLL2CR, 4, 0),
   1786		  _NO_MUX,
   1787		  _DIV(RCC_PLL2CFGR2, 0, 7, 0, NULL)),
   1788
   1789	COMPOSITE(PLL2_Q, "pll2_q", PARENT("pll2"), 0,
   1790		  _GATE(RCC_PLL2CR, 5, 0),
   1791		  _NO_MUX,
   1792		  _DIV(RCC_PLL2CFGR2, 8, 7, 0, NULL)),
   1793
   1794	COMPOSITE(PLL2_R, "pll2_r", PARENT("pll2"), CLK_IS_CRITICAL,
   1795		  _GATE(RCC_PLL2CR, 6, 0),
   1796		  _NO_MUX,
   1797		  _DIV(RCC_PLL2CFGR2, 16, 7, 0, NULL)),
   1798
   1799	COMPOSITE(PLL3_P, "pll3_p", PARENT("pll3"), 0,
   1800		  _GATE(RCC_PLL3CR, 4, 0),
   1801		  _NO_MUX,
   1802		  _DIV(RCC_PLL3CFGR2, 0, 7, 0, NULL)),
   1803
   1804	COMPOSITE(PLL3_Q, "pll3_q", PARENT("pll3"), 0,
   1805		  _GATE(RCC_PLL3CR, 5, 0),
   1806		  _NO_MUX,
   1807		  _DIV(RCC_PLL3CFGR2, 8, 7, 0, NULL)),
   1808
   1809	COMPOSITE(PLL3_R, "pll3_r", PARENT("pll3"), 0,
   1810		  _GATE(RCC_PLL3CR, 6, 0),
   1811		  _NO_MUX,
   1812		  _DIV(RCC_PLL3CFGR2, 16, 7, 0, NULL)),
   1813
   1814	COMPOSITE(PLL4_P, "pll4_p", PARENT("pll4"), 0,
   1815		  _GATE(RCC_PLL4CR, 4, 0),
   1816		  _NO_MUX,
   1817		  _DIV(RCC_PLL4CFGR2, 0, 7, 0, NULL)),
   1818
   1819	COMPOSITE(PLL4_Q, "pll4_q", PARENT("pll4"), 0,
   1820		  _GATE(RCC_PLL4CR, 5, 0),
   1821		  _NO_MUX,
   1822		  _DIV(RCC_PLL4CFGR2, 8, 7, 0, NULL)),
   1823
   1824	COMPOSITE(PLL4_R, "pll4_r", PARENT("pll4"), 0,
   1825		  _GATE(RCC_PLL4CR, 6, 0),
   1826		  _NO_MUX,
   1827		  _DIV(RCC_PLL4CFGR2, 16, 7, 0, NULL)),
   1828
   1829	/* MUX system clocks */
   1830	MUX(CK_PER, "ck_per", per_src, CLK_OPS_PARENT_ENABLE,
   1831	    RCC_CPERCKSELR, 0, 2, 0),
   1832
   1833	MUX(CK_MPU, "ck_mpu", cpu_src, CLK_OPS_PARENT_ENABLE |
   1834	     CLK_IS_CRITICAL, RCC_MPCKSELR, 0, 2, 0),
   1835
   1836	COMPOSITE(CK_AXI, "ck_axi", axi_src, CLK_IS_CRITICAL |
   1837		   CLK_OPS_PARENT_ENABLE,
   1838		   _NO_GATE,
   1839		   _MUX(RCC_ASSCKSELR, 0, 2, 0),
   1840		   _DIV(RCC_AXIDIVR, 0, 3, 0, axi_div_table)),
   1841
   1842	COMPOSITE(CK_MCU, "ck_mcu", mcu_src, CLK_IS_CRITICAL |
   1843		   CLK_OPS_PARENT_ENABLE,
   1844		   _NO_GATE,
   1845		   _MUX(RCC_MSSCKSELR, 0, 2, 0),
   1846		   _DIV(RCC_MCUDIVR, 0, 4, 0, mcu_div_table)),
   1847
   1848	DIV_TABLE(NO_ID, "pclk1", "ck_mcu", CLK_IGNORE_UNUSED, RCC_APB1DIVR, 0,
   1849		  3, CLK_DIVIDER_READ_ONLY, apb_div_table),
   1850
   1851	DIV_TABLE(NO_ID, "pclk2", "ck_mcu", CLK_IGNORE_UNUSED, RCC_APB2DIVR, 0,
   1852		  3, CLK_DIVIDER_READ_ONLY, apb_div_table),
   1853
   1854	DIV_TABLE(NO_ID, "pclk3", "ck_mcu", CLK_IGNORE_UNUSED, RCC_APB3DIVR, 0,
   1855		  3, CLK_DIVIDER_READ_ONLY, apb_div_table),
   1856
   1857	DIV_TABLE(NO_ID, "pclk4", "ck_axi", CLK_IGNORE_UNUSED, RCC_APB4DIVR, 0,
   1858		  3, CLK_DIVIDER_READ_ONLY, apb_div_table),
   1859
   1860	DIV_TABLE(NO_ID, "pclk5", "ck_axi", CLK_IGNORE_UNUSED, RCC_APB5DIVR, 0,
   1861		  3, CLK_DIVIDER_READ_ONLY, apb_div_table),
   1862
   1863	/* Kernel Timers */
   1864	STM32_CKTIM("ck1_tim", "pclk1", 0, RCC_APB1DIVR, RCC_TIMG1PRER),
   1865	STM32_CKTIM("ck2_tim", "pclk2", 0, RCC_APB2DIVR, RCC_TIMG2PRER),
   1866
   1867	STM32_TIM(TIM2_K, "tim2_k", "ck1_tim", RCC_APB1ENSETR, 0),
   1868	STM32_TIM(TIM3_K, "tim3_k", "ck1_tim", RCC_APB1ENSETR, 1),
   1869	STM32_TIM(TIM4_K, "tim4_k", "ck1_tim", RCC_APB1ENSETR, 2),
   1870	STM32_TIM(TIM5_K, "tim5_k", "ck1_tim", RCC_APB1ENSETR, 3),
   1871	STM32_TIM(TIM6_K, "tim6_k", "ck1_tim", RCC_APB1ENSETR, 4),
   1872	STM32_TIM(TIM7_K, "tim7_k", "ck1_tim", RCC_APB1ENSETR, 5),
   1873	STM32_TIM(TIM12_K, "tim12_k", "ck1_tim", RCC_APB1ENSETR, 6),
   1874	STM32_TIM(TIM13_K, "tim13_k", "ck1_tim", RCC_APB1ENSETR, 7),
   1875	STM32_TIM(TIM14_K, "tim14_k", "ck1_tim", RCC_APB1ENSETR, 8),
   1876	STM32_TIM(TIM1_K, "tim1_k", "ck2_tim", RCC_APB2ENSETR, 0),
   1877	STM32_TIM(TIM8_K, "tim8_k", "ck2_tim", RCC_APB2ENSETR, 1),
   1878	STM32_TIM(TIM15_K, "tim15_k", "ck2_tim", RCC_APB2ENSETR, 2),
   1879	STM32_TIM(TIM16_K, "tim16_k", "ck2_tim", RCC_APB2ENSETR, 3),
   1880	STM32_TIM(TIM17_K, "tim17_k", "ck2_tim", RCC_APB2ENSETR, 4),
   1881
   1882	/* Peripheral clocks */
   1883	PCLK(TIM2, "tim2", "pclk1", CLK_IGNORE_UNUSED, G_TIM2),
   1884	PCLK(TIM3, "tim3", "pclk1", CLK_IGNORE_UNUSED, G_TIM3),
   1885	PCLK(TIM4, "tim4", "pclk1", CLK_IGNORE_UNUSED, G_TIM4),
   1886	PCLK(TIM5, "tim5", "pclk1", CLK_IGNORE_UNUSED, G_TIM5),
   1887	PCLK(TIM6, "tim6", "pclk1", CLK_IGNORE_UNUSED, G_TIM6),
   1888	PCLK(TIM7, "tim7", "pclk1", CLK_IGNORE_UNUSED, G_TIM7),
   1889	PCLK(TIM12, "tim12", "pclk1", CLK_IGNORE_UNUSED, G_TIM12),
   1890	PCLK(TIM13, "tim13", "pclk1", CLK_IGNORE_UNUSED, G_TIM13),
   1891	PCLK(TIM14, "tim14", "pclk1", CLK_IGNORE_UNUSED, G_TIM14),
   1892	PCLK(LPTIM1, "lptim1", "pclk1", 0, G_LPTIM1),
   1893	PCLK(SPI2, "spi2", "pclk1", 0, G_SPI2),
   1894	PCLK(SPI3, "spi3", "pclk1", 0, G_SPI3),
   1895	PCLK(USART2, "usart2", "pclk1", 0, G_USART2),
   1896	PCLK(USART3, "usart3", "pclk1", 0, G_USART3),
   1897	PCLK(UART4, "uart4", "pclk1", 0, G_UART4),
   1898	PCLK(UART5, "uart5", "pclk1", 0, G_UART5),
   1899	PCLK(UART7, "uart7", "pclk1", 0, G_UART7),
   1900	PCLK(UART8, "uart8", "pclk1", 0, G_UART8),
   1901	PCLK(I2C1, "i2c1", "pclk1", 0, G_I2C1),
   1902	PCLK(I2C2, "i2c2", "pclk1", 0, G_I2C2),
   1903	PCLK(I2C3, "i2c3", "pclk1", 0, G_I2C3),
   1904	PCLK(I2C5, "i2c5", "pclk1", 0, G_I2C5),
   1905	PCLK(SPDIF, "spdif", "pclk1", 0, G_SPDIF),
   1906	PCLK(CEC, "cec", "pclk1", 0, G_CEC),
   1907	PCLK(DAC12, "dac12", "pclk1", 0, G_DAC12),
   1908	PCLK(MDIO, "mdio", "pclk1", 0, G_MDIO),
   1909	PCLK(TIM1, "tim1", "pclk2", CLK_IGNORE_UNUSED, G_TIM1),
   1910	PCLK(TIM8, "tim8", "pclk2", CLK_IGNORE_UNUSED, G_TIM8),
   1911	PCLK(TIM15, "tim15", "pclk2", CLK_IGNORE_UNUSED, G_TIM15),
   1912	PCLK(TIM16, "tim16", "pclk2", CLK_IGNORE_UNUSED, G_TIM16),
   1913	PCLK(TIM17, "tim17", "pclk2", CLK_IGNORE_UNUSED, G_TIM17),
   1914	PCLK(SPI1, "spi1", "pclk2", 0, G_SPI1),
   1915	PCLK(SPI4, "spi4", "pclk2", 0, G_SPI4),
   1916	PCLK(SPI5, "spi5", "pclk2", 0, G_SPI5),
   1917	PCLK(USART6, "usart6", "pclk2", 0, G_USART6),
   1918	PCLK(SAI1, "sai1", "pclk2", 0, G_SAI1),
   1919	PCLK(SAI2, "sai2", "pclk2", 0, G_SAI2),
   1920	PCLK(SAI3, "sai3", "pclk2", 0, G_SAI3),
   1921	PCLK(DFSDM, "dfsdm", "pclk2", 0, G_DFSDM),
   1922	PCLK(FDCAN, "fdcan", "pclk2", 0, G_FDCAN),
   1923	PCLK(LPTIM2, "lptim2", "pclk3", 0, G_LPTIM2),
   1924	PCLK(LPTIM3, "lptim3", "pclk3", 0, G_LPTIM3),
   1925	PCLK(LPTIM4, "lptim4", "pclk3", 0, G_LPTIM4),
   1926	PCLK(LPTIM5, "lptim5", "pclk3", 0, G_LPTIM5),
   1927	PCLK(SAI4, "sai4", "pclk3", 0, G_SAI4),
   1928	PCLK(SYSCFG, "syscfg", "pclk3", 0, G_SYSCFG),
   1929	PCLK(VREF, "vref", "pclk3", 13, G_VREF),
   1930	PCLK(TMPSENS, "tmpsens", "pclk3", 0, G_TMPSENS),
   1931	PCLK(PMBCTRL, "pmbctrl", "pclk3", 0, G_PMBCTRL),
   1932	PCLK(HDP, "hdp", "pclk3", 0, G_HDP),
   1933	PCLK(LTDC, "ltdc", "pclk4", 0, G_LTDC),
   1934	PCLK(DSI, "dsi", "pclk4", 0, G_DSI),
   1935	PCLK(IWDG2, "iwdg2", "pclk4", 0, G_IWDG2),
   1936	PCLK(USBPHY, "usbphy", "pclk4", 0, G_USBPHY),
   1937	PCLK(STGENRO, "stgenro", "pclk4", 0, G_STGENRO),
   1938	PCLK(SPI6, "spi6", "pclk5", 0, G_SPI6),
   1939	PCLK(I2C4, "i2c4", "pclk5", 0, G_I2C4),
   1940	PCLK(I2C6, "i2c6", "pclk5", 0, G_I2C6),
   1941	PCLK(USART1, "usart1", "pclk5", 0, G_USART1),
   1942	PCLK(RTCAPB, "rtcapb", "pclk5", CLK_IGNORE_UNUSED |
   1943	     CLK_IS_CRITICAL, G_RTCAPB),
   1944	PCLK(TZC1, "tzc1", "ck_axi", CLK_IGNORE_UNUSED, G_TZC1),
   1945	PCLK(TZC2, "tzc2", "ck_axi", CLK_IGNORE_UNUSED, G_TZC2),
   1946	PCLK(TZPC, "tzpc", "pclk5", CLK_IGNORE_UNUSED, G_TZPC),
   1947	PCLK(IWDG1, "iwdg1", "pclk5", 0, G_IWDG1),
   1948	PCLK(BSEC, "bsec", "pclk5", CLK_IGNORE_UNUSED, G_BSEC),
   1949	PCLK(STGEN, "stgen", "pclk5", CLK_IGNORE_UNUSED, G_STGEN),
   1950	PCLK(DMA1, "dma1", "ck_mcu", 0, G_DMA1),
   1951	PCLK(DMA2, "dma2", "ck_mcu",  0, G_DMA2),
   1952	PCLK(DMAMUX, "dmamux", "ck_mcu", 0, G_DMAMUX),
   1953	PCLK(ADC12, "adc12", "ck_mcu", 0, G_ADC12),
   1954	PCLK(USBO, "usbo", "ck_mcu", 0, G_USBO),
   1955	PCLK(SDMMC3, "sdmmc3", "ck_mcu", 0, G_SDMMC3),
   1956	PCLK(DCMI, "dcmi", "ck_mcu", 0, G_DCMI),
   1957	PCLK(CRYP2, "cryp2", "ck_mcu", 0, G_CRYP2),
   1958	PCLK(HASH2, "hash2", "ck_mcu", 0, G_HASH2),
   1959	PCLK(RNG2, "rng2", "ck_mcu", 0, G_RNG2),
   1960	PCLK(CRC2, "crc2", "ck_mcu", 0, G_CRC2),
   1961	PCLK(HSEM, "hsem", "ck_mcu", 0, G_HSEM),
   1962	PCLK(IPCC, "ipcc", "ck_mcu", 0, G_IPCC),
   1963	PCLK(GPIOA, "gpioa", "ck_mcu", 0, G_GPIOA),
   1964	PCLK(GPIOB, "gpiob", "ck_mcu", 0, G_GPIOB),
   1965	PCLK(GPIOC, "gpioc", "ck_mcu", 0, G_GPIOC),
   1966	PCLK(GPIOD, "gpiod", "ck_mcu", 0, G_GPIOD),
   1967	PCLK(GPIOE, "gpioe", "ck_mcu", 0, G_GPIOE),
   1968	PCLK(GPIOF, "gpiof", "ck_mcu", 0, G_GPIOF),
   1969	PCLK(GPIOG, "gpiog", "ck_mcu", 0, G_GPIOG),
   1970	PCLK(GPIOH, "gpioh", "ck_mcu", 0, G_GPIOH),
   1971	PCLK(GPIOI, "gpioi", "ck_mcu", 0, G_GPIOI),
   1972	PCLK(GPIOJ, "gpioj", "ck_mcu", 0, G_GPIOJ),
   1973	PCLK(GPIOK, "gpiok", "ck_mcu", 0, G_GPIOK),
   1974	PCLK(GPIOZ, "gpioz", "ck_axi", CLK_IGNORE_UNUSED, G_GPIOZ),
   1975	PCLK(CRYP1, "cryp1", "ck_axi", CLK_IGNORE_UNUSED, G_CRYP1),
   1976	PCLK(HASH1, "hash1", "ck_axi", CLK_IGNORE_UNUSED, G_HASH1),
   1977	PCLK(RNG1, "rng1", "ck_axi", 0, G_RNG1),
   1978	PCLK(BKPSRAM, "bkpsram", "ck_axi", CLK_IGNORE_UNUSED, G_BKPSRAM),
   1979	PCLK(MDMA, "mdma", "ck_axi", 0, G_MDMA),
   1980	PCLK(GPU, "gpu", "ck_axi", 0, G_GPU),
   1981	PCLK(ETHTX, "ethtx", "ck_axi", 0, G_ETHTX),
   1982	PCLK_PDATA(ETHRX, "ethrx", ethrx_src, 0, G_ETHRX),
   1983	PCLK(ETHMAC, "ethmac", "ck_axi", 0, G_ETHMAC),
   1984	PCLK(FMC, "fmc", "ck_axi", CLK_IGNORE_UNUSED, G_FMC),
   1985	PCLK(QSPI, "qspi", "ck_axi", CLK_IGNORE_UNUSED, G_QSPI),
   1986	PCLK(SDMMC1, "sdmmc1", "ck_axi", 0, G_SDMMC1),
   1987	PCLK(SDMMC2, "sdmmc2", "ck_axi", 0, G_SDMMC2),
   1988	PCLK(CRC1, "crc1", "ck_axi", 0, G_CRC1),
   1989	PCLK(USBH, "usbh", "ck_axi", 0, G_USBH),
   1990	PCLK(ETHSTP, "ethstp", "ck_axi", 0, G_ETHSTP),
   1991	PCLK(DDRPERFM, "ddrperfm", "pclk4", 0, G_DDRPERFM),
   1992
   1993	/* Kernel clocks */
   1994	KCLK(SDMMC1_K, "sdmmc1_k", sdmmc12_src, 0, G_SDMMC1, M_SDMMC12),
   1995	KCLK(SDMMC2_K, "sdmmc2_k", sdmmc12_src, 0, G_SDMMC2, M_SDMMC12),
   1996	KCLK(SDMMC3_K, "sdmmc3_k", sdmmc3_src, 0, G_SDMMC3, M_SDMMC3),
   1997	KCLK(FMC_K, "fmc_k", fmc_src, 0, G_FMC, M_FMC),
   1998	KCLK(QSPI_K, "qspi_k", qspi_src, 0, G_QSPI, M_QSPI),
   1999	KCLK(RNG1_K, "rng1_k", rng_src, 0, G_RNG1, M_RNG1),
   2000	KCLK(RNG2_K, "rng2_k", rng_src, 0, G_RNG2, M_RNG2),
   2001	KCLK(USBPHY_K, "usbphy_k", usbphy_src, 0, G_USBPHY, M_USBPHY),
   2002	KCLK(STGEN_K, "stgen_k", stgen_src, CLK_IS_CRITICAL, G_STGEN, M_STGEN),
   2003	KCLK(SPDIF_K, "spdif_k", spdif_src, 0, G_SPDIF, M_SPDIF),
   2004	KCLK(SPI1_K, "spi1_k", spi123_src, 0, G_SPI1, M_SPI1),
   2005	KCLK(SPI2_K, "spi2_k", spi123_src, 0, G_SPI2, M_SPI23),
   2006	KCLK(SPI3_K, "spi3_k", spi123_src, 0, G_SPI3, M_SPI23),
   2007	KCLK(SPI4_K, "spi4_k", spi45_src, 0, G_SPI4, M_SPI45),
   2008	KCLK(SPI5_K, "spi5_k", spi45_src, 0, G_SPI5, M_SPI45),
   2009	KCLK(SPI6_K, "spi6_k", spi6_src, 0, G_SPI6, M_SPI6),
   2010	KCLK(CEC_K, "cec_k", cec_src, 0, G_CEC, M_CEC),
   2011	KCLK(I2C1_K, "i2c1_k", i2c12_src, 0, G_I2C1, M_I2C12),
   2012	KCLK(I2C2_K, "i2c2_k", i2c12_src, 0, G_I2C2, M_I2C12),
   2013	KCLK(I2C3_K, "i2c3_k", i2c35_src, 0, G_I2C3, M_I2C35),
   2014	KCLK(I2C5_K, "i2c5_k", i2c35_src, 0, G_I2C5, M_I2C35),
   2015	KCLK(I2C4_K, "i2c4_k", i2c46_src, 0, G_I2C4, M_I2C46),
   2016	KCLK(I2C6_K, "i2c6_k", i2c46_src, 0, G_I2C6, M_I2C46),
   2017	KCLK(LPTIM1_K, "lptim1_k", lptim1_src, 0, G_LPTIM1, M_LPTIM1),
   2018	KCLK(LPTIM2_K, "lptim2_k", lptim23_src, 0, G_LPTIM2, M_LPTIM23),
   2019	KCLK(LPTIM3_K, "lptim3_k", lptim23_src, 0, G_LPTIM3, M_LPTIM23),
   2020	KCLK(LPTIM4_K, "lptim4_k", lptim45_src, 0, G_LPTIM4, M_LPTIM45),
   2021	KCLK(LPTIM5_K, "lptim5_k", lptim45_src, 0, G_LPTIM5, M_LPTIM45),
   2022	KCLK(USART1_K, "usart1_k", usart1_src, 0, G_USART1, M_USART1),
   2023	KCLK(USART2_K, "usart2_k", usart234578_src, 0, G_USART2, M_UART24),
   2024	KCLK(USART3_K, "usart3_k", usart234578_src, 0, G_USART3, M_UART35),
   2025	KCLK(UART4_K, "uart4_k", usart234578_src, 0, G_UART4, M_UART24),
   2026	KCLK(UART5_K, "uart5_k", usart234578_src, 0, G_UART5, M_UART35),
   2027	KCLK(USART6_K, "uart6_k", usart6_src, 0, G_USART6, M_USART6),
   2028	KCLK(UART7_K, "uart7_k", usart234578_src, 0, G_UART7, M_UART78),
   2029	KCLK(UART8_K, "uart8_k", usart234578_src, 0, G_UART8, M_UART78),
   2030	KCLK(FDCAN_K, "fdcan_k", fdcan_src, 0, G_FDCAN, M_FDCAN),
   2031	KCLK(SAI1_K, "sai1_k", sai_src, 0, G_SAI1, M_SAI1),
   2032	KCLK(SAI2_K, "sai2_k", sai2_src, 0, G_SAI2, M_SAI2),
   2033	KCLK(SAI3_K, "sai3_k", sai_src, 0, G_SAI3, M_SAI3),
   2034	KCLK(SAI4_K, "sai4_k", sai_src, 0, G_SAI4, M_SAI4),
   2035	KCLK(ADC12_K, "adc12_k", adc12_src, 0, G_ADC12, M_ADC12),
   2036	KCLK(DSI_K, "dsi_k", dsi_src, 0, G_DSI, M_DSI),
   2037	KCLK(ADFSDM_K, "adfsdm_k", sai_src, 0, G_ADFSDM, M_SAI1),
   2038	KCLK(USBO_K, "usbo_k", usbo_src, 0, G_USBO, M_USBO),
   2039
   2040	/* Particulary Kernel Clocks (no mux or no gate) */
   2041	MGATE_MP1(DFSDM_K, "dfsdm_k", "ck_mcu", 0, G_DFSDM),
   2042	MGATE_MP1(DSI_PX, "dsi_px", "pll4_q", CLK_SET_RATE_PARENT, G_DSI),
   2043	MGATE_MP1(LTDC_PX, "ltdc_px", "pll4_q", CLK_SET_RATE_PARENT, G_LTDC),
   2044	MGATE_MP1(GPU_K, "gpu_k", "pll2_q", 0, G_GPU),
   2045	MGATE_MP1(DAC12_K, "dac12_k", "ck_lsi", 0, G_DAC12),
   2046
   2047	COMPOSITE(NO_ID, "ck_ker_eth", eth_src, CLK_OPS_PARENT_ENABLE |
   2048		  CLK_SET_RATE_NO_REPARENT,
   2049		  _NO_GATE,
   2050		  _MMUX(M_ETHCK),
   2051		  _NO_DIV),
   2052
   2053	MGATE_MP1(ETHCK_K, "ethck_k", "ck_ker_eth", 0, G_ETHCK),
   2054
   2055	DIV(ETHPTP_K, "ethptp_k", "ck_ker_eth", CLK_OPS_PARENT_ENABLE |
   2056	    CLK_SET_RATE_NO_REPARENT, RCC_ETHCKSELR, 4, 4, 0),
   2057
   2058	/* RTC clock */
   2059	COMPOSITE(RTC, "ck_rtc", rtc_src, CLK_OPS_PARENT_ENABLE,
   2060		  _GATE(RCC_BDCR, 20, 0),
   2061		  _MUX(RCC_BDCR, 16, 2, 0),
   2062		  _DIV_RTC(RCC_RTCDIVR, 0, 6, 0, NULL)),
   2063
   2064	/* MCO clocks */
   2065	COMPOSITE(CK_MCO1, "ck_mco1", mco1_src, CLK_OPS_PARENT_ENABLE |
   2066		  CLK_SET_RATE_NO_REPARENT,
   2067		  _GATE(RCC_MCO1CFGR, 12, 0),
   2068		  _MUX(RCC_MCO1CFGR, 0, 3, 0),
   2069		  _DIV(RCC_MCO1CFGR, 4, 4, 0, NULL)),
   2070
   2071	COMPOSITE(CK_MCO2, "ck_mco2", mco2_src, CLK_OPS_PARENT_ENABLE |
   2072		  CLK_SET_RATE_NO_REPARENT,
   2073		  _GATE(RCC_MCO2CFGR, 12, 0),
   2074		  _MUX(RCC_MCO2CFGR, 0, 3, 0),
   2075		  _DIV(RCC_MCO2CFGR, 4, 4, 0, NULL)),
   2076
   2077	/* Debug clocks */
   2078	GATE(CK_DBG, "ck_sys_dbg", "ck_axi", CLK_IGNORE_UNUSED,
   2079	     RCC_DBGCFGR, 8, 0),
   2080
   2081	COMPOSITE(CK_TRACE, "ck_trace", ck_trace_src, CLK_OPS_PARENT_ENABLE,
   2082		  _GATE(RCC_DBGCFGR, 9, 0),
   2083		  _NO_MUX,
   2084		  _DIV(RCC_DBGCFGR, 0, 3, 0, ck_trace_div_table)),
   2085};
   2086
   2087static const u32 stm32mp1_clock_secured[] = {
   2088	CK_HSE,
   2089	CK_HSI,
   2090	CK_CSI,
   2091	CK_LSI,
   2092	CK_LSE,
   2093	PLL1,
   2094	PLL2,
   2095	PLL1_P,
   2096	PLL2_P,
   2097	PLL2_Q,
   2098	PLL2_R,
   2099	CK_MPU,
   2100	CK_AXI,
   2101	SPI6,
   2102	I2C4,
   2103	I2C6,
   2104	USART1,
   2105	RTCAPB,
   2106	TZC1,
   2107	TZC2,
   2108	TZPC,
   2109	IWDG1,
   2110	BSEC,
   2111	STGEN,
   2112	GPIOZ,
   2113	CRYP1,
   2114	HASH1,
   2115	RNG1,
   2116	BKPSRAM,
   2117	RNG1_K,
   2118	STGEN_K,
   2119	SPI6_K,
   2120	I2C4_K,
   2121	I2C6_K,
   2122	USART1_K,
   2123	RTC,
   2124};
   2125
   2126static bool stm32_check_security(const struct clock_config *cfg)
   2127{
   2128	int i;
   2129
   2130	for (i = 0; i < ARRAY_SIZE(stm32mp1_clock_secured); i++)
   2131		if (cfg->id == stm32mp1_clock_secured[i])
   2132			return true;
   2133	return false;
   2134}
   2135
   2136struct stm32_rcc_match_data {
   2137	const struct clock_config *cfg;
   2138	unsigned int num;
   2139	unsigned int maxbinding;
   2140	u32 clear_offset;
   2141	bool (*check_security)(const struct clock_config *cfg);
   2142};
   2143
   2144static struct stm32_rcc_match_data stm32mp1_data = {
   2145	.cfg		= stm32mp1_clock_cfg,
   2146	.num		= ARRAY_SIZE(stm32mp1_clock_cfg),
   2147	.maxbinding	= STM32MP1_LAST_CLK,
   2148	.clear_offset	= RCC_CLR,
   2149};
   2150
   2151static struct stm32_rcc_match_data stm32mp1_data_secure = {
   2152	.cfg		= stm32mp1_clock_cfg,
   2153	.num		= ARRAY_SIZE(stm32mp1_clock_cfg),
   2154	.maxbinding	= STM32MP1_LAST_CLK,
   2155	.clear_offset	= RCC_CLR,
   2156	.check_security = &stm32_check_security
   2157};
   2158
   2159static const struct of_device_id stm32mp1_match_data[] = {
   2160	{
   2161		.compatible = "st,stm32mp1-rcc",
   2162		.data = &stm32mp1_data,
   2163	},
   2164	{
   2165		.compatible = "st,stm32mp1-rcc-secure",
   2166		.data = &stm32mp1_data_secure,
   2167	},
   2168	{ }
   2169};
   2170MODULE_DEVICE_TABLE(of, stm32mp1_match_data);
   2171
   2172static int stm32_register_hw_clk(struct device *dev,
   2173				 struct clk_hw_onecell_data *clk_data,
   2174				 void __iomem *base, spinlock_t *lock,
   2175				 const struct clock_config *cfg)
   2176{
   2177	struct clk_hw **hws;
   2178	struct clk_hw *hw = ERR_PTR(-ENOENT);
   2179
   2180	hws = clk_data->hws;
   2181
   2182	if (cfg->func)
   2183		hw = (*cfg->func)(dev, clk_data, base, lock, cfg);
   2184
   2185	if (IS_ERR(hw)) {
   2186		pr_err("Unable to register %s\n", cfg->name);
   2187		return  PTR_ERR(hw);
   2188	}
   2189
   2190	if (cfg->id != NO_ID)
   2191		hws[cfg->id] = hw;
   2192
   2193	return 0;
   2194}
   2195
   2196#define STM32_RESET_ID_MASK GENMASK(15, 0)
   2197
   2198struct stm32_reset_data {
   2199	/* reset lock */
   2200	spinlock_t			lock;
   2201	struct reset_controller_dev	rcdev;
   2202	void __iomem			*membase;
   2203	u32				clear_offset;
   2204};
   2205
   2206static inline struct stm32_reset_data *
   2207to_stm32_reset_data(struct reset_controller_dev *rcdev)
   2208{
   2209	return container_of(rcdev, struct stm32_reset_data, rcdev);
   2210}
   2211
   2212static int stm32_reset_update(struct reset_controller_dev *rcdev,
   2213			      unsigned long id, bool assert)
   2214{
   2215	struct stm32_reset_data *data = to_stm32_reset_data(rcdev);
   2216	int reg_width = sizeof(u32);
   2217	int bank = id / (reg_width * BITS_PER_BYTE);
   2218	int offset = id % (reg_width * BITS_PER_BYTE);
   2219
   2220	if (data->clear_offset) {
   2221		void __iomem *addr;
   2222
   2223		addr = data->membase + (bank * reg_width);
   2224		if (!assert)
   2225			addr += data->clear_offset;
   2226
   2227		writel(BIT(offset), addr);
   2228
   2229	} else {
   2230		unsigned long flags;
   2231		u32 reg;
   2232
   2233		spin_lock_irqsave(&data->lock, flags);
   2234
   2235		reg = readl(data->membase + (bank * reg_width));
   2236
   2237		if (assert)
   2238			reg |= BIT(offset);
   2239		else
   2240			reg &= ~BIT(offset);
   2241
   2242		writel(reg, data->membase + (bank * reg_width));
   2243
   2244		spin_unlock_irqrestore(&data->lock, flags);
   2245	}
   2246
   2247	return 0;
   2248}
   2249
   2250static int stm32_reset_assert(struct reset_controller_dev *rcdev,
   2251			      unsigned long id)
   2252{
   2253	return stm32_reset_update(rcdev, id, true);
   2254}
   2255
   2256static int stm32_reset_deassert(struct reset_controller_dev *rcdev,
   2257				unsigned long id)
   2258{
   2259	return stm32_reset_update(rcdev, id, false);
   2260}
   2261
   2262static int stm32_reset_status(struct reset_controller_dev *rcdev,
   2263			      unsigned long id)
   2264{
   2265	struct stm32_reset_data *data = to_stm32_reset_data(rcdev);
   2266	int reg_width = sizeof(u32);
   2267	int bank = id / (reg_width * BITS_PER_BYTE);
   2268	int offset = id % (reg_width * BITS_PER_BYTE);
   2269	u32 reg;
   2270
   2271	reg = readl(data->membase + (bank * reg_width));
   2272
   2273	return !!(reg & BIT(offset));
   2274}
   2275
   2276static const struct reset_control_ops stm32_reset_ops = {
   2277	.assert		= stm32_reset_assert,
   2278	.deassert	= stm32_reset_deassert,
   2279	.status		= stm32_reset_status,
   2280};
   2281
   2282static int stm32_rcc_reset_init(struct device *dev, void __iomem *base,
   2283				const struct of_device_id *match)
   2284{
   2285	const struct stm32_rcc_match_data *data = match->data;
   2286	struct stm32_reset_data *reset_data = NULL;
   2287
   2288	reset_data = kzalloc(sizeof(*reset_data), GFP_KERNEL);
   2289	if (!reset_data)
   2290		return -ENOMEM;
   2291
   2292	spin_lock_init(&reset_data->lock);
   2293	reset_data->membase = base;
   2294	reset_data->rcdev.owner = THIS_MODULE;
   2295	reset_data->rcdev.ops = &stm32_reset_ops;
   2296	reset_data->rcdev.of_node = dev_of_node(dev);
   2297	reset_data->rcdev.nr_resets = STM32_RESET_ID_MASK;
   2298	reset_data->clear_offset = data->clear_offset;
   2299
   2300	return reset_controller_register(&reset_data->rcdev);
   2301}
   2302
   2303static int stm32_rcc_clock_init(struct device *dev, void __iomem *base,
   2304				const struct of_device_id *match)
   2305{
   2306	const struct stm32_rcc_match_data *data = match->data;
   2307	struct clk_hw_onecell_data *clk_data;
   2308	struct clk_hw **hws;
   2309	int err, n, max_binding;
   2310
   2311	max_binding =  data->maxbinding;
   2312
   2313	clk_data = devm_kzalloc(dev, struct_size(clk_data, hws, max_binding),
   2314				GFP_KERNEL);
   2315	if (!clk_data)
   2316		return -ENOMEM;
   2317
   2318	clk_data->num = max_binding;
   2319
   2320	hws = clk_data->hws;
   2321
   2322	for (n = 0; n < max_binding; n++)
   2323		hws[n] = ERR_PTR(-ENOENT);
   2324
   2325	for (n = 0; n < data->num; n++) {
   2326		if (data->check_security && data->check_security(&data->cfg[n]))
   2327			continue;
   2328
   2329		err = stm32_register_hw_clk(dev, clk_data, base, &rlock,
   2330					    &data->cfg[n]);
   2331		if (err) {
   2332			dev_err(dev, "Can't register clk %s: %d\n",
   2333				data->cfg[n].name, err);
   2334
   2335			return err;
   2336		}
   2337	}
   2338
   2339	return of_clk_add_hw_provider(dev_of_node(dev), of_clk_hw_onecell_get, clk_data);
   2340}
   2341
   2342static int stm32_rcc_init(struct device *dev, void __iomem *base,
   2343			  const struct of_device_id *match_data)
   2344{
   2345	const struct of_device_id *match;
   2346	int err;
   2347
   2348	match = of_match_node(match_data, dev_of_node(dev));
   2349	if (!match) {
   2350		dev_err(dev, "match data not found\n");
   2351		return -ENODEV;
   2352	}
   2353
   2354	/* RCC Reset Configuration */
   2355	err = stm32_rcc_reset_init(dev, base, match);
   2356	if (err) {
   2357		pr_err("stm32mp1 reset failed to initialize\n");
   2358		return err;
   2359	}
   2360
   2361	/* RCC Clock Configuration */
   2362	err = stm32_rcc_clock_init(dev, base, match);
   2363	if (err) {
   2364		pr_err("stm32mp1 clock failed to initialize\n");
   2365		return err;
   2366	}
   2367
   2368	return 0;
   2369}
   2370
   2371static int stm32mp1_rcc_init(struct device *dev)
   2372{
   2373	void __iomem *base;
   2374	int ret;
   2375
   2376	base = of_iomap(dev_of_node(dev), 0);
   2377	if (!base) {
   2378		pr_err("%pOFn: unable to map resource", dev_of_node(dev));
   2379		ret = -ENOMEM;
   2380		goto out;
   2381	}
   2382
   2383	ret = stm32_rcc_init(dev, base, stm32mp1_match_data);
   2384
   2385out:
   2386	if (ret) {
   2387		if (base)
   2388			iounmap(base);
   2389
   2390		of_node_put(dev_of_node(dev));
   2391	}
   2392
   2393	return ret;
   2394}
   2395
   2396static int get_clock_deps(struct device *dev)
   2397{
   2398	static const char * const clock_deps_name[] = {
   2399		"hsi", "hse", "csi", "lsi", "lse",
   2400	};
   2401	size_t deps_size = sizeof(struct clk *) * ARRAY_SIZE(clock_deps_name);
   2402	struct clk **clk_deps;
   2403	int i;
   2404
   2405	clk_deps = devm_kzalloc(dev, deps_size, GFP_KERNEL);
   2406	if (!clk_deps)
   2407		return -ENOMEM;
   2408
   2409	for (i = 0; i < ARRAY_SIZE(clock_deps_name); i++) {
   2410		struct clk *clk = of_clk_get_by_name(dev_of_node(dev),
   2411						     clock_deps_name[i]);
   2412
   2413		if (IS_ERR(clk)) {
   2414			if (PTR_ERR(clk) != -EINVAL && PTR_ERR(clk) != -ENOENT)
   2415				return PTR_ERR(clk);
   2416		} else {
   2417			/* Device gets a reference count on the clock */
   2418			clk_deps[i] = devm_clk_get(dev, __clk_get_name(clk));
   2419			clk_put(clk);
   2420		}
   2421	}
   2422
   2423	return 0;
   2424}
   2425
   2426static int stm32mp1_rcc_clocks_probe(struct platform_device *pdev)
   2427{
   2428	struct device *dev = &pdev->dev;
   2429	int ret = get_clock_deps(dev);
   2430
   2431	if (!ret)
   2432		ret = stm32mp1_rcc_init(dev);
   2433
   2434	return ret;
   2435}
   2436
   2437static int stm32mp1_rcc_clocks_remove(struct platform_device *pdev)
   2438{
   2439	struct device *dev = &pdev->dev;
   2440	struct device_node *child, *np = dev_of_node(dev);
   2441
   2442	for_each_available_child_of_node(np, child)
   2443		of_clk_del_provider(child);
   2444
   2445	return 0;
   2446}
   2447
   2448static struct platform_driver stm32mp1_rcc_clocks_driver = {
   2449	.driver	= {
   2450		.name = "stm32mp1_rcc",
   2451		.of_match_table = stm32mp1_match_data,
   2452	},
   2453	.probe = stm32mp1_rcc_clocks_probe,
   2454	.remove = stm32mp1_rcc_clocks_remove,
   2455};
   2456
   2457static int __init stm32mp1_clocks_init(void)
   2458{
   2459	return platform_driver_register(&stm32mp1_rcc_clocks_driver);
   2460}
   2461core_initcall(stm32mp1_clocks_init);