Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (C) STMicroelectronics 2017
   4 * Author: Gabriel Fernandez <gabriel.fernandez@st.com> for STMicroelectronics.
   5 */
   6
   7#include <linux/clk.h>
   8#include <linux/clk-provider.h>
   9#include <linux/err.h>
  10#include <linux/io.h>
  11#include <linux/mfd/syscon.h>
  12#include <linux/of.h>
  13#include <linux/of_address.h>
  14#include <linux/slab.h>
  15#include <linux/spinlock.h>
  16#include <linux/regmap.h>
  17
  18#include <dt-bindings/clock/stm32h7-clks.h>
  19
  20/* Reset Clock Control Registers */
  21#define RCC_CR		0x00
  22#define RCC_CFGR	0x10
  23#define RCC_D1CFGR	0x18
  24#define RCC_D2CFGR	0x1C
  25#define RCC_D3CFGR	0x20
  26#define RCC_PLLCKSELR	0x28
  27#define RCC_PLLCFGR	0x2C
  28#define RCC_PLL1DIVR	0x30
  29#define RCC_PLL1FRACR	0x34
  30#define RCC_PLL2DIVR	0x38
  31#define RCC_PLL2FRACR	0x3C
  32#define RCC_PLL3DIVR	0x40
  33#define RCC_PLL3FRACR	0x44
  34#define RCC_D1CCIPR	0x4C
  35#define RCC_D2CCIP1R	0x50
  36#define RCC_D2CCIP2R	0x54
  37#define RCC_D3CCIPR	0x58
  38#define RCC_BDCR	0x70
  39#define RCC_CSR		0x74
  40#define RCC_AHB3ENR	0xD4
  41#define RCC_AHB1ENR	0xD8
  42#define RCC_AHB2ENR	0xDC
  43#define RCC_AHB4ENR	0xE0
  44#define RCC_APB3ENR	0xE4
  45#define RCC_APB1LENR	0xE8
  46#define RCC_APB1HENR	0xEC
  47#define RCC_APB2ENR	0xF0
  48#define RCC_APB4ENR	0xF4
  49
  50static DEFINE_SPINLOCK(stm32rcc_lock);
  51
  52static void __iomem *base;
  53static struct clk_hw **hws;
  54
  55/* System clock parent */
  56static const char * const sys_src[] = {
  57	"hsi_ck", "csi_ck", "hse_ck", "pll1_p" };
  58
  59static const char * const tracein_src[] = {
  60	"hsi_ck", "csi_ck", "hse_ck", "pll1_r" };
  61
  62static const char * const per_src[] = {
  63	"hsi_ker", "csi_ker", "hse_ck", "disabled" };
  64
  65static const char * const pll_src[] = {
  66	"hsi_ck", "csi_ck", "hse_ck", "no clock" };
  67
  68static const char * const sdmmc_src[] = { "pll1_q", "pll2_r" };
  69
  70static const char * const dsi_src[] = { "ck_dsi_phy", "pll2_q" };
  71
  72static const char * const qspi_src[] = {
  73	"hclk", "pll1_q", "pll2_r", "per_ck" };
  74
  75static const char * const fmc_src[] = {
  76	"hclk", "pll1_q", "pll2_r", "per_ck" };
  77
  78/* Kernel clock parent */
  79static const char * const swp_src[] = {	"pclk1", "hsi_ker" };
  80
  81static const char * const fdcan_src[] = { "hse_ck", "pll1_q", "pll2_q" };
  82
  83static const char * const dfsdm1_src[] = { "pclk2", "sys_ck" };
  84
  85static const char * const spdifrx_src[] = {
  86	"pll1_q", "pll2_r", "pll3_r", "hsi_ker" };
  87
  88static const char *spi_src1[5] = {
  89	"pll1_q", "pll2_p", "pll3_p", NULL, "per_ck" };
  90
  91static const char * const spi_src2[] = {
  92	"pclk2", "pll2_q", "pll3_q", "hsi_ker", "csi_ker", "hse_ck" };
  93
  94static const char * const spi_src3[] = {
  95	"pclk4", "pll2_q", "pll3_q", "hsi_ker", "csi_ker", "hse_ck" };
  96
  97static const char * const lptim_src1[] = {
  98	"pclk1", "pll2_p", "pll3_r", "lse_ck", "lsi_ck", "per_ck" };
  99
 100static const char * const lptim_src2[] = {
 101	"pclk4", "pll2_p", "pll3_r", "lse_ck", "lsi_ck", "per_ck" };
 102
 103static const char * const cec_src[] = {"lse_ck", "lsi_ck", "csi_ker_div122" };
 104
 105static const char * const usbotg_src[] = {"pll1_q", "pll3_q", "rc48_ck" };
 106
 107/* i2c 1,2,3 src */
 108static const char * const i2c_src1[] = {
 109	"pclk1", "pll3_r", "hsi_ker", "csi_ker" };
 110
 111static const char * const i2c_src2[] = {
 112	"pclk4", "pll3_r", "hsi_ker", "csi_ker" };
 113
 114static const char * const rng_src[] = {
 115	"rc48_ck", "pll1_q", "lse_ck", "lsi_ck" };
 116
 117/* usart 1,6 src */
 118static const char * const usart_src1[] = {
 119	"pclk2", "pll2_q", "pll3_q", "hsi_ker", "csi_ker", "lse_ck" };
 120
 121/* usart 2,3,4,5,7,8 src */
 122static const char * const usart_src2[] = {
 123	"pclk1", "pll2_q", "pll3_q", "hsi_ker", "csi_ker", "lse_ck" };
 124
 125static const char *sai_src[5] = {
 126	"pll1_q", "pll2_p", "pll3_p", NULL, "per_ck" };
 127
 128static const char * const adc_src[] = { "pll2_p", "pll3_r", "per_ck" };
 129
 130/* lptim 2,3,4,5 src */
 131static const char * const lpuart1_src[] = {
 132	"pclk3", "pll2_q", "pll3_q", "csi_ker", "lse_ck" };
 133
 134static const char * const hrtim_src[] = { "tim2_ker", "d1cpre" };
 135
 136/* RTC clock parent */
 137static const char * const rtc_src[] = { "off", "lse_ck", "lsi_ck", "hse_1M" };
 138
 139/* Micro-controller output clock parent */
 140static const char * const mco_src1[] = {
 141	"hsi_ck", "lse_ck", "hse_ck", "pll1_q",	"rc48_ck" };
 142
 143static const char * const mco_src2[] = {
 144	"sys_ck", "pll2_p", "hse_ck", "pll1_p", "csi_ck", "lsi_ck" };
 145
 146/* LCD clock */
 147static const char * const ltdc_src[] = {"pll3_r"};
 148
 149/* Gate clock with ready bit and backup domain management */
 150struct stm32_ready_gate {
 151	struct	clk_gate gate;
 152	u8	bit_rdy;
 153};
 154
 155#define to_ready_gate_clk(_rgate) container_of(_rgate, struct stm32_ready_gate,\
 156		gate)
 157
 158#define RGATE_TIMEOUT 10000
 159
 160static int ready_gate_clk_enable(struct clk_hw *hw)
 161{
 162	struct clk_gate *gate = to_clk_gate(hw);
 163	struct stm32_ready_gate *rgate = to_ready_gate_clk(gate);
 164	int bit_status;
 165	unsigned int timeout = RGATE_TIMEOUT;
 166
 167	if (clk_gate_ops.is_enabled(hw))
 168		return 0;
 169
 170	clk_gate_ops.enable(hw);
 171
 172	/* We can't use readl_poll_timeout() because we can blocked if
 173	 * someone enables this clock before clocksource changes.
 174	 * Only jiffies counter is available. Jiffies are incremented by
 175	 * interruptions and enable op does not allow to be interrupted.
 176	 */
 177	do {
 178		bit_status = !(readl(gate->reg) & BIT(rgate->bit_rdy));
 179
 180		if (bit_status)
 181			udelay(100);
 182
 183	} while (bit_status && --timeout);
 184
 185	return bit_status;
 186}
 187
 188static void ready_gate_clk_disable(struct clk_hw *hw)
 189{
 190	struct clk_gate *gate = to_clk_gate(hw);
 191	struct stm32_ready_gate *rgate = to_ready_gate_clk(gate);
 192	int bit_status;
 193	unsigned int timeout = RGATE_TIMEOUT;
 194
 195	if (!clk_gate_ops.is_enabled(hw))
 196		return;
 197
 198	clk_gate_ops.disable(hw);
 199
 200	do {
 201		bit_status = !!(readl(gate->reg) & BIT(rgate->bit_rdy));
 202
 203		if (bit_status)
 204			udelay(100);
 205
 206	} while (bit_status && --timeout);
 207}
 208
 209static const struct clk_ops ready_gate_clk_ops = {
 210	.enable		= ready_gate_clk_enable,
 211	.disable	= ready_gate_clk_disable,
 212	.is_enabled	= clk_gate_is_enabled,
 213};
 214
 215static struct clk_hw *clk_register_ready_gate(struct device *dev,
 216		const char *name, const char *parent_name,
 217		void __iomem *reg, u8 bit_idx, u8 bit_rdy,
 218		unsigned long flags, spinlock_t *lock)
 219{
 220	struct stm32_ready_gate *rgate;
 221	struct clk_init_data init = { NULL };
 222	struct clk_hw *hw;
 223	int ret;
 224
 225	rgate = kzalloc(sizeof(*rgate), GFP_KERNEL);
 226	if (!rgate)
 227		return ERR_PTR(-ENOMEM);
 228
 229	init.name = name;
 230	init.ops = &ready_gate_clk_ops;
 231	init.flags = flags;
 232	init.parent_names = &parent_name;
 233	init.num_parents = 1;
 234
 235	rgate->bit_rdy = bit_rdy;
 236	rgate->gate.lock = lock;
 237	rgate->gate.reg = reg;
 238	rgate->gate.bit_idx = bit_idx;
 239	rgate->gate.hw.init = &init;
 240
 241	hw = &rgate->gate.hw;
 242	ret = clk_hw_register(dev, hw);
 243	if (ret) {
 244		kfree(rgate);
 245		hw = ERR_PTR(ret);
 246	}
 247
 248	return hw;
 249}
 250
 251struct gate_cfg {
 252	u32 offset;
 253	u8  bit_idx;
 254};
 255
 256struct muxdiv_cfg {
 257	u32 offset;
 258	u8 shift;
 259	u8 width;
 260};
 261
 262struct composite_clk_cfg {
 263	struct gate_cfg *gate;
 264	struct muxdiv_cfg *mux;
 265	struct muxdiv_cfg *div;
 266	const char *name;
 267	const char * const *parent_name;
 268	int num_parents;
 269	u32 flags;
 270};
 271
 272struct composite_clk_gcfg_t {
 273	u8 flags;
 274	const struct clk_ops *ops;
 275};
 276
 277/*
 278 * General config definition of a composite clock (only clock diviser for rate)
 279 */
 280struct composite_clk_gcfg {
 281	struct composite_clk_gcfg_t *mux;
 282	struct composite_clk_gcfg_t *div;
 283	struct composite_clk_gcfg_t *gate;
 284};
 285
 286#define M_CFG_MUX(_mux_ops, _mux_flags)\
 287	.mux = &(struct composite_clk_gcfg_t) { _mux_flags, _mux_ops}
 288
 289#define M_CFG_DIV(_rate_ops, _rate_flags)\
 290	.div = &(struct composite_clk_gcfg_t) {_rate_flags, _rate_ops}
 291
 292#define M_CFG_GATE(_gate_ops, _gate_flags)\
 293	.gate = &(struct composite_clk_gcfg_t) { _gate_flags, _gate_ops}
 294
 295static struct clk_mux *_get_cmux(void __iomem *reg, u8 shift, u8 width,
 296		u32 flags, spinlock_t *lock)
 297{
 298	struct clk_mux *mux;
 299
 300	mux = kzalloc(sizeof(*mux), GFP_KERNEL);
 301	if (!mux)
 302		return ERR_PTR(-ENOMEM);
 303
 304	mux->reg	= reg;
 305	mux->shift	= shift;
 306	mux->mask	= (1 << width) - 1;
 307	mux->flags	= flags;
 308	mux->lock	= lock;
 309
 310	return mux;
 311}
 312
 313static struct clk_divider *_get_cdiv(void __iomem *reg, u8 shift, u8 width,
 314		u32 flags, spinlock_t *lock)
 315{
 316	struct clk_divider *div;
 317
 318	div = kzalloc(sizeof(*div), GFP_KERNEL);
 319
 320	if (!div)
 321		return ERR_PTR(-ENOMEM);
 322
 323	div->reg   = reg;
 324	div->shift = shift;
 325	div->width = width;
 326	div->flags = flags;
 327	div->lock  = lock;
 328
 329	return div;
 330}
 331
 332static struct clk_gate *_get_cgate(void __iomem *reg, u8 bit_idx, u32 flags,
 333		spinlock_t *lock)
 334{
 335	struct clk_gate *gate;
 336
 337	gate = kzalloc(sizeof(*gate), GFP_KERNEL);
 338	if (!gate)
 339		return ERR_PTR(-ENOMEM);
 340
 341	gate->reg	= reg;
 342	gate->bit_idx	= bit_idx;
 343	gate->flags	= flags;
 344	gate->lock	= lock;
 345
 346	return gate;
 347}
 348
 349struct composite_cfg {
 350	struct clk_hw *mux_hw;
 351	struct clk_hw *div_hw;
 352	struct clk_hw *gate_hw;
 353
 354	const struct clk_ops *mux_ops;
 355	const struct clk_ops *div_ops;
 356	const struct clk_ops *gate_ops;
 357};
 358
 359static void get_cfg_composite_div(const struct composite_clk_gcfg *gcfg,
 360		const struct composite_clk_cfg *cfg,
 361		struct composite_cfg *composite, spinlock_t *lock)
 362{
 363	struct clk_mux     *mux = NULL;
 364	struct clk_divider *div = NULL;
 365	struct clk_gate    *gate = NULL;
 366	const struct clk_ops *mux_ops, *div_ops, *gate_ops;
 367	struct clk_hw *mux_hw;
 368	struct clk_hw *div_hw;
 369	struct clk_hw *gate_hw;
 370
 371	mux_ops = div_ops = gate_ops = NULL;
 372	mux_hw = div_hw = gate_hw = NULL;
 373
 374	if (gcfg->mux && cfg->mux) {
 375		mux = _get_cmux(base + cfg->mux->offset,
 376				cfg->mux->shift,
 377				cfg->mux->width,
 378				gcfg->mux->flags, lock);
 379
 380		if (!IS_ERR(mux)) {
 381			mux_hw = &mux->hw;
 382			mux_ops = gcfg->mux->ops ?
 383				  gcfg->mux->ops : &clk_mux_ops;
 384		}
 385	}
 386
 387	if (gcfg->div && cfg->div) {
 388		div = _get_cdiv(base + cfg->div->offset,
 389				cfg->div->shift,
 390				cfg->div->width,
 391				gcfg->div->flags, lock);
 392
 393		if (!IS_ERR(div)) {
 394			div_hw = &div->hw;
 395			div_ops = gcfg->div->ops ?
 396				  gcfg->div->ops : &clk_divider_ops;
 397		}
 398	}
 399
 400	if (gcfg->gate && cfg->gate) {
 401		gate = _get_cgate(base + cfg->gate->offset,
 402				cfg->gate->bit_idx,
 403				gcfg->gate->flags, lock);
 404
 405		if (!IS_ERR(gate)) {
 406			gate_hw = &gate->hw;
 407			gate_ops = gcfg->gate->ops ?
 408				   gcfg->gate->ops : &clk_gate_ops;
 409		}
 410	}
 411
 412	composite->mux_hw = mux_hw;
 413	composite->mux_ops = mux_ops;
 414
 415	composite->div_hw = div_hw;
 416	composite->div_ops = div_ops;
 417
 418	composite->gate_hw = gate_hw;
 419	composite->gate_ops = gate_ops;
 420}
 421
 422/* Kernel Timer */
 423struct timer_ker {
 424	u8 dppre_shift;
 425	struct clk_hw hw;
 426	spinlock_t *lock;
 427};
 428
 429#define to_timer_ker(_hw) container_of(_hw, struct timer_ker, hw)
 430
 431static unsigned long timer_ker_recalc_rate(struct clk_hw *hw,
 432		unsigned long parent_rate)
 433{
 434	struct timer_ker *clk_elem = to_timer_ker(hw);
 435	u32 timpre;
 436	u32 dppre_shift = clk_elem->dppre_shift;
 437	u32 prescaler;
 438	u32 mul;
 439
 440	timpre = (readl(base + RCC_CFGR) >> 15) & 0x01;
 441
 442	prescaler = (readl(base + RCC_D2CFGR) >> dppre_shift) & 0x03;
 443
 444	mul = 2;
 445
 446	if (prescaler < 4)
 447		mul = 1;
 448
 449	else if (timpre && prescaler > 4)
 450		mul = 4;
 451
 452	return parent_rate * mul;
 453}
 454
 455static const struct clk_ops timer_ker_ops = {
 456	.recalc_rate = timer_ker_recalc_rate,
 457};
 458
 459static struct clk_hw *clk_register_stm32_timer_ker(struct device *dev,
 460		const char *name, const char *parent_name,
 461		unsigned long flags,
 462		u8 dppre_shift,
 463		spinlock_t *lock)
 464{
 465	struct timer_ker *element;
 466	struct clk_init_data init;
 467	struct clk_hw *hw;
 468	int err;
 469
 470	element = kzalloc(sizeof(*element), GFP_KERNEL);
 471	if (!element)
 472		return ERR_PTR(-ENOMEM);
 473
 474	init.name = name;
 475	init.ops = &timer_ker_ops;
 476	init.flags = flags;
 477	init.parent_names = &parent_name;
 478	init.num_parents = 1;
 479
 480	element->hw.init = &init;
 481	element->lock = lock;
 482	element->dppre_shift = dppre_shift;
 483
 484	hw = &element->hw;
 485	err = clk_hw_register(dev, hw);
 486
 487	if (err) {
 488		kfree(element);
 489		return ERR_PTR(err);
 490	}
 491
 492	return hw;
 493}
 494
 495static const struct clk_div_table d1cpre_div_table[] = {
 496	{ 0, 1 }, { 1, 1 }, { 2, 1 }, { 3, 1},
 497	{ 4, 1 }, { 5, 1 }, { 6, 1 }, { 7, 1},
 498	{ 8, 2 }, { 9, 4 }, { 10, 8 }, { 11, 16 },
 499	{ 12, 64 }, { 13, 128 }, { 14, 256 },
 500	{ 15, 512 },
 501	{ 0 },
 502};
 503
 504static const struct clk_div_table ppre_div_table[] = {
 505	{ 0, 1 }, { 1, 1 }, { 2, 1 }, { 3, 1},
 506	{ 4, 2 }, { 5, 4 }, { 6, 8 }, { 7, 16 },
 507	{ 0 },
 508};
 509
 510static void register_core_and_bus_clocks(void)
 511{
 512	/* CORE AND BUS */
 513	hws[SYS_D1CPRE] = clk_hw_register_divider_table(NULL, "d1cpre",
 514			"sys_ck", CLK_IGNORE_UNUSED, base + RCC_D1CFGR, 8, 4, 0,
 515			d1cpre_div_table, &stm32rcc_lock);
 516
 517	hws[HCLK] = clk_hw_register_divider_table(NULL, "hclk", "d1cpre",
 518			CLK_IGNORE_UNUSED, base + RCC_D1CFGR, 0, 4, 0,
 519			d1cpre_div_table, &stm32rcc_lock);
 520
 521	/* D1 DOMAIN */
 522	/* * CPU Systick */
 523	hws[CPU_SYSTICK] = clk_hw_register_fixed_factor(NULL, "systick",
 524			"d1cpre", 0, 1, 8);
 525
 526	/* * APB3 peripheral */
 527	hws[PCLK3] = clk_hw_register_divider_table(NULL, "pclk3", "hclk", 0,
 528			base + RCC_D1CFGR, 4, 3, 0,
 529			ppre_div_table, &stm32rcc_lock);
 530
 531	/* D2 DOMAIN */
 532	/* * APB1 peripheral */
 533	hws[PCLK1] = clk_hw_register_divider_table(NULL, "pclk1", "hclk", 0,
 534			base + RCC_D2CFGR, 4, 3, 0,
 535			ppre_div_table, &stm32rcc_lock);
 536
 537	/* Timers prescaler clocks */
 538	clk_register_stm32_timer_ker(NULL, "tim1_ker", "pclk1", 0,
 539			4, &stm32rcc_lock);
 540
 541	/* * APB2 peripheral */
 542	hws[PCLK2] = clk_hw_register_divider_table(NULL, "pclk2", "hclk", 0,
 543			base + RCC_D2CFGR, 8, 3, 0, ppre_div_table,
 544			&stm32rcc_lock);
 545
 546	clk_register_stm32_timer_ker(NULL, "tim2_ker", "pclk2", 0, 8,
 547			&stm32rcc_lock);
 548
 549	/* D3 DOMAIN */
 550	/* * APB4 peripheral */
 551	hws[PCLK4] = clk_hw_register_divider_table(NULL, "pclk4", "hclk", 0,
 552			base + RCC_D3CFGR, 4, 3, 0,
 553			ppre_div_table, &stm32rcc_lock);
 554}
 555
 556/* MUX clock configuration */
 557struct stm32_mux_clk {
 558	const char *name;
 559	const char * const *parents;
 560	u8 num_parents;
 561	u32 offset;
 562	u8 shift;
 563	u8 width;
 564	u32 flags;
 565};
 566
 567#define M_MCLOCF(_name, _parents, _mux_offset, _mux_shift, _mux_width, _flags)\
 568{\
 569	.name		= _name,\
 570	.parents	= _parents,\
 571	.num_parents	= ARRAY_SIZE(_parents),\
 572	.offset		= _mux_offset,\
 573	.shift		= _mux_shift,\
 574	.width		= _mux_width,\
 575	.flags		= _flags,\
 576}
 577
 578#define M_MCLOC(_name, _parents, _mux_offset, _mux_shift, _mux_width)\
 579	M_MCLOCF(_name, _parents, _mux_offset, _mux_shift, _mux_width, 0)\
 580
 581static const struct stm32_mux_clk stm32_mclk[] __initconst = {
 582	M_MCLOC("per_ck",	per_src,	RCC_D1CCIPR,	28, 3),
 583	M_MCLOC("pllsrc",	pll_src,	RCC_PLLCKSELR,	 0, 3),
 584	M_MCLOC("sys_ck",	sys_src,	RCC_CFGR,	 0, 3),
 585	M_MCLOC("tracein_ck",	tracein_src,	RCC_CFGR,	 0, 3),
 586};
 587
 588/* Oscillary clock configuration */
 589struct stm32_osc_clk {
 590	const char *name;
 591	const char *parent;
 592	u32 gate_offset;
 593	u8 bit_idx;
 594	u8 bit_rdy;
 595	u32 flags;
 596};
 597
 598#define OSC_CLKF(_name, _parent, _gate_offset, _bit_idx, _bit_rdy, _flags)\
 599{\
 600	.name		= _name,\
 601	.parent		= _parent,\
 602	.gate_offset	= _gate_offset,\
 603	.bit_idx	= _bit_idx,\
 604	.bit_rdy	= _bit_rdy,\
 605	.flags		= _flags,\
 606}
 607
 608#define OSC_CLK(_name, _parent, _gate_offset, _bit_idx, _bit_rdy)\
 609	OSC_CLKF(_name, _parent, _gate_offset, _bit_idx, _bit_rdy, 0)
 610
 611static const struct stm32_osc_clk stm32_oclk[] __initconst = {
 612	OSC_CLKF("hsi_ck",  "hsidiv",   RCC_CR,   0,  2, CLK_IGNORE_UNUSED),
 613	OSC_CLKF("hsi_ker", "hsidiv",   RCC_CR,   1,  2, CLK_IGNORE_UNUSED),
 614	OSC_CLKF("csi_ck",  "clk-csi",  RCC_CR,   7,  8, CLK_IGNORE_UNUSED),
 615	OSC_CLKF("csi_ker", "clk-csi",  RCC_CR,   9,  8, CLK_IGNORE_UNUSED),
 616	OSC_CLKF("rc48_ck", "clk-rc48", RCC_CR,  12, 13, CLK_IGNORE_UNUSED),
 617	OSC_CLKF("lsi_ck",  "clk-lsi",  RCC_CSR,  0,  1, CLK_IGNORE_UNUSED),
 618};
 619
 620/* PLL configuration */
 621struct st32h7_pll_cfg {
 622	u8 bit_idx;
 623	u32 offset_divr;
 624	u8 bit_frac_en;
 625	u32 offset_frac;
 626	u8 divm;
 627};
 628
 629struct stm32_pll_data {
 630	const char *name;
 631	const char *parent_name;
 632	unsigned long flags;
 633	const struct st32h7_pll_cfg *cfg;
 634};
 635
 636static const struct st32h7_pll_cfg stm32h7_pll1 = {
 637	.bit_idx = 24,
 638	.offset_divr = RCC_PLL1DIVR,
 639	.bit_frac_en = 0,
 640	.offset_frac = RCC_PLL1FRACR,
 641	.divm = 4,
 642};
 643
 644static const struct st32h7_pll_cfg stm32h7_pll2 = {
 645	.bit_idx = 26,
 646	.offset_divr = RCC_PLL2DIVR,
 647	.bit_frac_en = 4,
 648	.offset_frac = RCC_PLL2FRACR,
 649	.divm = 12,
 650};
 651
 652static const struct st32h7_pll_cfg stm32h7_pll3 = {
 653	.bit_idx = 28,
 654	.offset_divr = RCC_PLL3DIVR,
 655	.bit_frac_en = 8,
 656	.offset_frac = RCC_PLL3FRACR,
 657	.divm = 20,
 658};
 659
 660static const struct stm32_pll_data stm32_pll[] = {
 661	{ "vco1", "pllsrc", CLK_IGNORE_UNUSED, &stm32h7_pll1 },
 662	{ "vco2", "pllsrc", 0, &stm32h7_pll2 },
 663	{ "vco3", "pllsrc", 0, &stm32h7_pll3 },
 664};
 665
 666struct stm32_fractional_divider {
 667	void __iomem	*mreg;
 668	u8		mshift;
 669	u8		mwidth;
 670
 671	void __iomem	*nreg;
 672	u8		nshift;
 673	u8		nwidth;
 674
 675	void __iomem	*freg_status;
 676	u8		freg_bit;
 677	void __iomem	*freg_value;
 678	u8		fshift;
 679	u8		fwidth;
 680
 681	u8		flags;
 682	struct clk_hw	hw;
 683	spinlock_t	*lock;
 684};
 685
 686struct stm32_pll_obj {
 687	spinlock_t *lock;
 688	struct stm32_fractional_divider div;
 689	struct stm32_ready_gate rgate;
 690	struct clk_hw hw;
 691};
 692
 693#define to_pll(_hw) container_of(_hw, struct stm32_pll_obj, hw)
 694
 695static int pll_is_enabled(struct clk_hw *hw)
 696{
 697	struct stm32_pll_obj *clk_elem = to_pll(hw);
 698	struct clk_hw *_hw = &clk_elem->rgate.gate.hw;
 699
 700	__clk_hw_set_clk(_hw, hw);
 701
 702	return ready_gate_clk_ops.is_enabled(_hw);
 703}
 704
 705static int pll_enable(struct clk_hw *hw)
 706{
 707	struct stm32_pll_obj *clk_elem = to_pll(hw);
 708	struct clk_hw *_hw = &clk_elem->rgate.gate.hw;
 709
 710	__clk_hw_set_clk(_hw, hw);
 711
 712	return ready_gate_clk_ops.enable(_hw);
 713}
 714
 715static void pll_disable(struct clk_hw *hw)
 716{
 717	struct stm32_pll_obj *clk_elem = to_pll(hw);
 718	struct clk_hw *_hw = &clk_elem->rgate.gate.hw;
 719
 720	__clk_hw_set_clk(_hw, hw);
 721
 722	ready_gate_clk_ops.disable(_hw);
 723}
 724
 725static int pll_frac_is_enabled(struct clk_hw *hw)
 726{
 727	struct stm32_pll_obj *clk_elem = to_pll(hw);
 728	struct stm32_fractional_divider *fd = &clk_elem->div;
 729
 730	return (readl(fd->freg_status) >> fd->freg_bit) & 0x01;
 731}
 732
 733static unsigned long pll_read_frac(struct clk_hw *hw)
 734{
 735	struct stm32_pll_obj *clk_elem = to_pll(hw);
 736	struct stm32_fractional_divider *fd = &clk_elem->div;
 737
 738	return (readl(fd->freg_value) >> fd->fshift) &
 739		GENMASK(fd->fwidth - 1, 0);
 740}
 741
 742static unsigned long pll_fd_recalc_rate(struct clk_hw *hw,
 743		unsigned long parent_rate)
 744{
 745	struct stm32_pll_obj *clk_elem = to_pll(hw);
 746	struct stm32_fractional_divider *fd = &clk_elem->div;
 747	unsigned long m, n;
 748	u32 val, mask;
 749	u64 rate, rate1 = 0;
 750
 751	val = readl(fd->mreg);
 752	mask = GENMASK(fd->mwidth - 1, 0) << fd->mshift;
 753	m = (val & mask) >> fd->mshift;
 754
 755	val = readl(fd->nreg);
 756	mask = GENMASK(fd->nwidth - 1, 0) << fd->nshift;
 757	n = ((val & mask) >> fd->nshift) + 1;
 758
 759	if (!n || !m)
 760		return parent_rate;
 761
 762	rate = (u64)parent_rate * n;
 763	do_div(rate, m);
 764
 765	if (pll_frac_is_enabled(hw)) {
 766		val = pll_read_frac(hw);
 767		rate1 = (u64)parent_rate * (u64)val;
 768		do_div(rate1, (m * 8191));
 769	}
 770
 771	return rate + rate1;
 772}
 773
 774static const struct clk_ops pll_ops = {
 775	.enable		= pll_enable,
 776	.disable	= pll_disable,
 777	.is_enabled	= pll_is_enabled,
 778	.recalc_rate	= pll_fd_recalc_rate,
 779};
 780
 781static struct clk_hw *clk_register_stm32_pll(struct device *dev,
 782		const char *name,
 783		const char *parent,
 784		unsigned long flags,
 785		const struct st32h7_pll_cfg *cfg,
 786		spinlock_t *lock)
 787{
 788	struct stm32_pll_obj *pll;
 789	struct clk_init_data init = { NULL };
 790	struct clk_hw *hw;
 791	int ret;
 792	struct stm32_fractional_divider *div = NULL;
 793	struct stm32_ready_gate *rgate;
 794
 795	pll = kzalloc(sizeof(*pll), GFP_KERNEL);
 796	if (!pll)
 797		return ERR_PTR(-ENOMEM);
 798
 799	init.name = name;
 800	init.ops = &pll_ops;
 801	init.flags = flags;
 802	init.parent_names = &parent;
 803	init.num_parents = 1;
 804	pll->hw.init = &init;
 805
 806	hw = &pll->hw;
 807	rgate = &pll->rgate;
 808
 809	rgate->bit_rdy = cfg->bit_idx + 1;
 810	rgate->gate.lock = lock;
 811	rgate->gate.reg = base + RCC_CR;
 812	rgate->gate.bit_idx = cfg->bit_idx;
 813
 814	div = &pll->div;
 815	div->flags = 0;
 816	div->mreg = base + RCC_PLLCKSELR;
 817	div->mshift = cfg->divm;
 818	div->mwidth = 6;
 819	div->nreg = base +  cfg->offset_divr;
 820	div->nshift = 0;
 821	div->nwidth = 9;
 822
 823	div->freg_status = base + RCC_PLLCFGR;
 824	div->freg_bit = cfg->bit_frac_en;
 825	div->freg_value = base +  cfg->offset_frac;
 826	div->fshift = 3;
 827	div->fwidth = 13;
 828
 829	div->lock = lock;
 830
 831	ret = clk_hw_register(dev, hw);
 832	if (ret) {
 833		kfree(pll);
 834		hw = ERR_PTR(ret);
 835	}
 836
 837	return hw;
 838}
 839
 840/* ODF CLOCKS */
 841static unsigned long odf_divider_recalc_rate(struct clk_hw *hw,
 842		unsigned long parent_rate)
 843{
 844	return clk_divider_ops.recalc_rate(hw, parent_rate);
 845}
 846
 847static int odf_divider_determine_rate(struct clk_hw *hw,
 848				      struct clk_rate_request *req)
 849{
 850	return clk_divider_ops.determine_rate(hw, req);
 851}
 852
 853static int odf_divider_set_rate(struct clk_hw *hw, unsigned long rate,
 854		unsigned long parent_rate)
 855{
 856	struct clk_hw *hwp;
 857	int pll_status;
 858	int ret;
 859
 860	hwp = clk_hw_get_parent(hw);
 861
 862	pll_status = pll_is_enabled(hwp);
 863
 864	if (pll_status)
 865		pll_disable(hwp);
 866
 867	ret = clk_divider_ops.set_rate(hw, rate, parent_rate);
 868
 869	if (pll_status)
 870		pll_enable(hwp);
 871
 872	return ret;
 873}
 874
 875static const struct clk_ops odf_divider_ops = {
 876	.recalc_rate	= odf_divider_recalc_rate,
 877	.determine_rate	= odf_divider_determine_rate,
 878	.set_rate	= odf_divider_set_rate,
 879};
 880
 881static int odf_gate_enable(struct clk_hw *hw)
 882{
 883	struct clk_hw *hwp;
 884	int pll_status;
 885	int ret;
 886
 887	if (clk_gate_ops.is_enabled(hw))
 888		return 0;
 889
 890	hwp = clk_hw_get_parent(hw);
 891
 892	pll_status = pll_is_enabled(hwp);
 893
 894	if (pll_status)
 895		pll_disable(hwp);
 896
 897	ret = clk_gate_ops.enable(hw);
 898
 899	if (pll_status)
 900		pll_enable(hwp);
 901
 902	return ret;
 903}
 904
 905static void odf_gate_disable(struct clk_hw *hw)
 906{
 907	struct clk_hw *hwp;
 908	int pll_status;
 909
 910	if (!clk_gate_ops.is_enabled(hw))
 911		return;
 912
 913	hwp = clk_hw_get_parent(hw);
 914
 915	pll_status = pll_is_enabled(hwp);
 916
 917	if (pll_status)
 918		pll_disable(hwp);
 919
 920	clk_gate_ops.disable(hw);
 921
 922	if (pll_status)
 923		pll_enable(hwp);
 924}
 925
 926static const struct clk_ops odf_gate_ops = {
 927	.enable		= odf_gate_enable,
 928	.disable	= odf_gate_disable,
 929	.is_enabled	= clk_gate_is_enabled,
 930};
 931
 932static struct composite_clk_gcfg odf_clk_gcfg = {
 933	M_CFG_DIV(&odf_divider_ops, 0),
 934	M_CFG_GATE(&odf_gate_ops, 0),
 935};
 936
 937#define M_ODF_F(_name, _parent, _gate_offset,  _bit_idx, _rate_offset,\
 938		_rate_shift, _rate_width, _flags)\
 939{\
 940	.mux = NULL,\
 941	.div = &(struct muxdiv_cfg) {_rate_offset, _rate_shift, _rate_width},\
 942	.gate = &(struct gate_cfg) {_gate_offset, _bit_idx },\
 943	.name = _name,\
 944	.parent_name = &(const char *) {_parent},\
 945	.num_parents = 1,\
 946	.flags = _flags,\
 947}
 948
 949#define M_ODF(_name, _parent, _gate_offset,  _bit_idx, _rate_offset,\
 950		_rate_shift, _rate_width)\
 951M_ODF_F(_name, _parent, _gate_offset,  _bit_idx, _rate_offset,\
 952		_rate_shift, _rate_width, 0)\
 953
 954static const struct composite_clk_cfg stm32_odf[3][3] = {
 955	{
 956		M_ODF_F("pll1_p", "vco1", RCC_PLLCFGR, 16, RCC_PLL1DIVR,  9, 7,
 957				CLK_IGNORE_UNUSED),
 958		M_ODF_F("pll1_q", "vco1", RCC_PLLCFGR, 17, RCC_PLL1DIVR, 16, 7,
 959				CLK_IGNORE_UNUSED),
 960		M_ODF_F("pll1_r", "vco1", RCC_PLLCFGR, 18, RCC_PLL1DIVR, 24, 7,
 961				CLK_IGNORE_UNUSED),
 962	},
 963
 964	{
 965		M_ODF("pll2_p", "vco2", RCC_PLLCFGR, 19, RCC_PLL2DIVR,  9, 7),
 966		M_ODF("pll2_q", "vco2", RCC_PLLCFGR, 20, RCC_PLL2DIVR, 16, 7),
 967		M_ODF("pll2_r", "vco2", RCC_PLLCFGR, 21, RCC_PLL2DIVR, 24, 7),
 968	},
 969	{
 970		M_ODF("pll3_p", "vco3", RCC_PLLCFGR, 22, RCC_PLL3DIVR,  9, 7),
 971		M_ODF("pll3_q", "vco3", RCC_PLLCFGR, 23, RCC_PLL3DIVR, 16, 7),
 972		M_ODF("pll3_r", "vco3", RCC_PLLCFGR, 24, RCC_PLL3DIVR, 24, 7),
 973	}
 974};
 975
 976/* PERIF CLOCKS */
 977struct pclk_t {
 978	u32 gate_offset;
 979	u8 bit_idx;
 980	const char *name;
 981	const char *parent;
 982	u32 flags;
 983};
 984
 985#define PER_CLKF(_gate_offset, _bit_idx, _name, _parent, _flags)\
 986{\
 987	.gate_offset	= _gate_offset,\
 988	.bit_idx	= _bit_idx,\
 989	.name		= _name,\
 990	.parent		= _parent,\
 991	.flags		= _flags,\
 992}
 993
 994#define PER_CLK(_gate_offset, _bit_idx, _name, _parent)\
 995	PER_CLKF(_gate_offset, _bit_idx, _name, _parent, 0)
 996
 997static const struct pclk_t pclk[] = {
 998	PER_CLK(RCC_AHB3ENR, 31, "d1sram1", "hclk"),
 999	PER_CLK(RCC_AHB3ENR, 30, "itcm", "hclk"),
1000	PER_CLK(RCC_AHB3ENR, 29, "dtcm2", "hclk"),
1001	PER_CLK(RCC_AHB3ENR, 28, "dtcm1", "hclk"),
1002	PER_CLK(RCC_AHB3ENR, 8, "flitf", "hclk"),
1003	PER_CLK(RCC_AHB3ENR, 5, "jpgdec", "hclk"),
1004	PER_CLK(RCC_AHB3ENR, 4, "dma2d", "hclk"),
1005	PER_CLK(RCC_AHB3ENR, 0, "mdma", "hclk"),
1006	PER_CLK(RCC_AHB1ENR, 28, "usb2ulpi", "hclk"),
1007	PER_CLK(RCC_AHB1ENR, 26, "usb1ulpi", "hclk"),
1008	PER_CLK(RCC_AHB1ENR, 17, "eth1rx", "hclk"),
1009	PER_CLK(RCC_AHB1ENR, 16, "eth1tx", "hclk"),
1010	PER_CLK(RCC_AHB1ENR, 15, "eth1mac", "hclk"),
1011	PER_CLK(RCC_AHB1ENR, 14, "art", "hclk"),
1012	PER_CLK(RCC_AHB1ENR, 1, "dma2", "hclk"),
1013	PER_CLK(RCC_AHB1ENR, 0, "dma1", "hclk"),
1014	PER_CLK(RCC_AHB2ENR, 31, "d2sram3", "hclk"),
1015	PER_CLK(RCC_AHB2ENR, 30, "d2sram2", "hclk"),
1016	PER_CLK(RCC_AHB2ENR, 29, "d2sram1", "hclk"),
1017	PER_CLK(RCC_AHB2ENR, 5, "hash", "hclk"),
1018	PER_CLK(RCC_AHB2ENR, 4, "crypt", "hclk"),
1019	PER_CLK(RCC_AHB2ENR, 0, "camitf", "hclk"),
1020	PER_CLK(RCC_AHB4ENR, 28, "bkpram", "hclk"),
1021	PER_CLK(RCC_AHB4ENR, 25, "hsem", "hclk"),
1022	PER_CLK(RCC_AHB4ENR, 21, "bdma", "hclk"),
1023	PER_CLK(RCC_AHB4ENR, 19, "crc", "hclk"),
1024	PER_CLK(RCC_AHB4ENR, 10, "gpiok", "hclk"),
1025	PER_CLK(RCC_AHB4ENR, 9, "gpioj", "hclk"),
1026	PER_CLK(RCC_AHB4ENR, 8, "gpioi", "hclk"),
1027	PER_CLK(RCC_AHB4ENR, 7, "gpioh", "hclk"),
1028	PER_CLK(RCC_AHB4ENR, 6, "gpiog", "hclk"),
1029	PER_CLK(RCC_AHB4ENR, 5, "gpiof", "hclk"),
1030	PER_CLK(RCC_AHB4ENR, 4, "gpioe", "hclk"),
1031	PER_CLK(RCC_AHB4ENR, 3, "gpiod", "hclk"),
1032	PER_CLK(RCC_AHB4ENR, 2, "gpioc", "hclk"),
1033	PER_CLK(RCC_AHB4ENR, 1, "gpiob", "hclk"),
1034	PER_CLK(RCC_AHB4ENR, 0, "gpioa", "hclk"),
1035	PER_CLK(RCC_APB3ENR, 6, "wwdg1", "pclk3"),
1036	PER_CLK(RCC_APB1LENR, 29, "dac12", "pclk1"),
1037	PER_CLK(RCC_APB1LENR, 11, "wwdg2", "pclk1"),
1038	PER_CLK(RCC_APB1LENR, 8, "tim14", "tim1_ker"),
1039	PER_CLK(RCC_APB1LENR, 7, "tim13", "tim1_ker"),
1040	PER_CLK(RCC_APB1LENR, 6, "tim12", "tim1_ker"),
1041	PER_CLK(RCC_APB1LENR, 5, "tim7", "tim1_ker"),
1042	PER_CLK(RCC_APB1LENR, 4, "tim6", "tim1_ker"),
1043	PER_CLK(RCC_APB1LENR, 3, "tim5", "tim1_ker"),
1044	PER_CLK(RCC_APB1LENR, 2, "tim4", "tim1_ker"),
1045	PER_CLK(RCC_APB1LENR, 1, "tim3", "tim1_ker"),
1046	PER_CLK(RCC_APB1LENR, 0, "tim2", "tim1_ker"),
1047	PER_CLK(RCC_APB1HENR, 5, "mdios", "pclk1"),
1048	PER_CLK(RCC_APB1HENR, 4, "opamp", "pclk1"),
1049	PER_CLK(RCC_APB1HENR, 1, "crs", "pclk1"),
1050	PER_CLK(RCC_APB2ENR, 18, "tim17", "tim2_ker"),
1051	PER_CLK(RCC_APB2ENR, 17, "tim16", "tim2_ker"),
1052	PER_CLK(RCC_APB2ENR, 16, "tim15", "tim2_ker"),
1053	PER_CLK(RCC_APB2ENR, 1, "tim8", "tim2_ker"),
1054	PER_CLK(RCC_APB2ENR, 0, "tim1", "tim2_ker"),
1055	PER_CLK(RCC_APB4ENR, 26, "tmpsens", "pclk4"),
1056	PER_CLK(RCC_APB4ENR, 16, "rtcapb", "pclk4"),
1057	PER_CLK(RCC_APB4ENR, 15, "vref", "pclk4"),
1058	PER_CLK(RCC_APB4ENR, 14, "comp12", "pclk4"),
1059	PER_CLK(RCC_APB4ENR, 1, "syscfg", "pclk4"),
1060};
1061
1062/* KERNEL CLOCKS */
1063#define KER_CLKF(_gate_offset, _bit_idx,\
1064		_mux_offset, _mux_shift, _mux_width,\
1065		_name, _parent_name,\
1066		_flags) \
1067{ \
1068	.gate = &(struct gate_cfg) {_gate_offset, _bit_idx},\
1069	.mux = &(struct muxdiv_cfg) {_mux_offset, _mux_shift, _mux_width },\
1070	.name = _name, \
1071	.parent_name = _parent_name, \
1072	.num_parents = ARRAY_SIZE(_parent_name),\
1073	.flags = _flags,\
1074}
1075
1076#define KER_CLK(_gate_offset, _bit_idx, _mux_offset, _mux_shift, _mux_width,\
1077		_name, _parent_name) \
1078KER_CLKF(_gate_offset, _bit_idx, _mux_offset, _mux_shift, _mux_width,\
1079		_name, _parent_name, 0)\
1080
1081#define KER_CLKF_NOMUX(_gate_offset, _bit_idx,\
1082		_name, _parent_name,\
1083		_flags) \
1084{ \
1085	.gate = &(struct gate_cfg) {_gate_offset, _bit_idx},\
1086	.mux = NULL,\
1087	.name = _name, \
1088	.parent_name = _parent_name, \
1089	.num_parents = 1,\
1090	.flags = _flags,\
1091}
1092
1093static const struct composite_clk_cfg kclk[] = {
1094	KER_CLK(RCC_AHB3ENR,  16, RCC_D1CCIPR,	16, 1, "sdmmc1", sdmmc_src),
1095	KER_CLKF(RCC_AHB3ENR, 14, RCC_D1CCIPR,	 4, 2, "quadspi", qspi_src,
1096			CLK_IGNORE_UNUSED),
1097	KER_CLKF(RCC_AHB3ENR, 12, RCC_D1CCIPR,	 0, 2, "fmc", fmc_src,
1098			CLK_IGNORE_UNUSED),
1099	KER_CLK(RCC_AHB1ENR,  27, RCC_D2CCIP2R,	20, 2, "usb2otg", usbotg_src),
1100	KER_CLK(RCC_AHB1ENR,  25, RCC_D2CCIP2R, 20, 2, "usb1otg", usbotg_src),
1101	KER_CLK(RCC_AHB1ENR,   5, RCC_D3CCIPR,	16, 2, "adc12", adc_src),
1102	KER_CLK(RCC_AHB2ENR,   9, RCC_D1CCIPR,	16, 1, "sdmmc2", sdmmc_src),
1103	KER_CLK(RCC_AHB2ENR,   6, RCC_D2CCIP2R,	 8, 2, "rng", rng_src),
1104	KER_CLK(RCC_AHB4ENR,  24, RCC_D3CCIPR,  16, 2, "adc3", adc_src),
1105	KER_CLKF(RCC_APB3ENR,   4, RCC_D1CCIPR,	 8, 1, "dsi", dsi_src,
1106			CLK_SET_RATE_PARENT),
1107	KER_CLKF_NOMUX(RCC_APB3ENR, 3, "ltdc", ltdc_src, CLK_SET_RATE_PARENT),
1108	KER_CLK(RCC_APB1LENR, 31, RCC_D2CCIP2R,  0, 3, "usart8", usart_src2),
1109	KER_CLK(RCC_APB1LENR, 30, RCC_D2CCIP2R,  0, 3, "usart7", usart_src2),
1110	KER_CLK(RCC_APB1LENR, 27, RCC_D2CCIP2R, 22, 2, "hdmicec", cec_src),
1111	KER_CLK(RCC_APB1LENR, 23, RCC_D2CCIP2R, 12, 2, "i2c3", i2c_src1),
1112	KER_CLK(RCC_APB1LENR, 22, RCC_D2CCIP2R, 12, 2, "i2c2", i2c_src1),
1113	KER_CLK(RCC_APB1LENR, 21, RCC_D2CCIP2R, 12, 2, "i2c1", i2c_src1),
1114	KER_CLK(RCC_APB1LENR, 20, RCC_D2CCIP2R,	 0, 3, "uart5", usart_src2),
1115	KER_CLK(RCC_APB1LENR, 19, RCC_D2CCIP2R,  0, 3, "uart4", usart_src2),
1116	KER_CLK(RCC_APB1LENR, 18, RCC_D2CCIP2R,  0, 3, "usart3", usart_src2),
1117	KER_CLK(RCC_APB1LENR, 17, RCC_D2CCIP2R,  0, 3, "usart2", usart_src2),
1118	KER_CLK(RCC_APB1LENR, 16, RCC_D2CCIP1R, 20, 2, "spdifrx", spdifrx_src),
1119	KER_CLK(RCC_APB1LENR, 15, RCC_D2CCIP1R, 16, 3, "spi3", spi_src1),
1120	KER_CLK(RCC_APB1LENR, 14, RCC_D2CCIP1R, 16, 3, "spi2", spi_src1),
1121	KER_CLK(RCC_APB1LENR,  9, RCC_D2CCIP2R, 28, 3, "lptim1", lptim_src1),
1122	KER_CLK(RCC_APB1HENR,  8, RCC_D2CCIP1R, 28, 2, "fdcan", fdcan_src),
1123	KER_CLK(RCC_APB1HENR,  2, RCC_D2CCIP1R, 31, 1, "swp", swp_src),
1124	KER_CLK(RCC_APB2ENR,  29, RCC_CFGR,	14, 1, "hrtim", hrtim_src),
1125	KER_CLK(RCC_APB2ENR,  28, RCC_D2CCIP1R, 24, 1, "dfsdm1", dfsdm1_src),
1126	KER_CLKF(RCC_APB2ENR,  24, RCC_D2CCIP1R,  6, 3, "sai3", sai_src,
1127		 CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT),
1128	KER_CLKF(RCC_APB2ENR,  23, RCC_D2CCIP1R,  6, 3, "sai2", sai_src,
1129		 CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT),
1130	KER_CLKF(RCC_APB2ENR,  22, RCC_D2CCIP1R,  0, 3, "sai1", sai_src,
1131		 CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT),
1132	KER_CLK(RCC_APB2ENR,  20, RCC_D2CCIP1R, 16, 3, "spi5", spi_src2),
1133	KER_CLK(RCC_APB2ENR,  13, RCC_D2CCIP1R, 16, 3, "spi4", spi_src2),
1134	KER_CLK(RCC_APB2ENR,  12, RCC_D2CCIP1R, 16, 3, "spi1", spi_src1),
1135	KER_CLK(RCC_APB2ENR,   5, RCC_D2CCIP2R,  3, 3, "usart6", usart_src1),
1136	KER_CLK(RCC_APB2ENR,   4, RCC_D2CCIP2R,  3, 3, "usart1", usart_src1),
1137	KER_CLK(RCC_APB4ENR,  21, RCC_D3CCIPR,	24, 3, "sai4b", sai_src),
1138	KER_CLK(RCC_APB4ENR,  21, RCC_D3CCIPR,	21, 3, "sai4a", sai_src),
1139	KER_CLK(RCC_APB4ENR,  12, RCC_D3CCIPR,	13, 3, "lptim5", lptim_src2),
1140	KER_CLK(RCC_APB4ENR,  11, RCC_D3CCIPR,	13, 3, "lptim4", lptim_src2),
1141	KER_CLK(RCC_APB4ENR,  10, RCC_D3CCIPR,	13, 3, "lptim3", lptim_src2),
1142	KER_CLK(RCC_APB4ENR,   9, RCC_D3CCIPR,	10, 3, "lptim2", lptim_src2),
1143	KER_CLK(RCC_APB4ENR,   7, RCC_D3CCIPR,	 8, 2, "i2c4", i2c_src2),
1144	KER_CLK(RCC_APB4ENR,   5, RCC_D3CCIPR,	28, 3, "spi6", spi_src3),
1145	KER_CLK(RCC_APB4ENR,   3, RCC_D3CCIPR,	 0, 3, "lpuart1", lpuart1_src),
1146};
1147
1148static struct composite_clk_gcfg kernel_clk_cfg = {
1149	M_CFG_MUX(NULL, 0),
1150	M_CFG_GATE(NULL, 0),
1151};
1152
1153/* RTC clock */
1154/*
1155 * RTC & LSE registers are protected against parasitic write access.
1156 * PWR_CR_DBP bit must be set to enable write access to RTC registers.
1157 */
1158/* STM32_PWR_CR */
1159#define PWR_CR				0x00
1160/* STM32_PWR_CR bit field */
1161#define PWR_CR_DBP			BIT(8)
1162
1163static struct composite_clk_gcfg rtc_clk_cfg = {
1164	M_CFG_MUX(NULL, 0),
1165	M_CFG_GATE(NULL, 0),
1166};
1167
1168static const struct composite_clk_cfg rtc_clk =
1169	KER_CLK(RCC_BDCR, 15, RCC_BDCR, 8, 2, "rtc_ck", rtc_src);
1170
1171/* Micro-controller output clock */
1172static struct composite_clk_gcfg mco_clk_cfg = {
1173	M_CFG_MUX(NULL, 0),
1174	M_CFG_DIV(NULL,	CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO),
1175};
1176
1177#define M_MCO_F(_name, _parents, _mux_offset,  _mux_shift, _mux_width,\
1178		_rate_offset, _rate_shift, _rate_width,\
1179		_flags)\
1180{\
1181	.mux = &(struct muxdiv_cfg) {_mux_offset, _mux_shift, _mux_width },\
1182	.div = &(struct muxdiv_cfg) {_rate_offset, _rate_shift, _rate_width},\
1183	.gate = NULL,\
1184	.name = _name,\
1185	.parent_name = _parents,\
1186	.num_parents = ARRAY_SIZE(_parents),\
1187	.flags = _flags,\
1188}
1189
1190static const struct composite_clk_cfg mco_clk[] = {
1191	M_MCO_F("mco1", mco_src1, RCC_CFGR, 22, 4, RCC_CFGR, 18, 4, 0),
1192	M_MCO_F("mco2", mco_src2, RCC_CFGR, 29, 3, RCC_CFGR, 25, 4, 0),
1193};
1194
1195static void __init stm32h7_rcc_init(struct device_node *np)
1196{
1197	struct clk_hw_onecell_data *clk_data;
1198	struct composite_cfg c_cfg;
1199	int n;
1200	const char *hse_clk, *lse_clk, *i2s_clk;
1201	struct regmap *pdrm;
1202
1203	clk_data = kzalloc(struct_size(clk_data, hws, STM32H7_MAX_CLKS),
1204			   GFP_KERNEL);
1205	if (!clk_data)
1206		return;
1207
1208	clk_data->num = STM32H7_MAX_CLKS;
1209
1210	hws = clk_data->hws;
1211
1212	for (n = 0; n < STM32H7_MAX_CLKS; n++)
1213		hws[n] = ERR_PTR(-ENOENT);
1214
1215	/* get RCC base @ from DT */
1216	base = of_iomap(np, 0);
1217	if (!base) {
1218		pr_err("%pOFn: unable to map resource", np);
1219		goto err_free_clks;
1220	}
1221
1222	pdrm = syscon_regmap_lookup_by_phandle(np, "st,syscfg");
1223	if (IS_ERR(pdrm))
1224		pr_warn("%s: Unable to get syscfg\n", __func__);
1225	else
1226		/* In any case disable backup domain write protection
1227		 * and will never be enabled.
1228		 * Needed by LSE & RTC clocks.
1229		 */
1230		regmap_update_bits(pdrm, PWR_CR, PWR_CR_DBP, PWR_CR_DBP);
1231
1232	/* Put parent names from DT */
1233	hse_clk = of_clk_get_parent_name(np, 0);
1234	lse_clk = of_clk_get_parent_name(np, 1);
1235	i2s_clk = of_clk_get_parent_name(np, 2);
1236
1237	sai_src[3] = i2s_clk;
1238	spi_src1[3] = i2s_clk;
1239
1240	/* Register Internal oscillators */
1241	clk_hw_register_fixed_rate(NULL, "clk-hsi", NULL, 0, 64000000);
1242	clk_hw_register_fixed_rate(NULL, "clk-csi", NULL, 0, 4000000);
1243	clk_hw_register_fixed_rate(NULL, "clk-lsi", NULL, 0, 32000);
1244	clk_hw_register_fixed_rate(NULL, "clk-rc48", NULL, 0, 48000);
1245
1246	/* This clock is coming from outside. Frequencies unknown */
1247	hws[CK_DSI_PHY] = clk_hw_register_fixed_rate(NULL, "ck_dsi_phy", NULL,
1248			0, 0);
1249
1250	hws[HSI_DIV] = clk_hw_register_divider(NULL, "hsidiv", "clk-hsi", 0,
1251			base + RCC_CR, 3, 2, CLK_DIVIDER_POWER_OF_TWO,
1252			&stm32rcc_lock);
1253
1254	hws[HSE_1M] = clk_hw_register_divider(NULL, "hse_1M", "hse_ck",	0,
1255			base + RCC_CFGR, 8, 6, CLK_DIVIDER_ONE_BASED |
1256			CLK_DIVIDER_ALLOW_ZERO,
1257			&stm32rcc_lock);
1258
1259	/* Mux system clocks */
1260	for (n = 0; n < ARRAY_SIZE(stm32_mclk); n++)
1261		hws[MCLK_BANK + n] = clk_hw_register_mux(NULL,
1262				stm32_mclk[n].name,
1263				stm32_mclk[n].parents,
1264				stm32_mclk[n].num_parents,
1265				stm32_mclk[n].flags,
1266				stm32_mclk[n].offset + base,
1267				stm32_mclk[n].shift,
1268				stm32_mclk[n].width,
1269				0,
1270				&stm32rcc_lock);
1271
1272	register_core_and_bus_clocks();
1273
1274	/* Oscillary clocks */
1275	for (n = 0; n < ARRAY_SIZE(stm32_oclk); n++)
1276		hws[OSC_BANK + n] = clk_register_ready_gate(NULL,
1277				stm32_oclk[n].name,
1278				stm32_oclk[n].parent,
1279				stm32_oclk[n].gate_offset + base,
1280				stm32_oclk[n].bit_idx,
1281				stm32_oclk[n].bit_rdy,
1282				stm32_oclk[n].flags,
1283				&stm32rcc_lock);
1284
1285	hws[HSE_CK] = clk_register_ready_gate(NULL,
1286				"hse_ck",
1287				hse_clk,
1288				RCC_CR + base,
1289				16, 17,
1290				0,
1291				&stm32rcc_lock);
1292
1293	hws[LSE_CK] = clk_register_ready_gate(NULL,
1294				"lse_ck",
1295				lse_clk,
1296				RCC_BDCR + base,
1297				0, 1,
1298				0,
1299				&stm32rcc_lock);
1300
1301	hws[CSI_KER_DIV122 + n] = clk_hw_register_fixed_factor(NULL,
1302			"csi_ker_div122", "csi_ker", 0, 1, 122);
1303
1304	/* PLLs */
1305	for (n = 0; n < ARRAY_SIZE(stm32_pll); n++) {
1306		int odf;
1307
1308		/* Register the VCO */
1309		clk_register_stm32_pll(NULL, stm32_pll[n].name,
1310				stm32_pll[n].parent_name, stm32_pll[n].flags,
1311				stm32_pll[n].cfg,
1312				&stm32rcc_lock);
1313
1314		/* Register the 3 output dividers */
1315		for (odf = 0; odf < 3; odf++) {
1316			int idx = n * 3 + odf;
1317
1318			get_cfg_composite_div(&odf_clk_gcfg, &stm32_odf[n][odf],
1319					&c_cfg,	&stm32rcc_lock);
1320
1321			hws[ODF_BANK + idx] = clk_hw_register_composite(NULL,
1322					stm32_odf[n][odf].name,
1323					stm32_odf[n][odf].parent_name,
1324					stm32_odf[n][odf].num_parents,
1325					c_cfg.mux_hw, c_cfg.mux_ops,
1326					c_cfg.div_hw, c_cfg.div_ops,
1327					c_cfg.gate_hw, c_cfg.gate_ops,
1328					stm32_odf[n][odf].flags);
1329		}
1330	}
1331
1332	/* Peripheral clocks */
1333	for (n = 0; n < ARRAY_SIZE(pclk); n++)
1334		hws[PERIF_BANK + n] = clk_hw_register_gate(NULL, pclk[n].name,
1335				pclk[n].parent,
1336				pclk[n].flags, base + pclk[n].gate_offset,
1337				pclk[n].bit_idx, pclk[n].flags, &stm32rcc_lock);
1338
1339	/* Kernel clocks */
1340	for (n = 0; n < ARRAY_SIZE(kclk); n++) {
1341		get_cfg_composite_div(&kernel_clk_cfg, &kclk[n], &c_cfg,
1342				&stm32rcc_lock);
1343
1344		hws[KERN_BANK + n] = clk_hw_register_composite(NULL,
1345				kclk[n].name,
1346				kclk[n].parent_name,
1347				kclk[n].num_parents,
1348				c_cfg.mux_hw, c_cfg.mux_ops,
1349				c_cfg.div_hw, c_cfg.div_ops,
1350				c_cfg.gate_hw, c_cfg.gate_ops,
1351				kclk[n].flags);
1352	}
1353
1354	/* RTC clock (default state is off) */
1355	clk_hw_register_fixed_rate(NULL, "off", NULL, 0, 0);
1356
1357	get_cfg_composite_div(&rtc_clk_cfg, &rtc_clk, &c_cfg, &stm32rcc_lock);
1358
1359	hws[RTC_CK] = clk_hw_register_composite(NULL,
1360			rtc_clk.name,
1361			rtc_clk.parent_name,
1362			rtc_clk.num_parents,
1363			c_cfg.mux_hw, c_cfg.mux_ops,
1364			c_cfg.div_hw, c_cfg.div_ops,
1365			c_cfg.gate_hw, c_cfg.gate_ops,
1366			rtc_clk.flags);
1367
1368	/* Micro-controller clocks */
1369	for (n = 0; n < ARRAY_SIZE(mco_clk); n++) {
1370		get_cfg_composite_div(&mco_clk_cfg, &mco_clk[n], &c_cfg,
1371				&stm32rcc_lock);
1372
1373		hws[MCO_BANK + n] = clk_hw_register_composite(NULL,
1374				mco_clk[n].name,
1375				mco_clk[n].parent_name,
1376				mco_clk[n].num_parents,
1377				c_cfg.mux_hw, c_cfg.mux_ops,
1378				c_cfg.div_hw, c_cfg.div_ops,
1379				c_cfg.gate_hw, c_cfg.gate_ops,
1380				mco_clk[n].flags);
1381	}
1382
1383	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, clk_data);
1384
1385	return;
1386
1387err_free_clks:
1388	kfree(clk_data);
1389}
1390
1391/* The RCC node is a clock and reset controller, and these
1392 * functionalities are supported by different drivers that
1393 * matches the same compatible strings.
1394 */
1395CLK_OF_DECLARE_DRIVER(stm32h7_rcc, "st,stm32h743-rcc", stm32h7_rcc_init);