dispcc-sm7150.c 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2018, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2024, Danila Tikhonov <danila@jiaxyga.com>
  5. * Copyright (c) 2024, David Wronek <david@mainlining.org>
  6. */
  7. #include <linux/clk-provider.h>
  8. #include <linux/mod_devicetable.h>
  9. #include <linux/module.h>
  10. #include <linux/of.h>
  11. #include <linux/platform_device.h>
  12. #include <linux/regmap.h>
  13. #include <dt-bindings/clock/qcom,sm7150-dispcc.h>
  14. #include "clk-alpha-pll.h"
  15. #include "clk-branch.h"
  16. #include "clk-rcg.h"
  17. #include "clk-regmap.h"
  18. #include "clk-regmap-divider.h"
  19. #include "common.h"
  20. #include "gdsc.h"
  21. enum {
  22. DT_BI_TCXO,
  23. DT_BI_TCXO_AO,
  24. DT_GCC_DISP_GPLL0_CLK,
  25. DT_CHIP_SLEEP_CLK,
  26. DT_DSI0_PHY_PLL_OUT_BYTECLK,
  27. DT_DSI0_PHY_PLL_OUT_DSICLK,
  28. DT_DSI1_PHY_PLL_OUT_BYTECLK,
  29. DT_DSI1_PHY_PLL_OUT_DSICLK,
  30. DT_DP_PHY_PLL_LINK_CLK,
  31. DT_DP_PHY_PLL_VCO_DIV_CLK,
  32. };
  33. enum {
  34. P_BI_TCXO,
  35. P_CHIP_SLEEP_CLK,
  36. P_DISPCC_PLL0_OUT_EVEN,
  37. P_DISPCC_PLL0_OUT_MAIN,
  38. P_DP_PHY_PLL_LINK_CLK,
  39. P_DP_PHY_PLL_VCO_DIV_CLK,
  40. P_DSI0_PHY_PLL_OUT_BYTECLK,
  41. P_DSI0_PHY_PLL_OUT_DSICLK,
  42. P_DSI1_PHY_PLL_OUT_BYTECLK,
  43. P_DSI1_PHY_PLL_OUT_DSICLK,
  44. P_GCC_DISP_GPLL0_CLK,
  45. };
  46. static const struct pll_vco fabia_vco[] = {
  47. { 249600000, 2000000000, 0 },
  48. { 125000000, 1000000000, 1 },
  49. };
  50. /* 860MHz configuration */
  51. static const struct alpha_pll_config dispcc_pll0_config = {
  52. .l = 0x2c,
  53. .alpha = 0xcaaa,
  54. .test_ctl_val = 0x40000000,
  55. };
  56. static struct clk_alpha_pll dispcc_pll0 = {
  57. .offset = 0x0,
  58. .vco_table = fabia_vco,
  59. .num_vco = ARRAY_SIZE(fabia_vco),
  60. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
  61. .clkr = {
  62. .hw.init = &(const struct clk_init_data) {
  63. .name = "dispcc_pll0",
  64. .parent_data = &(const struct clk_parent_data) {
  65. .index = DT_BI_TCXO,
  66. },
  67. .num_parents = 1,
  68. .ops = &clk_alpha_pll_fabia_ops,
  69. },
  70. },
  71. };
  72. static const struct parent_map dispcc_parent_map_0[] = {
  73. { P_BI_TCXO, 0 },
  74. { P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
  75. { P_DSI1_PHY_PLL_OUT_BYTECLK, 2 },
  76. };
  77. static const struct clk_parent_data dispcc_parent_data_0[] = {
  78. { .index = DT_BI_TCXO },
  79. { .index = DT_DSI0_PHY_PLL_OUT_BYTECLK },
  80. { .index = DT_DSI1_PHY_PLL_OUT_BYTECLK },
  81. };
  82. static const struct parent_map dispcc_parent_map_1[] = {
  83. { P_BI_TCXO, 0 },
  84. { P_DP_PHY_PLL_LINK_CLK, 1 },
  85. { P_DP_PHY_PLL_VCO_DIV_CLK, 2 },
  86. };
  87. static const struct clk_parent_data dispcc_parent_data_1[] = {
  88. { .index = DT_BI_TCXO },
  89. { .index = DT_DP_PHY_PLL_LINK_CLK },
  90. { .index = DT_DP_PHY_PLL_VCO_DIV_CLK },
  91. };
  92. static const struct parent_map dispcc_parent_map_2[] = {
  93. { P_BI_TCXO, 0 },
  94. };
  95. static const struct clk_parent_data dispcc_parent_data_2[] = {
  96. { .index = DT_BI_TCXO },
  97. };
  98. static const struct clk_parent_data dispcc_parent_data_2_ao[] = {
  99. { .index = DT_BI_TCXO_AO },
  100. };
  101. static const struct parent_map dispcc_parent_map_3[] = {
  102. { P_BI_TCXO, 0 },
  103. { P_DISPCC_PLL0_OUT_MAIN, 1 },
  104. { P_GCC_DISP_GPLL0_CLK, 4 },
  105. { P_DISPCC_PLL0_OUT_EVEN, 5 },
  106. };
  107. static const struct clk_parent_data dispcc_parent_data_3[] = {
  108. { .index = DT_BI_TCXO },
  109. { .hw = &dispcc_pll0.clkr.hw },
  110. { .index = DT_GCC_DISP_GPLL0_CLK },
  111. { .hw = &dispcc_pll0.clkr.hw },
  112. };
  113. static const struct parent_map dispcc_parent_map_4[] = {
  114. { P_BI_TCXO, 0 },
  115. { P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
  116. { P_DSI1_PHY_PLL_OUT_DSICLK, 2 },
  117. };
  118. static const struct clk_parent_data dispcc_parent_data_4[] = {
  119. { .index = DT_BI_TCXO },
  120. { .index = DT_DSI0_PHY_PLL_OUT_DSICLK },
  121. { .index = DT_DSI1_PHY_PLL_OUT_DSICLK },
  122. };
  123. static const struct parent_map dispcc_parent_map_5[] = {
  124. { P_BI_TCXO, 0 },
  125. { P_GCC_DISP_GPLL0_CLK, 4 },
  126. };
  127. static const struct clk_parent_data dispcc_parent_data_5[] = {
  128. { .index = DT_BI_TCXO },
  129. { .index = DT_GCC_DISP_GPLL0_CLK },
  130. };
  131. static const struct parent_map dispcc_parent_map_6[] = {
  132. { P_CHIP_SLEEP_CLK, 0 },
  133. };
  134. static const struct clk_parent_data dispcc_parent_data_6[] = {
  135. { .index = DT_CHIP_SLEEP_CLK },
  136. };
  137. static const struct freq_tbl ftbl_dispcc_mdss_ahb_clk_src[] = {
  138. F(19200000, P_BI_TCXO, 1, 0, 0),
  139. F(37500000, P_GCC_DISP_GPLL0_CLK, 16, 0, 0),
  140. F(75000000, P_GCC_DISP_GPLL0_CLK, 8, 0, 0),
  141. { }
  142. };
  143. static struct clk_rcg2 dispcc_mdss_ahb_clk_src = {
  144. .cmd_rcgr = 0x22bc,
  145. .mnd_width = 0,
  146. .hid_width = 5,
  147. .parent_map = dispcc_parent_map_5,
  148. .freq_tbl = ftbl_dispcc_mdss_ahb_clk_src,
  149. .clkr.hw.init = &(const struct clk_init_data) {
  150. .name = "dispcc_mdss_ahb_clk_src",
  151. .parent_data = dispcc_parent_data_5,
  152. .num_parents = ARRAY_SIZE(dispcc_parent_data_5),
  153. .flags = CLK_SET_RATE_PARENT,
  154. .ops = &clk_rcg2_shared_ops,
  155. },
  156. };
  157. static const struct freq_tbl ftbl_dispcc_mdss_byte0_clk_src[] = {
  158. F(19200000, P_BI_TCXO, 1, 0, 0),
  159. { }
  160. };
  161. static struct clk_rcg2 dispcc_mdss_byte0_clk_src = {
  162. .cmd_rcgr = 0x2110,
  163. .mnd_width = 0,
  164. .hid_width = 5,
  165. .parent_map = dispcc_parent_map_0,
  166. .clkr.hw.init = &(const struct clk_init_data) {
  167. .name = "dispcc_mdss_byte0_clk_src",
  168. .parent_data = dispcc_parent_data_0,
  169. .num_parents = ARRAY_SIZE(dispcc_parent_data_0),
  170. .flags = CLK_SET_RATE_PARENT,
  171. .ops = &clk_byte2_ops,
  172. },
  173. };
  174. static struct clk_rcg2 dispcc_mdss_byte1_clk_src = {
  175. .cmd_rcgr = 0x212c,
  176. .mnd_width = 0,
  177. .hid_width = 5,
  178. .parent_map = dispcc_parent_map_0,
  179. .clkr.hw.init = &(const struct clk_init_data) {
  180. .name = "dispcc_mdss_byte1_clk_src",
  181. .parent_data = dispcc_parent_data_0,
  182. .num_parents = ARRAY_SIZE(dispcc_parent_data_0),
  183. .flags = CLK_SET_RATE_PARENT,
  184. .ops = &clk_byte2_ops,
  185. },
  186. };
  187. static struct clk_rcg2 dispcc_mdss_dp_aux_clk_src = {
  188. .cmd_rcgr = 0x21dc,
  189. .mnd_width = 0,
  190. .hid_width = 5,
  191. .parent_map = dispcc_parent_map_2,
  192. .freq_tbl = ftbl_dispcc_mdss_byte0_clk_src,
  193. .clkr.hw.init = &(const struct clk_init_data) {
  194. .name = "dispcc_mdss_dp_aux_clk_src",
  195. .parent_data = dispcc_parent_data_2,
  196. .num_parents = ARRAY_SIZE(dispcc_parent_data_2),
  197. .ops = &clk_rcg2_ops,
  198. },
  199. };
  200. static const struct freq_tbl ftbl_dispcc_mdss_dp_crypto_clk_src[] = {
  201. F(108000, P_DP_PHY_PLL_LINK_CLK, 3, 0, 0),
  202. F(180000, P_DP_PHY_PLL_LINK_CLK, 3, 0, 0),
  203. F(360000, P_DP_PHY_PLL_LINK_CLK, 1.5, 0, 0),
  204. F(540000, P_DP_PHY_PLL_LINK_CLK, 1.5, 0, 0),
  205. { }
  206. };
  207. static struct clk_rcg2 dispcc_mdss_dp_crypto_clk_src = {
  208. .cmd_rcgr = 0x2194,
  209. .mnd_width = 0,
  210. .hid_width = 5,
  211. .parent_map = dispcc_parent_map_1,
  212. .freq_tbl = ftbl_dispcc_mdss_dp_crypto_clk_src,
  213. .clkr.hw.init = &(const struct clk_init_data) {
  214. .name = "dispcc_mdss_dp_crypto_clk_src",
  215. .parent_data = dispcc_parent_data_1,
  216. .num_parents = ARRAY_SIZE(dispcc_parent_data_1),
  217. .ops = &clk_rcg2_ops,
  218. },
  219. };
  220. static struct clk_rcg2 dispcc_mdss_dp_link_clk_src = {
  221. .cmd_rcgr = 0x2178,
  222. .mnd_width = 0,
  223. .hid_width = 5,
  224. .parent_map = dispcc_parent_map_1,
  225. .clkr.hw.init = &(const struct clk_init_data) {
  226. .name = "dispcc_mdss_dp_link_clk_src",
  227. .parent_data = dispcc_parent_data_1,
  228. .num_parents = ARRAY_SIZE(dispcc_parent_data_1),
  229. .flags = CLK_SET_RATE_PARENT,
  230. .ops = &clk_byte2_ops,
  231. },
  232. };
  233. static struct clk_rcg2 dispcc_mdss_dp_pixel1_clk_src = {
  234. .cmd_rcgr = 0x21c4,
  235. .mnd_width = 16,
  236. .hid_width = 5,
  237. .parent_map = dispcc_parent_map_1,
  238. .clkr.hw.init = &(const struct clk_init_data) {
  239. .name = "dispcc_mdss_dp_pixel1_clk_src",
  240. .parent_data = dispcc_parent_data_1,
  241. .num_parents = ARRAY_SIZE(dispcc_parent_data_1),
  242. .flags = CLK_SET_RATE_PARENT,
  243. .ops = &clk_dp_ops,
  244. },
  245. };
  246. static struct clk_rcg2 dispcc_mdss_dp_pixel_clk_src = {
  247. .cmd_rcgr = 0x21ac,
  248. .mnd_width = 16,
  249. .hid_width = 5,
  250. .parent_map = dispcc_parent_map_1,
  251. .clkr.hw.init = &(const struct clk_init_data) {
  252. .name = "dispcc_mdss_dp_pixel_clk_src",
  253. .parent_data = dispcc_parent_data_1,
  254. .num_parents = ARRAY_SIZE(dispcc_parent_data_1),
  255. .flags = CLK_SET_RATE_PARENT,
  256. .ops = &clk_dp_ops,
  257. },
  258. };
  259. static struct clk_rcg2 dispcc_mdss_esc0_clk_src = {
  260. .cmd_rcgr = 0x2148,
  261. .mnd_width = 0,
  262. .hid_width = 5,
  263. .parent_map = dispcc_parent_map_0,
  264. .freq_tbl = ftbl_dispcc_mdss_byte0_clk_src,
  265. .clkr.hw.init = &(const struct clk_init_data) {
  266. .name = "dispcc_mdss_esc0_clk_src",
  267. .parent_data = dispcc_parent_data_0,
  268. .num_parents = ARRAY_SIZE(dispcc_parent_data_0),
  269. .ops = &clk_rcg2_ops,
  270. },
  271. };
  272. static struct clk_rcg2 dispcc_mdss_esc1_clk_src = {
  273. .cmd_rcgr = 0x2160,
  274. .mnd_width = 0,
  275. .hid_width = 5,
  276. .parent_map = dispcc_parent_map_0,
  277. .freq_tbl = ftbl_dispcc_mdss_byte0_clk_src,
  278. .clkr.hw.init = &(const struct clk_init_data) {
  279. .name = "dispcc_mdss_esc1_clk_src",
  280. .parent_data = dispcc_parent_data_0,
  281. .num_parents = ARRAY_SIZE(dispcc_parent_data_0),
  282. .ops = &clk_rcg2_ops,
  283. },
  284. };
  285. static const struct freq_tbl ftbl_dispcc_mdss_mdp_clk_src[] = {
  286. F(19200000, P_BI_TCXO, 1, 0, 0),
  287. F(85714286, P_GCC_DISP_GPLL0_CLK, 7, 0, 0),
  288. F(100000000, P_GCC_DISP_GPLL0_CLK, 6, 0, 0),
  289. F(150000000, P_GCC_DISP_GPLL0_CLK, 4, 0, 0),
  290. F(172000000, P_DISPCC_PLL0_OUT_MAIN, 5, 0, 0),
  291. F(200000000, P_GCC_DISP_GPLL0_CLK, 3, 0, 0),
  292. F(286666667, P_DISPCC_PLL0_OUT_MAIN, 3, 0, 0),
  293. F(300000000, P_GCC_DISP_GPLL0_CLK, 2, 0, 0),
  294. F(344000000, P_DISPCC_PLL0_OUT_MAIN, 2.5, 0, 0),
  295. F(430000000, P_DISPCC_PLL0_OUT_MAIN, 2, 0, 0),
  296. { }
  297. };
  298. static struct clk_rcg2 dispcc_mdss_mdp_clk_src = {
  299. .cmd_rcgr = 0x20c8,
  300. .mnd_width = 0,
  301. .hid_width = 5,
  302. .parent_map = dispcc_parent_map_3,
  303. .freq_tbl = ftbl_dispcc_mdss_mdp_clk_src,
  304. .clkr.hw.init = &(const struct clk_init_data) {
  305. .name = "dispcc_mdss_mdp_clk_src",
  306. .parent_data = dispcc_parent_data_3,
  307. .num_parents = ARRAY_SIZE(dispcc_parent_data_3),
  308. .flags = CLK_SET_RATE_PARENT,
  309. .ops = &clk_rcg2_shared_ops,
  310. },
  311. };
  312. static struct clk_rcg2 dispcc_mdss_pclk0_clk_src = {
  313. .cmd_rcgr = 0x2098,
  314. .mnd_width = 8,
  315. .hid_width = 5,
  316. .parent_map = dispcc_parent_map_4,
  317. .clkr.hw.init = &(const struct clk_init_data) {
  318. .name = "dispcc_mdss_pclk0_clk_src",
  319. .parent_data = dispcc_parent_data_4,
  320. .num_parents = ARRAY_SIZE(dispcc_parent_data_4),
  321. .flags = CLK_SET_RATE_PARENT,
  322. .ops = &clk_pixel_ops,
  323. },
  324. };
  325. static struct clk_rcg2 dispcc_mdss_pclk1_clk_src = {
  326. .cmd_rcgr = 0x20b0,
  327. .mnd_width = 8,
  328. .hid_width = 5,
  329. .parent_map = dispcc_parent_map_4,
  330. .clkr.hw.init = &(const struct clk_init_data) {
  331. .name = "dispcc_mdss_pclk1_clk_src",
  332. .parent_data = dispcc_parent_data_4,
  333. .num_parents = ARRAY_SIZE(dispcc_parent_data_4),
  334. .flags = CLK_SET_RATE_PARENT,
  335. .ops = &clk_pixel_ops,
  336. },
  337. };
  338. static const struct freq_tbl ftbl_dispcc_mdss_rot_clk_src[] = {
  339. F(19200000, P_BI_TCXO, 1, 0, 0),
  340. F(171428571, P_GCC_DISP_GPLL0_CLK, 3.5, 0, 0),
  341. F(200000000, P_GCC_DISP_GPLL0_CLK, 3, 0, 0),
  342. F(300000000, P_GCC_DISP_GPLL0_CLK, 2, 0, 0),
  343. F(344000000, P_DISPCC_PLL0_OUT_MAIN, 2.5, 0, 0),
  344. F(430000000, P_DISPCC_PLL0_OUT_MAIN, 2, 0, 0),
  345. { }
  346. };
  347. static struct clk_rcg2 dispcc_mdss_rot_clk_src = {
  348. .cmd_rcgr = 0x20e0,
  349. .mnd_width = 0,
  350. .hid_width = 5,
  351. .parent_map = dispcc_parent_map_3,
  352. .freq_tbl = ftbl_dispcc_mdss_rot_clk_src,
  353. .clkr.hw.init = &(const struct clk_init_data) {
  354. .name = "dispcc_mdss_rot_clk_src",
  355. .parent_data = dispcc_parent_data_3,
  356. .num_parents = ARRAY_SIZE(dispcc_parent_data_3),
  357. .ops = &clk_rcg2_shared_ops,
  358. },
  359. };
  360. static struct clk_rcg2 dispcc_mdss_vsync_clk_src = {
  361. .cmd_rcgr = 0x20f8,
  362. .mnd_width = 0,
  363. .hid_width = 5,
  364. .parent_map = dispcc_parent_map_2,
  365. .freq_tbl = ftbl_dispcc_mdss_byte0_clk_src,
  366. .clkr.hw.init = &(const struct clk_init_data) {
  367. .name = "dispcc_mdss_vsync_clk_src",
  368. .parent_data = dispcc_parent_data_2,
  369. .num_parents = ARRAY_SIZE(dispcc_parent_data_2),
  370. .ops = &clk_rcg2_ops,
  371. },
  372. };
  373. static const struct freq_tbl ftbl_dispcc_sleep_clk_src[] = {
  374. F(32000, P_CHIP_SLEEP_CLK, 1, 0, 0),
  375. { }
  376. };
  377. static struct clk_rcg2 dispcc_sleep_clk_src = {
  378. .cmd_rcgr = 0x6060,
  379. .mnd_width = 0,
  380. .hid_width = 5,
  381. .parent_map = dispcc_parent_map_6,
  382. .freq_tbl = ftbl_dispcc_sleep_clk_src,
  383. .clkr.hw.init = &(const struct clk_init_data) {
  384. .name = "dispcc_sleep_clk_src",
  385. .parent_data = dispcc_parent_data_6,
  386. .num_parents = ARRAY_SIZE(dispcc_parent_data_6),
  387. .ops = &clk_rcg2_ops,
  388. },
  389. };
  390. static struct clk_rcg2 dispcc_xo_clk_src = {
  391. .cmd_rcgr = 0x6044,
  392. .mnd_width = 0,
  393. .hid_width = 5,
  394. .parent_map = dispcc_parent_map_2,
  395. .freq_tbl = ftbl_dispcc_mdss_byte0_clk_src,
  396. .clkr.hw.init = &(const struct clk_init_data) {
  397. .name = "dispcc_xo_clk_src",
  398. .parent_data = dispcc_parent_data_2_ao,
  399. .num_parents = ARRAY_SIZE(dispcc_parent_data_2_ao),
  400. .ops = &clk_rcg2_ops,
  401. },
  402. };
  403. static struct clk_branch dispcc_mdss_ahb_clk = {
  404. .halt_reg = 0x2080,
  405. .halt_check = BRANCH_HALT,
  406. .clkr = {
  407. .enable_reg = 0x2080,
  408. .enable_mask = BIT(0),
  409. .hw.init = &(const struct clk_init_data) {
  410. .name = "dispcc_mdss_ahb_clk",
  411. .parent_hws = (const struct clk_hw*[]) {
  412. &dispcc_mdss_ahb_clk_src.clkr.hw,
  413. },
  414. .num_parents = 1,
  415. .flags = CLK_SET_RATE_PARENT,
  416. .ops = &clk_branch2_ops,
  417. },
  418. },
  419. };
  420. static struct clk_branch dispcc_mdss_byte0_clk = {
  421. .halt_reg = 0x2028,
  422. .halt_check = BRANCH_HALT,
  423. .clkr = {
  424. .enable_reg = 0x2028,
  425. .enable_mask = BIT(0),
  426. .hw.init = &(const struct clk_init_data) {
  427. .name = "dispcc_mdss_byte0_clk",
  428. .parent_hws = (const struct clk_hw*[]) {
  429. &dispcc_mdss_byte0_clk_src.clkr.hw,
  430. },
  431. .num_parents = 1,
  432. .flags = CLK_SET_RATE_PARENT,
  433. .ops = &clk_branch2_ops,
  434. },
  435. },
  436. };
  437. static struct clk_regmap_div dispcc_mdss_byte0_div_clk_src = {
  438. .reg = 0x2128,
  439. .shift = 0,
  440. .width = 2,
  441. .clkr = {
  442. .hw.init = &(const struct clk_init_data) {
  443. .name = "dispcc_mdss_byte0_div_clk_src",
  444. .parent_hws = (const struct clk_hw*[]) {
  445. &dispcc_mdss_byte0_clk_src.clkr.hw,
  446. },
  447. .num_parents = 1,
  448. .ops = &clk_regmap_div_ops,
  449. },
  450. },
  451. };
  452. static struct clk_branch dispcc_mdss_byte0_intf_clk = {
  453. .halt_reg = 0x202c,
  454. .halt_check = BRANCH_HALT,
  455. .clkr = {
  456. .enable_reg = 0x202c,
  457. .enable_mask = BIT(0),
  458. .hw.init = &(const struct clk_init_data) {
  459. .name = "dispcc_mdss_byte0_intf_clk",
  460. .parent_hws = (const struct clk_hw*[]) {
  461. &dispcc_mdss_byte0_div_clk_src.clkr.hw,
  462. },
  463. .num_parents = 1,
  464. .ops = &clk_branch2_ops,
  465. },
  466. },
  467. };
  468. static struct clk_branch dispcc_mdss_byte1_clk = {
  469. .halt_reg = 0x2030,
  470. .halt_check = BRANCH_HALT,
  471. .clkr = {
  472. .enable_reg = 0x2030,
  473. .enable_mask = BIT(0),
  474. .hw.init = &(const struct clk_init_data) {
  475. .name = "dispcc_mdss_byte1_clk",
  476. .parent_hws = (const struct clk_hw*[]) {
  477. &dispcc_mdss_byte1_clk_src.clkr.hw,
  478. },
  479. .num_parents = 1,
  480. .flags = CLK_SET_RATE_PARENT,
  481. .ops = &clk_branch2_ops,
  482. },
  483. },
  484. };
  485. static struct clk_regmap_div dispcc_mdss_byte1_div_clk_src = {
  486. .reg = 0x2144,
  487. .shift = 0,
  488. .width = 2,
  489. .clkr = {
  490. .hw.init = &(const struct clk_init_data) {
  491. .name = "dispcc_mdss_byte1_div_clk_src",
  492. .parent_hws = (const struct clk_hw*[]) {
  493. &dispcc_mdss_byte1_clk_src.clkr.hw,
  494. },
  495. .num_parents = 1,
  496. .ops = &clk_regmap_div_ops,
  497. },
  498. },
  499. };
  500. static struct clk_branch dispcc_mdss_byte1_intf_clk = {
  501. .halt_reg = 0x2034,
  502. .halt_check = BRANCH_HALT,
  503. .clkr = {
  504. .enable_reg = 0x2034,
  505. .enable_mask = BIT(0),
  506. .hw.init = &(const struct clk_init_data) {
  507. .name = "dispcc_mdss_byte1_intf_clk",
  508. .parent_hws = (const struct clk_hw*[]) {
  509. &dispcc_mdss_byte1_div_clk_src.clkr.hw,
  510. },
  511. .num_parents = 1,
  512. .flags = CLK_SET_RATE_PARENT,
  513. .ops = &clk_branch2_ops,
  514. },
  515. },
  516. };
  517. static struct clk_branch dispcc_mdss_dp_aux_clk = {
  518. .halt_reg = 0x2054,
  519. .halt_check = BRANCH_HALT,
  520. .clkr = {
  521. .enable_reg = 0x2054,
  522. .enable_mask = BIT(0),
  523. .hw.init = &(const struct clk_init_data) {
  524. .name = "dispcc_mdss_dp_aux_clk",
  525. .parent_hws = (const struct clk_hw*[]) {
  526. &dispcc_mdss_dp_aux_clk_src.clkr.hw,
  527. },
  528. .num_parents = 1,
  529. .flags = CLK_SET_RATE_PARENT,
  530. .ops = &clk_branch2_ops,
  531. },
  532. },
  533. };
  534. static struct clk_branch dispcc_mdss_dp_crypto_clk = {
  535. .halt_reg = 0x2048,
  536. .halt_check = BRANCH_HALT,
  537. .clkr = {
  538. .enable_reg = 0x2048,
  539. .enable_mask = BIT(0),
  540. .hw.init = &(const struct clk_init_data) {
  541. .name = "dispcc_mdss_dp_crypto_clk",
  542. .parent_hws = (const struct clk_hw*[]) {
  543. &dispcc_mdss_dp_crypto_clk_src.clkr.hw,
  544. },
  545. .num_parents = 1,
  546. .flags = CLK_SET_RATE_PARENT,
  547. .ops = &clk_branch2_ops,
  548. },
  549. },
  550. };
  551. static struct clk_branch dispcc_mdss_dp_link_clk = {
  552. .halt_reg = 0x2040,
  553. .halt_check = BRANCH_HALT,
  554. .clkr = {
  555. .enable_reg = 0x2040,
  556. .enable_mask = BIT(0),
  557. .hw.init = &(const struct clk_init_data) {
  558. .name = "dispcc_mdss_dp_link_clk",
  559. .parent_hws = (const struct clk_hw*[]) {
  560. &dispcc_mdss_dp_link_clk_src.clkr.hw,
  561. },
  562. .num_parents = 1,
  563. .flags = CLK_SET_RATE_PARENT,
  564. .ops = &clk_branch2_ops,
  565. },
  566. },
  567. };
  568. static struct clk_branch dispcc_mdss_dp_link_intf_clk = {
  569. .halt_reg = 0x2044,
  570. .halt_check = BRANCH_HALT,
  571. .clkr = {
  572. .enable_reg = 0x2044,
  573. .enable_mask = BIT(0),
  574. .hw.init = &(const struct clk_init_data) {
  575. .name = "dispcc_mdss_dp_link_intf_clk",
  576. .parent_hws = (const struct clk_hw*[]) {
  577. &dispcc_mdss_dp_link_clk_src.clkr.hw,
  578. },
  579. .num_parents = 1,
  580. .ops = &clk_branch2_ops,
  581. },
  582. },
  583. };
  584. static struct clk_branch dispcc_mdss_dp_pixel1_clk = {
  585. .halt_reg = 0x2050,
  586. .halt_check = BRANCH_HALT,
  587. .clkr = {
  588. .enable_reg = 0x2050,
  589. .enable_mask = BIT(0),
  590. .hw.init = &(const struct clk_init_data) {
  591. .name = "dispcc_mdss_dp_pixel1_clk",
  592. .parent_hws = (const struct clk_hw*[]) {
  593. &dispcc_mdss_dp_pixel1_clk_src.clkr.hw,
  594. },
  595. .num_parents = 1,
  596. .flags = CLK_SET_RATE_PARENT,
  597. .ops = &clk_branch2_ops,
  598. },
  599. },
  600. };
  601. static struct clk_branch dispcc_mdss_dp_pixel_clk = {
  602. .halt_reg = 0x204c,
  603. .halt_check = BRANCH_HALT,
  604. .clkr = {
  605. .enable_reg = 0x204c,
  606. .enable_mask = BIT(0),
  607. .hw.init = &(const struct clk_init_data) {
  608. .name = "dispcc_mdss_dp_pixel_clk",
  609. .parent_hws = (const struct clk_hw*[]) {
  610. &dispcc_mdss_dp_pixel_clk_src.clkr.hw,
  611. },
  612. .num_parents = 1,
  613. .flags = CLK_SET_RATE_PARENT,
  614. .ops = &clk_branch2_ops,
  615. },
  616. },
  617. };
  618. static struct clk_branch dispcc_mdss_esc0_clk = {
  619. .halt_reg = 0x2038,
  620. .halt_check = BRANCH_HALT,
  621. .clkr = {
  622. .enable_reg = 0x2038,
  623. .enable_mask = BIT(0),
  624. .hw.init = &(const struct clk_init_data) {
  625. .name = "dispcc_mdss_esc0_clk",
  626. .parent_hws = (const struct clk_hw*[]) {
  627. &dispcc_mdss_esc0_clk_src.clkr.hw,
  628. },
  629. .num_parents = 1,
  630. .flags = CLK_SET_RATE_PARENT,
  631. .ops = &clk_branch2_ops,
  632. },
  633. },
  634. };
  635. static struct clk_branch dispcc_mdss_esc1_clk = {
  636. .halt_reg = 0x203c,
  637. .halt_check = BRANCH_HALT,
  638. .clkr = {
  639. .enable_reg = 0x203c,
  640. .enable_mask = BIT(0),
  641. .hw.init = &(const struct clk_init_data) {
  642. .name = "dispcc_mdss_esc1_clk",
  643. .parent_hws = (const struct clk_hw*[]) {
  644. &dispcc_mdss_esc1_clk_src.clkr.hw,
  645. },
  646. .num_parents = 1,
  647. .flags = CLK_SET_RATE_PARENT,
  648. .ops = &clk_branch2_ops,
  649. },
  650. },
  651. };
  652. static struct clk_branch dispcc_mdss_mdp_clk = {
  653. .halt_reg = 0x200c,
  654. .halt_check = BRANCH_HALT,
  655. .clkr = {
  656. .enable_reg = 0x200c,
  657. .enable_mask = BIT(0),
  658. .hw.init = &(const struct clk_init_data) {
  659. .name = "dispcc_mdss_mdp_clk",
  660. .parent_hws = (const struct clk_hw*[]) {
  661. &dispcc_mdss_mdp_clk_src.clkr.hw,
  662. },
  663. .num_parents = 1,
  664. .flags = CLK_SET_RATE_PARENT,
  665. .ops = &clk_branch2_ops,
  666. },
  667. },
  668. };
  669. static struct clk_branch dispcc_mdss_mdp_lut_clk = {
  670. .halt_reg = 0x201c,
  671. .halt_check = BRANCH_VOTED,
  672. .clkr = {
  673. .enable_reg = 0x201c,
  674. .enable_mask = BIT(0),
  675. .hw.init = &(const struct clk_init_data) {
  676. .name = "dispcc_mdss_mdp_lut_clk",
  677. .parent_hws = (const struct clk_hw*[]) {
  678. &dispcc_mdss_mdp_clk_src.clkr.hw,
  679. },
  680. .num_parents = 1,
  681. .ops = &clk_branch2_ops,
  682. },
  683. },
  684. };
  685. static struct clk_branch dispcc_mdss_non_gdsc_ahb_clk = {
  686. .halt_reg = 0x4004,
  687. .halt_check = BRANCH_VOTED,
  688. .clkr = {
  689. .enable_reg = 0x4004,
  690. .enable_mask = BIT(0),
  691. .hw.init = &(const struct clk_init_data) {
  692. .name = "dispcc_mdss_non_gdsc_ahb_clk",
  693. .parent_hws = (const struct clk_hw*[]) {
  694. &dispcc_mdss_ahb_clk_src.clkr.hw,
  695. },
  696. .num_parents = 1,
  697. .flags = CLK_SET_RATE_PARENT,
  698. .ops = &clk_branch2_ops,
  699. },
  700. },
  701. };
  702. static struct clk_branch dispcc_mdss_pclk0_clk = {
  703. .halt_reg = 0x2004,
  704. .halt_check = BRANCH_HALT,
  705. .clkr = {
  706. .enable_reg = 0x2004,
  707. .enable_mask = BIT(0),
  708. .hw.init = &(const struct clk_init_data) {
  709. .name = "dispcc_mdss_pclk0_clk",
  710. .parent_hws = (const struct clk_hw*[]) {
  711. &dispcc_mdss_pclk0_clk_src.clkr.hw,
  712. },
  713. .num_parents = 1,
  714. .flags = CLK_SET_RATE_PARENT,
  715. .ops = &clk_branch2_ops,
  716. },
  717. },
  718. };
  719. static struct clk_branch dispcc_mdss_pclk1_clk = {
  720. .halt_reg = 0x2008,
  721. .halt_check = BRANCH_HALT,
  722. .clkr = {
  723. .enable_reg = 0x2008,
  724. .enable_mask = BIT(0),
  725. .hw.init = &(const struct clk_init_data) {
  726. .name = "dispcc_mdss_pclk1_clk",
  727. .parent_hws = (const struct clk_hw*[]) {
  728. &dispcc_mdss_pclk1_clk_src.clkr.hw,
  729. },
  730. .num_parents = 1,
  731. .flags = CLK_SET_RATE_PARENT,
  732. .ops = &clk_branch2_ops,
  733. },
  734. },
  735. };
  736. static struct clk_branch dispcc_mdss_rot_clk = {
  737. .halt_reg = 0x2014,
  738. .halt_check = BRANCH_HALT,
  739. .clkr = {
  740. .enable_reg = 0x2014,
  741. .enable_mask = BIT(0),
  742. .hw.init = &(const struct clk_init_data) {
  743. .name = "dispcc_mdss_rot_clk",
  744. .parent_hws = (const struct clk_hw*[]) {
  745. &dispcc_mdss_rot_clk_src.clkr.hw,
  746. },
  747. .num_parents = 1,
  748. .flags = CLK_SET_RATE_PARENT,
  749. .ops = &clk_branch2_ops,
  750. },
  751. },
  752. };
  753. static struct clk_branch dispcc_mdss_rscc_ahb_clk = {
  754. .halt_reg = 0x400c,
  755. .halt_check = BRANCH_HALT,
  756. .clkr = {
  757. .enable_reg = 0x400c,
  758. .enable_mask = BIT(0),
  759. .hw.init = &(const struct clk_init_data) {
  760. .name = "dispcc_mdss_rscc_ahb_clk",
  761. .parent_names = (const char *[]) {
  762. "dispcc_mdss_ahb_clk_src",
  763. },
  764. .num_parents = 1,
  765. .flags = CLK_SET_RATE_PARENT,
  766. .ops = &clk_branch2_ops,
  767. },
  768. },
  769. };
  770. static struct clk_branch dispcc_mdss_rscc_vsync_clk = {
  771. .halt_reg = 0x4008,
  772. .halt_check = BRANCH_HALT,
  773. .clkr = {
  774. .enable_reg = 0x4008,
  775. .enable_mask = BIT(0),
  776. .hw.init = &(const struct clk_init_data) {
  777. .name = "dispcc_mdss_rscc_vsync_clk",
  778. .parent_hws = (const struct clk_hw*[]) {
  779. &dispcc_mdss_vsync_clk_src.clkr.hw,
  780. },
  781. .num_parents = 1,
  782. .flags = CLK_SET_RATE_PARENT,
  783. .ops = &clk_branch2_ops,
  784. },
  785. },
  786. };
  787. static struct clk_branch dispcc_mdss_vsync_clk = {
  788. .halt_reg = 0x2024,
  789. .halt_check = BRANCH_HALT,
  790. .clkr = {
  791. .enable_reg = 0x2024,
  792. .enable_mask = BIT(0),
  793. .hw.init = &(const struct clk_init_data) {
  794. .name = "dispcc_mdss_vsync_clk",
  795. .parent_hws = (const struct clk_hw*[]) {
  796. &dispcc_mdss_vsync_clk_src.clkr.hw,
  797. },
  798. .num_parents = 1,
  799. .flags = CLK_SET_RATE_PARENT,
  800. .ops = &clk_branch2_ops,
  801. },
  802. },
  803. };
  804. static struct clk_branch dispcc_sleep_clk = {
  805. .halt_reg = 0x6078,
  806. .halt_check = BRANCH_HALT,
  807. .clkr = {
  808. .enable_reg = 0x6078,
  809. .enable_mask = BIT(0),
  810. .hw.init = &(const struct clk_init_data) {
  811. .name = "dispcc_sleep_clk",
  812. .parent_names = (const char *[]) {
  813. "dispcc_sleep_clk_src",
  814. },
  815. .num_parents = 1,
  816. .flags = CLK_SET_RATE_PARENT,
  817. .ops = &clk_branch2_ops,
  818. },
  819. },
  820. };
  821. static struct gdsc mdss_gdsc = {
  822. .gdscr = 0x3000,
  823. .en_rest_wait_val = 0x2,
  824. .en_few_wait_val = 0x2,
  825. .clk_dis_wait_val = 0xf,
  826. .pd = {
  827. .name = "mdss_gdsc",
  828. },
  829. .pwrsts = PWRSTS_OFF_ON,
  830. .flags = HW_CTRL,
  831. };
  832. static struct clk_regmap *dispcc_sm7150_clocks[] = {
  833. [DISPCC_MDSS_AHB_CLK] = &dispcc_mdss_ahb_clk.clkr,
  834. [DISPCC_MDSS_AHB_CLK_SRC] = &dispcc_mdss_ahb_clk_src.clkr,
  835. [DISPCC_MDSS_BYTE0_CLK] = &dispcc_mdss_byte0_clk.clkr,
  836. [DISPCC_MDSS_BYTE0_CLK_SRC] = &dispcc_mdss_byte0_clk_src.clkr,
  837. [DISPCC_MDSS_BYTE0_DIV_CLK_SRC] = &dispcc_mdss_byte0_div_clk_src.clkr,
  838. [DISPCC_MDSS_BYTE0_INTF_CLK] = &dispcc_mdss_byte0_intf_clk.clkr,
  839. [DISPCC_MDSS_BYTE1_CLK] = &dispcc_mdss_byte1_clk.clkr,
  840. [DISPCC_MDSS_BYTE1_CLK_SRC] = &dispcc_mdss_byte1_clk_src.clkr,
  841. [DISPCC_MDSS_BYTE1_DIV_CLK_SRC] = &dispcc_mdss_byte1_div_clk_src.clkr,
  842. [DISPCC_MDSS_BYTE1_INTF_CLK] = &dispcc_mdss_byte1_intf_clk.clkr,
  843. [DISPCC_MDSS_DP_AUX_CLK] = &dispcc_mdss_dp_aux_clk.clkr,
  844. [DISPCC_MDSS_DP_AUX_CLK_SRC] = &dispcc_mdss_dp_aux_clk_src.clkr,
  845. [DISPCC_MDSS_DP_CRYPTO_CLK] = &dispcc_mdss_dp_crypto_clk.clkr,
  846. [DISPCC_MDSS_DP_CRYPTO_CLK_SRC] = &dispcc_mdss_dp_crypto_clk_src.clkr,
  847. [DISPCC_MDSS_DP_LINK_CLK] = &dispcc_mdss_dp_link_clk.clkr,
  848. [DISPCC_MDSS_DP_LINK_CLK_SRC] = &dispcc_mdss_dp_link_clk_src.clkr,
  849. [DISPCC_MDSS_DP_LINK_INTF_CLK] = &dispcc_mdss_dp_link_intf_clk.clkr,
  850. [DISPCC_MDSS_DP_PIXEL1_CLK] = &dispcc_mdss_dp_pixel1_clk.clkr,
  851. [DISPCC_MDSS_DP_PIXEL1_CLK_SRC] = &dispcc_mdss_dp_pixel1_clk_src.clkr,
  852. [DISPCC_MDSS_DP_PIXEL_CLK] = &dispcc_mdss_dp_pixel_clk.clkr,
  853. [DISPCC_MDSS_DP_PIXEL_CLK_SRC] = &dispcc_mdss_dp_pixel_clk_src.clkr,
  854. [DISPCC_MDSS_ESC0_CLK] = &dispcc_mdss_esc0_clk.clkr,
  855. [DISPCC_MDSS_ESC0_CLK_SRC] = &dispcc_mdss_esc0_clk_src.clkr,
  856. [DISPCC_MDSS_ESC1_CLK] = &dispcc_mdss_esc1_clk.clkr,
  857. [DISPCC_MDSS_ESC1_CLK_SRC] = &dispcc_mdss_esc1_clk_src.clkr,
  858. [DISPCC_MDSS_MDP_CLK] = &dispcc_mdss_mdp_clk.clkr,
  859. [DISPCC_MDSS_MDP_CLK_SRC] = &dispcc_mdss_mdp_clk_src.clkr,
  860. [DISPCC_MDSS_MDP_LUT_CLK] = &dispcc_mdss_mdp_lut_clk.clkr,
  861. [DISPCC_MDSS_NON_GDSC_AHB_CLK] = &dispcc_mdss_non_gdsc_ahb_clk.clkr,
  862. [DISPCC_MDSS_PCLK0_CLK] = &dispcc_mdss_pclk0_clk.clkr,
  863. [DISPCC_MDSS_PCLK0_CLK_SRC] = &dispcc_mdss_pclk0_clk_src.clkr,
  864. [DISPCC_MDSS_PCLK1_CLK] = &dispcc_mdss_pclk1_clk.clkr,
  865. [DISPCC_MDSS_PCLK1_CLK_SRC] = &dispcc_mdss_pclk1_clk_src.clkr,
  866. [DISPCC_MDSS_ROT_CLK] = &dispcc_mdss_rot_clk.clkr,
  867. [DISPCC_MDSS_ROT_CLK_SRC] = &dispcc_mdss_rot_clk_src.clkr,
  868. [DISPCC_MDSS_RSCC_AHB_CLK] = &dispcc_mdss_rscc_ahb_clk.clkr,
  869. [DISPCC_MDSS_RSCC_VSYNC_CLK] = &dispcc_mdss_rscc_vsync_clk.clkr,
  870. [DISPCC_MDSS_VSYNC_CLK] = &dispcc_mdss_vsync_clk.clkr,
  871. [DISPCC_MDSS_VSYNC_CLK_SRC] = &dispcc_mdss_vsync_clk_src.clkr,
  872. [DISPCC_PLL0] = &dispcc_pll0.clkr,
  873. [DISPCC_SLEEP_CLK] = &dispcc_sleep_clk.clkr,
  874. [DISPCC_SLEEP_CLK_SRC] = &dispcc_sleep_clk_src.clkr,
  875. [DISPCC_XO_CLK_SRC] = &dispcc_xo_clk_src.clkr,
  876. };
  877. static struct gdsc *dispcc_sm7150_gdscs[] = {
  878. [MDSS_GDSC] = &mdss_gdsc,
  879. };
  880. static const struct regmap_config dispcc_sm7150_regmap_config = {
  881. .reg_bits = 32,
  882. .reg_stride = 4,
  883. .val_bits = 32,
  884. .max_register = 0x10000,
  885. .fast_io = true,
  886. };
  887. static const struct qcom_cc_desc dispcc_sm7150_desc = {
  888. .config = &dispcc_sm7150_regmap_config,
  889. .clks = dispcc_sm7150_clocks,
  890. .num_clks = ARRAY_SIZE(dispcc_sm7150_clocks),
  891. .gdscs = dispcc_sm7150_gdscs,
  892. .num_gdscs = ARRAY_SIZE(dispcc_sm7150_gdscs),
  893. };
  894. static const struct of_device_id dispcc_sm7150_match_table[] = {
  895. { .compatible = "qcom,sm7150-dispcc" },
  896. { }
  897. };
  898. MODULE_DEVICE_TABLE(of, dispcc_sm7150_match_table);
  899. static int dispcc_sm7150_probe(struct platform_device *pdev)
  900. {
  901. struct regmap *regmap;
  902. regmap = qcom_cc_map(pdev, &dispcc_sm7150_desc);
  903. if (IS_ERR(regmap))
  904. return PTR_ERR(regmap);
  905. clk_fabia_pll_configure(&dispcc_pll0, regmap, &dispcc_pll0_config);
  906. /* Enable clock gating for DSI and MDP clocks */
  907. regmap_update_bits(regmap, 0x8000, 0x7f0, 0x7f0);
  908. /* Keep some clocks always-on */
  909. qcom_branch_set_clk_en(regmap, 0x605c); /* DISPCC_XO_CLK */
  910. return qcom_cc_really_probe(&pdev->dev, &dispcc_sm7150_desc, regmap);
  911. }
  912. static struct platform_driver dispcc_sm7150_driver = {
  913. .probe = dispcc_sm7150_probe,
  914. .driver = {
  915. .name = "dispcc-sm7150",
  916. .of_match_table = dispcc_sm7150_match_table,
  917. },
  918. };
  919. module_platform_driver(dispcc_sm7150_driver);
  920. MODULE_DESCRIPTION("Qualcomm SM7150 Display Clock Controller");
  921. MODULE_LICENSE("GPL");