clk-lgm.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2020-2022 MaxLinear, Inc.
  4. * Copyright (C) 2020 Intel Corporation.
  5. * Zhu Yixin <[email protected]>
  6. * Rahul Tanwar <[email protected]>
  7. */
  8. #include <linux/clk-provider.h>
  9. #include <linux/mfd/syscon.h>
  10. #include <linux/of.h>
  11. #include <linux/platform_device.h>
  12. #include <dt-bindings/clock/intel,lgm-clk.h>
  13. #include "clk-cgu.h"
  14. #define PLL_DIV_WIDTH 4
  15. #define PLL_DDIV_WIDTH 3
  16. /* Gate0 clock shift */
  17. #define G_C55_SHIFT 7
  18. #define G_QSPI_SHIFT 9
  19. #define G_EIP197_SHIFT 11
  20. #define G_VAULT130_SHIFT 12
  21. #define G_TOE_SHIFT 13
  22. #define G_SDXC_SHIFT 14
  23. #define G_EMMC_SHIFT 15
  24. #define G_SPIDBG_SHIFT 17
  25. #define G_DMA3_SHIFT 28
  26. /* Gate1 clock shift */
  27. #define G_DMA0_SHIFT 0
  28. #define G_LEDC0_SHIFT 1
  29. #define G_LEDC1_SHIFT 2
  30. #define G_I2S0_SHIFT 3
  31. #define G_I2S1_SHIFT 4
  32. #define G_EBU_SHIFT 5
  33. #define G_PWM_SHIFT 6
  34. #define G_I2C0_SHIFT 7
  35. #define G_I2C1_SHIFT 8
  36. #define G_I2C2_SHIFT 9
  37. #define G_I2C3_SHIFT 10
  38. #define G_SSC0_SHIFT 12
  39. #define G_SSC1_SHIFT 13
  40. #define G_SSC2_SHIFT 14
  41. #define G_SSC3_SHIFT 15
  42. #define G_GPTC0_SHIFT 17
  43. #define G_GPTC1_SHIFT 18
  44. #define G_GPTC2_SHIFT 19
  45. #define G_GPTC3_SHIFT 20
  46. #define G_ASC0_SHIFT 22
  47. #define G_ASC1_SHIFT 23
  48. #define G_ASC2_SHIFT 24
  49. #define G_ASC3_SHIFT 25
  50. #define G_PCM0_SHIFT 27
  51. #define G_PCM1_SHIFT 28
  52. #define G_PCM2_SHIFT 29
  53. /* Gate2 clock shift */
  54. #define G_PCIE10_SHIFT 1
  55. #define G_PCIE11_SHIFT 2
  56. #define G_PCIE30_SHIFT 3
  57. #define G_PCIE31_SHIFT 4
  58. #define G_PCIE20_SHIFT 5
  59. #define G_PCIE21_SHIFT 6
  60. #define G_PCIE40_SHIFT 7
  61. #define G_PCIE41_SHIFT 8
  62. #define G_XPCS0_SHIFT 10
  63. #define G_XPCS1_SHIFT 11
  64. #define G_XPCS2_SHIFT 12
  65. #define G_XPCS3_SHIFT 13
  66. #define G_SATA0_SHIFT 14
  67. #define G_SATA1_SHIFT 15
  68. #define G_SATA2_SHIFT 16
  69. #define G_SATA3_SHIFT 17
  70. /* Gate3 clock shift */
  71. #define G_ARCEM4_SHIFT 0
  72. #define G_IDMAR1_SHIFT 2
  73. #define G_IDMAT0_SHIFT 3
  74. #define G_IDMAT1_SHIFT 4
  75. #define G_IDMAT2_SHIFT 5
  76. #define G_PPV4_SHIFT 8
  77. #define G_GSWIPO_SHIFT 9
  78. #define G_CQEM_SHIFT 10
  79. #define G_XPCS5_SHIFT 14
  80. #define G_USB1_SHIFT 25
  81. #define G_USB2_SHIFT 26
  82. /* Register definition */
  83. #define CGU_PLL0CZ_CFG0 0x000
  84. #define CGU_PLL0CM0_CFG0 0x020
  85. #define CGU_PLL0CM1_CFG0 0x040
  86. #define CGU_PLL0B_CFG0 0x060
  87. #define CGU_PLL1_CFG0 0x080
  88. #define CGU_PLL2_CFG0 0x0A0
  89. #define CGU_PLLPP_CFG0 0x0C0
  90. #define CGU_LJPLL3_CFG0 0x0E0
  91. #define CGU_LJPLL4_CFG0 0x100
  92. #define CGU_C55_PCMCR 0x18C
  93. #define CGU_PCMCR 0x190
  94. #define CGU_IF_CLK1 0x1A0
  95. #define CGU_IF_CLK2 0x1A4
  96. #define CGU_GATE0 0x300
  97. #define CGU_GATE1 0x310
  98. #define CGU_GATE2 0x320
  99. #define CGU_GATE3 0x310
  100. #define PLL_DIV(x) ((x) + 0x04)
  101. #define PLL_SSC(x) ((x) + 0x10)
  102. #define CLK_NR_CLKS (LGM_GCLK_USB2 + 1)
  103. /*
  104. * Below table defines the pair's of regval & effective dividers.
  105. * It's more efficient to provide an explicit table due to non-linear
  106. * relation between values.
  107. */
  108. static const struct clk_div_table pll_div[] = {
  109. { .val = 0, .div = 1 },
  110. { .val = 1, .div = 2 },
  111. { .val = 2, .div = 3 },
  112. { .val = 3, .div = 4 },
  113. { .val = 4, .div = 5 },
  114. { .val = 5, .div = 6 },
  115. { .val = 6, .div = 8 },
  116. { .val = 7, .div = 10 },
  117. { .val = 8, .div = 12 },
  118. { .val = 9, .div = 16 },
  119. { .val = 10, .div = 20 },
  120. { .val = 11, .div = 24 },
  121. { .val = 12, .div = 32 },
  122. { .val = 13, .div = 40 },
  123. { .val = 14, .div = 48 },
  124. { .val = 15, .div = 64 },
  125. {}
  126. };
  127. static const struct clk_div_table dcl_div[] = {
  128. { .val = 0, .div = 6 },
  129. { .val = 1, .div = 12 },
  130. { .val = 2, .div = 24 },
  131. { .val = 3, .div = 32 },
  132. { .val = 4, .div = 48 },
  133. { .val = 5, .div = 96 },
  134. {}
  135. };
  136. static const struct clk_parent_data pll_p[] = {
  137. { .fw_name = "osc", .name = "osc" },
  138. };
  139. static const struct clk_parent_data pllcm_p[] = {
  140. { .fw_name = "cpu_cm", .name = "cpu_cm" },
  141. };
  142. static const struct clk_parent_data emmc_p[] = {
  143. { .fw_name = "emmc4", .name = "emmc4" },
  144. { .fw_name = "noc4", .name = "noc4" },
  145. };
  146. static const struct clk_parent_data sdxc_p[] = {
  147. { .fw_name = "sdxc3", .name = "sdxc3" },
  148. { .fw_name = "sdxc2", .name = "sdxc2" },
  149. };
  150. static const struct clk_parent_data pcm_p[] = {
  151. { .fw_name = "v_docsis", .name = "v_docsis" },
  152. { .fw_name = "dcl", .name = "dcl" },
  153. };
  154. static const struct clk_parent_data cbphy_p[] = {
  155. { .fw_name = "dd_serdes", .name = "dd_serdes" },
  156. { .fw_name = "dd_pcie", .name = "dd_pcie" },
  157. };
  158. static const struct lgm_pll_clk_data lgm_pll_clks[] = {
  159. LGM_PLL(LGM_CLK_PLL0CZ, "pll0cz", pll_p, CLK_IGNORE_UNUSED,
  160. CGU_PLL0CZ_CFG0, TYPE_ROPLL),
  161. LGM_PLL(LGM_CLK_PLL0CM0, "pll0cm0", pllcm_p, CLK_IGNORE_UNUSED,
  162. CGU_PLL0CM0_CFG0, TYPE_ROPLL),
  163. LGM_PLL(LGM_CLK_PLL0CM1, "pll0cm1", pllcm_p, CLK_IGNORE_UNUSED,
  164. CGU_PLL0CM1_CFG0, TYPE_ROPLL),
  165. LGM_PLL(LGM_CLK_PLL0B, "pll0b", pll_p, CLK_IGNORE_UNUSED,
  166. CGU_PLL0B_CFG0, TYPE_ROPLL),
  167. LGM_PLL(LGM_CLK_PLL1, "pll1", pll_p, 0, CGU_PLL1_CFG0, TYPE_ROPLL),
  168. LGM_PLL(LGM_CLK_PLL2, "pll2", pll_p, CLK_IGNORE_UNUSED,
  169. CGU_PLL2_CFG0, TYPE_ROPLL),
  170. LGM_PLL(LGM_CLK_PLLPP, "pllpp", pll_p, 0, CGU_PLLPP_CFG0, TYPE_ROPLL),
  171. LGM_PLL(LGM_CLK_LJPLL3, "ljpll3", pll_p, 0, CGU_LJPLL3_CFG0, TYPE_LJPLL),
  172. LGM_PLL(LGM_CLK_LJPLL4, "ljpll4", pll_p, 0, CGU_LJPLL4_CFG0, TYPE_LJPLL),
  173. };
  174. static const struct lgm_clk_branch lgm_branch_clks[] = {
  175. LGM_DIV(LGM_CLK_PP_HW, "pp_hw", "pllpp", 0, PLL_DIV(CGU_PLLPP_CFG0),
  176. 0, PLL_DIV_WIDTH, 24, 1, 0, 0, pll_div),
  177. LGM_DIV(LGM_CLK_PP_UC, "pp_uc", "pllpp", 0, PLL_DIV(CGU_PLLPP_CFG0),
  178. 4, PLL_DIV_WIDTH, 25, 1, 0, 0, pll_div),
  179. LGM_DIV(LGM_CLK_PP_FXD, "pp_fxd", "pllpp", 0, PLL_DIV(CGU_PLLPP_CFG0),
  180. 8, PLL_DIV_WIDTH, 26, 1, 0, 0, pll_div),
  181. LGM_DIV(LGM_CLK_PP_TBM, "pp_tbm", "pllpp", 0, PLL_DIV(CGU_PLLPP_CFG0),
  182. 12, PLL_DIV_WIDTH, 27, 1, 0, 0, pll_div),
  183. LGM_DIV(LGM_CLK_DDR, "ddr", "pll2", CLK_IGNORE_UNUSED,
  184. PLL_DIV(CGU_PLL2_CFG0), 0, PLL_DIV_WIDTH, 24, 1, 0, 0,
  185. pll_div),
  186. LGM_DIV(LGM_CLK_CM, "cpu_cm", "pll0cz", 0, PLL_DIV(CGU_PLL0CZ_CFG0),
  187. 0, PLL_DIV_WIDTH, 24, 1, 0, 0, pll_div),
  188. LGM_DIV(LGM_CLK_IC, "cpu_ic", "pll0cz", CLK_IGNORE_UNUSED,
  189. PLL_DIV(CGU_PLL0CZ_CFG0), 4, PLL_DIV_WIDTH, 25,
  190. 1, 0, 0, pll_div),
  191. LGM_DIV(LGM_CLK_SDXC3, "sdxc3", "pll0cz", 0, PLL_DIV(CGU_PLL0CZ_CFG0),
  192. 8, PLL_DIV_WIDTH, 26, 1, 0, 0, pll_div),
  193. LGM_DIV(LGM_CLK_CPU0, "cm0", "pll0cm0",
  194. CLK_IGNORE_UNUSED, PLL_DIV(CGU_PLL0CM0_CFG0),
  195. 0, PLL_DIV_WIDTH, 24, 1, 0, 0, pll_div),
  196. LGM_DIV(LGM_CLK_CPU1, "cm1", "pll0cm1",
  197. CLK_IGNORE_UNUSED, PLL_DIV(CGU_PLL0CM1_CFG0),
  198. 0, PLL_DIV_WIDTH, 24, 1, 0, 0, pll_div),
  199. /*
  200. * Marking ngi_clk (next generation interconnect) and noc_clk
  201. * (network on chip peripheral clk) as critical clocks because
  202. * these are shared parent clock sources for many different
  203. * peripherals.
  204. */
  205. LGM_DIV(LGM_CLK_NGI, "ngi", "pll0b",
  206. (CLK_IGNORE_UNUSED|CLK_IS_CRITICAL), PLL_DIV(CGU_PLL0B_CFG0),
  207. 0, PLL_DIV_WIDTH, 24, 1, 0, 0, pll_div),
  208. LGM_DIV(LGM_CLK_NOC4, "noc4", "pll0b",
  209. (CLK_IGNORE_UNUSED|CLK_IS_CRITICAL), PLL_DIV(CGU_PLL0B_CFG0),
  210. 4, PLL_DIV_WIDTH, 25, 1, 0, 0, pll_div),
  211. LGM_DIV(LGM_CLK_SW, "switch", "pll0b", 0, PLL_DIV(CGU_PLL0B_CFG0),
  212. 8, PLL_DIV_WIDTH, 26, 1, 0, 0, pll_div),
  213. LGM_DIV(LGM_CLK_QSPI, "qspi", "pll0b", 0, PLL_DIV(CGU_PLL0B_CFG0),
  214. 12, PLL_DIV_WIDTH, 27, 1, 0, 0, pll_div),
  215. LGM_DIV(LGM_CLK_CT, "v_ct", "pll1", 0, PLL_DIV(CGU_PLL1_CFG0),
  216. 0, PLL_DIV_WIDTH, 24, 1, 0, 0, pll_div),
  217. LGM_DIV(LGM_CLK_DSP, "v_dsp", "pll1", 0, PLL_DIV(CGU_PLL1_CFG0),
  218. 8, PLL_DIV_WIDTH, 26, 1, 0, 0, pll_div),
  219. LGM_DIV(LGM_CLK_VIF, "v_ifclk", "pll1", 0, PLL_DIV(CGU_PLL1_CFG0),
  220. 12, PLL_DIV_WIDTH, 27, 1, 0, 0, pll_div),
  221. LGM_FIXED_FACTOR(LGM_CLK_EMMC4, "emmc4", "sdxc3", 0, 0,
  222. 0, 0, 0, 0, 1, 4),
  223. LGM_FIXED_FACTOR(LGM_CLK_SDXC2, "sdxc2", "noc4", 0, 0,
  224. 0, 0, 0, 0, 1, 4),
  225. LGM_MUX(LGM_CLK_EMMC, "emmc", emmc_p, 0, CGU_IF_CLK1,
  226. 0, 1, CLK_MUX_ROUND_CLOSEST, 0),
  227. LGM_MUX(LGM_CLK_SDXC, "sdxc", sdxc_p, 0, CGU_IF_CLK1,
  228. 1, 1, CLK_MUX_ROUND_CLOSEST, 0),
  229. LGM_FIXED(LGM_CLK_OSC, "osc", NULL, 0, 0, 0, 0, 0, 40000000, 0),
  230. LGM_FIXED(LGM_CLK_SLIC, "slic", NULL, 0, CGU_IF_CLK1,
  231. 8, 2, CLOCK_FLAG_VAL_INIT, 8192000, 2),
  232. LGM_FIXED(LGM_CLK_DOCSIS, "v_docsis", NULL, 0, 0, 0, 0, 0, 16000000, 0),
  233. LGM_DIV(LGM_CLK_DCL, "dcl", "v_ifclk", CLK_SET_RATE_PARENT, CGU_PCMCR,
  234. 25, 3, 0, 0, DIV_CLK_NO_MASK, 0, dcl_div),
  235. LGM_MUX(LGM_CLK_PCM, "pcm", pcm_p, 0, CGU_C55_PCMCR,
  236. 0, 1, CLK_MUX_ROUND_CLOSEST, 0),
  237. LGM_FIXED_FACTOR(LGM_CLK_DDR_PHY, "ddr_phy", "ddr",
  238. CLK_IGNORE_UNUSED, 0,
  239. 0, 0, 0, 0, 2, 1),
  240. LGM_FIXED_FACTOR(LGM_CLK_PONDEF, "pondef", "dd_pool",
  241. CLK_SET_RATE_PARENT, 0, 0, 0, 0, 0, 1, 2),
  242. LGM_MUX(LGM_CLK_CBPHY0, "cbphy0", cbphy_p, 0, 0,
  243. 0, 0, MUX_CLK_SW | CLK_MUX_ROUND_CLOSEST, 0),
  244. LGM_MUX(LGM_CLK_CBPHY1, "cbphy1", cbphy_p, 0, 0,
  245. 0, 0, MUX_CLK_SW | CLK_MUX_ROUND_CLOSEST, 0),
  246. LGM_MUX(LGM_CLK_CBPHY2, "cbphy2", cbphy_p, 0, 0,
  247. 0, 0, MUX_CLK_SW | CLK_MUX_ROUND_CLOSEST, 0),
  248. LGM_MUX(LGM_CLK_CBPHY3, "cbphy3", cbphy_p, 0, 0,
  249. 0, 0, MUX_CLK_SW | CLK_MUX_ROUND_CLOSEST, 0),
  250. LGM_GATE(LGM_GCLK_C55, "g_c55", NULL, 0, CGU_GATE0,
  251. G_C55_SHIFT, 0, 0),
  252. LGM_GATE(LGM_GCLK_QSPI, "g_qspi", "qspi", 0, CGU_GATE0,
  253. G_QSPI_SHIFT, 0, 0),
  254. LGM_GATE(LGM_GCLK_EIP197, "g_eip197", NULL, 0, CGU_GATE0,
  255. G_EIP197_SHIFT, 0, 0),
  256. LGM_GATE(LGM_GCLK_VAULT, "g_vault130", NULL, 0, CGU_GATE0,
  257. G_VAULT130_SHIFT, 0, 0),
  258. LGM_GATE(LGM_GCLK_TOE, "g_toe", NULL, 0, CGU_GATE0,
  259. G_TOE_SHIFT, 0, 0),
  260. LGM_GATE(LGM_GCLK_SDXC, "g_sdxc", "sdxc", 0, CGU_GATE0,
  261. G_SDXC_SHIFT, 0, 0),
  262. LGM_GATE(LGM_GCLK_EMMC, "g_emmc", "emmc", 0, CGU_GATE0,
  263. G_EMMC_SHIFT, 0, 0),
  264. LGM_GATE(LGM_GCLK_SPI_DBG, "g_spidbg", NULL, 0, CGU_GATE0,
  265. G_SPIDBG_SHIFT, 0, 0),
  266. LGM_GATE(LGM_GCLK_DMA3, "g_dma3", NULL, 0, CGU_GATE0,
  267. G_DMA3_SHIFT, 0, 0),
  268. LGM_GATE(LGM_GCLK_DMA0, "g_dma0", NULL, 0, CGU_GATE1,
  269. G_DMA0_SHIFT, 0, 0),
  270. LGM_GATE(LGM_GCLK_LEDC0, "g_ledc0", NULL, 0, CGU_GATE1,
  271. G_LEDC0_SHIFT, 0, 0),
  272. LGM_GATE(LGM_GCLK_LEDC1, "g_ledc1", NULL, 0, CGU_GATE1,
  273. G_LEDC1_SHIFT, 0, 0),
  274. LGM_GATE(LGM_GCLK_I2S0, "g_i2s0", NULL, 0, CGU_GATE1,
  275. G_I2S0_SHIFT, 0, 0),
  276. LGM_GATE(LGM_GCLK_I2S1, "g_i2s1", NULL, 0, CGU_GATE1,
  277. G_I2S1_SHIFT, 0, 0),
  278. LGM_GATE(LGM_GCLK_EBU, "g_ebu", NULL, 0, CGU_GATE1,
  279. G_EBU_SHIFT, 0, 0),
  280. LGM_GATE(LGM_GCLK_PWM, "g_pwm", NULL, 0, CGU_GATE1,
  281. G_PWM_SHIFT, 0, 0),
  282. LGM_GATE(LGM_GCLK_I2C0, "g_i2c0", NULL, 0, CGU_GATE1,
  283. G_I2C0_SHIFT, 0, 0),
  284. LGM_GATE(LGM_GCLK_I2C1, "g_i2c1", NULL, 0, CGU_GATE1,
  285. G_I2C1_SHIFT, 0, 0),
  286. LGM_GATE(LGM_GCLK_I2C2, "g_i2c2", NULL, 0, CGU_GATE1,
  287. G_I2C2_SHIFT, 0, 0),
  288. LGM_GATE(LGM_GCLK_I2C3, "g_i2c3", NULL, 0, CGU_GATE1,
  289. G_I2C3_SHIFT, 0, 0),
  290. LGM_GATE(LGM_GCLK_SSC0, "g_ssc0", "noc4", 0, CGU_GATE1,
  291. G_SSC0_SHIFT, 0, 0),
  292. LGM_GATE(LGM_GCLK_SSC1, "g_ssc1", "noc4", 0, CGU_GATE1,
  293. G_SSC1_SHIFT, 0, 0),
  294. LGM_GATE(LGM_GCLK_SSC2, "g_ssc2", "noc4", 0, CGU_GATE1,
  295. G_SSC2_SHIFT, 0, 0),
  296. LGM_GATE(LGM_GCLK_SSC3, "g_ssc3", "noc4", 0, CGU_GATE1,
  297. G_SSC3_SHIFT, 0, 0),
  298. LGM_GATE(LGM_GCLK_GPTC0, "g_gptc0", "noc4", 0, CGU_GATE1,
  299. G_GPTC0_SHIFT, 0, 0),
  300. LGM_GATE(LGM_GCLK_GPTC1, "g_gptc1", "noc4", 0, CGU_GATE1,
  301. G_GPTC1_SHIFT, 0, 0),
  302. LGM_GATE(LGM_GCLK_GPTC2, "g_gptc2", "noc4", 0, CGU_GATE1,
  303. G_GPTC2_SHIFT, 0, 0),
  304. LGM_GATE(LGM_GCLK_GPTC3, "g_gptc3", "osc", 0, CGU_GATE1,
  305. G_GPTC3_SHIFT, 0, 0),
  306. LGM_GATE(LGM_GCLK_ASC0, "g_asc0", "noc4", 0, CGU_GATE1,
  307. G_ASC0_SHIFT, 0, 0),
  308. LGM_GATE(LGM_GCLK_ASC1, "g_asc1", "noc4", 0, CGU_GATE1,
  309. G_ASC1_SHIFT, 0, 0),
  310. LGM_GATE(LGM_GCLK_ASC2, "g_asc2", "noc4", 0, CGU_GATE1,
  311. G_ASC2_SHIFT, 0, 0),
  312. LGM_GATE(LGM_GCLK_ASC3, "g_asc3", "osc", 0, CGU_GATE1,
  313. G_ASC3_SHIFT, 0, 0),
  314. LGM_GATE(LGM_GCLK_PCM0, "g_pcm0", NULL, 0, CGU_GATE1,
  315. G_PCM0_SHIFT, 0, 0),
  316. LGM_GATE(LGM_GCLK_PCM1, "g_pcm1", NULL, 0, CGU_GATE1,
  317. G_PCM1_SHIFT, 0, 0),
  318. LGM_GATE(LGM_GCLK_PCM2, "g_pcm2", NULL, 0, CGU_GATE1,
  319. G_PCM2_SHIFT, 0, 0),
  320. LGM_GATE(LGM_GCLK_PCIE10, "g_pcie10", NULL, 0, CGU_GATE2,
  321. G_PCIE10_SHIFT, 0, 0),
  322. LGM_GATE(LGM_GCLK_PCIE11, "g_pcie11", NULL, 0, CGU_GATE2,
  323. G_PCIE11_SHIFT, 0, 0),
  324. LGM_GATE(LGM_GCLK_PCIE30, "g_pcie30", NULL, 0, CGU_GATE2,
  325. G_PCIE30_SHIFT, 0, 0),
  326. LGM_GATE(LGM_GCLK_PCIE31, "g_pcie31", NULL, 0, CGU_GATE2,
  327. G_PCIE31_SHIFT, 0, 0),
  328. LGM_GATE(LGM_GCLK_PCIE20, "g_pcie20", NULL, 0, CGU_GATE2,
  329. G_PCIE20_SHIFT, 0, 0),
  330. LGM_GATE(LGM_GCLK_PCIE21, "g_pcie21", NULL, 0, CGU_GATE2,
  331. G_PCIE21_SHIFT, 0, 0),
  332. LGM_GATE(LGM_GCLK_PCIE40, "g_pcie40", NULL, 0, CGU_GATE2,
  333. G_PCIE40_SHIFT, 0, 0),
  334. LGM_GATE(LGM_GCLK_PCIE41, "g_pcie41", NULL, 0, CGU_GATE2,
  335. G_PCIE41_SHIFT, 0, 0),
  336. LGM_GATE(LGM_GCLK_XPCS0, "g_xpcs0", NULL, 0, CGU_GATE2,
  337. G_XPCS0_SHIFT, 0, 0),
  338. LGM_GATE(LGM_GCLK_XPCS1, "g_xpcs1", NULL, 0, CGU_GATE2,
  339. G_XPCS1_SHIFT, 0, 0),
  340. LGM_GATE(LGM_GCLK_XPCS2, "g_xpcs2", NULL, 0, CGU_GATE2,
  341. G_XPCS2_SHIFT, 0, 0),
  342. LGM_GATE(LGM_GCLK_XPCS3, "g_xpcs3", NULL, 0, CGU_GATE2,
  343. G_XPCS3_SHIFT, 0, 0),
  344. LGM_GATE(LGM_GCLK_SATA0, "g_sata0", NULL, 0, CGU_GATE2,
  345. G_SATA0_SHIFT, 0, 0),
  346. LGM_GATE(LGM_GCLK_SATA1, "g_sata1", NULL, 0, CGU_GATE2,
  347. G_SATA1_SHIFT, 0, 0),
  348. LGM_GATE(LGM_GCLK_SATA2, "g_sata2", NULL, 0, CGU_GATE2,
  349. G_SATA2_SHIFT, 0, 0),
  350. LGM_GATE(LGM_GCLK_SATA3, "g_sata3", NULL, 0, CGU_GATE2,
  351. G_SATA3_SHIFT, 0, 0),
  352. LGM_GATE(LGM_GCLK_ARCEM4, "g_arcem4", NULL, 0, CGU_GATE3,
  353. G_ARCEM4_SHIFT, 0, 0),
  354. LGM_GATE(LGM_GCLK_IDMAR1, "g_idmar1", NULL, 0, CGU_GATE3,
  355. G_IDMAR1_SHIFT, 0, 0),
  356. LGM_GATE(LGM_GCLK_IDMAT0, "g_idmat0", NULL, 0, CGU_GATE3,
  357. G_IDMAT0_SHIFT, 0, 0),
  358. LGM_GATE(LGM_GCLK_IDMAT1, "g_idmat1", NULL, 0, CGU_GATE3,
  359. G_IDMAT1_SHIFT, 0, 0),
  360. LGM_GATE(LGM_GCLK_IDMAT2, "g_idmat2", NULL, 0, CGU_GATE3,
  361. G_IDMAT2_SHIFT, 0, 0),
  362. LGM_GATE(LGM_GCLK_PPV4, "g_ppv4", NULL, 0, CGU_GATE3,
  363. G_PPV4_SHIFT, 0, 0),
  364. LGM_GATE(LGM_GCLK_GSWIPO, "g_gswipo", "switch", 0, CGU_GATE3,
  365. G_GSWIPO_SHIFT, 0, 0),
  366. LGM_GATE(LGM_GCLK_CQEM, "g_cqem", "switch", 0, CGU_GATE3,
  367. G_CQEM_SHIFT, 0, 0),
  368. LGM_GATE(LGM_GCLK_XPCS5, "g_xpcs5", NULL, 0, CGU_GATE3,
  369. G_XPCS5_SHIFT, 0, 0),
  370. LGM_GATE(LGM_GCLK_USB1, "g_usb1", NULL, 0, CGU_GATE3,
  371. G_USB1_SHIFT, 0, 0),
  372. LGM_GATE(LGM_GCLK_USB2, "g_usb2", NULL, 0, CGU_GATE3,
  373. G_USB2_SHIFT, 0, 0),
  374. };
  375. static const struct lgm_clk_ddiv_data lgm_ddiv_clks[] = {
  376. LGM_DDIV(LGM_CLK_CML, "dd_cml", "ljpll3", 0,
  377. PLL_DIV(CGU_LJPLL3_CFG0), 0, PLL_DDIV_WIDTH,
  378. 3, PLL_DDIV_WIDTH, 24, 1, 29, 0),
  379. LGM_DDIV(LGM_CLK_SERDES, "dd_serdes", "ljpll3", 0,
  380. PLL_DIV(CGU_LJPLL3_CFG0), 6, PLL_DDIV_WIDTH,
  381. 9, PLL_DDIV_WIDTH, 25, 1, 28, 0),
  382. LGM_DDIV(LGM_CLK_POOL, "dd_pool", "ljpll3", 0,
  383. PLL_DIV(CGU_LJPLL3_CFG0), 12, PLL_DDIV_WIDTH,
  384. 15, PLL_DDIV_WIDTH, 26, 1, 28, 0),
  385. LGM_DDIV(LGM_CLK_PTP, "dd_ptp", "ljpll3", 0,
  386. PLL_DIV(CGU_LJPLL3_CFG0), 18, PLL_DDIV_WIDTH,
  387. 21, PLL_DDIV_WIDTH, 27, 1, 28, 0),
  388. LGM_DDIV(LGM_CLK_PCIE, "dd_pcie", "ljpll4", 0,
  389. PLL_DIV(CGU_LJPLL4_CFG0), 0, PLL_DDIV_WIDTH,
  390. 3, PLL_DDIV_WIDTH, 24, 1, 29, 0),
  391. };
  392. static int lgm_cgu_probe(struct platform_device *pdev)
  393. {
  394. struct lgm_clk_provider *ctx;
  395. struct device *dev = &pdev->dev;
  396. struct device_node *np = dev->of_node;
  397. int ret;
  398. ctx = devm_kzalloc(dev, struct_size(ctx, clk_data.hws, CLK_NR_CLKS),
  399. GFP_KERNEL);
  400. if (!ctx)
  401. return -ENOMEM;
  402. ctx->clk_data.num = CLK_NR_CLKS;
  403. ctx->membase = syscon_node_to_regmap(np);
  404. if (IS_ERR(ctx->membase)) {
  405. dev_err(dev, "Failed to get clk CGU iomem\n");
  406. return PTR_ERR(ctx->membase);
  407. }
  408. ctx->np = np;
  409. ctx->dev = dev;
  410. ret = lgm_clk_register_plls(ctx, lgm_pll_clks,
  411. ARRAY_SIZE(lgm_pll_clks));
  412. if (ret)
  413. return ret;
  414. ret = lgm_clk_register_branches(ctx, lgm_branch_clks,
  415. ARRAY_SIZE(lgm_branch_clks));
  416. if (ret)
  417. return ret;
  418. ret = lgm_clk_register_ddiv(ctx, lgm_ddiv_clks,
  419. ARRAY_SIZE(lgm_ddiv_clks));
  420. if (ret)
  421. return ret;
  422. return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
  423. &ctx->clk_data);
  424. }
  425. static const struct of_device_id of_lgm_cgu_match[] = {
  426. { .compatible = "intel,cgu-lgm" },
  427. {}
  428. };
  429. static struct platform_driver lgm_cgu_driver = {
  430. .probe = lgm_cgu_probe,
  431. .driver = {
  432. .name = "cgu-lgm",
  433. .of_match_table = of_lgm_cgu_match,
  434. },
  435. };
  436. builtin_platform_driver(lgm_cgu_driver);