dispcc-sm8450.c 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022, Linaro Ltd.
  5. */
  6. #include <linux/clk.h>
  7. #include <linux/clk-provider.h>
  8. #include <linux/err.h>
  9. #include <linux/kernel.h>
  10. #include <linux/module.h>
  11. #include <linux/of.h>
  12. #include <linux/platform_device.h>
  13. #include <linux/regmap.h>
  14. #include <linux/pm_runtime.h>
  15. #include <dt-bindings/clock/qcom,sm8450-dispcc.h>
  16. #include "common.h"
  17. #include "clk-alpha-pll.h"
  18. #include "clk-branch.h"
  19. #include "clk-pll.h"
  20. #include "clk-rcg.h"
  21. #include "clk-regmap.h"
  22. #include "clk-regmap-divider.h"
  23. #include "clk-regmap-mux.h"
  24. #include "reset.h"
  25. #include "gdsc.h"
  26. /* Need to match the order of clocks in DT binding */
  27. enum {
  28. DT_BI_TCXO,
  29. DT_BI_TCXO_AO,
  30. DT_AHB_CLK,
  31. DT_SLEEP_CLK,
  32. DT_DSI0_PHY_PLL_OUT_BYTECLK,
  33. DT_DSI0_PHY_PLL_OUT_DSICLK,
  34. DT_DSI1_PHY_PLL_OUT_BYTECLK,
  35. DT_DSI1_PHY_PLL_OUT_DSICLK,
  36. DT_DP0_PHY_PLL_LINK_CLK,
  37. DT_DP0_PHY_PLL_VCO_DIV_CLK,
  38. DT_DP1_PHY_PLL_LINK_CLK,
  39. DT_DP1_PHY_PLL_VCO_DIV_CLK,
  40. DT_DP2_PHY_PLL_LINK_CLK,
  41. DT_DP2_PHY_PLL_VCO_DIV_CLK,
  42. DT_DP3_PHY_PLL_LINK_CLK,
  43. DT_DP3_PHY_PLL_VCO_DIV_CLK,
  44. };
  45. #define DISP_CC_MISC_CMD 0xF000
  46. enum {
  47. P_BI_TCXO,
  48. P_DISP_CC_PLL0_OUT_MAIN,
  49. P_DISP_CC_PLL1_OUT_EVEN,
  50. P_DISP_CC_PLL1_OUT_MAIN,
  51. P_DP0_PHY_PLL_LINK_CLK,
  52. P_DP0_PHY_PLL_VCO_DIV_CLK,
  53. P_DP1_PHY_PLL_LINK_CLK,
  54. P_DP1_PHY_PLL_VCO_DIV_CLK,
  55. P_DP2_PHY_PLL_LINK_CLK,
  56. P_DP2_PHY_PLL_VCO_DIV_CLK,
  57. P_DP3_PHY_PLL_LINK_CLK,
  58. P_DP3_PHY_PLL_VCO_DIV_CLK,
  59. P_DSI0_PHY_PLL_OUT_BYTECLK,
  60. P_DSI0_PHY_PLL_OUT_DSICLK,
  61. P_DSI1_PHY_PLL_OUT_BYTECLK,
  62. P_DSI1_PHY_PLL_OUT_DSICLK,
  63. P_SLEEP_CLK,
  64. };
  65. static const struct pll_vco lucid_evo_vco[] = {
  66. { 249600000, 2000000000, 0 },
  67. };
  68. static const struct alpha_pll_config disp_cc_pll0_config = {
  69. .l = 0xD,
  70. .alpha = 0x6492,
  71. .config_ctl_val = 0x20485699,
  72. .config_ctl_hi_val = 0x00182261,
  73. .config_ctl_hi1_val = 0x32AA299C,
  74. .user_ctl_val = 0x00000000,
  75. .user_ctl_hi_val = 0x00000805,
  76. };
  77. static struct clk_alpha_pll disp_cc_pll0 = {
  78. .offset = 0x0,
  79. .vco_table = lucid_evo_vco,
  80. .num_vco = ARRAY_SIZE(lucid_evo_vco),
  81. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
  82. .clkr = {
  83. .hw.init = &(struct clk_init_data) {
  84. .name = "disp_cc_pll0",
  85. .parent_data = &(const struct clk_parent_data) {
  86. .index = DT_BI_TCXO,
  87. },
  88. .num_parents = 1,
  89. .ops = &clk_alpha_pll_reset_lucid_evo_ops,
  90. },
  91. },
  92. };
  93. static const struct alpha_pll_config disp_cc_pll1_config = {
  94. .l = 0x1F,
  95. .alpha = 0x4000,
  96. .config_ctl_val = 0x20485699,
  97. .config_ctl_hi_val = 0x00182261,
  98. .config_ctl_hi1_val = 0x32AA299C,
  99. .user_ctl_val = 0x00000000,
  100. .user_ctl_hi_val = 0x00000805,
  101. };
  102. static struct clk_alpha_pll disp_cc_pll1 = {
  103. .offset = 0x1000,
  104. .vco_table = lucid_evo_vco,
  105. .num_vco = ARRAY_SIZE(lucid_evo_vco),
  106. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
  107. .clkr = {
  108. .hw.init = &(struct clk_init_data) {
  109. .name = "disp_cc_pll1",
  110. .parent_data = &(const struct clk_parent_data) {
  111. .index = DT_BI_TCXO,
  112. },
  113. .num_parents = 1,
  114. .ops = &clk_alpha_pll_reset_lucid_evo_ops,
  115. },
  116. },
  117. };
  118. static const struct parent_map disp_cc_parent_map_0[] = {
  119. { P_BI_TCXO, 0 },
  120. { P_DP0_PHY_PLL_LINK_CLK, 1 },
  121. { P_DP0_PHY_PLL_VCO_DIV_CLK, 2 },
  122. { P_DP3_PHY_PLL_VCO_DIV_CLK, 3 },
  123. { P_DP1_PHY_PLL_VCO_DIV_CLK, 4 },
  124. { P_DP2_PHY_PLL_VCO_DIV_CLK, 6 },
  125. };
  126. static const struct clk_parent_data disp_cc_parent_data_0[] = {
  127. { .index = DT_BI_TCXO },
  128. { .index = DT_DP0_PHY_PLL_LINK_CLK },
  129. { .index = DT_DP0_PHY_PLL_VCO_DIV_CLK },
  130. { .index = DT_DP3_PHY_PLL_VCO_DIV_CLK },
  131. { .index = DT_DP1_PHY_PLL_VCO_DIV_CLK },
  132. { .index = DT_DP2_PHY_PLL_VCO_DIV_CLK },
  133. };
  134. static const struct parent_map disp_cc_parent_map_1[] = {
  135. { P_BI_TCXO, 0 },
  136. };
  137. static const struct clk_parent_data disp_cc_parent_data_1[] = {
  138. { .index = DT_BI_TCXO },
  139. };
  140. static const struct clk_parent_data disp_cc_parent_data_1_ao[] = {
  141. { .index = DT_BI_TCXO_AO },
  142. };
  143. static const struct parent_map disp_cc_parent_map_2[] = {
  144. { P_BI_TCXO, 0 },
  145. { P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
  146. { P_DSI0_PHY_PLL_OUT_BYTECLK, 2 },
  147. { P_DSI1_PHY_PLL_OUT_DSICLK, 3 },
  148. { P_DSI1_PHY_PLL_OUT_BYTECLK, 4 },
  149. };
  150. static const struct clk_parent_data disp_cc_parent_data_2[] = {
  151. { .index = DT_BI_TCXO },
  152. { .index = DT_DSI0_PHY_PLL_OUT_DSICLK },
  153. { .index = DT_DSI0_PHY_PLL_OUT_BYTECLK },
  154. { .index = DT_DSI1_PHY_PLL_OUT_DSICLK },
  155. { .index = DT_DSI1_PHY_PLL_OUT_BYTECLK },
  156. };
  157. static const struct parent_map disp_cc_parent_map_3[] = {
  158. { P_BI_TCXO, 0 },
  159. { P_DP0_PHY_PLL_LINK_CLK, 1 },
  160. { P_DP1_PHY_PLL_LINK_CLK, 2 },
  161. { P_DP2_PHY_PLL_LINK_CLK, 3 },
  162. { P_DP3_PHY_PLL_LINK_CLK, 4 },
  163. };
  164. static const struct clk_parent_data disp_cc_parent_data_3[] = {
  165. { .index = DT_BI_TCXO },
  166. { .index = DT_DP0_PHY_PLL_LINK_CLK },
  167. { .index = DT_DP1_PHY_PLL_LINK_CLK },
  168. { .index = DT_DP2_PHY_PLL_LINK_CLK },
  169. { .index = DT_DP3_PHY_PLL_LINK_CLK },
  170. };
  171. static const struct parent_map disp_cc_parent_map_4[] = {
  172. { P_BI_TCXO, 0 },
  173. { P_DSI0_PHY_PLL_OUT_BYTECLK, 2 },
  174. { P_DSI1_PHY_PLL_OUT_BYTECLK, 4 },
  175. };
  176. static const struct clk_parent_data disp_cc_parent_data_4[] = {
  177. { .index = DT_BI_TCXO },
  178. { .index = DT_DSI0_PHY_PLL_OUT_BYTECLK },
  179. { .index = DT_DSI1_PHY_PLL_OUT_BYTECLK },
  180. };
  181. static const struct parent_map disp_cc_parent_map_5[] = {
  182. { P_BI_TCXO, 0 },
  183. { P_DISP_CC_PLL0_OUT_MAIN, 1 },
  184. { P_DISP_CC_PLL1_OUT_MAIN, 4 },
  185. { P_DISP_CC_PLL1_OUT_EVEN, 6 },
  186. };
  187. static const struct clk_parent_data disp_cc_parent_data_5[] = {
  188. { .index = DT_BI_TCXO },
  189. { .hw = &disp_cc_pll0.clkr.hw },
  190. { .hw = &disp_cc_pll1.clkr.hw },
  191. { .hw = &disp_cc_pll1.clkr.hw },
  192. };
  193. static const struct parent_map disp_cc_parent_map_6[] = {
  194. { P_BI_TCXO, 0 },
  195. { P_DISP_CC_PLL1_OUT_MAIN, 4 },
  196. { P_DISP_CC_PLL1_OUT_EVEN, 6 },
  197. };
  198. static const struct clk_parent_data disp_cc_parent_data_6[] = {
  199. { .index = DT_BI_TCXO },
  200. { .hw = &disp_cc_pll1.clkr.hw },
  201. { .hw = &disp_cc_pll1.clkr.hw },
  202. };
  203. static const struct parent_map disp_cc_parent_map_7[] = {
  204. { P_SLEEP_CLK, 0 },
  205. };
  206. static const struct clk_parent_data disp_cc_parent_data_7[] = {
  207. { .index = DT_SLEEP_CLK },
  208. };
  209. static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
  210. F(19200000, P_BI_TCXO, 1, 0, 0),
  211. F(37500000, P_DISP_CC_PLL1_OUT_MAIN, 16, 0, 0),
  212. F(75000000, P_DISP_CC_PLL1_OUT_MAIN, 8, 0, 0),
  213. { }
  214. };
  215. static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
  216. .cmd_rcgr = 0x8324,
  217. .mnd_width = 0,
  218. .hid_width = 5,
  219. .parent_map = disp_cc_parent_map_6,
  220. .freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
  221. .clkr.hw.init = &(struct clk_init_data) {
  222. .name = "disp_cc_mdss_ahb_clk_src",
  223. .parent_data = disp_cc_parent_data_6,
  224. .num_parents = ARRAY_SIZE(disp_cc_parent_data_6),
  225. .flags = CLK_SET_RATE_PARENT,
  226. .ops = &clk_rcg2_shared_ops,
  227. },
  228. };
  229. static const struct freq_tbl ftbl_disp_cc_mdss_byte0_clk_src[] = {
  230. F(19200000, P_BI_TCXO, 1, 0, 0),
  231. { }
  232. };
  233. static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
  234. .cmd_rcgr = 0x8134,
  235. .mnd_width = 0,
  236. .hid_width = 5,
  237. .parent_map = disp_cc_parent_map_2,
  238. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  239. .clkr.hw.init = &(struct clk_init_data) {
  240. .name = "disp_cc_mdss_byte0_clk_src",
  241. .parent_data = disp_cc_parent_data_2,
  242. .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
  243. .flags = CLK_SET_RATE_PARENT,
  244. .ops = &clk_byte2_ops,
  245. },
  246. };
  247. static struct clk_rcg2 disp_cc_mdss_byte1_clk_src = {
  248. .cmd_rcgr = 0x8150,
  249. .mnd_width = 0,
  250. .hid_width = 5,
  251. .parent_map = disp_cc_parent_map_2,
  252. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  253. .clkr.hw.init = &(struct clk_init_data) {
  254. .name = "disp_cc_mdss_byte1_clk_src",
  255. .parent_data = disp_cc_parent_data_2,
  256. .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
  257. .flags = CLK_SET_RATE_PARENT,
  258. .ops = &clk_byte2_ops,
  259. },
  260. };
  261. static struct clk_rcg2 disp_cc_mdss_dptx0_aux_clk_src = {
  262. .cmd_rcgr = 0x81ec,
  263. .mnd_width = 0,
  264. .hid_width = 5,
  265. .parent_map = disp_cc_parent_map_1,
  266. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  267. .clkr.hw.init = &(struct clk_init_data) {
  268. .name = "disp_cc_mdss_dptx0_aux_clk_src",
  269. .parent_data = disp_cc_parent_data_1,
  270. .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
  271. .flags = CLK_SET_RATE_PARENT,
  272. .ops = &clk_rcg2_ops,
  273. },
  274. };
  275. static struct clk_rcg2 disp_cc_mdss_dptx0_link_clk_src = {
  276. .cmd_rcgr = 0x819c,
  277. .mnd_width = 0,
  278. .hid_width = 5,
  279. .parent_map = disp_cc_parent_map_3,
  280. .clkr.hw.init = &(struct clk_init_data) {
  281. .name = "disp_cc_mdss_dptx0_link_clk_src",
  282. .parent_data = disp_cc_parent_data_3,
  283. .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
  284. .flags = CLK_SET_RATE_PARENT,
  285. .ops = &clk_byte2_ops,
  286. },
  287. };
  288. static struct clk_rcg2 disp_cc_mdss_dptx0_pixel0_clk_src = {
  289. .cmd_rcgr = 0x81bc,
  290. .mnd_width = 16,
  291. .hid_width = 5,
  292. .parent_map = disp_cc_parent_map_0,
  293. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  294. .clkr.hw.init = &(struct clk_init_data) {
  295. .name = "disp_cc_mdss_dptx0_pixel0_clk_src",
  296. .parent_data = disp_cc_parent_data_0,
  297. .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
  298. .flags = CLK_SET_RATE_PARENT,
  299. .ops = &clk_dp_ops,
  300. },
  301. };
  302. static struct clk_rcg2 disp_cc_mdss_dptx0_pixel1_clk_src = {
  303. .cmd_rcgr = 0x81d4,
  304. .mnd_width = 16,
  305. .hid_width = 5,
  306. .parent_map = disp_cc_parent_map_0,
  307. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  308. .clkr.hw.init = &(struct clk_init_data) {
  309. .name = "disp_cc_mdss_dptx0_pixel1_clk_src",
  310. .parent_data = disp_cc_parent_data_0,
  311. .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
  312. .flags = CLK_SET_RATE_PARENT,
  313. .ops = &clk_dp_ops,
  314. },
  315. };
  316. static struct clk_rcg2 disp_cc_mdss_dptx1_aux_clk_src = {
  317. .cmd_rcgr = 0x8254,
  318. .mnd_width = 0,
  319. .hid_width = 5,
  320. .parent_map = disp_cc_parent_map_1,
  321. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  322. .clkr.hw.init = &(struct clk_init_data) {
  323. .name = "disp_cc_mdss_dptx1_aux_clk_src",
  324. .parent_data = disp_cc_parent_data_1,
  325. .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
  326. .flags = CLK_SET_RATE_PARENT,
  327. .ops = &clk_dp_ops,
  328. },
  329. };
  330. static struct clk_rcg2 disp_cc_mdss_dptx1_link_clk_src = {
  331. .cmd_rcgr = 0x8234,
  332. .mnd_width = 0,
  333. .hid_width = 5,
  334. .parent_map = disp_cc_parent_map_3,
  335. .clkr.hw.init = &(struct clk_init_data) {
  336. .name = "disp_cc_mdss_dptx1_link_clk_src",
  337. .parent_data = disp_cc_parent_data_3,
  338. .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
  339. .flags = CLK_SET_RATE_PARENT,
  340. .ops = &clk_byte2_ops,
  341. },
  342. };
  343. static struct clk_rcg2 disp_cc_mdss_dptx1_pixel0_clk_src = {
  344. .cmd_rcgr = 0x8204,
  345. .mnd_width = 16,
  346. .hid_width = 5,
  347. .parent_map = disp_cc_parent_map_0,
  348. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  349. .clkr.hw.init = &(struct clk_init_data) {
  350. .name = "disp_cc_mdss_dptx1_pixel0_clk_src",
  351. .parent_data = disp_cc_parent_data_0,
  352. .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
  353. .flags = CLK_SET_RATE_PARENT,
  354. .ops = &clk_dp_ops,
  355. },
  356. };
  357. static struct clk_rcg2 disp_cc_mdss_dptx1_pixel1_clk_src = {
  358. .cmd_rcgr = 0x821c,
  359. .mnd_width = 16,
  360. .hid_width = 5,
  361. .parent_map = disp_cc_parent_map_0,
  362. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  363. .clkr.hw.init = &(struct clk_init_data) {
  364. .name = "disp_cc_mdss_dptx1_pixel1_clk_src",
  365. .parent_data = disp_cc_parent_data_0,
  366. .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
  367. .flags = CLK_SET_RATE_PARENT,
  368. .ops = &clk_dp_ops,
  369. },
  370. };
  371. static struct clk_rcg2 disp_cc_mdss_dptx2_aux_clk_src = {
  372. .cmd_rcgr = 0x82bc,
  373. .mnd_width = 0,
  374. .hid_width = 5,
  375. .parent_map = disp_cc_parent_map_1,
  376. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  377. .clkr.hw.init = &(struct clk_init_data) {
  378. .name = "disp_cc_mdss_dptx2_aux_clk_src",
  379. .parent_data = disp_cc_parent_data_1,
  380. .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
  381. .flags = CLK_SET_RATE_PARENT,
  382. .ops = &clk_rcg2_ops,
  383. },
  384. };
  385. static struct clk_rcg2 disp_cc_mdss_dptx2_link_clk_src = {
  386. .cmd_rcgr = 0x826c,
  387. .mnd_width = 0,
  388. .hid_width = 5,
  389. .parent_map = disp_cc_parent_map_3,
  390. .clkr.hw.init = &(struct clk_init_data) {
  391. .name = "disp_cc_mdss_dptx2_link_clk_src",
  392. .parent_data = disp_cc_parent_data_3,
  393. .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
  394. .flags = CLK_SET_RATE_PARENT,
  395. .ops = &clk_byte2_ops,
  396. },
  397. };
  398. static struct clk_rcg2 disp_cc_mdss_dptx2_pixel0_clk_src = {
  399. .cmd_rcgr = 0x828c,
  400. .mnd_width = 16,
  401. .hid_width = 5,
  402. .parent_map = disp_cc_parent_map_0,
  403. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  404. .clkr.hw.init = &(struct clk_init_data) {
  405. .name = "disp_cc_mdss_dptx2_pixel0_clk_src",
  406. .parent_data = disp_cc_parent_data_0,
  407. .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
  408. .flags = CLK_SET_RATE_PARENT,
  409. .ops = &clk_dp_ops,
  410. },
  411. };
  412. static struct clk_rcg2 disp_cc_mdss_dptx2_pixel1_clk_src = {
  413. .cmd_rcgr = 0x82a4,
  414. .mnd_width = 16,
  415. .hid_width = 5,
  416. .parent_map = disp_cc_parent_map_0,
  417. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  418. .clkr.hw.init = &(struct clk_init_data) {
  419. .name = "disp_cc_mdss_dptx2_pixel1_clk_src",
  420. .parent_data = disp_cc_parent_data_0,
  421. .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
  422. .flags = CLK_SET_RATE_PARENT,
  423. .ops = &clk_dp_ops,
  424. },
  425. };
  426. static struct clk_rcg2 disp_cc_mdss_dptx3_aux_clk_src = {
  427. .cmd_rcgr = 0x8308,
  428. .mnd_width = 0,
  429. .hid_width = 5,
  430. .parent_map = disp_cc_parent_map_1,
  431. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  432. .clkr.hw.init = &(struct clk_init_data) {
  433. .name = "disp_cc_mdss_dptx3_aux_clk_src",
  434. .parent_data = disp_cc_parent_data_1,
  435. .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
  436. .flags = CLK_SET_RATE_PARENT,
  437. .ops = &clk_rcg2_ops,
  438. },
  439. };
  440. static struct clk_rcg2 disp_cc_mdss_dptx3_link_clk_src = {
  441. .cmd_rcgr = 0x82ec,
  442. .mnd_width = 0,
  443. .hid_width = 5,
  444. .parent_map = disp_cc_parent_map_3,
  445. .clkr.hw.init = &(struct clk_init_data) {
  446. .name = "disp_cc_mdss_dptx3_link_clk_src",
  447. .parent_data = disp_cc_parent_data_3,
  448. .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
  449. .flags = CLK_SET_RATE_PARENT,
  450. .ops = &clk_byte2_ops,
  451. },
  452. };
  453. static struct clk_rcg2 disp_cc_mdss_dptx3_pixel0_clk_src = {
  454. .cmd_rcgr = 0x82d4,
  455. .mnd_width = 16,
  456. .hid_width = 5,
  457. .parent_map = disp_cc_parent_map_0,
  458. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  459. .clkr.hw.init = &(struct clk_init_data) {
  460. .name = "disp_cc_mdss_dptx3_pixel0_clk_src",
  461. .parent_data = disp_cc_parent_data_0,
  462. .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
  463. .flags = CLK_SET_RATE_PARENT,
  464. .ops = &clk_dp_ops,
  465. },
  466. };
  467. static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
  468. .cmd_rcgr = 0x816c,
  469. .mnd_width = 0,
  470. .hid_width = 5,
  471. .parent_map = disp_cc_parent_map_4,
  472. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  473. .clkr.hw.init = &(struct clk_init_data) {
  474. .name = "disp_cc_mdss_esc0_clk_src",
  475. .parent_data = disp_cc_parent_data_4,
  476. .num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
  477. .flags = CLK_SET_RATE_PARENT,
  478. .ops = &clk_rcg2_ops,
  479. },
  480. };
  481. static struct clk_rcg2 disp_cc_mdss_esc1_clk_src = {
  482. .cmd_rcgr = 0x8184,
  483. .mnd_width = 0,
  484. .hid_width = 5,
  485. .parent_map = disp_cc_parent_map_4,
  486. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  487. .clkr.hw.init = &(struct clk_init_data) {
  488. .name = "disp_cc_mdss_esc1_clk_src",
  489. .parent_data = disp_cc_parent_data_4,
  490. .num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
  491. .flags = CLK_SET_RATE_PARENT,
  492. .ops = &clk_rcg2_ops,
  493. },
  494. };
  495. static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
  496. F(19200000, P_BI_TCXO, 1, 0, 0),
  497. F(85714286, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
  498. F(100000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
  499. F(150000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
  500. F(172000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
  501. F(200000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
  502. F(325000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
  503. F(375000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
  504. F(500000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
  505. { }
  506. };
  507. static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
  508. .cmd_rcgr = 0x80ec,
  509. .mnd_width = 0,
  510. .hid_width = 5,
  511. .parent_map = disp_cc_parent_map_5,
  512. .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
  513. .clkr.hw.init = &(struct clk_init_data) {
  514. .name = "disp_cc_mdss_mdp_clk_src",
  515. .parent_data = disp_cc_parent_data_5,
  516. .num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
  517. .flags = CLK_SET_RATE_PARENT,
  518. .ops = &clk_rcg2_shared_ops,
  519. },
  520. };
  521. static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
  522. .cmd_rcgr = 0x80bc,
  523. .mnd_width = 8,
  524. .hid_width = 5,
  525. .parent_map = disp_cc_parent_map_2,
  526. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  527. .clkr.hw.init = &(struct clk_init_data) {
  528. .name = "disp_cc_mdss_pclk0_clk_src",
  529. .parent_data = disp_cc_parent_data_2,
  530. .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
  531. .flags = CLK_SET_RATE_PARENT,
  532. .ops = &clk_pixel_ops,
  533. },
  534. };
  535. static struct clk_rcg2 disp_cc_mdss_pclk1_clk_src = {
  536. .cmd_rcgr = 0x80d4,
  537. .mnd_width = 8,
  538. .hid_width = 5,
  539. .parent_map = disp_cc_parent_map_2,
  540. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  541. .clkr.hw.init = &(struct clk_init_data) {
  542. .name = "disp_cc_mdss_pclk1_clk_src",
  543. .parent_data = disp_cc_parent_data_2,
  544. .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
  545. .flags = CLK_SET_RATE_PARENT,
  546. .ops = &clk_pixel_ops,
  547. },
  548. };
  549. static const struct freq_tbl ftbl_disp_cc_mdss_rot_clk_src[] = {
  550. F(19200000, P_BI_TCXO, 1, 0, 0),
  551. F(150000000, P_DISP_CC_PLL1_OUT_MAIN, 4, 0, 0),
  552. F(200000000, P_DISP_CC_PLL1_OUT_MAIN, 3, 0, 0),
  553. F(300000000, P_DISP_CC_PLL1_OUT_MAIN, 2, 0, 0),
  554. { }
  555. };
  556. static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
  557. .cmd_rcgr = 0x8104,
  558. .mnd_width = 0,
  559. .hid_width = 5,
  560. .parent_map = disp_cc_parent_map_5,
  561. .freq_tbl = ftbl_disp_cc_mdss_rot_clk_src,
  562. .clkr.hw.init = &(struct clk_init_data) {
  563. .name = "disp_cc_mdss_rot_clk_src",
  564. .parent_data = disp_cc_parent_data_5,
  565. .num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
  566. .flags = CLK_SET_RATE_PARENT,
  567. .ops = &clk_rcg2_shared_ops,
  568. },
  569. };
  570. static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
  571. .cmd_rcgr = 0x811c,
  572. .mnd_width = 0,
  573. .hid_width = 5,
  574. .parent_map = disp_cc_parent_map_1,
  575. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  576. .clkr.hw.init = &(struct clk_init_data) {
  577. .name = "disp_cc_mdss_vsync_clk_src",
  578. .parent_data = disp_cc_parent_data_1,
  579. .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
  580. .flags = CLK_SET_RATE_PARENT,
  581. .ops = &clk_rcg2_ops,
  582. },
  583. };
  584. static const struct freq_tbl ftbl_disp_cc_sleep_clk_src[] = {
  585. F(32000, P_SLEEP_CLK, 1, 0, 0),
  586. { }
  587. };
  588. static struct clk_rcg2 disp_cc_sleep_clk_src = {
  589. .cmd_rcgr = 0xe060,
  590. .mnd_width = 0,
  591. .hid_width = 5,
  592. .parent_map = disp_cc_parent_map_7,
  593. .freq_tbl = ftbl_disp_cc_sleep_clk_src,
  594. .clkr.hw.init = &(struct clk_init_data) {
  595. .name = "disp_cc_sleep_clk_src",
  596. .parent_data = disp_cc_parent_data_7,
  597. .num_parents = ARRAY_SIZE(disp_cc_parent_data_7),
  598. .flags = CLK_SET_RATE_PARENT,
  599. .ops = &clk_rcg2_ops,
  600. },
  601. };
  602. static struct clk_rcg2 disp_cc_xo_clk_src = {
  603. .cmd_rcgr = 0xe044,
  604. .mnd_width = 0,
  605. .hid_width = 5,
  606. .parent_map = disp_cc_parent_map_1,
  607. .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
  608. .clkr.hw.init = &(struct clk_init_data) {
  609. .name = "disp_cc_xo_clk_src",
  610. .parent_data = disp_cc_parent_data_1_ao,
  611. .num_parents = ARRAY_SIZE(disp_cc_parent_data_1_ao),
  612. .flags = CLK_SET_RATE_PARENT,
  613. .ops = &clk_rcg2_ops,
  614. },
  615. };
  616. static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
  617. .reg = 0x814c,
  618. .shift = 0,
  619. .width = 4,
  620. .clkr.hw.init = &(struct clk_init_data) {
  621. .name = "disp_cc_mdss_byte0_div_clk_src",
  622. .parent_hws = (const struct clk_hw*[]) {
  623. &disp_cc_mdss_byte0_clk_src.clkr.hw,
  624. },
  625. .num_parents = 1,
  626. .ops = &clk_regmap_div_ops,
  627. },
  628. };
  629. static struct clk_regmap_div disp_cc_mdss_byte1_div_clk_src = {
  630. .reg = 0x8168,
  631. .shift = 0,
  632. .width = 4,
  633. .clkr.hw.init = &(struct clk_init_data) {
  634. .name = "disp_cc_mdss_byte1_div_clk_src",
  635. .parent_hws = (const struct clk_hw*[]) {
  636. &disp_cc_mdss_byte1_clk_src.clkr.hw,
  637. },
  638. .num_parents = 1,
  639. .ops = &clk_regmap_div_ops,
  640. },
  641. };
  642. static struct clk_regmap_div disp_cc_mdss_dptx0_link_div_clk_src = {
  643. .reg = 0x81b4,
  644. .shift = 0,
  645. .width = 4,
  646. .clkr.hw.init = &(struct clk_init_data) {
  647. .name = "disp_cc_mdss_dptx0_link_div_clk_src",
  648. .parent_hws = (const struct clk_hw*[]) {
  649. &disp_cc_mdss_dptx0_link_clk_src.clkr.hw,
  650. },
  651. .num_parents = 1,
  652. .flags = CLK_SET_RATE_PARENT,
  653. .ops = &clk_regmap_div_ro_ops,
  654. },
  655. };
  656. static struct clk_regmap_div disp_cc_mdss_dptx1_link_div_clk_src = {
  657. .reg = 0x824c,
  658. .shift = 0,
  659. .width = 4,
  660. .clkr.hw.init = &(struct clk_init_data) {
  661. .name = "disp_cc_mdss_dptx1_link_div_clk_src",
  662. .parent_hws = (const struct clk_hw*[]) {
  663. &disp_cc_mdss_dptx1_link_clk_src.clkr.hw,
  664. },
  665. .num_parents = 1,
  666. .flags = CLK_SET_RATE_PARENT,
  667. .ops = &clk_regmap_div_ro_ops,
  668. },
  669. };
  670. static struct clk_regmap_div disp_cc_mdss_dptx2_link_div_clk_src = {
  671. .reg = 0x8284,
  672. .shift = 0,
  673. .width = 4,
  674. .clkr.hw.init = &(struct clk_init_data) {
  675. .name = "disp_cc_mdss_dptx2_link_div_clk_src",
  676. .parent_hws = (const struct clk_hw*[]) {
  677. &disp_cc_mdss_dptx2_link_clk_src.clkr.hw,
  678. },
  679. .num_parents = 1,
  680. .flags = CLK_SET_RATE_PARENT,
  681. .ops = &clk_regmap_div_ro_ops,
  682. },
  683. };
  684. static struct clk_regmap_div disp_cc_mdss_dptx3_link_div_clk_src = {
  685. .reg = 0x8304,
  686. .shift = 0,
  687. .width = 4,
  688. .clkr.hw.init = &(struct clk_init_data) {
  689. .name = "disp_cc_mdss_dptx3_link_div_clk_src",
  690. .parent_hws = (const struct clk_hw*[]) {
  691. &disp_cc_mdss_dptx3_link_clk_src.clkr.hw,
  692. },
  693. .num_parents = 1,
  694. .flags = CLK_SET_RATE_PARENT,
  695. .ops = &clk_regmap_div_ro_ops,
  696. },
  697. };
  698. static struct clk_branch disp_cc_mdss_ahb1_clk = {
  699. .halt_reg = 0xa020,
  700. .halt_check = BRANCH_HALT,
  701. .clkr = {
  702. .enable_reg = 0xa020,
  703. .enable_mask = BIT(0),
  704. .hw.init = &(struct clk_init_data) {
  705. .name = "disp_cc_mdss_ahb1_clk",
  706. .parent_hws = (const struct clk_hw*[]) {
  707. &disp_cc_mdss_ahb_clk_src.clkr.hw,
  708. },
  709. .num_parents = 1,
  710. .flags = CLK_SET_RATE_PARENT,
  711. .ops = &clk_branch2_ops,
  712. },
  713. },
  714. };
  715. static struct clk_branch disp_cc_mdss_ahb_clk = {
  716. .halt_reg = 0x80a4,
  717. .halt_check = BRANCH_HALT,
  718. .clkr = {
  719. .enable_reg = 0x80a4,
  720. .enable_mask = BIT(0),
  721. .hw.init = &(struct clk_init_data) {
  722. .name = "disp_cc_mdss_ahb_clk",
  723. .parent_hws = (const struct clk_hw*[]) {
  724. &disp_cc_mdss_ahb_clk_src.clkr.hw,
  725. },
  726. .num_parents = 1,
  727. .flags = CLK_SET_RATE_PARENT,
  728. .ops = &clk_branch2_ops,
  729. },
  730. },
  731. };
  732. static struct clk_branch disp_cc_mdss_byte0_clk = {
  733. .halt_reg = 0x8028,
  734. .halt_check = BRANCH_HALT,
  735. .clkr = {
  736. .enable_reg = 0x8028,
  737. .enable_mask = BIT(0),
  738. .hw.init = &(struct clk_init_data) {
  739. .name = "disp_cc_mdss_byte0_clk",
  740. .parent_hws = (const struct clk_hw*[]) {
  741. &disp_cc_mdss_byte0_clk_src.clkr.hw,
  742. },
  743. .num_parents = 1,
  744. .flags = CLK_SET_RATE_PARENT,
  745. .ops = &clk_branch2_ops,
  746. },
  747. },
  748. };
  749. static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
  750. .halt_reg = 0x802c,
  751. .halt_check = BRANCH_HALT,
  752. .clkr = {
  753. .enable_reg = 0x802c,
  754. .enable_mask = BIT(0),
  755. .hw.init = &(struct clk_init_data) {
  756. .name = "disp_cc_mdss_byte0_intf_clk",
  757. .parent_hws = (const struct clk_hw*[]) {
  758. &disp_cc_mdss_byte0_div_clk_src.clkr.hw,
  759. },
  760. .num_parents = 1,
  761. .flags = CLK_SET_RATE_PARENT,
  762. .ops = &clk_branch2_ops,
  763. },
  764. },
  765. };
  766. static struct clk_branch disp_cc_mdss_byte1_clk = {
  767. .halt_reg = 0x8030,
  768. .halt_check = BRANCH_HALT,
  769. .clkr = {
  770. .enable_reg = 0x8030,
  771. .enable_mask = BIT(0),
  772. .hw.init = &(struct clk_init_data) {
  773. .name = "disp_cc_mdss_byte1_clk",
  774. .parent_hws = (const struct clk_hw*[]) {
  775. &disp_cc_mdss_byte1_clk_src.clkr.hw,
  776. },
  777. .num_parents = 1,
  778. .flags = CLK_SET_RATE_PARENT,
  779. .ops = &clk_branch2_ops,
  780. },
  781. },
  782. };
  783. static struct clk_branch disp_cc_mdss_byte1_intf_clk = {
  784. .halt_reg = 0x8034,
  785. .halt_check = BRANCH_HALT,
  786. .clkr = {
  787. .enable_reg = 0x8034,
  788. .enable_mask = BIT(0),
  789. .hw.init = &(struct clk_init_data) {
  790. .name = "disp_cc_mdss_byte1_intf_clk",
  791. .parent_hws = (const struct clk_hw*[]) {
  792. &disp_cc_mdss_byte1_div_clk_src.clkr.hw,
  793. },
  794. .num_parents = 1,
  795. .flags = CLK_SET_RATE_PARENT,
  796. .ops = &clk_branch2_ops,
  797. },
  798. },
  799. };
  800. static struct clk_branch disp_cc_mdss_dptx0_aux_clk = {
  801. .halt_reg = 0x8058,
  802. .halt_check = BRANCH_HALT,
  803. .clkr = {
  804. .enable_reg = 0x8058,
  805. .enable_mask = BIT(0),
  806. .hw.init = &(struct clk_init_data) {
  807. .name = "disp_cc_mdss_dptx0_aux_clk",
  808. .parent_hws = (const struct clk_hw*[]) {
  809. &disp_cc_mdss_dptx0_aux_clk_src.clkr.hw,
  810. },
  811. .num_parents = 1,
  812. .flags = CLK_SET_RATE_PARENT,
  813. .ops = &clk_branch2_ops,
  814. },
  815. },
  816. };
  817. static struct clk_branch disp_cc_mdss_dptx0_crypto_clk = {
  818. .halt_reg = 0x804c,
  819. .halt_check = BRANCH_HALT,
  820. .clkr = {
  821. .enable_reg = 0x804c,
  822. .enable_mask = BIT(0),
  823. .hw.init = &(struct clk_init_data) {
  824. .name = "disp_cc_mdss_dptx0_crypto_clk",
  825. .parent_hws = (const struct clk_hw*[]) {
  826. &disp_cc_mdss_dptx0_link_clk_src.clkr.hw,
  827. },
  828. .num_parents = 1,
  829. .flags = CLK_SET_RATE_PARENT,
  830. .ops = &clk_branch2_ops,
  831. },
  832. },
  833. };
  834. static struct clk_branch disp_cc_mdss_dptx0_link_clk = {
  835. .halt_reg = 0x8040,
  836. .halt_check = BRANCH_HALT,
  837. .clkr = {
  838. .enable_reg = 0x8040,
  839. .enable_mask = BIT(0),
  840. .hw.init = &(struct clk_init_data) {
  841. .name = "disp_cc_mdss_dptx0_link_clk",
  842. .parent_hws = (const struct clk_hw*[]) {
  843. &disp_cc_mdss_dptx0_link_clk_src.clkr.hw,
  844. },
  845. .num_parents = 1,
  846. .flags = CLK_SET_RATE_PARENT,
  847. .ops = &clk_branch2_ops,
  848. },
  849. },
  850. };
  851. static struct clk_branch disp_cc_mdss_dptx0_link_intf_clk = {
  852. .halt_reg = 0x8048,
  853. .halt_check = BRANCH_HALT,
  854. .clkr = {
  855. .enable_reg = 0x8048,
  856. .enable_mask = BIT(0),
  857. .hw.init = &(struct clk_init_data) {
  858. .name = "disp_cc_mdss_dptx0_link_intf_clk",
  859. .parent_hws = (const struct clk_hw*[]) {
  860. &disp_cc_mdss_dptx0_link_div_clk_src.clkr.hw,
  861. },
  862. .num_parents = 1,
  863. .flags = CLK_SET_RATE_PARENT,
  864. .ops = &clk_branch2_ops,
  865. },
  866. },
  867. };
  868. static struct clk_branch disp_cc_mdss_dptx0_pixel0_clk = {
  869. .halt_reg = 0x8050,
  870. .halt_check = BRANCH_HALT,
  871. .clkr = {
  872. .enable_reg = 0x8050,
  873. .enable_mask = BIT(0),
  874. .hw.init = &(struct clk_init_data) {
  875. .name = "disp_cc_mdss_dptx0_pixel0_clk",
  876. .parent_hws = (const struct clk_hw*[]) {
  877. &disp_cc_mdss_dptx0_pixel0_clk_src.clkr.hw,
  878. },
  879. .num_parents = 1,
  880. .flags = CLK_SET_RATE_PARENT,
  881. .ops = &clk_branch2_ops,
  882. },
  883. },
  884. };
  885. static struct clk_branch disp_cc_mdss_dptx0_pixel1_clk = {
  886. .halt_reg = 0x8054,
  887. .halt_check = BRANCH_HALT,
  888. .clkr = {
  889. .enable_reg = 0x8054,
  890. .enable_mask = BIT(0),
  891. .hw.init = &(struct clk_init_data) {
  892. .name = "disp_cc_mdss_dptx0_pixel1_clk",
  893. .parent_hws = (const struct clk_hw*[]) {
  894. &disp_cc_mdss_dptx0_pixel1_clk_src.clkr.hw,
  895. },
  896. .num_parents = 1,
  897. .flags = CLK_SET_RATE_PARENT,
  898. .ops = &clk_branch2_ops,
  899. },
  900. },
  901. };
  902. static struct clk_branch disp_cc_mdss_dptx0_usb_router_link_intf_clk = {
  903. .halt_reg = 0x8044,
  904. .halt_check = BRANCH_HALT,
  905. .clkr = {
  906. .enable_reg = 0x8044,
  907. .enable_mask = BIT(0),
  908. .hw.init = &(struct clk_init_data) {
  909. .name = "disp_cc_mdss_dptx0_usb_router_link_intf_clk",
  910. .parent_hws = (const struct clk_hw*[]) {
  911. &disp_cc_mdss_dptx0_link_div_clk_src.clkr.hw,
  912. },
  913. .num_parents = 1,
  914. .flags = CLK_SET_RATE_PARENT,
  915. .ops = &clk_branch2_ops,
  916. },
  917. },
  918. };
  919. static struct clk_branch disp_cc_mdss_dptx1_aux_clk = {
  920. .halt_reg = 0x8074,
  921. .halt_check = BRANCH_HALT,
  922. .clkr = {
  923. .enable_reg = 0x8074,
  924. .enable_mask = BIT(0),
  925. .hw.init = &(struct clk_init_data) {
  926. .name = "disp_cc_mdss_dptx1_aux_clk",
  927. .parent_hws = (const struct clk_hw*[]) {
  928. &disp_cc_mdss_dptx1_aux_clk_src.clkr.hw,
  929. },
  930. .num_parents = 1,
  931. .flags = CLK_SET_RATE_PARENT,
  932. .ops = &clk_branch2_ops,
  933. },
  934. },
  935. };
  936. static struct clk_branch disp_cc_mdss_dptx1_crypto_clk = {
  937. .halt_reg = 0x8070,
  938. .halt_check = BRANCH_HALT,
  939. .clkr = {
  940. .enable_reg = 0x8070,
  941. .enable_mask = BIT(0),
  942. .hw.init = &(struct clk_init_data) {
  943. .name = "disp_cc_mdss_dptx1_crypto_clk",
  944. .parent_hws = (const struct clk_hw*[]) {
  945. &disp_cc_mdss_dptx1_link_clk_src.clkr.hw,
  946. },
  947. .num_parents = 1,
  948. .flags = CLK_SET_RATE_PARENT,
  949. .ops = &clk_branch2_ops,
  950. },
  951. },
  952. };
  953. static struct clk_branch disp_cc_mdss_dptx1_link_clk = {
  954. .halt_reg = 0x8064,
  955. .halt_check = BRANCH_HALT,
  956. .clkr = {
  957. .enable_reg = 0x8064,
  958. .enable_mask = BIT(0),
  959. .hw.init = &(struct clk_init_data) {
  960. .name = "disp_cc_mdss_dptx1_link_clk",
  961. .parent_hws = (const struct clk_hw*[]) {
  962. &disp_cc_mdss_dptx1_link_clk_src.clkr.hw,
  963. },
  964. .num_parents = 1,
  965. .flags = CLK_SET_RATE_PARENT,
  966. .ops = &clk_branch2_ops,
  967. },
  968. },
  969. };
  970. static struct clk_branch disp_cc_mdss_dptx1_link_intf_clk = {
  971. .halt_reg = 0x806c,
  972. .halt_check = BRANCH_HALT,
  973. .clkr = {
  974. .enable_reg = 0x806c,
  975. .enable_mask = BIT(0),
  976. .hw.init = &(struct clk_init_data) {
  977. .name = "disp_cc_mdss_dptx1_link_intf_clk",
  978. .parent_hws = (const struct clk_hw*[]) {
  979. &disp_cc_mdss_dptx1_link_div_clk_src.clkr.hw,
  980. },
  981. .num_parents = 1,
  982. .flags = CLK_SET_RATE_PARENT,
  983. .ops = &clk_branch2_ops,
  984. },
  985. },
  986. };
  987. static struct clk_branch disp_cc_mdss_dptx1_pixel0_clk = {
  988. .halt_reg = 0x805c,
  989. .halt_check = BRANCH_HALT,
  990. .clkr = {
  991. .enable_reg = 0x805c,
  992. .enable_mask = BIT(0),
  993. .hw.init = &(struct clk_init_data) {
  994. .name = "disp_cc_mdss_dptx1_pixel0_clk",
  995. .parent_hws = (const struct clk_hw*[]) {
  996. &disp_cc_mdss_dptx1_pixel0_clk_src.clkr.hw,
  997. },
  998. .num_parents = 1,
  999. .flags = CLK_SET_RATE_PARENT,
  1000. .ops = &clk_branch2_ops,
  1001. },
  1002. },
  1003. };
  1004. static struct clk_branch disp_cc_mdss_dptx1_pixel1_clk = {
  1005. .halt_reg = 0x8060,
  1006. .halt_check = BRANCH_HALT,
  1007. .clkr = {
  1008. .enable_reg = 0x8060,
  1009. .enable_mask = BIT(0),
  1010. .hw.init = &(struct clk_init_data) {
  1011. .name = "disp_cc_mdss_dptx1_pixel1_clk",
  1012. .parent_hws = (const struct clk_hw*[]) {
  1013. &disp_cc_mdss_dptx1_pixel1_clk_src.clkr.hw,
  1014. },
  1015. .num_parents = 1,
  1016. .flags = CLK_SET_RATE_PARENT,
  1017. .ops = &clk_branch2_ops,
  1018. },
  1019. },
  1020. };
  1021. static struct clk_branch disp_cc_mdss_dptx1_usb_router_link_intf_clk = {
  1022. .halt_reg = 0x8068,
  1023. .halt_check = BRANCH_HALT,
  1024. .clkr = {
  1025. .enable_reg = 0x8068,
  1026. .enable_mask = BIT(0),
  1027. .hw.init = &(struct clk_init_data) {
  1028. .name = "disp_cc_mdss_dptx1_usb_router_link_intf_clk",
  1029. .parent_hws = (const struct clk_hw*[]) {
  1030. &disp_cc_mdss_dptx0_link_div_clk_src.clkr.hw,
  1031. },
  1032. .num_parents = 1,
  1033. .flags = CLK_SET_RATE_PARENT,
  1034. .ops = &clk_branch2_ops,
  1035. },
  1036. },
  1037. };
  1038. static struct clk_branch disp_cc_mdss_dptx2_aux_clk = {
  1039. .halt_reg = 0x808c,
  1040. .halt_check = BRANCH_HALT,
  1041. .clkr = {
  1042. .enable_reg = 0x808c,
  1043. .enable_mask = BIT(0),
  1044. .hw.init = &(struct clk_init_data) {
  1045. .name = "disp_cc_mdss_dptx2_aux_clk",
  1046. .parent_hws = (const struct clk_hw*[]) {
  1047. &disp_cc_mdss_dptx2_aux_clk_src.clkr.hw,
  1048. },
  1049. .num_parents = 1,
  1050. .flags = CLK_SET_RATE_PARENT,
  1051. .ops = &clk_branch2_ops,
  1052. },
  1053. },
  1054. };
  1055. static struct clk_branch disp_cc_mdss_dptx2_crypto_clk = {
  1056. .halt_reg = 0x8088,
  1057. .halt_check = BRANCH_HALT,
  1058. .clkr = {
  1059. .enable_reg = 0x8088,
  1060. .enable_mask = BIT(0),
  1061. .hw.init = &(struct clk_init_data) {
  1062. .name = "disp_cc_mdss_dptx2_crypto_clk",
  1063. .parent_hws = (const struct clk_hw*[]) {
  1064. &disp_cc_mdss_dptx2_link_clk_src.clkr.hw,
  1065. },
  1066. .num_parents = 1,
  1067. .flags = CLK_SET_RATE_PARENT,
  1068. .ops = &clk_branch2_ops,
  1069. },
  1070. },
  1071. };
  1072. static struct clk_branch disp_cc_mdss_dptx2_link_clk = {
  1073. .halt_reg = 0x8080,
  1074. .halt_check = BRANCH_HALT,
  1075. .clkr = {
  1076. .enable_reg = 0x8080,
  1077. .enable_mask = BIT(0),
  1078. .hw.init = &(struct clk_init_data) {
  1079. .name = "disp_cc_mdss_dptx2_link_clk",
  1080. .parent_hws = (const struct clk_hw*[]) {
  1081. &disp_cc_mdss_dptx2_link_clk_src.clkr.hw,
  1082. },
  1083. .num_parents = 1,
  1084. .flags = CLK_SET_RATE_PARENT,
  1085. .ops = &clk_branch2_ops,
  1086. },
  1087. },
  1088. };
  1089. static struct clk_branch disp_cc_mdss_dptx2_link_intf_clk = {
  1090. .halt_reg = 0x8084,
  1091. .halt_check = BRANCH_HALT,
  1092. .clkr = {
  1093. .enable_reg = 0x8084,
  1094. .enable_mask = BIT(0),
  1095. .hw.init = &(struct clk_init_data) {
  1096. .name = "disp_cc_mdss_dptx2_link_intf_clk",
  1097. .parent_hws = (const struct clk_hw*[]) {
  1098. &disp_cc_mdss_dptx2_link_div_clk_src.clkr.hw,
  1099. },
  1100. .num_parents = 1,
  1101. .flags = CLK_SET_RATE_PARENT,
  1102. .ops = &clk_branch2_ops,
  1103. },
  1104. },
  1105. };
  1106. static struct clk_branch disp_cc_mdss_dptx2_pixel0_clk = {
  1107. .halt_reg = 0x8078,
  1108. .halt_check = BRANCH_HALT,
  1109. .clkr = {
  1110. .enable_reg = 0x8078,
  1111. .enable_mask = BIT(0),
  1112. .hw.init = &(struct clk_init_data) {
  1113. .name = "disp_cc_mdss_dptx2_pixel0_clk",
  1114. .parent_hws = (const struct clk_hw*[]) {
  1115. &disp_cc_mdss_dptx2_pixel0_clk_src.clkr.hw,
  1116. },
  1117. .num_parents = 1,
  1118. .flags = CLK_SET_RATE_PARENT,
  1119. .ops = &clk_branch2_ops,
  1120. },
  1121. },
  1122. };
  1123. static struct clk_branch disp_cc_mdss_dptx2_pixel1_clk = {
  1124. .halt_reg = 0x807c,
  1125. .halt_check = BRANCH_HALT,
  1126. .clkr = {
  1127. .enable_reg = 0x807c,
  1128. .enable_mask = BIT(0),
  1129. .hw.init = &(struct clk_init_data) {
  1130. .name = "disp_cc_mdss_dptx2_pixel1_clk",
  1131. .parent_hws = (const struct clk_hw*[]) {
  1132. &disp_cc_mdss_dptx2_pixel1_clk_src.clkr.hw,
  1133. },
  1134. .num_parents = 1,
  1135. .flags = CLK_SET_RATE_PARENT,
  1136. .ops = &clk_branch2_ops,
  1137. },
  1138. },
  1139. };
  1140. static struct clk_branch disp_cc_mdss_dptx3_aux_clk = {
  1141. .halt_reg = 0x809c,
  1142. .halt_check = BRANCH_HALT,
  1143. .clkr = {
  1144. .enable_reg = 0x809c,
  1145. .enable_mask = BIT(0),
  1146. .hw.init = &(struct clk_init_data) {
  1147. .name = "disp_cc_mdss_dptx3_aux_clk",
  1148. .parent_hws = (const struct clk_hw*[]) {
  1149. &disp_cc_mdss_dptx3_aux_clk_src.clkr.hw,
  1150. },
  1151. .num_parents = 1,
  1152. .flags = CLK_SET_RATE_PARENT,
  1153. .ops = &clk_branch2_ops,
  1154. },
  1155. },
  1156. };
  1157. static struct clk_branch disp_cc_mdss_dptx3_crypto_clk = {
  1158. .halt_reg = 0x80a0,
  1159. .halt_check = BRANCH_HALT,
  1160. .clkr = {
  1161. .enable_reg = 0x80a0,
  1162. .enable_mask = BIT(0),
  1163. .hw.init = &(struct clk_init_data) {
  1164. .name = "disp_cc_mdss_dptx3_crypto_clk",
  1165. .parent_hws = (const struct clk_hw*[]) {
  1166. &disp_cc_mdss_dptx3_link_clk_src.clkr.hw,
  1167. },
  1168. .num_parents = 1,
  1169. .flags = CLK_SET_RATE_PARENT,
  1170. .ops = &clk_branch2_ops,
  1171. },
  1172. },
  1173. };
  1174. static struct clk_branch disp_cc_mdss_dptx3_link_clk = {
  1175. .halt_reg = 0x8094,
  1176. .halt_check = BRANCH_HALT,
  1177. .clkr = {
  1178. .enable_reg = 0x8094,
  1179. .enable_mask = BIT(0),
  1180. .hw.init = &(struct clk_init_data) {
  1181. .name = "disp_cc_mdss_dptx3_link_clk",
  1182. .parent_hws = (const struct clk_hw*[]) {
  1183. &disp_cc_mdss_dptx3_link_clk_src.clkr.hw,
  1184. },
  1185. .num_parents = 1,
  1186. .flags = CLK_SET_RATE_PARENT,
  1187. .ops = &clk_branch2_ops,
  1188. },
  1189. },
  1190. };
  1191. static struct clk_branch disp_cc_mdss_dptx3_link_intf_clk = {
  1192. .halt_reg = 0x8098,
  1193. .halt_check = BRANCH_HALT,
  1194. .clkr = {
  1195. .enable_reg = 0x8098,
  1196. .enable_mask = BIT(0),
  1197. .hw.init = &(struct clk_init_data) {
  1198. .name = "disp_cc_mdss_dptx3_link_intf_clk",
  1199. .parent_hws = (const struct clk_hw*[]) {
  1200. &disp_cc_mdss_dptx3_link_div_clk_src.clkr.hw,
  1201. },
  1202. .num_parents = 1,
  1203. .flags = CLK_SET_RATE_PARENT,
  1204. .ops = &clk_branch2_ops,
  1205. },
  1206. },
  1207. };
  1208. static struct clk_branch disp_cc_mdss_dptx3_pixel0_clk = {
  1209. .halt_reg = 0x8090,
  1210. .halt_check = BRANCH_HALT,
  1211. .clkr = {
  1212. .enable_reg = 0x8090,
  1213. .enable_mask = BIT(0),
  1214. .hw.init = &(struct clk_init_data) {
  1215. .name = "disp_cc_mdss_dptx3_pixel0_clk",
  1216. .parent_hws = (const struct clk_hw*[]) {
  1217. &disp_cc_mdss_dptx3_pixel0_clk_src.clkr.hw,
  1218. },
  1219. .num_parents = 1,
  1220. .flags = CLK_SET_RATE_PARENT,
  1221. .ops = &clk_branch2_ops,
  1222. },
  1223. },
  1224. };
  1225. static struct clk_branch disp_cc_mdss_esc0_clk = {
  1226. .halt_reg = 0x8038,
  1227. .halt_check = BRANCH_HALT,
  1228. .clkr = {
  1229. .enable_reg = 0x8038,
  1230. .enable_mask = BIT(0),
  1231. .hw.init = &(struct clk_init_data) {
  1232. .name = "disp_cc_mdss_esc0_clk",
  1233. .parent_hws = (const struct clk_hw*[]) {
  1234. &disp_cc_mdss_esc0_clk_src.clkr.hw,
  1235. },
  1236. .num_parents = 1,
  1237. .flags = CLK_SET_RATE_PARENT,
  1238. .ops = &clk_branch2_ops,
  1239. },
  1240. },
  1241. };
  1242. static struct clk_branch disp_cc_mdss_esc1_clk = {
  1243. .halt_reg = 0x803c,
  1244. .halt_check = BRANCH_HALT,
  1245. .clkr = {
  1246. .enable_reg = 0x803c,
  1247. .enable_mask = BIT(0),
  1248. .hw.init = &(struct clk_init_data) {
  1249. .name = "disp_cc_mdss_esc1_clk",
  1250. .parent_hws = (const struct clk_hw*[]) {
  1251. &disp_cc_mdss_esc1_clk_src.clkr.hw,
  1252. },
  1253. .num_parents = 1,
  1254. .flags = CLK_SET_RATE_PARENT,
  1255. .ops = &clk_branch2_ops,
  1256. },
  1257. },
  1258. };
  1259. static struct clk_branch disp_cc_mdss_mdp1_clk = {
  1260. .halt_reg = 0xa004,
  1261. .halt_check = BRANCH_HALT,
  1262. .clkr = {
  1263. .enable_reg = 0xa004,
  1264. .enable_mask = BIT(0),
  1265. .hw.init = &(struct clk_init_data) {
  1266. .name = "disp_cc_mdss_mdp1_clk",
  1267. .parent_hws = (const struct clk_hw*[]) {
  1268. &disp_cc_mdss_mdp_clk_src.clkr.hw,
  1269. },
  1270. .num_parents = 1,
  1271. .flags = CLK_SET_RATE_PARENT,
  1272. .ops = &clk_branch2_ops,
  1273. },
  1274. },
  1275. };
  1276. static struct clk_branch disp_cc_mdss_mdp_clk = {
  1277. .halt_reg = 0x800c,
  1278. .halt_check = BRANCH_HALT,
  1279. .clkr = {
  1280. .enable_reg = 0x800c,
  1281. .enable_mask = BIT(0),
  1282. .hw.init = &(struct clk_init_data) {
  1283. .name = "disp_cc_mdss_mdp_clk",
  1284. .parent_hws = (const struct clk_hw*[]) {
  1285. &disp_cc_mdss_mdp_clk_src.clkr.hw,
  1286. },
  1287. .num_parents = 1,
  1288. .flags = CLK_SET_RATE_PARENT,
  1289. .ops = &clk_branch2_ops,
  1290. },
  1291. },
  1292. };
  1293. static struct clk_branch disp_cc_mdss_mdp_lut1_clk = {
  1294. .halt_reg = 0xa014,
  1295. .halt_check = BRANCH_HALT,
  1296. .clkr = {
  1297. .enable_reg = 0xa014,
  1298. .enable_mask = BIT(0),
  1299. .hw.init = &(struct clk_init_data) {
  1300. .name = "disp_cc_mdss_mdp_lut1_clk",
  1301. .parent_hws = (const struct clk_hw*[]) {
  1302. &disp_cc_mdss_mdp_clk_src.clkr.hw,
  1303. },
  1304. .num_parents = 1,
  1305. .flags = CLK_SET_RATE_PARENT,
  1306. .ops = &clk_branch2_ops,
  1307. },
  1308. },
  1309. };
  1310. static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
  1311. .halt_reg = 0x801c,
  1312. .halt_check = BRANCH_HALT_VOTED,
  1313. .clkr = {
  1314. .enable_reg = 0x801c,
  1315. .enable_mask = BIT(0),
  1316. .hw.init = &(struct clk_init_data) {
  1317. .name = "disp_cc_mdss_mdp_lut_clk",
  1318. .parent_hws = (const struct clk_hw*[]) {
  1319. &disp_cc_mdss_mdp_clk_src.clkr.hw,
  1320. },
  1321. .num_parents = 1,
  1322. .flags = CLK_SET_RATE_PARENT,
  1323. .ops = &clk_branch2_ops,
  1324. },
  1325. },
  1326. };
  1327. static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
  1328. .halt_reg = 0xc004,
  1329. .halt_check = BRANCH_HALT_VOTED,
  1330. .clkr = {
  1331. .enable_reg = 0xc004,
  1332. .enable_mask = BIT(0),
  1333. .hw.init = &(struct clk_init_data) {
  1334. .name = "disp_cc_mdss_non_gdsc_ahb_clk",
  1335. .parent_hws = (const struct clk_hw*[]) {
  1336. &disp_cc_mdss_ahb_clk_src.clkr.hw,
  1337. },
  1338. .num_parents = 1,
  1339. .flags = CLK_SET_RATE_PARENT,
  1340. .ops = &clk_branch2_ops,
  1341. },
  1342. },
  1343. };
  1344. static struct clk_branch disp_cc_mdss_pclk0_clk = {
  1345. .halt_reg = 0x8004,
  1346. .halt_check = BRANCH_HALT,
  1347. .clkr = {
  1348. .enable_reg = 0x8004,
  1349. .enable_mask = BIT(0),
  1350. .hw.init = &(struct clk_init_data) {
  1351. .name = "disp_cc_mdss_pclk0_clk",
  1352. .parent_hws = (const struct clk_hw*[]) {
  1353. &disp_cc_mdss_pclk0_clk_src.clkr.hw,
  1354. },
  1355. .num_parents = 1,
  1356. .flags = CLK_SET_RATE_PARENT,
  1357. .ops = &clk_branch2_ops,
  1358. },
  1359. },
  1360. };
  1361. static struct clk_branch disp_cc_mdss_pclk1_clk = {
  1362. .halt_reg = 0x8008,
  1363. .halt_check = BRANCH_HALT,
  1364. .clkr = {
  1365. .enable_reg = 0x8008,
  1366. .enable_mask = BIT(0),
  1367. .hw.init = &(struct clk_init_data) {
  1368. .name = "disp_cc_mdss_pclk1_clk",
  1369. .parent_hws = (const struct clk_hw*[]) {
  1370. &disp_cc_mdss_pclk1_clk_src.clkr.hw,
  1371. },
  1372. .num_parents = 1,
  1373. .flags = CLK_SET_RATE_PARENT,
  1374. .ops = &clk_branch2_ops,
  1375. },
  1376. },
  1377. };
  1378. static struct clk_branch disp_cc_mdss_rot1_clk = {
  1379. .halt_reg = 0xa00c,
  1380. .halt_check = BRANCH_HALT,
  1381. .clkr = {
  1382. .enable_reg = 0xa00c,
  1383. .enable_mask = BIT(0),
  1384. .hw.init = &(struct clk_init_data) {
  1385. .name = "disp_cc_mdss_rot1_clk",
  1386. .parent_hws = (const struct clk_hw*[]) {
  1387. &disp_cc_mdss_rot_clk_src.clkr.hw,
  1388. },
  1389. .num_parents = 1,
  1390. .flags = CLK_SET_RATE_PARENT,
  1391. .ops = &clk_branch2_ops,
  1392. },
  1393. },
  1394. };
  1395. static struct clk_branch disp_cc_mdss_rot_clk = {
  1396. .halt_reg = 0x8014,
  1397. .halt_check = BRANCH_HALT,
  1398. .clkr = {
  1399. .enable_reg = 0x8014,
  1400. .enable_mask = BIT(0),
  1401. .hw.init = &(struct clk_init_data) {
  1402. .name = "disp_cc_mdss_rot_clk",
  1403. .parent_hws = (const struct clk_hw*[]) {
  1404. &disp_cc_mdss_rot_clk_src.clkr.hw,
  1405. },
  1406. .num_parents = 1,
  1407. .flags = CLK_SET_RATE_PARENT,
  1408. .ops = &clk_branch2_ops,
  1409. },
  1410. },
  1411. };
  1412. static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
  1413. .halt_reg = 0xc00c,
  1414. .halt_check = BRANCH_HALT,
  1415. .clkr = {
  1416. .enable_reg = 0xc00c,
  1417. .enable_mask = BIT(0),
  1418. .hw.init = &(struct clk_init_data) {
  1419. .name = "disp_cc_mdss_rscc_ahb_clk",
  1420. .parent_hws = (const struct clk_hw*[]) {
  1421. &disp_cc_mdss_ahb_clk_src.clkr.hw,
  1422. },
  1423. .num_parents = 1,
  1424. .flags = CLK_SET_RATE_PARENT,
  1425. .ops = &clk_branch2_ops,
  1426. },
  1427. },
  1428. };
  1429. static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
  1430. .halt_reg = 0xc008,
  1431. .halt_check = BRANCH_HALT,
  1432. .clkr = {
  1433. .enable_reg = 0xc008,
  1434. .enable_mask = BIT(0),
  1435. .hw.init = &(struct clk_init_data) {
  1436. .name = "disp_cc_mdss_rscc_vsync_clk",
  1437. .parent_hws = (const struct clk_hw*[]) {
  1438. &disp_cc_mdss_vsync_clk_src.clkr.hw,
  1439. },
  1440. .num_parents = 1,
  1441. .flags = CLK_SET_RATE_PARENT,
  1442. .ops = &clk_branch2_ops,
  1443. },
  1444. },
  1445. };
  1446. static struct clk_branch disp_cc_mdss_vsync1_clk = {
  1447. .halt_reg = 0xa01c,
  1448. .halt_check = BRANCH_HALT,
  1449. .clkr = {
  1450. .enable_reg = 0xa01c,
  1451. .enable_mask = BIT(0),
  1452. .hw.init = &(struct clk_init_data) {
  1453. .name = "disp_cc_mdss_vsync1_clk",
  1454. .parent_hws = (const struct clk_hw*[]) {
  1455. &disp_cc_mdss_vsync_clk_src.clkr.hw,
  1456. },
  1457. .num_parents = 1,
  1458. .flags = CLK_SET_RATE_PARENT,
  1459. .ops = &clk_branch2_ops,
  1460. },
  1461. },
  1462. };
  1463. static struct clk_branch disp_cc_mdss_vsync_clk = {
  1464. .halt_reg = 0x8024,
  1465. .halt_check = BRANCH_HALT,
  1466. .clkr = {
  1467. .enable_reg = 0x8024,
  1468. .enable_mask = BIT(0),
  1469. .hw.init = &(struct clk_init_data) {
  1470. .name = "disp_cc_mdss_vsync_clk",
  1471. .parent_hws = (const struct clk_hw*[]) {
  1472. &disp_cc_mdss_vsync_clk_src.clkr.hw,
  1473. },
  1474. .num_parents = 1,
  1475. .flags = CLK_SET_RATE_PARENT,
  1476. .ops = &clk_branch2_ops,
  1477. },
  1478. },
  1479. };
  1480. static struct clk_branch disp_cc_sleep_clk = {
  1481. .halt_reg = 0xe078,
  1482. .halt_check = BRANCH_HALT,
  1483. .clkr = {
  1484. .enable_reg = 0xe078,
  1485. .enable_mask = BIT(0),
  1486. .hw.init = &(struct clk_init_data) {
  1487. .name = "disp_cc_sleep_clk",
  1488. .parent_hws = (const struct clk_hw*[]) {
  1489. &disp_cc_sleep_clk_src.clkr.hw,
  1490. },
  1491. .num_parents = 1,
  1492. .flags = CLK_SET_RATE_PARENT,
  1493. .ops = &clk_branch2_ops,
  1494. },
  1495. },
  1496. };
  1497. static struct gdsc mdss_gdsc = {
  1498. .gdscr = 0x9000,
  1499. .pd = {
  1500. .name = "mdss_gdsc",
  1501. },
  1502. .pwrsts = PWRSTS_OFF_ON,
  1503. .flags = HW_CTRL | RETAIN_FF_ENABLE,
  1504. };
  1505. static struct gdsc mdss_int2_gdsc = {
  1506. .gdscr = 0xb000,
  1507. .pd = {
  1508. .name = "mdss_int2_gdsc",
  1509. },
  1510. .pwrsts = PWRSTS_OFF_ON,
  1511. .flags = HW_CTRL | RETAIN_FF_ENABLE,
  1512. };
  1513. static struct clk_regmap *disp_cc_sm8450_clocks[] = {
  1514. [DISP_CC_MDSS_AHB1_CLK] = &disp_cc_mdss_ahb1_clk.clkr,
  1515. [DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
  1516. [DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
  1517. [DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
  1518. [DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
  1519. [DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr,
  1520. [DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
  1521. [DISP_CC_MDSS_BYTE1_CLK] = &disp_cc_mdss_byte1_clk.clkr,
  1522. [DISP_CC_MDSS_BYTE1_CLK_SRC] = &disp_cc_mdss_byte1_clk_src.clkr,
  1523. [DISP_CC_MDSS_BYTE1_DIV_CLK_SRC] = &disp_cc_mdss_byte1_div_clk_src.clkr,
  1524. [DISP_CC_MDSS_BYTE1_INTF_CLK] = &disp_cc_mdss_byte1_intf_clk.clkr,
  1525. [DISP_CC_MDSS_DPTX0_AUX_CLK] = &disp_cc_mdss_dptx0_aux_clk.clkr,
  1526. [DISP_CC_MDSS_DPTX0_AUX_CLK_SRC] = &disp_cc_mdss_dptx0_aux_clk_src.clkr,
  1527. [DISP_CC_MDSS_DPTX0_CRYPTO_CLK] = &disp_cc_mdss_dptx0_crypto_clk.clkr,
  1528. [DISP_CC_MDSS_DPTX0_LINK_CLK] = &disp_cc_mdss_dptx0_link_clk.clkr,
  1529. [DISP_CC_MDSS_DPTX0_LINK_CLK_SRC] = &disp_cc_mdss_dptx0_link_clk_src.clkr,
  1530. [DISP_CC_MDSS_DPTX0_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx0_link_div_clk_src.clkr,
  1531. [DISP_CC_MDSS_DPTX0_LINK_INTF_CLK] = &disp_cc_mdss_dptx0_link_intf_clk.clkr,
  1532. [DISP_CC_MDSS_DPTX0_PIXEL0_CLK] = &disp_cc_mdss_dptx0_pixel0_clk.clkr,
  1533. [DISP_CC_MDSS_DPTX0_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx0_pixel0_clk_src.clkr,
  1534. [DISP_CC_MDSS_DPTX0_PIXEL1_CLK] = &disp_cc_mdss_dptx0_pixel1_clk.clkr,
  1535. [DISP_CC_MDSS_DPTX0_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx0_pixel1_clk_src.clkr,
  1536. [DISP_CC_MDSS_DPTX0_USB_ROUTER_LINK_INTF_CLK] =
  1537. &disp_cc_mdss_dptx0_usb_router_link_intf_clk.clkr,
  1538. [DISP_CC_MDSS_DPTX1_AUX_CLK] = &disp_cc_mdss_dptx1_aux_clk.clkr,
  1539. [DISP_CC_MDSS_DPTX1_AUX_CLK_SRC] = &disp_cc_mdss_dptx1_aux_clk_src.clkr,
  1540. [DISP_CC_MDSS_DPTX1_CRYPTO_CLK] = &disp_cc_mdss_dptx1_crypto_clk.clkr,
  1541. [DISP_CC_MDSS_DPTX1_LINK_CLK] = &disp_cc_mdss_dptx1_link_clk.clkr,
  1542. [DISP_CC_MDSS_DPTX1_LINK_CLK_SRC] = &disp_cc_mdss_dptx1_link_clk_src.clkr,
  1543. [DISP_CC_MDSS_DPTX1_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx1_link_div_clk_src.clkr,
  1544. [DISP_CC_MDSS_DPTX1_LINK_INTF_CLK] = &disp_cc_mdss_dptx1_link_intf_clk.clkr,
  1545. [DISP_CC_MDSS_DPTX1_PIXEL0_CLK] = &disp_cc_mdss_dptx1_pixel0_clk.clkr,
  1546. [DISP_CC_MDSS_DPTX1_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx1_pixel0_clk_src.clkr,
  1547. [DISP_CC_MDSS_DPTX1_PIXEL1_CLK] = &disp_cc_mdss_dptx1_pixel1_clk.clkr,
  1548. [DISP_CC_MDSS_DPTX1_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx1_pixel1_clk_src.clkr,
  1549. [DISP_CC_MDSS_DPTX1_USB_ROUTER_LINK_INTF_CLK] =
  1550. &disp_cc_mdss_dptx1_usb_router_link_intf_clk.clkr,
  1551. [DISP_CC_MDSS_DPTX2_AUX_CLK] = &disp_cc_mdss_dptx2_aux_clk.clkr,
  1552. [DISP_CC_MDSS_DPTX2_AUX_CLK_SRC] = &disp_cc_mdss_dptx2_aux_clk_src.clkr,
  1553. [DISP_CC_MDSS_DPTX2_CRYPTO_CLK] = &disp_cc_mdss_dptx2_crypto_clk.clkr,
  1554. [DISP_CC_MDSS_DPTX2_LINK_CLK] = &disp_cc_mdss_dptx2_link_clk.clkr,
  1555. [DISP_CC_MDSS_DPTX2_LINK_CLK_SRC] = &disp_cc_mdss_dptx2_link_clk_src.clkr,
  1556. [DISP_CC_MDSS_DPTX2_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx2_link_div_clk_src.clkr,
  1557. [DISP_CC_MDSS_DPTX2_LINK_INTF_CLK] = &disp_cc_mdss_dptx2_link_intf_clk.clkr,
  1558. [DISP_CC_MDSS_DPTX2_PIXEL0_CLK] = &disp_cc_mdss_dptx2_pixel0_clk.clkr,
  1559. [DISP_CC_MDSS_DPTX2_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx2_pixel0_clk_src.clkr,
  1560. [DISP_CC_MDSS_DPTX2_PIXEL1_CLK] = &disp_cc_mdss_dptx2_pixel1_clk.clkr,
  1561. [DISP_CC_MDSS_DPTX2_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx2_pixel1_clk_src.clkr,
  1562. [DISP_CC_MDSS_DPTX3_AUX_CLK] = &disp_cc_mdss_dptx3_aux_clk.clkr,
  1563. [DISP_CC_MDSS_DPTX3_AUX_CLK_SRC] = &disp_cc_mdss_dptx3_aux_clk_src.clkr,
  1564. [DISP_CC_MDSS_DPTX3_CRYPTO_CLK] = &disp_cc_mdss_dptx3_crypto_clk.clkr,
  1565. [DISP_CC_MDSS_DPTX3_LINK_CLK] = &disp_cc_mdss_dptx3_link_clk.clkr,
  1566. [DISP_CC_MDSS_DPTX3_LINK_CLK_SRC] = &disp_cc_mdss_dptx3_link_clk_src.clkr,
  1567. [DISP_CC_MDSS_DPTX3_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx3_link_div_clk_src.clkr,
  1568. [DISP_CC_MDSS_DPTX3_LINK_INTF_CLK] = &disp_cc_mdss_dptx3_link_intf_clk.clkr,
  1569. [DISP_CC_MDSS_DPTX3_PIXEL0_CLK] = &disp_cc_mdss_dptx3_pixel0_clk.clkr,
  1570. [DISP_CC_MDSS_DPTX3_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx3_pixel0_clk_src.clkr,
  1571. [DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
  1572. [DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
  1573. [DISP_CC_MDSS_ESC1_CLK] = &disp_cc_mdss_esc1_clk.clkr,
  1574. [DISP_CC_MDSS_ESC1_CLK_SRC] = &disp_cc_mdss_esc1_clk_src.clkr,
  1575. [DISP_CC_MDSS_MDP1_CLK] = &disp_cc_mdss_mdp1_clk.clkr,
  1576. [DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
  1577. [DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
  1578. [DISP_CC_MDSS_MDP_LUT1_CLK] = &disp_cc_mdss_mdp_lut1_clk.clkr,
  1579. [DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
  1580. [DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr,
  1581. [DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
  1582. [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
  1583. [DISP_CC_MDSS_PCLK1_CLK] = &disp_cc_mdss_pclk1_clk.clkr,
  1584. [DISP_CC_MDSS_PCLK1_CLK_SRC] = &disp_cc_mdss_pclk1_clk_src.clkr,
  1585. [DISP_CC_MDSS_ROT1_CLK] = &disp_cc_mdss_rot1_clk.clkr,
  1586. [DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr,
  1587. [DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr,
  1588. [DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr,
  1589. [DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr,
  1590. [DISP_CC_MDSS_VSYNC1_CLK] = &disp_cc_mdss_vsync1_clk.clkr,
  1591. [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
  1592. [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
  1593. [DISP_CC_PLL0] = &disp_cc_pll0.clkr,
  1594. [DISP_CC_PLL1] = &disp_cc_pll1.clkr,
  1595. [DISP_CC_SLEEP_CLK] = &disp_cc_sleep_clk.clkr,
  1596. [DISP_CC_SLEEP_CLK_SRC] = &disp_cc_sleep_clk_src.clkr,
  1597. [DISP_CC_XO_CLK_SRC] = &disp_cc_xo_clk_src.clkr,
  1598. };
  1599. static const struct qcom_reset_map disp_cc_sm8450_resets[] = {
  1600. [DISP_CC_MDSS_CORE_BCR] = { 0x8000 },
  1601. [DISP_CC_MDSS_CORE_INT2_BCR] = { 0xa000 },
  1602. [DISP_CC_MDSS_RSCC_BCR] = { 0xc000 },
  1603. };
  1604. static struct gdsc *disp_cc_sm8450_gdscs[] = {
  1605. [MDSS_GDSC] = &mdss_gdsc,
  1606. [MDSS_INT2_GDSC] = &mdss_int2_gdsc,
  1607. };
  1608. static const struct regmap_config disp_cc_sm8450_regmap_config = {
  1609. .reg_bits = 32,
  1610. .reg_stride = 4,
  1611. .val_bits = 32,
  1612. .max_register = 0x11008,
  1613. .fast_io = true,
  1614. };
  1615. static struct qcom_cc_desc disp_cc_sm8450_desc = {
  1616. .config = &disp_cc_sm8450_regmap_config,
  1617. .clks = disp_cc_sm8450_clocks,
  1618. .num_clks = ARRAY_SIZE(disp_cc_sm8450_clocks),
  1619. .resets = disp_cc_sm8450_resets,
  1620. .num_resets = ARRAY_SIZE(disp_cc_sm8450_resets),
  1621. .gdscs = disp_cc_sm8450_gdscs,
  1622. .num_gdscs = ARRAY_SIZE(disp_cc_sm8450_gdscs),
  1623. };
  1624. static const struct of_device_id disp_cc_sm8450_match_table[] = {
  1625. { .compatible = "qcom,sm8450-dispcc" },
  1626. { }
  1627. };
  1628. MODULE_DEVICE_TABLE(of, disp_cc_sm8450_match_table);
  1629. static int disp_cc_sm8450_probe(struct platform_device *pdev)
  1630. {
  1631. struct regmap *regmap;
  1632. int ret;
  1633. ret = devm_pm_runtime_enable(&pdev->dev);
  1634. if (ret)
  1635. return ret;
  1636. ret = pm_runtime_resume_and_get(&pdev->dev);
  1637. if (ret)
  1638. return ret;
  1639. regmap = qcom_cc_map(pdev, &disp_cc_sm8450_desc);
  1640. if (IS_ERR(regmap)) {
  1641. ret = PTR_ERR(regmap);
  1642. goto err_put_rpm;
  1643. }
  1644. clk_lucid_evo_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
  1645. clk_lucid_evo_pll_configure(&disp_cc_pll1, regmap, &disp_cc_pll1_config);
  1646. /* Enable clock gating for MDP clocks */
  1647. regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10);
  1648. /* Keep some clocks always-on */
  1649. qcom_branch_set_clk_en(regmap, 0xe05c); /* DISP_CC_XO_CLK */
  1650. ret = qcom_cc_really_probe(&pdev->dev, &disp_cc_sm8450_desc, regmap);
  1651. if (ret)
  1652. goto err_put_rpm;
  1653. pm_runtime_put(&pdev->dev);
  1654. return 0;
  1655. err_put_rpm:
  1656. pm_runtime_put_sync(&pdev->dev);
  1657. return ret;
  1658. }
  1659. static struct platform_driver disp_cc_sm8450_driver = {
  1660. .probe = disp_cc_sm8450_probe,
  1661. .driver = {
  1662. .name = "disp_cc-sm8450",
  1663. .of_match_table = disp_cc_sm8450_match_table,
  1664. },
  1665. };
  1666. module_platform_driver(disp_cc_sm8450_driver);
  1667. MODULE_DESCRIPTION("QTI DISPCC SM8450 Driver");
  1668. MODULE_LICENSE("GPL");