clk-k210.c 25 KB

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