Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Copyright (C) 2019-20 Sean Anderson <seanga2@gmail.com>
   4 * Copyright (c) 2019 Western Digital Corporation or its affiliates.
   5 */
   6#define pr_fmt(fmt)     "k210-clk: " fmt
   7
   8#include <linux/io.h>
   9#include <linux/slab.h>
  10#include <linux/spinlock.h>
  11#include <linux/platform_device.h>
  12#include <linux/of.h>
  13#include <linux/of_clk.h>
  14#include <linux/of_platform.h>
  15#include <linux/of_address.h>
  16#include <linux/clk-provider.h>
  17#include <linux/bitfield.h>
  18#include <linux/delay.h>
  19#include <soc/canaan/k210-sysctl.h>
  20
  21#include <dt-bindings/clock/k210-clk.h>
  22
  23struct k210_sysclk;
  24
  25struct k210_clk {
  26	int id;
  27	struct k210_sysclk *ksc;
  28	struct clk_hw hw;
  29};
  30
  31struct k210_clk_cfg {
  32	const char *name;
  33	u8 gate_reg;
  34	u8 gate_bit;
  35	u8 div_reg;
  36	u8 div_shift;
  37	u8 div_width;
  38	u8 div_type;
  39	u8 mux_reg;
  40	u8 mux_bit;
  41};
  42
  43enum k210_clk_div_type {
  44	K210_DIV_NONE,
  45	K210_DIV_ONE_BASED,
  46	K210_DIV_DOUBLE_ONE_BASED,
  47	K210_DIV_POWER_OF_TWO,
  48};
  49
  50#define K210_GATE(_reg, _bit)	\
  51	.gate_reg = (_reg),	\
  52	.gate_bit = (_bit)
  53
  54#define K210_DIV(_reg, _shift, _width, _type)	\
  55	.div_reg = (_reg),			\
  56	.div_shift = (_shift),			\
  57	.div_width = (_width),			\
  58	.div_type = (_type)
  59
  60#define K210_MUX(_reg, _bit)	\
  61	.mux_reg = (_reg),	\
  62	.mux_bit = (_bit)
  63
  64static struct k210_clk_cfg k210_clk_cfgs[K210_NUM_CLKS] = {
  65	/* Gated clocks, no mux, no divider */
  66	[K210_CLK_CPU] = {
  67		.name = "cpu",
  68		K210_GATE(K210_SYSCTL_EN_CENT, 0)
  69	},
  70	[K210_CLK_DMA] = {
  71		.name = "dma",
  72		K210_GATE(K210_SYSCTL_EN_PERI, 1)
  73	},
  74	[K210_CLK_FFT] = {
  75		.name = "fft",
  76		K210_GATE(K210_SYSCTL_EN_PERI, 4)
  77	},
  78	[K210_CLK_GPIO] = {
  79		.name = "gpio",
  80		K210_GATE(K210_SYSCTL_EN_PERI, 5)
  81	},
  82	[K210_CLK_UART1] = {
  83		.name = "uart1",
  84		K210_GATE(K210_SYSCTL_EN_PERI, 16)
  85	},
  86	[K210_CLK_UART2] = {
  87		.name = "uart2",
  88		K210_GATE(K210_SYSCTL_EN_PERI, 17)
  89	},
  90	[K210_CLK_UART3] = {
  91		.name = "uart3",
  92		K210_GATE(K210_SYSCTL_EN_PERI, 18)
  93	},
  94	[K210_CLK_FPIOA] = {
  95		.name = "fpioa",
  96		K210_GATE(K210_SYSCTL_EN_PERI, 20)
  97	},
  98	[K210_CLK_SHA] = {
  99		.name = "sha",
 100		K210_GATE(K210_SYSCTL_EN_PERI, 26)
 101	},
 102	[K210_CLK_AES] = {
 103		.name = "aes",
 104		K210_GATE(K210_SYSCTL_EN_PERI, 19)
 105	},
 106	[K210_CLK_OTP] = {
 107		.name = "otp",
 108		K210_GATE(K210_SYSCTL_EN_PERI, 27)
 109	},
 110	[K210_CLK_RTC] = {
 111		.name = "rtc",
 112		K210_GATE(K210_SYSCTL_EN_PERI, 29)
 113	},
 114
 115	/* Gated divider clocks */
 116	[K210_CLK_SRAM0] = {
 117		.name = "sram0",
 118		K210_GATE(K210_SYSCTL_EN_CENT, 1),
 119		K210_DIV(K210_SYSCTL_THR0, 0, 4, K210_DIV_ONE_BASED)
 120	},
 121	[K210_CLK_SRAM1] = {
 122		.name = "sram1",
 123		K210_GATE(K210_SYSCTL_EN_CENT, 2),
 124		K210_DIV(K210_SYSCTL_THR0, 4, 4, K210_DIV_ONE_BASED)
 125	},
 126	[K210_CLK_ROM] = {
 127		.name = "rom",
 128		K210_GATE(K210_SYSCTL_EN_PERI, 0),
 129		K210_DIV(K210_SYSCTL_THR0, 16, 4, K210_DIV_ONE_BASED)
 130	},
 131	[K210_CLK_DVP] = {
 132		.name = "dvp",
 133		K210_GATE(K210_SYSCTL_EN_PERI, 3),
 134		K210_DIV(K210_SYSCTL_THR0, 12, 4, K210_DIV_ONE_BASED)
 135	},
 136	[K210_CLK_APB0] = {
 137		.name = "apb0",
 138		K210_GATE(K210_SYSCTL_EN_CENT, 3),
 139		K210_DIV(K210_SYSCTL_SEL0, 3, 3, K210_DIV_ONE_BASED)
 140	},
 141	[K210_CLK_APB1] = {
 142		.name = "apb1",
 143		K210_GATE(K210_SYSCTL_EN_CENT, 4),
 144		K210_DIV(K210_SYSCTL_SEL0, 6, 3, K210_DIV_ONE_BASED)
 145	},
 146	[K210_CLK_APB2] = {
 147		.name = "apb2",
 148		K210_GATE(K210_SYSCTL_EN_CENT, 5),
 149		K210_DIV(K210_SYSCTL_SEL0, 9, 3, K210_DIV_ONE_BASED)
 150	},
 151	[K210_CLK_AI] = {
 152		.name = "ai",
 153		K210_GATE(K210_SYSCTL_EN_PERI, 2),
 154		K210_DIV(K210_SYSCTL_THR0, 8, 4, K210_DIV_ONE_BASED)
 155	},
 156	[K210_CLK_SPI0] = {
 157		.name = "spi0",
 158		K210_GATE(K210_SYSCTL_EN_PERI, 6),
 159		K210_DIV(K210_SYSCTL_THR1, 0, 8, K210_DIV_DOUBLE_ONE_BASED)
 160	},
 161	[K210_CLK_SPI1] = {
 162		.name = "spi1",
 163		K210_GATE(K210_SYSCTL_EN_PERI, 7),
 164		K210_DIV(K210_SYSCTL_THR1, 8, 8, K210_DIV_DOUBLE_ONE_BASED)
 165	},
 166	[K210_CLK_SPI2] = {
 167		.name = "spi2",
 168		K210_GATE(K210_SYSCTL_EN_PERI, 8),
 169		K210_DIV(K210_SYSCTL_THR1, 16, 8, K210_DIV_DOUBLE_ONE_BASED)
 170	},
 171	[K210_CLK_I2C0] = {
 172		.name = "i2c0",
 173		K210_GATE(K210_SYSCTL_EN_PERI, 13),
 174		K210_DIV(K210_SYSCTL_THR5, 8, 8, K210_DIV_DOUBLE_ONE_BASED)
 175	},
 176	[K210_CLK_I2C1] = {
 177		.name = "i2c1",
 178		K210_GATE(K210_SYSCTL_EN_PERI, 14),
 179		K210_DIV(K210_SYSCTL_THR5, 16, 8, K210_DIV_DOUBLE_ONE_BASED)
 180	},
 181	[K210_CLK_I2C2] = {
 182		.name = "i2c2",
 183		K210_GATE(K210_SYSCTL_EN_PERI, 15),
 184		K210_DIV(K210_SYSCTL_THR5, 24, 8, K210_DIV_DOUBLE_ONE_BASED)
 185	},
 186	[K210_CLK_WDT0] = {
 187		.name = "wdt0",
 188		K210_GATE(K210_SYSCTL_EN_PERI, 24),
 189		K210_DIV(K210_SYSCTL_THR6, 0, 8, K210_DIV_DOUBLE_ONE_BASED)
 190	},
 191	[K210_CLK_WDT1] = {
 192		.name = "wdt1",
 193		K210_GATE(K210_SYSCTL_EN_PERI, 25),
 194		K210_DIV(K210_SYSCTL_THR6, 8, 8, K210_DIV_DOUBLE_ONE_BASED)
 195	},
 196	[K210_CLK_I2S0] = {
 197		.name = "i2s0",
 198		K210_GATE(K210_SYSCTL_EN_PERI, 10),
 199		K210_DIV(K210_SYSCTL_THR3, 0, 16, K210_DIV_DOUBLE_ONE_BASED)
 200	},
 201	[K210_CLK_I2S1] = {
 202		.name = "i2s1",
 203		K210_GATE(K210_SYSCTL_EN_PERI, 11),
 204		K210_DIV(K210_SYSCTL_THR3, 16, 16, K210_DIV_DOUBLE_ONE_BASED)
 205	},
 206	[K210_CLK_I2S2] = {
 207		.name = "i2s2",
 208		K210_GATE(K210_SYSCTL_EN_PERI, 12),
 209		K210_DIV(K210_SYSCTL_THR4, 0, 16, K210_DIV_DOUBLE_ONE_BASED)
 210	},
 211
 212	/* Divider clocks, no gate, no mux */
 213	[K210_CLK_I2S0_M] = {
 214		.name = "i2s0_m",
 215		K210_DIV(K210_SYSCTL_THR4, 16, 8, K210_DIV_DOUBLE_ONE_BASED)
 216	},
 217	[K210_CLK_I2S1_M] = {
 218		.name = "i2s1_m",
 219		K210_DIV(K210_SYSCTL_THR4, 24, 8, K210_DIV_DOUBLE_ONE_BASED)
 220	},
 221	[K210_CLK_I2S2_M] = {
 222		.name = "i2s2_m",
 223		K210_DIV(K210_SYSCTL_THR4, 0, 8, K210_DIV_DOUBLE_ONE_BASED)
 224	},
 225
 226	/* Muxed gated divider clocks */
 227	[K210_CLK_SPI3] = {
 228		.name = "spi3",
 229		K210_GATE(K210_SYSCTL_EN_PERI, 9),
 230		K210_DIV(K210_SYSCTL_THR1, 24, 8, K210_DIV_DOUBLE_ONE_BASED),
 231		K210_MUX(K210_SYSCTL_SEL0, 12)
 232	},
 233	[K210_CLK_TIMER0] = {
 234		.name = "timer0",
 235		K210_GATE(K210_SYSCTL_EN_PERI, 21),
 236		K210_DIV(K210_SYSCTL_THR2,  0, 8, K210_DIV_DOUBLE_ONE_BASED),
 237		K210_MUX(K210_SYSCTL_SEL0, 13)
 238	},
 239	[K210_CLK_TIMER1] = {
 240		.name = "timer1",
 241		K210_GATE(K210_SYSCTL_EN_PERI, 22),
 242		K210_DIV(K210_SYSCTL_THR2, 8, 8, K210_DIV_DOUBLE_ONE_BASED),
 243		K210_MUX(K210_SYSCTL_SEL0, 14)
 244	},
 245	[K210_CLK_TIMER2] = {
 246		.name = "timer2",
 247		K210_GATE(K210_SYSCTL_EN_PERI, 23),
 248		K210_DIV(K210_SYSCTL_THR2, 16, 8, K210_DIV_DOUBLE_ONE_BASED),
 249		K210_MUX(K210_SYSCTL_SEL0, 15)
 250	},
 251};
 252
 253/*
 254 * PLL control register bits.
 255 */
 256#define K210_PLL_CLKR		GENMASK(3, 0)
 257#define K210_PLL_CLKF		GENMASK(9, 4)
 258#define K210_PLL_CLKOD		GENMASK(13, 10)
 259#define K210_PLL_BWADJ		GENMASK(19, 14)
 260#define K210_PLL_RESET		(1 << 20)
 261#define K210_PLL_PWRD		(1 << 21)
 262#define K210_PLL_INTFB		(1 << 22)
 263#define K210_PLL_BYPASS		(1 << 23)
 264#define K210_PLL_TEST		(1 << 24)
 265#define K210_PLL_EN		(1 << 25)
 266#define K210_PLL_SEL		GENMASK(27, 26) /* PLL2 only */
 267
 268/*
 269 * PLL lock register bits.
 270 */
 271#define K210_PLL_LOCK		0
 272#define K210_PLL_CLEAR_SLIP	2
 273#define K210_PLL_TEST_OUT	3
 274
 275/*
 276 * Clock selector register bits.
 277 */
 278#define K210_ACLK_SEL		BIT(0)
 279#define K210_ACLK_DIV		GENMASK(2, 1)
 280
 281/*
 282 * PLLs.
 283 */
 284enum k210_pll_id {
 285	K210_PLL0, K210_PLL1, K210_PLL2, K210_PLL_NUM
 286};
 287
 288struct k210_pll {
 289	enum k210_pll_id id;
 290	struct k210_sysclk *ksc;
 291	void __iomem *base;
 292	void __iomem *reg;
 293	void __iomem *lock;
 294	u8 lock_shift;
 295	u8 lock_width;
 296	struct clk_hw hw;
 297};
 298#define to_k210_pll(_hw)	container_of(_hw, struct k210_pll, hw)
 299
 300/*
 301 * PLLs configuration: by default PLL0 runs at 780 MHz and PLL1 at 299 MHz.
 302 * The first 2 SRAM banks depend on ACLK/CPU clock which is by default PLL0
 303 * rate divided by 2. Set PLL1 to 390 MHz so that the third SRAM bank has the
 304 * same clock as the first 2.
 305 */
 306struct k210_pll_cfg {
 307	u32 reg;
 308	u8 lock_shift;
 309	u8 lock_width;
 310	u32 r;
 311	u32 f;
 312	u32 od;
 313	u32 bwadj;
 314};
 315
 316static struct k210_pll_cfg k210_plls_cfg[] = {
 317	{ K210_SYSCTL_PLL0,  0, 2, 0, 59, 1, 59 }, /* 780 MHz */
 318	{ K210_SYSCTL_PLL1,  8, 1, 0, 59, 3, 59 }, /* 390 MHz */
 319	{ K210_SYSCTL_PLL2, 16, 1, 0, 22, 1, 22 }, /* 299 MHz */
 320};
 321
 322/**
 323 * struct k210_sysclk - sysclk driver data
 324 * @regs: system controller registers start address
 325 * @clk_lock: clock setting spinlock
 326 * @plls: SoC PLLs descriptors
 327 * @aclk: ACLK clock
 328 * @clks: All other clocks
 329 */
 330struct k210_sysclk {
 331	void __iomem			*regs;
 332	spinlock_t			clk_lock;
 333	struct k210_pll			plls[K210_PLL_NUM];
 334	struct clk_hw			aclk;
 335	struct k210_clk			clks[K210_NUM_CLKS];
 336};
 337
 338#define to_k210_sysclk(_hw)	container_of(_hw, struct k210_sysclk, aclk)
 339
 340/*
 341 * Set ACLK parent selector: 0 for IN0, 1 for PLL0.
 342 */
 343static void k210_aclk_set_selector(void __iomem *regs, u8 sel)
 344{
 345	u32 reg = readl(regs + K210_SYSCTL_SEL0);
 346
 347	if (sel)
 348		reg |= K210_ACLK_SEL;
 349	else
 350		reg &= K210_ACLK_SEL;
 351	writel(reg, regs + K210_SYSCTL_SEL0);
 352}
 353
 354static void k210_init_pll(void __iomem *regs, enum k210_pll_id pllid,
 355			  struct k210_pll *pll)
 356{
 357	pll->id = pllid;
 358	pll->reg = regs + k210_plls_cfg[pllid].reg;
 359	pll->lock = regs + K210_SYSCTL_PLL_LOCK;
 360	pll->lock_shift = k210_plls_cfg[pllid].lock_shift;
 361	pll->lock_width = k210_plls_cfg[pllid].lock_width;
 362}
 363
 364static void k210_pll_wait_for_lock(struct k210_pll *pll)
 365{
 366	u32 reg, mask = GENMASK(pll->lock_shift + pll->lock_width - 1,
 367				pll->lock_shift);
 368
 369	while (true) {
 370		reg = readl(pll->lock);
 371		if ((reg & mask) == mask)
 372			break;
 373
 374		reg |= BIT(pll->lock_shift + K210_PLL_CLEAR_SLIP);
 375		writel(reg, pll->lock);
 376	}
 377}
 378
 379static bool k210_pll_hw_is_enabled(struct k210_pll *pll)
 380{
 381	u32 reg = readl(pll->reg);
 382	u32 mask = K210_PLL_PWRD | K210_PLL_EN;
 383
 384	if (reg & K210_PLL_RESET)
 385		return false;
 386
 387	return (reg & mask) == mask;
 388}
 389
 390static void k210_pll_enable_hw(void __iomem *regs, struct k210_pll *pll)
 391{
 392	struct k210_pll_cfg *pll_cfg = &k210_plls_cfg[pll->id];
 393	u32 reg;
 394
 395	if (k210_pll_hw_is_enabled(pll))
 396		return;
 397
 398	/*
 399	 * For PLL0, we need to re-parent ACLK to IN0 to keep the CPU cores and
 400	 * SRAM running.
 401	 */
 402	if (pll->id == K210_PLL0)
 403		k210_aclk_set_selector(regs, 0);
 404
 405	/* Set PLL factors */
 406	reg = readl(pll->reg);
 407	reg &= ~GENMASK(19, 0);
 408	reg |= FIELD_PREP(K210_PLL_CLKR, pll_cfg->r);
 409	reg |= FIELD_PREP(K210_PLL_CLKF, pll_cfg->f);
 410	reg |= FIELD_PREP(K210_PLL_CLKOD, pll_cfg->od);
 411	reg |= FIELD_PREP(K210_PLL_BWADJ, pll_cfg->bwadj);
 412	reg |= K210_PLL_PWRD;
 413	writel(reg, pll->reg);
 414
 415	/*
 416	 * Reset the PLL: ensure reset is low before asserting it.
 417	 * The magic NOPs come from the Kendryte reference SDK.
 418	 */
 419	reg &= ~K210_PLL_RESET;
 420	writel(reg, pll->reg);
 421	reg |= K210_PLL_RESET;
 422	writel(reg, pll->reg);
 423	nop();
 424	nop();
 425	reg &= ~K210_PLL_RESET;
 426	writel(reg, pll->reg);
 427
 428	k210_pll_wait_for_lock(pll);
 429
 430	reg &= ~K210_PLL_BYPASS;
 431	reg |= K210_PLL_EN;
 432	writel(reg, pll->reg);
 433
 434	if (pll->id == K210_PLL0)
 435		k210_aclk_set_selector(regs, 1);
 436}
 437
 438static int k210_pll_enable(struct clk_hw *hw)
 439{
 440	struct k210_pll *pll = to_k210_pll(hw);
 441	struct k210_sysclk *ksc = pll->ksc;
 442	unsigned long flags;
 443
 444	spin_lock_irqsave(&ksc->clk_lock, flags);
 445
 446	k210_pll_enable_hw(ksc->regs, pll);
 447
 448	spin_unlock_irqrestore(&ksc->clk_lock, flags);
 449
 450	return 0;
 451}
 452
 453static void k210_pll_disable(struct clk_hw *hw)
 454{
 455	struct k210_pll *pll = to_k210_pll(hw);
 456	struct k210_sysclk *ksc = pll->ksc;
 457	unsigned long flags;
 458	u32 reg;
 459
 460	/*
 461	 * Bypassing before powering off is important so child clocks do not
 462	 * stop working. This is especially important for pll0, the indirect
 463	 * parent of the cpu clock.
 464	 */
 465	spin_lock_irqsave(&ksc->clk_lock, flags);
 466	reg = readl(pll->reg);
 467	reg |= K210_PLL_BYPASS;
 468	writel(reg, pll->reg);
 469
 470	reg &= ~K210_PLL_PWRD;
 471	reg &= ~K210_PLL_EN;
 472	writel(reg, pll->reg);
 473	spin_unlock_irqrestore(&ksc->clk_lock, flags);
 474}
 475
 476static int k210_pll_is_enabled(struct clk_hw *hw)
 477{
 478	return k210_pll_hw_is_enabled(to_k210_pll(hw));
 479}
 480
 481static unsigned long k210_pll_get_rate(struct clk_hw *hw,
 482				       unsigned long parent_rate)
 483{
 484	struct k210_pll *pll = to_k210_pll(hw);
 485	u32 reg = readl(pll->reg);
 486	u32 r, f, od;
 487
 488	if (reg & K210_PLL_BYPASS)
 489		return parent_rate;
 490
 491	if (!(reg & K210_PLL_PWRD))
 492		return 0;
 493
 494	r = FIELD_GET(K210_PLL_CLKR, reg) + 1;
 495	f = FIELD_GET(K210_PLL_CLKF, reg) + 1;
 496	od = FIELD_GET(K210_PLL_CLKOD, reg) + 1;
 497
 498	return (u64)parent_rate * f / (r * od);
 499}
 500
 501static const struct clk_ops k210_pll_ops = {
 502	.enable		= k210_pll_enable,
 503	.disable	= k210_pll_disable,
 504	.is_enabled	= k210_pll_is_enabled,
 505	.recalc_rate	= k210_pll_get_rate,
 506};
 507
 508static int k210_pll2_set_parent(struct clk_hw *hw, u8 index)
 509{
 510	struct k210_pll *pll = to_k210_pll(hw);
 511	struct k210_sysclk *ksc = pll->ksc;
 512	unsigned long flags;
 513	u32 reg;
 514
 515	spin_lock_irqsave(&ksc->clk_lock, flags);
 516
 517	reg = readl(pll->reg);
 518	reg &= ~K210_PLL_SEL;
 519	reg |= FIELD_PREP(K210_PLL_SEL, index);
 520	writel(reg, pll->reg);
 521
 522	spin_unlock_irqrestore(&ksc->clk_lock, flags);
 523
 524	return 0;
 525}
 526
 527static u8 k210_pll2_get_parent(struct clk_hw *hw)
 528{
 529	struct k210_pll *pll = to_k210_pll(hw);
 530	u32 reg = readl(pll->reg);
 531
 532	return FIELD_GET(K210_PLL_SEL, reg);
 533}
 534
 535static const struct clk_ops k210_pll2_ops = {
 536	.enable		= k210_pll_enable,
 537	.disable	= k210_pll_disable,
 538	.is_enabled	= k210_pll_is_enabled,
 539	.recalc_rate	= k210_pll_get_rate,
 540	.set_parent	= k210_pll2_set_parent,
 541	.get_parent	= k210_pll2_get_parent,
 542};
 543
 544static int __init k210_register_pll(struct device_node *np,
 545				    struct k210_sysclk *ksc,
 546				    enum k210_pll_id pllid, const char *name,
 547				    int num_parents, const struct clk_ops *ops)
 548{
 549	struct k210_pll *pll = &ksc->plls[pllid];
 550	struct clk_init_data init = {};
 551	const struct clk_parent_data parent_data[] = {
 552		{ /* .index = 0 for in0 */ },
 553		{ .hw = &ksc->plls[K210_PLL0].hw },
 554		{ .hw = &ksc->plls[K210_PLL1].hw },
 555	};
 556
 557	init.name = name;
 558	init.parent_data = parent_data;
 559	init.num_parents = num_parents;
 560	init.ops = ops;
 561
 562	pll->hw.init = &init;
 563	pll->ksc = ksc;
 564
 565	return of_clk_hw_register(np, &pll->hw);
 566}
 567
 568static int __init k210_register_plls(struct device_node *np,
 569				     struct k210_sysclk *ksc)
 570{
 571	int i, ret;
 572
 573	for (i = 0; i < K210_PLL_NUM; i++)
 574		k210_init_pll(ksc->regs, i, &ksc->plls[i]);
 575
 576	/* PLL0 and PLL1 only have IN0 as parent */
 577	ret = k210_register_pll(np, ksc, K210_PLL0, "pll0", 1, &k210_pll_ops);
 578	if (ret) {
 579		pr_err("%pOFP: register PLL0 failed\n", np);
 580		return ret;
 581	}
 582	ret = k210_register_pll(np, ksc, K210_PLL1, "pll1", 1, &k210_pll_ops);
 583	if (ret) {
 584		pr_err("%pOFP: register PLL1 failed\n", np);
 585		return ret;
 586	}
 587
 588	/* PLL2 has IN0, PLL0 and PLL1 as parents */
 589	ret = k210_register_pll(np, ksc, K210_PLL2, "pll2", 3, &k210_pll2_ops);
 590	if (ret) {
 591		pr_err("%pOFP: register PLL2 failed\n", np);
 592		return ret;
 593	}
 594
 595	return 0;
 596}
 597
 598static int k210_aclk_set_parent(struct clk_hw *hw, u8 index)
 599{
 600	struct k210_sysclk *ksc = to_k210_sysclk(hw);
 601	unsigned long flags;
 602
 603	spin_lock_irqsave(&ksc->clk_lock, flags);
 604
 605	k210_aclk_set_selector(ksc->regs, index);
 606
 607	spin_unlock_irqrestore(&ksc->clk_lock, flags);
 608
 609	return 0;
 610}
 611
 612static u8 k210_aclk_get_parent(struct clk_hw *hw)
 613{
 614	struct k210_sysclk *ksc = to_k210_sysclk(hw);
 615	u32 sel;
 616
 617	sel = readl(ksc->regs + K210_SYSCTL_SEL0) & K210_ACLK_SEL;
 618
 619	return sel ? 1 : 0;
 620}
 621
 622static unsigned long k210_aclk_get_rate(struct clk_hw *hw,
 623					unsigned long parent_rate)
 624{
 625	struct k210_sysclk *ksc = to_k210_sysclk(hw);
 626	u32 reg = readl(ksc->regs + K210_SYSCTL_SEL0);
 627	unsigned int shift;
 628
 629	if (!(reg & 0x1))
 630		return parent_rate;
 631
 632	shift = FIELD_GET(K210_ACLK_DIV, reg);
 633
 634	return parent_rate / (2UL << shift);
 635}
 636
 637static const struct clk_ops k210_aclk_ops = {
 638	.set_parent	= k210_aclk_set_parent,
 639	.get_parent	= k210_aclk_get_parent,
 640	.recalc_rate	= k210_aclk_get_rate,
 641};
 642
 643/*
 644 * ACLK has IN0 and PLL0 as parents.
 645 */
 646static int __init k210_register_aclk(struct device_node *np,
 647				     struct k210_sysclk *ksc)
 648{
 649	struct clk_init_data init = {};
 650	const struct clk_parent_data parent_data[] = {
 651		{ /* .index = 0 for in0 */ },
 652		{ .hw = &ksc->plls[K210_PLL0].hw },
 653	};
 654	int ret;
 655
 656	init.name = "aclk";
 657	init.parent_data = parent_data;
 658	init.num_parents = 2;
 659	init.ops = &k210_aclk_ops;
 660	ksc->aclk.init = &init;
 661
 662	ret = of_clk_hw_register(np, &ksc->aclk);
 663	if (ret) {
 664		pr_err("%pOFP: register aclk failed\n", np);
 665		return ret;
 666	}
 667
 668	return 0;
 669}
 670
 671#define to_k210_clk(_hw)	container_of(_hw, struct k210_clk, hw)
 672
 673static int k210_clk_enable(struct clk_hw *hw)
 674{
 675	struct k210_clk *kclk = to_k210_clk(hw);
 676	struct k210_sysclk *ksc = kclk->ksc;
 677	struct k210_clk_cfg *cfg = &k210_clk_cfgs[kclk->id];
 678	unsigned long flags;
 679	u32 reg;
 680
 681	if (!cfg->gate_reg)
 682		return 0;
 683
 684	spin_lock_irqsave(&ksc->clk_lock, flags);
 685	reg = readl(ksc->regs + cfg->gate_reg);
 686	reg |= BIT(cfg->gate_bit);
 687	writel(reg, ksc->regs + cfg->gate_reg);
 688	spin_unlock_irqrestore(&ksc->clk_lock, flags);
 689
 690	return 0;
 691}
 692
 693static void k210_clk_disable(struct clk_hw *hw)
 694{
 695	struct k210_clk *kclk = to_k210_clk(hw);
 696	struct k210_sysclk *ksc = kclk->ksc;
 697	struct k210_clk_cfg *cfg = &k210_clk_cfgs[kclk->id];
 698	unsigned long flags;
 699	u32 reg;
 700
 701	if (!cfg->gate_reg)
 702		return;
 703
 704	spin_lock_irqsave(&ksc->clk_lock, flags);
 705	reg = readl(ksc->regs + cfg->gate_reg);
 706	reg &= ~BIT(cfg->gate_bit);
 707	writel(reg, ksc->regs + cfg->gate_reg);
 708	spin_unlock_irqrestore(&ksc->clk_lock, flags);
 709}
 710
 711static int k210_clk_set_parent(struct clk_hw *hw, u8 index)
 712{
 713	struct k210_clk *kclk = to_k210_clk(hw);
 714	struct k210_sysclk *ksc = kclk->ksc;
 715	struct k210_clk_cfg *cfg = &k210_clk_cfgs[kclk->id];
 716	unsigned long flags;
 717	u32 reg;
 718
 719	spin_lock_irqsave(&ksc->clk_lock, flags);
 720	reg = readl(ksc->regs + cfg->mux_reg);
 721	if (index)
 722		reg |= BIT(cfg->mux_bit);
 723	else
 724		reg &= ~BIT(cfg->mux_bit);
 725	writel(reg, ksc->regs + cfg->mux_reg);
 726	spin_unlock_irqrestore(&ksc->clk_lock, flags);
 727
 728	return 0;
 729}
 730
 731static u8 k210_clk_get_parent(struct clk_hw *hw)
 732{
 733	struct k210_clk *kclk = to_k210_clk(hw);
 734	struct k210_sysclk *ksc = kclk->ksc;
 735	struct k210_clk_cfg *cfg = &k210_clk_cfgs[kclk->id];
 736	unsigned long flags;
 737	u32 reg, idx;
 738
 739	spin_lock_irqsave(&ksc->clk_lock, flags);
 740	reg = readl(ksc->regs + cfg->mux_reg);
 741	idx = (reg & BIT(cfg->mux_bit)) ? 1 : 0;
 742	spin_unlock_irqrestore(&ksc->clk_lock, flags);
 743
 744	return idx;
 745}
 746
 747static unsigned long k210_clk_get_rate(struct clk_hw *hw,
 748				       unsigned long parent_rate)
 749{
 750	struct k210_clk *kclk = to_k210_clk(hw);
 751	struct k210_sysclk *ksc = kclk->ksc;
 752	struct k210_clk_cfg *cfg = &k210_clk_cfgs[kclk->id];
 753	u32 reg, div_val;
 754
 755	if (!cfg->div_reg)
 756		return parent_rate;
 757
 758	reg = readl(ksc->regs + cfg->div_reg);
 759	div_val = (reg >> cfg->div_shift) & GENMASK(cfg->div_width - 1, 0);
 760
 761	switch (cfg->div_type) {
 762	case K210_DIV_ONE_BASED:
 763		return parent_rate / (div_val + 1);
 764	case K210_DIV_DOUBLE_ONE_BASED:
 765		return parent_rate / ((div_val + 1) * 2);
 766	case K210_DIV_POWER_OF_TWO:
 767		return parent_rate / (2UL << div_val);
 768	case K210_DIV_NONE:
 769	default:
 770		return 0;
 771	}
 772}
 773
 774static const struct clk_ops k210_clk_mux_ops = {
 775	.enable		= k210_clk_enable,
 776	.disable	= k210_clk_disable,
 777	.set_parent	= k210_clk_set_parent,
 778	.get_parent	= k210_clk_get_parent,
 779	.recalc_rate	= k210_clk_get_rate,
 780};
 781
 782static const struct clk_ops k210_clk_ops = {
 783	.enable		= k210_clk_enable,
 784	.disable	= k210_clk_disable,
 785	.recalc_rate	= k210_clk_get_rate,
 786};
 787
 788static void __init k210_register_clk(struct device_node *np,
 789				     struct k210_sysclk *ksc, int id,
 790				     const struct clk_parent_data *parent_data,
 791				     int num_parents, unsigned long flags)
 792{
 793	struct k210_clk *kclk = &ksc->clks[id];
 794	struct clk_init_data init = {};
 795	int ret;
 796
 797	init.name = k210_clk_cfgs[id].name;
 798	init.flags = flags;
 799	init.parent_data = parent_data;
 800	init.num_parents = num_parents;
 801	if (num_parents > 1)
 802		init.ops = &k210_clk_mux_ops;
 803	else
 804		init.ops = &k210_clk_ops;
 805
 806	kclk->id = id;
 807	kclk->ksc = ksc;
 808	kclk->hw.init = &init;
 809
 810	ret = of_clk_hw_register(np, &kclk->hw);
 811	if (ret) {
 812		pr_err("%pOFP: register clock %s failed\n",
 813		       np, k210_clk_cfgs[id].name);
 814		kclk->id = -1;
 815	}
 816}
 817
 818/*
 819 * All muxed clocks have IN0 and PLL0 as parents.
 820 */
 821static inline void __init k210_register_mux_clk(struct device_node *np,
 822						struct k210_sysclk *ksc, int id)
 823{
 824	const struct clk_parent_data parent_data[2] = {
 825		{ /* .index = 0 for in0 */ },
 826		{ .hw = &ksc->plls[K210_PLL0].hw }
 827	};
 828
 829	k210_register_clk(np, ksc, id, parent_data, 2, 0);
 830}
 831
 832static inline void __init k210_register_in0_child(struct device_node *np,
 833						struct k210_sysclk *ksc, int id)
 834{
 835	const struct clk_parent_data parent_data = {
 836		/* .index = 0 for in0 */
 837	};
 838
 839	k210_register_clk(np, ksc, id, &parent_data, 1, 0);
 840}
 841
 842static inline void __init k210_register_pll_child(struct device_node *np,
 843						struct k210_sysclk *ksc, int id,
 844						enum k210_pll_id pllid,
 845						unsigned long flags)
 846{
 847	const struct clk_parent_data parent_data = {
 848		.hw = &ksc->plls[pllid].hw,
 849	};
 850
 851	k210_register_clk(np, ksc, id, &parent_data, 1, flags);
 852}
 853
 854static inline void __init k210_register_aclk_child(struct device_node *np,
 855						struct k210_sysclk *ksc, int id,
 856						unsigned long flags)
 857{
 858	const struct clk_parent_data parent_data = {
 859		.hw = &ksc->aclk,
 860	};
 861
 862	k210_register_clk(np, ksc, id, &parent_data, 1, flags);
 863}
 864
 865static inline void __init k210_register_clk_child(struct device_node *np,
 866						struct k210_sysclk *ksc, int id,
 867						int parent_id)
 868{
 869	const struct clk_parent_data parent_data = {
 870		.hw = &ksc->clks[parent_id].hw,
 871	};
 872
 873	k210_register_clk(np, ksc, id, &parent_data, 1, 0);
 874}
 875
 876static struct clk_hw *k210_clk_hw_onecell_get(struct of_phandle_args *clkspec,
 877					      void *data)
 878{
 879	struct k210_sysclk *ksc = data;
 880	unsigned int idx = clkspec->args[0];
 881
 882	if (idx >= K210_NUM_CLKS)
 883		return ERR_PTR(-EINVAL);
 884
 885	return &ksc->clks[idx].hw;
 886}
 887
 888static void __init k210_clk_init(struct device_node *np)
 889{
 890	struct device_node *sysctl_np;
 891	struct k210_sysclk *ksc;
 892	int i, ret;
 893
 894	ksc = kzalloc(sizeof(*ksc), GFP_KERNEL);
 895	if (!ksc)
 896		return;
 897
 898	spin_lock_init(&ksc->clk_lock);
 899	sysctl_np = of_get_parent(np);
 900	ksc->regs = of_iomap(sysctl_np, 0);
 901	of_node_put(sysctl_np);
 902	if (!ksc->regs) {
 903		pr_err("%pOFP: failed to map registers\n", np);
 904		return;
 905	}
 906
 907	ret = k210_register_plls(np, ksc);
 908	if (ret)
 909		return;
 910
 911	ret = k210_register_aclk(np, ksc);
 912	if (ret)
 913		return;
 914
 915	/*
 916	 * Critical clocks: there are no consumers of the SRAM clocks,
 917	 * including the AI clock for the third SRAM bank. The CPU clock
 918	 * is only referenced by the uarths serial device and so would be
 919	 * disabled if the serial console is disabled to switch to another
 920	 * console. Mark all these clocks as critical so that they are never
 921	 * disabled by the core clock management.
 922	 */
 923	k210_register_aclk_child(np, ksc, K210_CLK_CPU, CLK_IS_CRITICAL);
 924	k210_register_aclk_child(np, ksc, K210_CLK_SRAM0, CLK_IS_CRITICAL);
 925	k210_register_aclk_child(np, ksc, K210_CLK_SRAM1, CLK_IS_CRITICAL);
 926	k210_register_pll_child(np, ksc, K210_CLK_AI, K210_PLL1,
 927				CLK_IS_CRITICAL);
 928
 929	/* Clocks with aclk as source */
 930	k210_register_aclk_child(np, ksc, K210_CLK_DMA, 0);
 931	k210_register_aclk_child(np, ksc, K210_CLK_FFT, 0);
 932	k210_register_aclk_child(np, ksc, K210_CLK_ROM, 0);
 933	k210_register_aclk_child(np, ksc, K210_CLK_DVP, 0);
 934	k210_register_aclk_child(np, ksc, K210_CLK_APB0, 0);
 935	k210_register_aclk_child(np, ksc, K210_CLK_APB1, 0);
 936	k210_register_aclk_child(np, ksc, K210_CLK_APB2, 0);
 937
 938	/* Clocks with PLL0 as source */
 939	k210_register_pll_child(np, ksc, K210_CLK_SPI0, K210_PLL0, 0);
 940	k210_register_pll_child(np, ksc, K210_CLK_SPI1, K210_PLL0, 0);
 941	k210_register_pll_child(np, ksc, K210_CLK_SPI2, K210_PLL0, 0);
 942	k210_register_pll_child(np, ksc, K210_CLK_I2C0, K210_PLL0, 0);
 943	k210_register_pll_child(np, ksc, K210_CLK_I2C1, K210_PLL0, 0);
 944	k210_register_pll_child(np, ksc, K210_CLK_I2C2, K210_PLL0, 0);
 945
 946	/* Clocks with PLL2 as source */
 947	k210_register_pll_child(np, ksc, K210_CLK_I2S0, K210_PLL2, 0);
 948	k210_register_pll_child(np, ksc, K210_CLK_I2S1, K210_PLL2, 0);
 949	k210_register_pll_child(np, ksc, K210_CLK_I2S2, K210_PLL2, 0);
 950	k210_register_pll_child(np, ksc, K210_CLK_I2S0_M, K210_PLL2, 0);
 951	k210_register_pll_child(np, ksc, K210_CLK_I2S1_M, K210_PLL2, 0);
 952	k210_register_pll_child(np, ksc, K210_CLK_I2S2_M, K210_PLL2, 0);
 953
 954	/* Clocks with IN0 as source */
 955	k210_register_in0_child(np, ksc, K210_CLK_WDT0);
 956	k210_register_in0_child(np, ksc, K210_CLK_WDT1);
 957	k210_register_in0_child(np, ksc, K210_CLK_RTC);
 958
 959	/* Clocks with APB0 as source */
 960	k210_register_clk_child(np, ksc, K210_CLK_GPIO, K210_CLK_APB0);
 961	k210_register_clk_child(np, ksc, K210_CLK_UART1, K210_CLK_APB0);
 962	k210_register_clk_child(np, ksc, K210_CLK_UART2, K210_CLK_APB0);
 963	k210_register_clk_child(np, ksc, K210_CLK_UART3, K210_CLK_APB0);
 964	k210_register_clk_child(np, ksc, K210_CLK_FPIOA, K210_CLK_APB0);
 965	k210_register_clk_child(np, ksc, K210_CLK_SHA, K210_CLK_APB0);
 966
 967	/* Clocks with APB1 as source */
 968	k210_register_clk_child(np, ksc, K210_CLK_AES, K210_CLK_APB1);
 969	k210_register_clk_child(np, ksc, K210_CLK_OTP, K210_CLK_APB1);
 970
 971	/* Mux clocks with in0 or pll0 as source */
 972	k210_register_mux_clk(np, ksc, K210_CLK_SPI3);
 973	k210_register_mux_clk(np, ksc, K210_CLK_TIMER0);
 974	k210_register_mux_clk(np, ksc, K210_CLK_TIMER1);
 975	k210_register_mux_clk(np, ksc, K210_CLK_TIMER2);
 976
 977	/* Check for registration errors */
 978	for (i = 0; i < K210_NUM_CLKS; i++) {
 979		if (ksc->clks[i].id != i)
 980			return;
 981	}
 982
 983	ret = of_clk_add_hw_provider(np, k210_clk_hw_onecell_get, ksc);
 984	if (ret) {
 985		pr_err("%pOFP: add clock provider failed %d\n", np, ret);
 986		return;
 987	}
 988
 989	pr_info("%pOFP: CPU running at %lu MHz\n",
 990		np, clk_hw_get_rate(&ksc->clks[K210_CLK_CPU].hw) / 1000000);
 991}
 992
 993CLK_OF_DECLARE(k210_clk, "canaan,k210-clk", k210_clk_init);
 994
 995/*
 996 * Enable PLL1 to be able to use the AI SRAM.
 997 */
 998void __init k210_clk_early_init(void __iomem *regs)
 999{
1000	struct k210_pll pll1;
1001
1002	/* Make sure ACLK selector is set to PLL0 */
1003	k210_aclk_set_selector(regs, 1);
1004
1005	/* Startup PLL1 to enable the aisram bank for general memory use */
1006	k210_init_pll(regs, K210_PLL1, &pll1);
1007	k210_pll_enable_hw(regs, &pll1);
1008}