dispcc-pitti.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
  4. */
  5. #include <linux/clk.h>
  6. #include <linux/clk-provider.h>
  7. #include <linux/kernel.h>
  8. #include <linux/module.h>
  9. #include <linux/of_device.h>
  10. #include <linux/of.h>
  11. #include <linux/regmap.h>
  12. #include <dt-bindings/clock/qcom,dispcc-pitti.h>
  13. #include "clk-alpha-pll.h"
  14. #include "clk-branch.h"
  15. #include "clk-rcg.h"
  16. #include "clk-regmap.h"
  17. #include "clk-regmap-divider.h"
  18. #include "common.h"
  19. #include "reset.h"
  20. #include "vdd-level-holi.h"
  21. #define DISP_CC_MISC_CMD 0xF000
  22. static DEFINE_VDD_REGULATORS(vdd_cx, VDD_HIGH + 1, 1, vdd_corner);
  23. static DEFINE_VDD_REGULATORS(vdd_mx, VDD_HIGH + 1, 1, vdd_corner);
  24. static struct clk_vdd_class *disp_cc_pitti_regulators[] = {
  25. &vdd_cx,
  26. &vdd_mx,
  27. };
  28. enum {
  29. P_BI_TCXO,
  30. P_DISP_CC_PLL0_OUT_MAIN,
  31. P_DISP_CC_PLL1_OUT_EVEN,
  32. P_DISP_CC_PLL1_OUT_MAIN,
  33. P_DSI0_PHY_PLL_OUT_BYTECLK,
  34. P_DSI0_PHY_PLL_OUT_DSICLK,
  35. P_SLEEP_CLK,
  36. };
  37. static const struct pll_vco lucid_evo_vco[] = {
  38. { 249600000, 2020000000, 0 },
  39. };
  40. /* 600MHz Configuration */
  41. static const struct alpha_pll_config disp_cc_pll0_config = {
  42. .l = 0x1f,
  43. .cal_l = 0x44,
  44. .alpha = 0x4000,
  45. .config_ctl_val = 0x20485699,
  46. .config_ctl_hi_val = 0x00182261,
  47. .config_ctl_hi1_val = 0x32aa299c,
  48. .user_ctl_val = 0x00000001,
  49. .user_ctl_hi_val = 0x00000805,
  50. };
  51. static struct clk_alpha_pll disp_cc_pll0 = {
  52. .offset = 0x0,
  53. .vco_table = lucid_evo_vco,
  54. .num_vco = ARRAY_SIZE(lucid_evo_vco),
  55. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
  56. .clkr = {
  57. .hw.init = &(const struct clk_init_data) {
  58. .name = "disp_cc_pll0",
  59. .parent_data = &(const struct clk_parent_data) {
  60. .fw_name = "bi_tcxo",
  61. },
  62. .num_parents = 1,
  63. .ops = &clk_alpha_pll_lucid_evo_ops,
  64. },
  65. .vdd_data = {
  66. .vdd_class = &vdd_cx,
  67. .num_rate_max = VDD_NUM,
  68. .rate_max = (unsigned long[VDD_NUM]) {
  69. [VDD_LOWER_D1] = 500000000,
  70. [VDD_LOWER] = 615000000,
  71. [VDD_LOW] = 1066000000,
  72. [VDD_LOW_L1] = 1500000000,
  73. [VDD_NOMINAL] = 1800000000,
  74. [VDD_HIGH] = 2020000000},
  75. },
  76. },
  77. };
  78. /* 600MHz Configuration */
  79. static const struct alpha_pll_config disp_cc_pll1_config = {
  80. .l = 0x1f,
  81. .cal_l = 0x44,
  82. .alpha = 0x4000,
  83. .config_ctl_val = 0x20485699,
  84. .config_ctl_hi_val = 0x00182261,
  85. .config_ctl_hi1_val = 0x32aa299c,
  86. .user_ctl_val = 0x00000001,
  87. .user_ctl_hi_val = 0x00000805,
  88. };
  89. static struct clk_alpha_pll disp_cc_pll1 = {
  90. .offset = 0x1000,
  91. .vco_table = lucid_evo_vco,
  92. .num_vco = ARRAY_SIZE(lucid_evo_vco),
  93. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
  94. .clkr = {
  95. .hw.init = &(const struct clk_init_data) {
  96. .name = "disp_cc_pll1",
  97. .parent_data = &(const struct clk_parent_data) {
  98. .fw_name = "bi_tcxo",
  99. },
  100. .num_parents = 1,
  101. .ops = &clk_alpha_pll_lucid_evo_ops,
  102. },
  103. .vdd_data = {
  104. .vdd_class = &vdd_cx,
  105. .num_rate_max = VDD_NUM,
  106. .rate_max = (unsigned long[VDD_NUM]) {
  107. [VDD_LOWER_D1] = 500000000,
  108. [VDD_LOWER] = 615000000,
  109. [VDD_LOW] = 1066000000,
  110. [VDD_LOW_L1] = 1500000000,
  111. [VDD_NOMINAL] = 1800000000,
  112. [VDD_HIGH] = 2020000000},
  113. },
  114. },
  115. };
  116. static const struct parent_map disp_cc_parent_map_0[] = {
  117. { P_BI_TCXO, 0 },
  118. { P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
  119. { P_DSI0_PHY_PLL_OUT_BYTECLK, 2 },
  120. };
  121. static const struct clk_parent_data disp_cc_parent_data_0[] = {
  122. { .fw_name = "bi_tcxo" },
  123. { .fw_name = "dsi0_phy_pll_out_dsiclk", .name = "dsi0_phy_pll_out_dsiclk" },
  124. { .fw_name = "dsi0_phy_pll_out_byteclk", .name = "dsi0_phy_pll_out_byteclk" },
  125. };
  126. static const struct parent_map disp_cc_parent_map_1[] = {
  127. { P_BI_TCXO, 0 },
  128. { P_DISP_CC_PLL0_OUT_MAIN, 1 },
  129. { P_DISP_CC_PLL1_OUT_MAIN, 4 },
  130. { P_DISP_CC_PLL1_OUT_EVEN, 6 },
  131. };
  132. static const struct clk_parent_data disp_cc_parent_data_1[] = {
  133. { .fw_name = "bi_tcxo" },
  134. { .hw = &disp_cc_pll0.clkr.hw },
  135. { .hw = &disp_cc_pll1.clkr.hw },
  136. { .hw = &disp_cc_pll1.clkr.hw },
  137. };
  138. static const struct parent_map disp_cc_parent_map_2[] = {
  139. { P_BI_TCXO, 0 },
  140. };
  141. static const struct clk_parent_data disp_cc_parent_data_2[] = {
  142. { .fw_name = "bi_tcxo" },
  143. };
  144. static const struct parent_map disp_cc_parent_map_3[] = {
  145. { P_BI_TCXO, 0 },
  146. { P_DISP_CC_PLL1_OUT_MAIN, 4 },
  147. { P_DISP_CC_PLL1_OUT_EVEN, 6 },
  148. };
  149. static const struct clk_parent_data disp_cc_parent_data_3[] = {
  150. { .fw_name = "bi_tcxo" },
  151. { .hw = &disp_cc_pll1.clkr.hw },
  152. { .hw = &disp_cc_pll1.clkr.hw },
  153. };
  154. static const struct parent_map disp_cc_parent_map_4[] = {
  155. { P_BI_TCXO, 0 },
  156. { P_DSI0_PHY_PLL_OUT_BYTECLK, 2 },
  157. };
  158. static const struct clk_parent_data disp_cc_parent_data_4[] = {
  159. { .fw_name = "bi_tcxo" },
  160. { .fw_name = "dsi0_phy_pll_out_byteclk", .name = "dsi0_phy_pll_out_byteclk" },
  161. };
  162. static const struct parent_map disp_cc_parent_map_5[] = {
  163. { P_SLEEP_CLK, 0 },
  164. };
  165. static const struct clk_parent_data disp_cc_parent_data_5[] = {
  166. { .fw_name = "sleep_clk" },
  167. };
  168. static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
  169. F(19200000, P_BI_TCXO, 1, 0, 0),
  170. F(37500000, P_DISP_CC_PLL1_OUT_MAIN, 16, 0, 0),
  171. F(75000000, P_DISP_CC_PLL1_OUT_MAIN, 8, 0, 0),
  172. { }
  173. };
  174. static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
  175. .cmd_rcgr = 0x82a4,
  176. .mnd_width = 0,
  177. .hid_width = 5,
  178. .parent_map = disp_cc_parent_map_3,
  179. .freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
  180. .enable_safe_config = true,
  181. .flags = HW_CLK_CTRL_MODE,
  182. .clkr.hw.init = &(const struct clk_init_data) {
  183. .name = "disp_cc_mdss_ahb_clk_src",
  184. .parent_data = disp_cc_parent_data_3,
  185. .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
  186. .ops = &clk_rcg2_ops,
  187. },
  188. .clkr.vdd_data = {
  189. .vdd_class = &vdd_cx,
  190. .num_rate_max = VDD_NUM,
  191. .rate_max = (unsigned long[VDD_NUM]) {
  192. [VDD_LOWER] = 19200000,
  193. [VDD_LOW] = 37500000,
  194. [VDD_NOMINAL] = 75000000},
  195. },
  196. };
  197. static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
  198. .cmd_rcgr = 0x80f8,
  199. .mnd_width = 0,
  200. .hid_width = 5,
  201. .parent_map = disp_cc_parent_map_0,
  202. .clkr.hw.init = &(const struct clk_init_data) {
  203. .name = "disp_cc_mdss_byte0_clk_src",
  204. .parent_data = disp_cc_parent_data_0,
  205. .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
  206. .flags = CLK_SET_RATE_PARENT,
  207. .ops = &clk_byte2_ops,
  208. },
  209. .clkr.vdd_data = {
  210. .vdd_class = &vdd_cx,
  211. .num_rate_max = VDD_NUM,
  212. .rate_max = (unsigned long[VDD_NUM]) {
  213. [VDD_LOWER] = 187500000,
  214. [VDD_LOW] = 300000000,
  215. [VDD_LOW_L1] = 358000000},
  216. },
  217. };
  218. static const struct freq_tbl ftbl_disp_cc_mdss_esc0_clk_src[] = {
  219. F(19200000, P_BI_TCXO, 1, 0, 0),
  220. { }
  221. };
  222. static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
  223. .cmd_rcgr = 0x8114,
  224. .mnd_width = 0,
  225. .hid_width = 5,
  226. .parent_map = disp_cc_parent_map_4,
  227. .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
  228. .clkr.hw.init = &(const struct clk_init_data) {
  229. .name = "disp_cc_mdss_esc0_clk_src",
  230. .parent_data = disp_cc_parent_data_4,
  231. .num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
  232. .ops = &clk_rcg2_ops,
  233. },
  234. .clkr.vdd_data = {
  235. .vdd_class = &vdd_cx,
  236. .num_rate_max = VDD_NUM,
  237. .rate_max = (unsigned long[VDD_NUM]) {
  238. [VDD_LOWER] = 19200000},
  239. },
  240. };
  241. static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
  242. F(200000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
  243. F(325000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
  244. F(380000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
  245. F(506000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
  246. F(608000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
  247. { }
  248. };
  249. static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
  250. .cmd_rcgr = 0x80b0,
  251. .mnd_width = 0,
  252. .hid_width = 5,
  253. .parent_map = disp_cc_parent_map_1,
  254. .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
  255. .enable_safe_config = true,
  256. .flags = HW_CLK_CTRL_MODE,
  257. .clkr.hw.init = &(const struct clk_init_data) {
  258. .name = "disp_cc_mdss_mdp_clk_src",
  259. .parent_data = disp_cc_parent_data_1,
  260. .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
  261. .flags = CLK_SET_RATE_PARENT,
  262. .ops = &clk_rcg2_ops,
  263. },
  264. .clkr.vdd_data = {
  265. .vdd_classes = disp_cc_pitti_regulators,
  266. .num_vdd_classes = ARRAY_SIZE(disp_cc_pitti_regulators),
  267. .num_rate_max = VDD_NUM,
  268. .rate_max = (unsigned long[VDD_NUM]) {
  269. [VDD_LOWER] = 200000000,
  270. [VDD_LOW] = 325000000,
  271. [VDD_LOW_L1] = 380000000,
  272. [VDD_NOMINAL] = 506000000,
  273. [VDD_HIGH] = 608000000},
  274. },
  275. };
  276. static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
  277. .cmd_rcgr = 0x8098,
  278. .mnd_width = 8,
  279. .hid_width = 5,
  280. .parent_map = disp_cc_parent_map_0,
  281. .clkr.hw.init = &(const struct clk_init_data) {
  282. .name = "disp_cc_mdss_pclk0_clk_src",
  283. .parent_data = disp_cc_parent_data_0,
  284. .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
  285. .flags = CLK_SET_RATE_PARENT,
  286. .ops = &clk_pixel_ops,
  287. },
  288. .clkr.vdd_data = {
  289. .vdd_class = &vdd_cx,
  290. .num_rate_max = VDD_NUM,
  291. .rate_max = (unsigned long[VDD_NUM]) {
  292. [VDD_LOWER] = 328125000,
  293. [VDD_LOW] = 525000000,
  294. [VDD_LOW_L1] = 625000000},
  295. },
  296. };
  297. static const struct freq_tbl ftbl_disp_cc_mdss_rot_clk_src[] = {
  298. F(200000000, P_DISP_CC_PLL1_OUT_MAIN, 3, 0, 0),
  299. F(300000000, P_DISP_CC_PLL1_OUT_MAIN, 2, 0, 0),
  300. { }
  301. };
  302. static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
  303. .cmd_rcgr = 0x80c8,
  304. .mnd_width = 0,
  305. .hid_width = 5,
  306. .parent_map = disp_cc_parent_map_1,
  307. .freq_tbl = ftbl_disp_cc_mdss_rot_clk_src,
  308. .enable_safe_config = true,
  309. .flags = HW_CLK_CTRL_MODE,
  310. .clkr.hw.init = &(const struct clk_init_data) {
  311. .name = "disp_cc_mdss_rot_clk_src",
  312. .parent_data = disp_cc_parent_data_1,
  313. .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
  314. .ops = &clk_rcg2_ops,
  315. },
  316. .clkr.vdd_data = {
  317. .vdd_classes = disp_cc_pitti_regulators,
  318. .num_vdd_classes = ARRAY_SIZE(disp_cc_pitti_regulators),
  319. .num_rate_max = VDD_NUM,
  320. .rate_max = (unsigned long[VDD_NUM]) {
  321. [VDD_LOWER] = 200000000,
  322. [VDD_LOW] = 300000000},
  323. },
  324. };
  325. static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
  326. .cmd_rcgr = 0x80e0,
  327. .mnd_width = 0,
  328. .hid_width = 5,
  329. .parent_map = disp_cc_parent_map_2,
  330. .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
  331. .clkr.hw.init = &(const struct clk_init_data) {
  332. .name = "disp_cc_mdss_vsync_clk_src",
  333. .parent_data = disp_cc_parent_data_2,
  334. .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
  335. .ops = &clk_rcg2_ops,
  336. },
  337. .clkr.vdd_data = {
  338. .vdd_class = &vdd_cx,
  339. .num_rate_max = VDD_NUM,
  340. .rate_max = (unsigned long[VDD_NUM]) {
  341. [VDD_LOWER] = 19200000},
  342. },
  343. };
  344. static const struct freq_tbl ftbl_disp_cc_sleep_clk_src[] = {
  345. F(32000, P_SLEEP_CLK, 1, 0, 0),
  346. { }
  347. };
  348. static struct clk_rcg2 disp_cc_sleep_clk_src = {
  349. .cmd_rcgr = 0xe058,
  350. .mnd_width = 0,
  351. .hid_width = 5,
  352. .parent_map = disp_cc_parent_map_5,
  353. .freq_tbl = ftbl_disp_cc_sleep_clk_src,
  354. .clkr.hw.init = &(const struct clk_init_data) {
  355. .name = "disp_cc_sleep_clk_src",
  356. .parent_data = disp_cc_parent_data_5,
  357. .num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
  358. .ops = &clk_rcg2_ops,
  359. },
  360. .clkr.vdd_data = {
  361. .vdd_class = &vdd_cx,
  362. .num_rate_max = VDD_NUM,
  363. .rate_max = (unsigned long[VDD_NUM]) {
  364. [VDD_LOWER] = 32000},
  365. },
  366. };
  367. static struct clk_rcg2 disp_cc_xo_clk_src = {
  368. .cmd_rcgr = 0xe03c,
  369. .mnd_width = 0,
  370. .hid_width = 5,
  371. .parent_map = disp_cc_parent_map_2,
  372. .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
  373. .clkr.hw.init = &(const struct clk_init_data) {
  374. .name = "disp_cc_xo_clk_src",
  375. .parent_data = disp_cc_parent_data_2,
  376. .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
  377. .ops = &clk_rcg2_ops,
  378. },
  379. .clkr.vdd_data = {
  380. .vdd_class = &vdd_cx,
  381. .num_rate_max = VDD_NUM,
  382. .rate_max = (unsigned long[VDD_NUM]) {
  383. [VDD_LOWER] = 19200000},
  384. },
  385. };
  386. static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
  387. .reg = 0x8110,
  388. .shift = 0,
  389. .width = 4,
  390. .clkr.hw.init = &(const struct clk_init_data) {
  391. .name = "disp_cc_mdss_byte0_div_clk_src",
  392. .parent_hws = (const struct clk_hw*[]) {
  393. &disp_cc_mdss_byte0_clk_src.clkr.hw,
  394. },
  395. .num_parents = 1,
  396. .ops = &clk_regmap_div_ops,
  397. },
  398. };
  399. static struct clk_branch disp_cc_mdss_accu_clk = {
  400. .halt_reg = 0xe074,
  401. .halt_check = BRANCH_HALT_VOTED,
  402. .clkr = {
  403. .enable_reg = 0xe074,
  404. .enable_mask = BIT(0),
  405. .hw.init = &(const struct clk_init_data) {
  406. .name = "disp_cc_mdss_accu_clk",
  407. .parent_hws = (const struct clk_hw*[]) {
  408. &disp_cc_xo_clk_src.clkr.hw,
  409. },
  410. .num_parents = 1,
  411. .flags = CLK_SET_RATE_PARENT,
  412. .ops = &clk_branch2_ops,
  413. },
  414. },
  415. };
  416. static struct clk_branch disp_cc_mdss_ahb1_clk = {
  417. .halt_reg = 0xa020,
  418. .halt_check = BRANCH_HALT,
  419. .clkr = {
  420. .enable_reg = 0xa020,
  421. .enable_mask = BIT(0),
  422. .hw.init = &(const struct clk_init_data) {
  423. .name = "disp_cc_mdss_ahb1_clk",
  424. .parent_hws = (const struct clk_hw*[]) {
  425. &disp_cc_mdss_ahb_clk_src.clkr.hw,
  426. },
  427. .num_parents = 1,
  428. .flags = CLK_DONT_HOLD_STATE | CLK_SET_RATE_PARENT,
  429. .ops = &clk_branch2_ops,
  430. },
  431. },
  432. };
  433. static struct clk_branch disp_cc_mdss_ahb_clk = {
  434. .halt_reg = 0x8094,
  435. .halt_check = BRANCH_HALT,
  436. .clkr = {
  437. .enable_reg = 0x8094,
  438. .enable_mask = BIT(0),
  439. .hw.init = &(const struct clk_init_data) {
  440. .name = "disp_cc_mdss_ahb_clk",
  441. .parent_hws = (const struct clk_hw*[]) {
  442. &disp_cc_mdss_ahb_clk_src.clkr.hw,
  443. },
  444. .num_parents = 1,
  445. .flags = CLK_DONT_HOLD_STATE | CLK_SET_RATE_PARENT,
  446. .ops = &clk_branch2_ops,
  447. },
  448. },
  449. };
  450. static struct clk_branch disp_cc_mdss_byte0_clk = {
  451. .halt_reg = 0x8024,
  452. .halt_check = BRANCH_HALT,
  453. .clkr = {
  454. .enable_reg = 0x8024,
  455. .enable_mask = BIT(0),
  456. .hw.init = &(const struct clk_init_data) {
  457. .name = "disp_cc_mdss_byte0_clk",
  458. .parent_hws = (const struct clk_hw*[]) {
  459. &disp_cc_mdss_byte0_clk_src.clkr.hw,
  460. },
  461. .num_parents = 1,
  462. .flags = CLK_SET_RATE_PARENT,
  463. .ops = &clk_branch2_ops,
  464. },
  465. },
  466. };
  467. static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
  468. .halt_reg = 0x8028,
  469. .halt_check = BRANCH_HALT,
  470. .clkr = {
  471. .enable_reg = 0x8028,
  472. .enable_mask = BIT(0),
  473. .hw.init = &(const struct clk_init_data) {
  474. .name = "disp_cc_mdss_byte0_intf_clk",
  475. .parent_hws = (const struct clk_hw*[]) {
  476. &disp_cc_mdss_byte0_div_clk_src.clkr.hw,
  477. },
  478. .num_parents = 1,
  479. .flags = CLK_SET_RATE_PARENT,
  480. .ops = &clk_branch2_ops,
  481. },
  482. },
  483. };
  484. static struct clk_branch disp_cc_mdss_esc0_clk = {
  485. .halt_reg = 0x802c,
  486. .halt_check = BRANCH_HALT,
  487. .clkr = {
  488. .enable_reg = 0x802c,
  489. .enable_mask = BIT(0),
  490. .hw.init = &(const struct clk_init_data) {
  491. .name = "disp_cc_mdss_esc0_clk",
  492. .parent_hws = (const struct clk_hw*[]) {
  493. &disp_cc_mdss_esc0_clk_src.clkr.hw,
  494. },
  495. .num_parents = 1,
  496. .flags = CLK_SET_RATE_PARENT,
  497. .ops = &clk_branch2_ops,
  498. },
  499. },
  500. };
  501. static struct clk_branch disp_cc_mdss_mdp1_clk = {
  502. .halt_reg = 0xa004,
  503. .halt_check = BRANCH_HALT,
  504. .clkr = {
  505. .enable_reg = 0xa004,
  506. .enable_mask = BIT(0),
  507. .hw.init = &(const struct clk_init_data) {
  508. .name = "disp_cc_mdss_mdp1_clk",
  509. .parent_hws = (const struct clk_hw*[]) {
  510. &disp_cc_mdss_mdp_clk_src.clkr.hw,
  511. },
  512. .num_parents = 1,
  513. .flags = CLK_SET_RATE_PARENT,
  514. .ops = &clk_branch2_ops,
  515. },
  516. },
  517. };
  518. static struct clk_branch disp_cc_mdss_mdp_clk = {
  519. .halt_reg = 0x8008,
  520. .halt_check = BRANCH_HALT,
  521. .clkr = {
  522. .enable_reg = 0x8008,
  523. .enable_mask = BIT(0),
  524. .hw.init = &(const struct clk_init_data) {
  525. .name = "disp_cc_mdss_mdp_clk",
  526. .parent_hws = (const struct clk_hw*[]) {
  527. &disp_cc_mdss_mdp_clk_src.clkr.hw,
  528. },
  529. .num_parents = 1,
  530. .flags = CLK_SET_RATE_PARENT,
  531. .ops = &clk_branch2_ops,
  532. },
  533. },
  534. };
  535. static struct clk_branch disp_cc_mdss_mdp_lut1_clk = {
  536. .halt_reg = 0xa014,
  537. .halt_check = BRANCH_HALT_VOTED,
  538. .clkr = {
  539. .enable_reg = 0xa014,
  540. .enable_mask = BIT(0),
  541. .hw.init = &(const struct clk_init_data) {
  542. .name = "disp_cc_mdss_mdp_lut1_clk",
  543. .parent_hws = (const struct clk_hw*[]) {
  544. &disp_cc_mdss_mdp_clk_src.clkr.hw,
  545. },
  546. .num_parents = 1,
  547. .flags = CLK_SET_RATE_PARENT,
  548. .ops = &clk_branch2_ops,
  549. },
  550. },
  551. };
  552. static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
  553. .halt_reg = 0x8018,
  554. .halt_check = BRANCH_HALT_VOTED,
  555. .clkr = {
  556. .enable_reg = 0x8018,
  557. .enable_mask = BIT(0),
  558. .hw.init = &(const struct clk_init_data) {
  559. .name = "disp_cc_mdss_mdp_lut_clk",
  560. .parent_hws = (const struct clk_hw*[]) {
  561. &disp_cc_mdss_mdp_clk_src.clkr.hw,
  562. },
  563. .num_parents = 1,
  564. .flags = CLK_SET_RATE_PARENT,
  565. .ops = &clk_branch2_ops,
  566. },
  567. },
  568. };
  569. static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
  570. .halt_reg = 0xc004,
  571. .halt_check = BRANCH_HALT_VOTED,
  572. .clkr = {
  573. .enable_reg = 0xc004,
  574. .enable_mask = BIT(0),
  575. .hw.init = &(const struct clk_init_data) {
  576. .name = "disp_cc_mdss_non_gdsc_ahb_clk",
  577. .parent_hws = (const struct clk_hw*[]) {
  578. &disp_cc_mdss_ahb_clk_src.clkr.hw,
  579. },
  580. .num_parents = 1,
  581. .flags = CLK_SET_RATE_PARENT,
  582. .ops = &clk_branch2_ops,
  583. },
  584. },
  585. };
  586. static struct clk_branch disp_cc_mdss_pclk0_clk = {
  587. .halt_reg = 0x8004,
  588. .halt_check = BRANCH_HALT,
  589. .clkr = {
  590. .enable_reg = 0x8004,
  591. .enable_mask = BIT(0),
  592. .hw.init = &(const struct clk_init_data) {
  593. .name = "disp_cc_mdss_pclk0_clk",
  594. .parent_hws = (const struct clk_hw*[]) {
  595. &disp_cc_mdss_pclk0_clk_src.clkr.hw,
  596. },
  597. .num_parents = 1,
  598. .flags = CLK_SET_RATE_PARENT,
  599. .ops = &clk_branch2_ops,
  600. },
  601. },
  602. };
  603. static struct clk_branch disp_cc_mdss_rot1_clk = {
  604. .halt_reg = 0xa00c,
  605. .halt_check = BRANCH_HALT,
  606. .clkr = {
  607. .enable_reg = 0xa00c,
  608. .enable_mask = BIT(0),
  609. .hw.init = &(const struct clk_init_data) {
  610. .name = "disp_cc_mdss_rot1_clk",
  611. .parent_hws = (const struct clk_hw*[]) {
  612. &disp_cc_mdss_rot_clk_src.clkr.hw,
  613. },
  614. .num_parents = 1,
  615. .flags = CLK_SET_RATE_PARENT,
  616. .ops = &clk_branch2_ops,
  617. },
  618. },
  619. };
  620. static struct clk_branch disp_cc_mdss_rot_clk = {
  621. .halt_reg = 0x8010,
  622. .halt_check = BRANCH_HALT,
  623. .clkr = {
  624. .enable_reg = 0x8010,
  625. .enable_mask = BIT(0),
  626. .hw.init = &(const struct clk_init_data) {
  627. .name = "disp_cc_mdss_rot_clk",
  628. .parent_hws = (const struct clk_hw*[]) {
  629. &disp_cc_mdss_rot_clk_src.clkr.hw,
  630. },
  631. .num_parents = 1,
  632. .flags = CLK_SET_RATE_PARENT,
  633. .ops = &clk_branch2_ops,
  634. },
  635. },
  636. };
  637. static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
  638. .halt_reg = 0xc00c,
  639. .halt_check = BRANCH_HALT,
  640. .clkr = {
  641. .enable_reg = 0xc00c,
  642. .enable_mask = BIT(0),
  643. .hw.init = &(const struct clk_init_data) {
  644. .name = "disp_cc_mdss_rscc_ahb_clk",
  645. .parent_hws = (const struct clk_hw*[]) {
  646. &disp_cc_mdss_ahb_clk_src.clkr.hw,
  647. },
  648. .num_parents = 1,
  649. .flags = CLK_SET_RATE_PARENT,
  650. .ops = &clk_branch2_ops,
  651. },
  652. },
  653. };
  654. static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
  655. .halt_reg = 0xc008,
  656. .halt_check = BRANCH_HALT,
  657. .clkr = {
  658. .enable_reg = 0xc008,
  659. .enable_mask = BIT(0),
  660. .hw.init = &(const struct clk_init_data) {
  661. .name = "disp_cc_mdss_rscc_vsync_clk",
  662. .parent_hws = (const struct clk_hw*[]) {
  663. &disp_cc_mdss_vsync_clk_src.clkr.hw,
  664. },
  665. .num_parents = 1,
  666. .flags = CLK_SET_RATE_PARENT,
  667. .ops = &clk_branch2_ops,
  668. },
  669. },
  670. };
  671. static struct clk_branch disp_cc_mdss_vsync1_clk = {
  672. .halt_reg = 0xa01c,
  673. .halt_check = BRANCH_HALT,
  674. .clkr = {
  675. .enable_reg = 0xa01c,
  676. .enable_mask = BIT(0),
  677. .hw.init = &(const struct clk_init_data) {
  678. .name = "disp_cc_mdss_vsync1_clk",
  679. .parent_hws = (const struct clk_hw*[]) {
  680. &disp_cc_mdss_vsync_clk_src.clkr.hw,
  681. },
  682. .num_parents = 1,
  683. .flags = CLK_SET_RATE_PARENT,
  684. .ops = &clk_branch2_ops,
  685. },
  686. },
  687. };
  688. static struct clk_branch disp_cc_mdss_vsync_clk = {
  689. .halt_reg = 0x8020,
  690. .halt_check = BRANCH_HALT,
  691. .clkr = {
  692. .enable_reg = 0x8020,
  693. .enable_mask = BIT(0),
  694. .hw.init = &(const struct clk_init_data) {
  695. .name = "disp_cc_mdss_vsync_clk",
  696. .parent_hws = (const struct clk_hw*[]) {
  697. &disp_cc_mdss_vsync_clk_src.clkr.hw,
  698. },
  699. .num_parents = 1,
  700. .flags = CLK_SET_RATE_PARENT,
  701. .ops = &clk_branch2_ops,
  702. },
  703. },
  704. };
  705. static struct clk_branch disp_cc_sleep_clk = {
  706. .halt_reg = 0xe070,
  707. .halt_check = BRANCH_HALT,
  708. .clkr = {
  709. .enable_reg = 0xe070,
  710. .enable_mask = BIT(0),
  711. .hw.init = &(const struct clk_init_data) {
  712. .name = "disp_cc_sleep_clk",
  713. .parent_hws = (const struct clk_hw*[]) {
  714. &disp_cc_sleep_clk_src.clkr.hw,
  715. },
  716. .num_parents = 1,
  717. .flags = CLK_SET_RATE_PARENT,
  718. .ops = &clk_branch2_ops,
  719. },
  720. },
  721. };
  722. static struct clk_regmap *disp_cc_pitti_clocks[] = {
  723. [DISP_CC_MDSS_ACCU_CLK] = &disp_cc_mdss_accu_clk.clkr,
  724. [DISP_CC_MDSS_AHB1_CLK] = &disp_cc_mdss_ahb1_clk.clkr,
  725. [DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
  726. [DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
  727. [DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
  728. [DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
  729. [DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr,
  730. [DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
  731. [DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
  732. [DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
  733. [DISP_CC_MDSS_MDP1_CLK] = &disp_cc_mdss_mdp1_clk.clkr,
  734. [DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
  735. [DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
  736. [DISP_CC_MDSS_MDP_LUT1_CLK] = &disp_cc_mdss_mdp_lut1_clk.clkr,
  737. [DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
  738. [DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr,
  739. [DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
  740. [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
  741. [DISP_CC_MDSS_ROT1_CLK] = &disp_cc_mdss_rot1_clk.clkr,
  742. [DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr,
  743. [DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr,
  744. [DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr,
  745. [DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr,
  746. [DISP_CC_MDSS_VSYNC1_CLK] = &disp_cc_mdss_vsync1_clk.clkr,
  747. [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
  748. [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
  749. [DISP_CC_PLL0] = &disp_cc_pll0.clkr,
  750. [DISP_CC_PLL1] = &disp_cc_pll1.clkr,
  751. [DISP_CC_SLEEP_CLK] = &disp_cc_sleep_clk.clkr,
  752. [DISP_CC_SLEEP_CLK_SRC] = &disp_cc_sleep_clk_src.clkr,
  753. [DISP_CC_XO_CLK_SRC] = &disp_cc_xo_clk_src.clkr,
  754. };
  755. static const struct qcom_reset_map disp_cc_pitti_resets[] = {
  756. [DISP_CC_MDSS_CORE_BCR] = { 0x8000 },
  757. [DISP_CC_MDSS_CORE_INT2_BCR] = { 0xa000 },
  758. [DISP_CC_MDSS_RSCC_BCR] = { 0xc000 },
  759. };
  760. static const struct regmap_config disp_cc_pitti_regmap_config = {
  761. .reg_bits = 32,
  762. .reg_stride = 4,
  763. .val_bits = 32,
  764. .max_register = 0x11008,
  765. .fast_io = true,
  766. };
  767. static const struct qcom_cc_desc disp_cc_pitti_desc = {
  768. .config = &disp_cc_pitti_regmap_config,
  769. .clks = disp_cc_pitti_clocks,
  770. .num_clks = ARRAY_SIZE(disp_cc_pitti_clocks),
  771. .resets = disp_cc_pitti_resets,
  772. .num_resets = ARRAY_SIZE(disp_cc_pitti_resets),
  773. .clk_regulators = disp_cc_pitti_regulators,
  774. .num_clk_regulators = ARRAY_SIZE(disp_cc_pitti_regulators),
  775. };
  776. static const struct of_device_id disp_cc_pitti_match_table[] = {
  777. { .compatible = "qcom,pitti-dispcc" },
  778. { }
  779. };
  780. MODULE_DEVICE_TABLE(of, disp_cc_pitti_match_table);
  781. static int disp_cc_pitti_probe(struct platform_device *pdev)
  782. {
  783. struct regmap *regmap;
  784. int ret;
  785. regmap = qcom_cc_map(pdev, &disp_cc_pitti_desc);
  786. if (IS_ERR(regmap))
  787. return PTR_ERR(regmap);
  788. clk_lucid_evo_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
  789. clk_lucid_evo_pll_configure(&disp_cc_pll1, regmap, &disp_cc_pll1_config);
  790. /* Enable clock gating for MDP clocks */
  791. regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10);
  792. /*
  793. * Keep clocks always enabled:
  794. * disp_cc_xo_clk
  795. */
  796. regmap_update_bits(regmap, 0xe054, BIT(0), BIT(0));
  797. ret = qcom_cc_really_probe(pdev, &disp_cc_pitti_desc, regmap);
  798. if (ret) {
  799. dev_err(&pdev->dev, "Failed to register DISP CC clocks\n");
  800. return ret;
  801. }
  802. dev_info(&pdev->dev, "Registered DISP CC clocks\n");
  803. return ret;
  804. }
  805. static void disp_cc_pitti_sync_state(struct device *dev)
  806. {
  807. qcom_cc_sync_state(dev, &disp_cc_pitti_desc);
  808. }
  809. static struct platform_driver disp_cc_pitti_driver = {
  810. .probe = disp_cc_pitti_probe,
  811. .driver = {
  812. .name = "disp_cc-pitti",
  813. .of_match_table = disp_cc_pitti_match_table,
  814. .sync_state = disp_cc_pitti_sync_state,
  815. },
  816. };
  817. static int __init disp_cc_pitti_init(void)
  818. {
  819. return platform_driver_register(&disp_cc_pitti_driver);
  820. }
  821. subsys_initcall(disp_cc_pitti_init);
  822. static void __exit disp_cc_pitti_exit(void)
  823. {
  824. platform_driver_unregister(&disp_cc_pitti_driver);
  825. }
  826. module_exit(disp_cc_pitti_exit);
  827. MODULE_DESCRIPTION("QTI DISP_CC PITTI Driver");
  828. MODULE_LICENSE("GPL");