camcc-sm6150.c 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2020, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #include <linux/clk-provider.h>
  7. #include <linux/err.h>
  8. #include <linux/kernel.h>
  9. #include <linux/module.h>
  10. #include <linux/of_device.h>
  11. #include <linux/of.h>
  12. #include <linux/regmap.h>
  13. #include <dt-bindings/clock/qcom,camcc-sm6150.h>
  14. #include "clk-alpha-pll.h"
  15. #include "clk-branch.h"
  16. #include "clk-rcg.h"
  17. #include "clk-regmap.h"
  18. #include "common.h"
  19. #include "vdd-level-sm6150.h"
  20. static DEFINE_VDD_REGULATORS(vdd_cx, VDD_NUM, 1, vdd_corner);
  21. static DEFINE_VDD_REGULATORS(vdd_mx, VDD_NUM, 1, vdd_corner);
  22. enum {
  23. P_BI_TCXO,
  24. P_CAM_CC_PLL0_OUT_AUX,
  25. P_CAM_CC_PLL1_OUT_AUX,
  26. P_CAM_CC_PLL2_OUT_AUX2,
  27. P_CAM_CC_PLL2_OUT_EARLY,
  28. P_CAM_CC_PLL3_OUT_MAIN,
  29. };
  30. static struct pll_vco brammo_vco[] = {
  31. { 500000000, 1250000000, 0 },
  32. };
  33. static struct pll_vco spark_vco[] = {
  34. { 1000000000, 2000000000, 0 },
  35. { 750000000, 1500000000, 1 },
  36. { 500000000, 1000000000, 2 },
  37. { 300000000, 500000000, 3 },
  38. { 550000000, 1100000000, 4 },
  39. };
  40. /* 600MHz configuration */
  41. static struct alpha_pll_config cam_cc_pll0_config = {
  42. .l = 0x1F,
  43. .alpha_hi = 0x40,
  44. .alpha_en_mask = BIT(24),
  45. .vco_val = 0x2 << 20,
  46. .vco_mask = 0x3 << 20,
  47. .aux_output_mask = BIT(1),
  48. .config_ctl_val = 0x4001055b,
  49. .test_ctl_hi_val = 0x1,
  50. .test_ctl_hi_mask = 0x1,
  51. };
  52. static struct clk_alpha_pll cam_cc_pll0 = {
  53. .offset = 0x0,
  54. .vco_table = spark_vco,
  55. .num_vco = ARRAY_SIZE(spark_vco),
  56. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  57. .config = &cam_cc_pll0_config,
  58. .clkr = {
  59. .hw.init = &(struct clk_init_data){
  60. .name = "cam_cc_pll0",
  61. .parent_data = &(const struct clk_parent_data){
  62. .fw_name = "bi_tcxo",
  63. },
  64. .num_parents = 1,
  65. .ops = &clk_alpha_pll_ops,
  66. },
  67. .vdd_data = {
  68. .vdd_class = &vdd_cx,
  69. .num_rate_max = VDD_NUM,
  70. .rate_max = (unsigned long[VDD_NUM]) {
  71. [VDD_MIN] = 1100000000,
  72. [VDD_NOMINAL] = 2000000000},
  73. },
  74. },
  75. };
  76. /* 808MHz configuration */
  77. static struct alpha_pll_config cam_cc_pll1_config = {
  78. .l = 0x2A,
  79. .alpha_hi = 0x15,
  80. .alpha = 0x55555555,
  81. .alpha_en_mask = BIT(24),
  82. .vco_val = 0x2 << 20,
  83. .vco_mask = 0x3 << 20,
  84. .aux_output_mask = BIT(1),
  85. .config_ctl_val = 0x4001055b,
  86. .test_ctl_hi_val = 0x1,
  87. .test_ctl_hi_mask = 0x1,
  88. };
  89. static struct clk_alpha_pll cam_cc_pll1 = {
  90. .offset = 0x1000,
  91. .vco_table = spark_vco,
  92. .num_vco = ARRAY_SIZE(spark_vco),
  93. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  94. .config = &cam_cc_pll1_config,
  95. .clkr = {
  96. .hw.init = &(struct clk_init_data){
  97. .name = "cam_cc_pll1",
  98. .parent_data = &(const struct clk_parent_data){
  99. .fw_name = "bi_tcxo",
  100. },
  101. .num_parents = 1,
  102. .ops = &clk_alpha_pll_ops,
  103. },
  104. .vdd_data = {
  105. .vdd_class = &vdd_cx,
  106. .num_rate_max = VDD_NUM,
  107. .rate_max = (unsigned long[VDD_NUM]) {
  108. [VDD_MIN] = 1100000000,
  109. [VDD_NOMINAL] = 2000000000},
  110. },
  111. },
  112. };
  113. /* 960MHz configuration */
  114. static struct alpha_pll_config cam_cc_pll2_config = {
  115. .l = 0x32,
  116. .vco_val = 0x0 << 20,
  117. .vco_mask = 0x3 << 20,
  118. .early_output_mask = BIT(3),
  119. .aux2_output_mask = BIT(2),
  120. .post_div_val = 0x1 << 8,
  121. .post_div_mask = 0x3 << 8,
  122. .config_ctl_val = 0x04289,
  123. .test_ctl_val = 0x08000000,
  124. .test_ctl_mask = 0x08000000,
  125. };
  126. static struct clk_alpha_pll cam_cc_pll2 = {
  127. .offset = 0x2000,
  128. .vco_table = brammo_vco,
  129. .num_vco = ARRAY_SIZE(brammo_vco),
  130. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_BRAMMO],
  131. .config = &cam_cc_pll2_config,
  132. .clkr = {
  133. .hw.init = &(struct clk_init_data){
  134. .name = "cam_cc_pll2",
  135. .parent_data = &(const struct clk_parent_data){
  136. .fw_name = "bi_tcxo",
  137. },
  138. .num_parents = 1,
  139. .ops = &clk_alpha_pll_ops,
  140. },
  141. .vdd_data = {
  142. .vdd_class = &vdd_mx,
  143. .num_rate_max = VDD_NUM,
  144. .rate_max = (unsigned long[VDD_NUM]) {
  145. [VDD_LOWER] = 1250000000,
  146. [VDD_LOW] = 1250000000,
  147. [VDD_NOMINAL] = 1250000000},
  148. },
  149. },
  150. };
  151. static const struct clk_div_table post_div_table_cam_cc_pll2_out_aux2[] = {
  152. { 0x1, 2 },
  153. { }
  154. };
  155. static struct clk_alpha_pll_postdiv cam_cc_pll2_out_aux2 = {
  156. .offset = 0x2000,
  157. .post_div_shift = 8,
  158. .post_div_table = post_div_table_cam_cc_pll2_out_aux2,
  159. .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll2_out_aux2),
  160. .width = 2,
  161. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_BRAMMO],
  162. .clkr.hw.init = &(struct clk_init_data){
  163. .name = "cam_cc_pll2_out_aux2",
  164. .parent_data = &(const struct clk_parent_data){
  165. .hw = &cam_cc_pll2.clkr.hw,
  166. },
  167. .num_parents = 1,
  168. .ops = &clk_alpha_pll_postdiv_ops,
  169. },
  170. };
  171. /* 1080MHz configuration */
  172. static struct alpha_pll_config cam_cc_pll3_config = {
  173. .l = 0x38,
  174. .alpha_hi = 0x40,
  175. .alpha_en_mask = BIT(24),
  176. .vco_val = 0x0 << 20,
  177. .vco_mask = 0x3 << 20,
  178. .main_output_mask = BIT(0),
  179. .config_ctl_val = 0x4001055b,
  180. .test_ctl_hi_val = 0x1,
  181. .test_ctl_hi_mask = 0x1,
  182. };
  183. static struct clk_alpha_pll cam_cc_pll3 = {
  184. .offset = 0x3000,
  185. .vco_table = spark_vco,
  186. .num_vco = ARRAY_SIZE(spark_vco),
  187. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  188. .config = &cam_cc_pll3_config,
  189. .clkr = {
  190. .hw.init = &(struct clk_init_data){
  191. .name = "cam_cc_pll3",
  192. .parent_data = &(const struct clk_parent_data){
  193. .fw_name = "bi_tcxo",
  194. },
  195. .num_parents = 1,
  196. .ops = &clk_alpha_pll_ops,
  197. },
  198. .vdd_data = {
  199. .vdd_class = &vdd_mx,
  200. .num_rate_max = VDD_NUM,
  201. .rate_max = (unsigned long[VDD_NUM]) {
  202. [VDD_MIN] = 1100000000,
  203. [VDD_NOMINAL] = 2000000000},
  204. },
  205. },
  206. };
  207. static const struct parent_map cam_cc_parent_map_0[] = {
  208. { P_BI_TCXO, 0 },
  209. { P_CAM_CC_PLL1_OUT_AUX, 2 },
  210. { P_CAM_CC_PLL0_OUT_AUX, 6 },
  211. };
  212. static const struct clk_parent_data cam_cc_parent_data_0[] = {
  213. { .fw_name = "bi_tcxo"},
  214. { .hw = &cam_cc_pll1.clkr.hw },
  215. { .hw = &cam_cc_pll0.clkr.hw },
  216. };
  217. static const struct parent_map cam_cc_parent_map_1[] = {
  218. { P_BI_TCXO, 0 },
  219. { P_CAM_CC_PLL2_OUT_EARLY, 4 },
  220. { P_CAM_CC_PLL3_OUT_MAIN, 5 },
  221. { P_CAM_CC_PLL0_OUT_AUX, 6 },
  222. };
  223. static const struct clk_parent_data cam_cc_parent_data_1[] = {
  224. { .fw_name = "bi_tcxo"},
  225. { .hw = &cam_cc_pll2.clkr.hw },
  226. { .hw = &cam_cc_pll3.clkr.hw },
  227. { .hw = &cam_cc_pll0.clkr.hw },
  228. };
  229. static const struct parent_map cam_cc_parent_map_2[] = {
  230. { P_BI_TCXO, 0 },
  231. { P_CAM_CC_PLL1_OUT_AUX, 2 },
  232. { P_CAM_CC_PLL2_OUT_EARLY, 4 },
  233. { P_CAM_CC_PLL3_OUT_MAIN, 5 },
  234. { P_CAM_CC_PLL0_OUT_AUX, 6 },
  235. };
  236. static const struct clk_parent_data cam_cc_parent_data_2[] = {
  237. { .fw_name = "bi_tcxo"},
  238. { .hw = &cam_cc_pll1.clkr.hw },
  239. { .hw = &cam_cc_pll2.clkr.hw },
  240. { .hw = &cam_cc_pll3.clkr.hw },
  241. { .hw = &cam_cc_pll0.clkr.hw },
  242. };
  243. static const struct parent_map cam_cc_parent_map_3[] = {
  244. { P_BI_TCXO, 0 },
  245. { P_CAM_CC_PLL2_OUT_AUX2, 1 },
  246. };
  247. static const struct clk_parent_data cam_cc_parent_data_3[] = {
  248. { .fw_name = "bi_tcxo"},
  249. { .hw = &cam_cc_pll2_out_aux2.clkr.hw },
  250. };
  251. static const struct parent_map cam_cc_parent_map_4[] = {
  252. { P_BI_TCXO, 0 },
  253. { P_CAM_CC_PLL3_OUT_MAIN, 5 },
  254. { P_CAM_CC_PLL0_OUT_AUX, 6 },
  255. };
  256. static const struct clk_parent_data cam_cc_parent_data_4[] = {
  257. { .fw_name = "bi_tcxo"},
  258. { .hw = &cam_cc_pll3.clkr.hw },
  259. { .hw = &cam_cc_pll0.clkr.hw },
  260. };
  261. static const struct parent_map cam_cc_parent_map_5[] = {
  262. { P_BI_TCXO, 0 },
  263. { P_CAM_CC_PLL0_OUT_AUX, 6 },
  264. };
  265. static const struct clk_parent_data cam_cc_parent_data_5[] = {
  266. { .fw_name = "bi_tcxo"},
  267. { .hw = &cam_cc_pll0.clkr.hw },
  268. };
  269. static const struct parent_map cam_cc_parent_map_6[] = {
  270. { P_BI_TCXO, 0 },
  271. { P_CAM_CC_PLL1_OUT_AUX, 2 },
  272. { P_CAM_CC_PLL3_OUT_MAIN, 5 },
  273. { P_CAM_CC_PLL0_OUT_AUX, 6 },
  274. };
  275. static const struct clk_parent_data cam_cc_parent_data_6[] = {
  276. { .fw_name = "bi_tcxo"},
  277. { .hw = &cam_cc_pll1.clkr.hw },
  278. { .hw = &cam_cc_pll3.clkr.hw },
  279. { .hw = &cam_cc_pll0.clkr.hw },
  280. };
  281. static const struct freq_tbl ftbl_cam_cc_bps_clk_src[] = {
  282. F(200000000, P_CAM_CC_PLL0_OUT_AUX, 3, 0, 0),
  283. F(360000000, P_CAM_CC_PLL3_OUT_MAIN, 3, 0, 0),
  284. F(432000000, P_CAM_CC_PLL3_OUT_MAIN, 2.5, 0, 0),
  285. F(480000000, P_CAM_CC_PLL2_OUT_EARLY, 2, 0, 0),
  286. F(540000000, P_CAM_CC_PLL3_OUT_MAIN, 2, 0, 0),
  287. F(600000000, P_CAM_CC_PLL0_OUT_AUX, 1, 0, 0),
  288. { }
  289. };
  290. static struct clk_rcg2 cam_cc_bps_clk_src = {
  291. .cmd_rcgr = 0x6010,
  292. .mnd_width = 0,
  293. .hid_width = 5,
  294. .parent_map = cam_cc_parent_map_1,
  295. .freq_tbl = ftbl_cam_cc_bps_clk_src,
  296. .enable_safe_config = true,
  297. .clkr.hw.init = &(struct clk_init_data){
  298. .name = "cam_cc_bps_clk_src",
  299. .parent_data = cam_cc_parent_data_1,
  300. .num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
  301. .ops = &clk_rcg2_ops,
  302. },
  303. .clkr.vdd_data = {
  304. .vdd_class = &vdd_cx,
  305. .num_rate_max = VDD_NUM,
  306. .rate_max = (unsigned long[VDD_NUM]) {
  307. [VDD_LOWER] = 200000000,
  308. [VDD_LOW] = 360000000,
  309. [VDD_LOW_L1] = 432000000,
  310. [VDD_NOMINAL] = 480000000,
  311. [VDD_NOMINAL_L1] = 540000000,
  312. [VDD_HIGH] = 600000000},
  313. },
  314. };
  315. static const struct freq_tbl ftbl_cam_cc_cci_clk_src[] = {
  316. F(37500000, P_CAM_CC_PLL0_OUT_AUX, 16, 0, 0),
  317. F(50000000, P_CAM_CC_PLL0_OUT_AUX, 12, 0, 0),
  318. F(100000000, P_CAM_CC_PLL0_OUT_AUX, 6, 0, 0),
  319. { }
  320. };
  321. static struct clk_rcg2 cam_cc_cci_clk_src = {
  322. .cmd_rcgr = 0xb0d8,
  323. .mnd_width = 8,
  324. .hid_width = 5,
  325. .parent_map = cam_cc_parent_map_5,
  326. .freq_tbl = ftbl_cam_cc_cci_clk_src,
  327. .enable_safe_config = true,
  328. .clkr.hw.init = &(struct clk_init_data){
  329. .name = "cam_cc_cci_clk_src",
  330. .parent_data = cam_cc_parent_data_5,
  331. .num_parents = ARRAY_SIZE(cam_cc_parent_data_5),
  332. .ops = &clk_rcg2_ops,
  333. },
  334. .clkr.vdd_data = {
  335. .vdd_class = &vdd_cx,
  336. .num_rate_max = VDD_NUM,
  337. .rate_max = (unsigned long[VDD_NUM]) {
  338. [VDD_LOWER] = 37500000,
  339. [VDD_LOW] = 50000000,
  340. [VDD_NOMINAL] = 100000000},
  341. },
  342. };
  343. static const struct freq_tbl ftbl_cam_cc_cphy_rx_clk_src[] = {
  344. F(100000000, P_CAM_CC_PLL0_OUT_AUX, 6, 0, 0),
  345. F(200000000, P_CAM_CC_PLL0_OUT_AUX, 3, 0, 0),
  346. F(269333333, P_CAM_CC_PLL1_OUT_AUX, 3, 0, 0),
  347. F(320000000, P_CAM_CC_PLL2_OUT_EARLY, 3, 0, 0),
  348. F(384000000, P_CAM_CC_PLL2_OUT_EARLY, 2.5, 0, 0),
  349. { }
  350. };
  351. static struct clk_rcg2 cam_cc_cphy_rx_clk_src = {
  352. .cmd_rcgr = 0x9064,
  353. .mnd_width = 0,
  354. .hid_width = 5,
  355. .parent_map = cam_cc_parent_map_2,
  356. .freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
  357. .enable_safe_config = true,
  358. .clkr.hw.init = &(struct clk_init_data){
  359. .name = "cam_cc_cphy_rx_clk_src",
  360. .parent_data = cam_cc_parent_data_2,
  361. .num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
  362. .ops = &clk_rcg2_ops,
  363. },
  364. .clkr.vdd_data = {
  365. .vdd_class = &vdd_cx,
  366. .num_rate_max = VDD_NUM,
  367. .rate_max = (unsigned long[VDD_NUM]) {
  368. [VDD_LOWER] = 100000000,
  369. [VDD_LOW] = 200000000,
  370. [VDD_LOW_L1] = 269333333,
  371. [VDD_NOMINAL] = 320000000,
  372. [VDD_HIGH] = 384000000},
  373. },
  374. };
  375. static const struct freq_tbl ftbl_cam_cc_csi0phytimer_clk_src[] = {
  376. F(100000000, P_CAM_CC_PLL0_OUT_AUX, 6, 0, 0),
  377. F(200000000, P_CAM_CC_PLL0_OUT_AUX, 3, 0, 0),
  378. F(269333333, P_CAM_CC_PLL1_OUT_AUX, 3, 0, 0),
  379. { }
  380. };
  381. static struct clk_rcg2 cam_cc_csi0phytimer_clk_src = {
  382. .cmd_rcgr = 0x5004,
  383. .mnd_width = 0,
  384. .hid_width = 5,
  385. .parent_map = cam_cc_parent_map_0,
  386. .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
  387. .enable_safe_config = true,
  388. .clkr.hw.init = &(struct clk_init_data){
  389. .name = "cam_cc_csi0phytimer_clk_src",
  390. .parent_data = cam_cc_parent_data_0,
  391. .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
  392. .ops = &clk_rcg2_ops,
  393. },
  394. .clkr.vdd_data = {
  395. .vdd_class = &vdd_cx,
  396. .num_rate_max = VDD_NUM,
  397. .rate_max = (unsigned long[VDD_NUM]) {
  398. [VDD_LOWER] = 100000000,
  399. [VDD_LOW] = 200000000,
  400. [VDD_LOW_L1] = 269333333},
  401. },
  402. };
  403. static struct clk_rcg2 cam_cc_csi1phytimer_clk_src = {
  404. .cmd_rcgr = 0x5028,
  405. .mnd_width = 0,
  406. .hid_width = 5,
  407. .parent_map = cam_cc_parent_map_0,
  408. .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
  409. .enable_safe_config = true,
  410. .clkr.hw.init = &(struct clk_init_data){
  411. .name = "cam_cc_csi1phytimer_clk_src",
  412. .parent_data = cam_cc_parent_data_0,
  413. .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
  414. .ops = &clk_rcg2_ops,
  415. },
  416. .clkr.vdd_data = {
  417. .vdd_class = &vdd_cx,
  418. .num_rate_max = VDD_NUM,
  419. .rate_max = (unsigned long[VDD_NUM]) {
  420. [VDD_LOWER] = 100000000,
  421. [VDD_LOW] = 200000000,
  422. [VDD_LOW_L1] = 269333333},
  423. },
  424. };
  425. static struct clk_rcg2 cam_cc_csi2phytimer_clk_src = {
  426. .cmd_rcgr = 0x504c,
  427. .mnd_width = 0,
  428. .hid_width = 5,
  429. .parent_map = cam_cc_parent_map_0,
  430. .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
  431. .enable_safe_config = true,
  432. .clkr.hw.init = &(struct clk_init_data){
  433. .name = "cam_cc_csi2phytimer_clk_src",
  434. .parent_data = cam_cc_parent_data_0,
  435. .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
  436. .ops = &clk_rcg2_ops,
  437. },
  438. .clkr.vdd_data = {
  439. .vdd_class = &vdd_cx,
  440. .num_rate_max = VDD_NUM,
  441. .rate_max = (unsigned long[VDD_NUM]) {
  442. [VDD_LOWER] = 100000000,
  443. [VDD_LOW] = 200000000,
  444. [VDD_LOW_L1] = 269333333},
  445. },
  446. };
  447. static const struct freq_tbl ftbl_cam_cc_fast_ahb_clk_src[] = {
  448. F(100000000, P_CAM_CC_PLL0_OUT_AUX, 6, 0, 0),
  449. F(200000000, P_CAM_CC_PLL0_OUT_AUX, 3, 0, 0),
  450. F(300000000, P_CAM_CC_PLL0_OUT_AUX, 2, 0, 0),
  451. F(404000000, P_CAM_CC_PLL1_OUT_AUX, 2, 0, 0),
  452. { }
  453. };
  454. static struct clk_rcg2 cam_cc_fast_ahb_clk_src = {
  455. .cmd_rcgr = 0x603c,
  456. .mnd_width = 0,
  457. .hid_width = 5,
  458. .parent_map = cam_cc_parent_map_0,
  459. .freq_tbl = ftbl_cam_cc_fast_ahb_clk_src,
  460. .enable_safe_config = true,
  461. .clkr.hw.init = &(struct clk_init_data){
  462. .name = "cam_cc_fast_ahb_clk_src",
  463. .parent_data = cam_cc_parent_data_0,
  464. .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
  465. .ops = &clk_rcg2_ops,
  466. },
  467. .clkr.vdd_data = {
  468. .vdd_class = &vdd_cx,
  469. .num_rate_max = VDD_NUM,
  470. .rate_max = (unsigned long[VDD_NUM]) {
  471. [VDD_LOWER] = 100000000,
  472. [VDD_LOW] = 200000000,
  473. [VDD_LOW_L1] = 300000000,
  474. [VDD_NOMINAL] = 404000000},
  475. },
  476. };
  477. static const struct freq_tbl ftbl_cam_cc_icp_clk_src[] = {
  478. F(240000000, P_CAM_CC_PLL0_OUT_AUX, 2.5, 0, 0),
  479. F(360000000, P_CAM_CC_PLL3_OUT_MAIN, 3, 0, 0),
  480. F(432000000, P_CAM_CC_PLL3_OUT_MAIN, 2.5, 0, 0),
  481. F(480000000, P_CAM_CC_PLL2_OUT_EARLY, 2, 0, 0),
  482. F(540000000, P_CAM_CC_PLL3_OUT_MAIN, 2, 0, 0),
  483. F(600000000, P_CAM_CC_PLL0_OUT_AUX, 1, 0, 0),
  484. { }
  485. };
  486. static struct clk_rcg2 cam_cc_icp_clk_src = {
  487. .cmd_rcgr = 0xb088,
  488. .mnd_width = 0,
  489. .hid_width = 5,
  490. .parent_map = cam_cc_parent_map_1,
  491. .freq_tbl = ftbl_cam_cc_icp_clk_src,
  492. .enable_safe_config = true,
  493. .clkr.hw.init = &(struct clk_init_data){
  494. .name = "cam_cc_icp_clk_src",
  495. .parent_data = cam_cc_parent_data_1,
  496. .num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
  497. .ops = &clk_rcg2_ops,
  498. },
  499. .clkr.vdd_data = {
  500. .vdd_class = &vdd_cx,
  501. .num_rate_max = VDD_NUM,
  502. .rate_max = (unsigned long[VDD_NUM]) {
  503. [VDD_LOWER] = 240000000,
  504. [VDD_LOW] = 360000000,
  505. [VDD_LOW_L1] = 432000000,
  506. [VDD_NOMINAL] = 480000000,
  507. [VDD_NOMINAL_L1] = 540000000,
  508. [VDD_HIGH] = 600000000},
  509. },
  510. };
  511. static const struct freq_tbl ftbl_cam_cc_ife_0_clk_src[] = {
  512. F(240000000, P_CAM_CC_PLL0_OUT_AUX, 2.5, 0, 0),
  513. F(360000000, P_CAM_CC_PLL3_OUT_MAIN, 3, 0, 0),
  514. F(432000000, P_CAM_CC_PLL3_OUT_MAIN, 2.5, 0, 0),
  515. F(540000000, P_CAM_CC_PLL3_OUT_MAIN, 2, 0, 0),
  516. F(600000000, P_CAM_CC_PLL0_OUT_AUX, 1, 0, 0),
  517. { }
  518. };
  519. static struct clk_rcg2 cam_cc_ife_0_clk_src = {
  520. .cmd_rcgr = 0x9010,
  521. .mnd_width = 0,
  522. .hid_width = 5,
  523. .parent_map = cam_cc_parent_map_4,
  524. .freq_tbl = ftbl_cam_cc_ife_0_clk_src,
  525. .enable_safe_config = true,
  526. .clkr.hw.init = &(struct clk_init_data){
  527. .name = "cam_cc_ife_0_clk_src",
  528. .parent_data = cam_cc_parent_data_4,
  529. .num_parents = ARRAY_SIZE(cam_cc_parent_data_4),
  530. .ops = &clk_rcg2_ops,
  531. },
  532. .clkr.vdd_data = {
  533. .vdd_class = &vdd_cx,
  534. .num_rate_max = VDD_NUM,
  535. .rate_max = (unsigned long[VDD_NUM]) {
  536. [VDD_LOWER] = 240000000,
  537. [VDD_LOW] = 360000000,
  538. [VDD_LOW_L1] = 432000000,
  539. [VDD_NOMINAL] = 540000000,
  540. [VDD_HIGH] = 600000000},
  541. },
  542. };
  543. static const struct freq_tbl ftbl_cam_cc_ife_0_csid_clk_src[] = {
  544. F(100000000, P_CAM_CC_PLL0_OUT_AUX, 6, 0, 0),
  545. F(200000000, P_CAM_CC_PLL0_OUT_AUX, 3, 0, 0),
  546. F(320000000, P_CAM_CC_PLL2_OUT_EARLY, 3, 0, 0),
  547. F(404000000, P_CAM_CC_PLL1_OUT_AUX, 2, 0, 0),
  548. F(480000000, P_CAM_CC_PLL2_OUT_EARLY, 2, 0, 0),
  549. F(540000000, P_CAM_CC_PLL3_OUT_MAIN, 2, 0, 0),
  550. { }
  551. };
  552. static struct clk_rcg2 cam_cc_ife_0_csid_clk_src = {
  553. .cmd_rcgr = 0x903c,
  554. .mnd_width = 0,
  555. .hid_width = 5,
  556. .parent_map = cam_cc_parent_map_2,
  557. .freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src,
  558. .enable_safe_config = true,
  559. .clkr.hw.init = &(struct clk_init_data){
  560. .name = "cam_cc_ife_0_csid_clk_src",
  561. .parent_data = cam_cc_parent_data_2,
  562. .num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
  563. .ops = &clk_rcg2_ops,
  564. },
  565. .clkr.vdd_data = {
  566. .vdd_class = &vdd_cx,
  567. .num_rate_max = VDD_NUM,
  568. .rate_max = (unsigned long[VDD_NUM]) {
  569. [VDD_LOWER] = 100000000,
  570. [VDD_LOW] = 200000000,
  571. [VDD_LOW_L1] = 320000000,
  572. [VDD_NOMINAL] = 404000000,
  573. [VDD_NOMINAL_L1] = 480000000,
  574. [VDD_HIGH] = 540000000},
  575. },
  576. };
  577. static struct clk_rcg2 cam_cc_ife_1_clk_src = {
  578. .cmd_rcgr = 0xa010,
  579. .mnd_width = 0,
  580. .hid_width = 5,
  581. .parent_map = cam_cc_parent_map_4,
  582. .freq_tbl = ftbl_cam_cc_ife_0_clk_src,
  583. .enable_safe_config = true,
  584. .clkr.hw.init = &(struct clk_init_data){
  585. .name = "cam_cc_ife_1_clk_src",
  586. .parent_data = cam_cc_parent_data_4,
  587. .num_parents = ARRAY_SIZE(cam_cc_parent_data_4),
  588. .ops = &clk_rcg2_ops,
  589. },
  590. .clkr.vdd_data = {
  591. .vdd_class = &vdd_cx,
  592. .num_rate_max = VDD_NUM,
  593. .rate_max = (unsigned long[VDD_NUM]) {
  594. [VDD_LOWER] = 240000000,
  595. [VDD_LOW] = 360000000,
  596. [VDD_LOW_L1] = 432000000,
  597. [VDD_NOMINAL] = 540000000,
  598. [VDD_HIGH] = 600000000},
  599. },
  600. };
  601. static struct clk_rcg2 cam_cc_ife_1_csid_clk_src = {
  602. .cmd_rcgr = 0xa034,
  603. .mnd_width = 0,
  604. .hid_width = 5,
  605. .parent_map = cam_cc_parent_map_2,
  606. .freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src,
  607. .enable_safe_config = true,
  608. .clkr.hw.init = &(struct clk_init_data){
  609. .name = "cam_cc_ife_1_csid_clk_src",
  610. .parent_data = cam_cc_parent_data_2,
  611. .num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
  612. .ops = &clk_rcg2_ops,
  613. },
  614. .clkr.vdd_data = {
  615. .vdd_class = &vdd_cx,
  616. .num_rate_max = VDD_NUM,
  617. .rate_max = (unsigned long[VDD_NUM]) {
  618. [VDD_LOWER] = 100000000,
  619. [VDD_LOW] = 200000000,
  620. [VDD_LOW_L1] = 320000000,
  621. [VDD_NOMINAL] = 404000000,
  622. [VDD_NOMINAL_L1] = 480000000,
  623. [VDD_HIGH] = 540000000},
  624. },
  625. };
  626. static struct clk_rcg2 cam_cc_ife_lite_clk_src = {
  627. .cmd_rcgr = 0xb004,
  628. .mnd_width = 0,
  629. .hid_width = 5,
  630. .parent_map = cam_cc_parent_map_4,
  631. .freq_tbl = ftbl_cam_cc_ife_0_clk_src,
  632. .enable_safe_config = true,
  633. .clkr.hw.init = &(struct clk_init_data){
  634. .name = "cam_cc_ife_lite_clk_src",
  635. .parent_data = cam_cc_parent_data_4,
  636. .num_parents = ARRAY_SIZE(cam_cc_parent_data_4),
  637. .ops = &clk_rcg2_ops,
  638. },
  639. .clkr.vdd_data = {
  640. .vdd_class = &vdd_cx,
  641. .num_rate_max = VDD_NUM,
  642. .rate_max = (unsigned long[VDD_NUM]) {
  643. [VDD_LOWER] = 240000000,
  644. [VDD_LOW] = 360000000,
  645. [VDD_LOW_L1] = 432000000,
  646. [VDD_NOMINAL] = 540000000,
  647. [VDD_HIGH] = 600000000},
  648. },
  649. };
  650. static struct clk_rcg2 cam_cc_ife_lite_csid_clk_src = {
  651. .cmd_rcgr = 0xb024,
  652. .mnd_width = 0,
  653. .hid_width = 5,
  654. .parent_map = cam_cc_parent_map_2,
  655. .freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src,
  656. .enable_safe_config = true,
  657. .clkr.hw.init = &(struct clk_init_data){
  658. .name = "cam_cc_ife_lite_csid_clk_src",
  659. .parent_data = cam_cc_parent_data_2,
  660. .num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
  661. .ops = &clk_rcg2_ops,
  662. },
  663. .clkr.vdd_data = {
  664. .vdd_class = &vdd_cx,
  665. .num_rate_max = VDD_NUM,
  666. .rate_max = (unsigned long[VDD_NUM]) {
  667. [VDD_LOWER] = 100000000,
  668. [VDD_LOW] = 200000000,
  669. [VDD_LOW_L1] = 320000000,
  670. [VDD_NOMINAL] = 404000000,
  671. [VDD_NOMINAL_L1] = 480000000,
  672. [VDD_HIGH] = 540000000},
  673. },
  674. };
  675. static struct clk_rcg2 cam_cc_ipe_0_clk_src = {
  676. .cmd_rcgr = 0x7010,
  677. .mnd_width = 0,
  678. .hid_width = 5,
  679. .parent_map = cam_cc_parent_map_1,
  680. .freq_tbl = ftbl_cam_cc_icp_clk_src,
  681. .enable_safe_config = true,
  682. .clkr.hw.init = &(struct clk_init_data){
  683. .name = "cam_cc_ipe_0_clk_src",
  684. .parent_data = cam_cc_parent_data_1,
  685. .num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
  686. .ops = &clk_rcg2_ops,
  687. },
  688. .clkr.vdd_data = {
  689. .vdd_class = &vdd_cx,
  690. .num_rate_max = VDD_NUM,
  691. .rate_max = (unsigned long[VDD_NUM]) {
  692. [VDD_LOWER] = 240000000,
  693. [VDD_LOW] = 360000000,
  694. [VDD_LOW_L1] = 432000000,
  695. [VDD_NOMINAL] = 480000000,
  696. [VDD_NOMINAL_L1] = 540000000,
  697. [VDD_HIGH] = 600000000},
  698. },
  699. };
  700. static const struct freq_tbl ftbl_cam_cc_jpeg_clk_src[] = {
  701. F(66666667, P_CAM_CC_PLL0_OUT_AUX, 9, 0, 0),
  702. F(133333333, P_CAM_CC_PLL0_OUT_AUX, 4.5, 0, 0),
  703. F(216000000, P_CAM_CC_PLL3_OUT_MAIN, 5, 0, 0),
  704. F(320000000, P_CAM_CC_PLL2_OUT_EARLY, 3, 0, 0),
  705. F(480000000, P_CAM_CC_PLL2_OUT_EARLY, 2, 0, 0),
  706. F(600000000, P_CAM_CC_PLL0_OUT_AUX, 1, 0, 0),
  707. { }
  708. };
  709. static struct clk_rcg2 cam_cc_jpeg_clk_src = {
  710. .cmd_rcgr = 0xb04c,
  711. .mnd_width = 0,
  712. .hid_width = 5,
  713. .parent_map = cam_cc_parent_map_1,
  714. .freq_tbl = ftbl_cam_cc_jpeg_clk_src,
  715. .enable_safe_config = true,
  716. .clkr.hw.init = &(struct clk_init_data){
  717. .name = "cam_cc_jpeg_clk_src",
  718. .parent_data = cam_cc_parent_data_1,
  719. .num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
  720. .ops = &clk_rcg2_ops,
  721. },
  722. .clkr.vdd_data = {
  723. .vdd_class = &vdd_cx,
  724. .num_rate_max = VDD_NUM,
  725. .rate_max = (unsigned long[VDD_NUM]) {
  726. [VDD_LOWER] = 66666667,
  727. [VDD_LOW] = 133333333,
  728. [VDD_LOW_L1] = 216000000,
  729. [VDD_NOMINAL] = 320000000,
  730. [VDD_NOMINAL_L1] = 480000000,
  731. [VDD_HIGH] = 600000000},
  732. },
  733. };
  734. static const struct freq_tbl ftbl_cam_cc_lrme_clk_src[] = {
  735. F(200000000, P_CAM_CC_PLL0_OUT_AUX, 3, 0, 0),
  736. F(216000000, P_CAM_CC_PLL3_OUT_MAIN, 5, 0, 0),
  737. F(300000000, P_CAM_CC_PLL0_OUT_AUX, 2, 0, 0),
  738. F(404000000, P_CAM_CC_PLL1_OUT_AUX, 2, 0, 0),
  739. { }
  740. };
  741. static struct clk_rcg2 cam_cc_lrme_clk_src = {
  742. .cmd_rcgr = 0xb0f8,
  743. .mnd_width = 0,
  744. .hid_width = 5,
  745. .parent_map = cam_cc_parent_map_6,
  746. .freq_tbl = ftbl_cam_cc_lrme_clk_src,
  747. .enable_safe_config = true,
  748. .clkr.hw.init = &(struct clk_init_data){
  749. .name = "cam_cc_lrme_clk_src",
  750. .parent_data = cam_cc_parent_data_6,
  751. .num_parents = ARRAY_SIZE(cam_cc_parent_data_6),
  752. .ops = &clk_rcg2_ops,
  753. },
  754. .clkr.vdd_data = {
  755. .vdd_class = &vdd_cx,
  756. .num_rate_max = VDD_NUM,
  757. .rate_max = (unsigned long[VDD_NUM]) {
  758. [VDD_LOWER] = 200000000,
  759. [VDD_LOW] = 216000000,
  760. [VDD_LOW_L1] = 300000000,
  761. [VDD_NOMINAL] = 404000000},
  762. },
  763. };
  764. static const struct freq_tbl ftbl_cam_cc_mclk0_clk_src[] = {
  765. F(19200000, P_BI_TCXO, 1, 0, 0),
  766. F(24000000, P_CAM_CC_PLL2_OUT_AUX2, 10, 1, 2),
  767. F(34285714, P_CAM_CC_PLL2_OUT_AUX2, 14, 0, 0),
  768. { }
  769. };
  770. static struct clk_rcg2 cam_cc_mclk0_clk_src = {
  771. .cmd_rcgr = 0x4004,
  772. .mnd_width = 8,
  773. .hid_width = 5,
  774. .parent_map = cam_cc_parent_map_3,
  775. .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
  776. .enable_safe_config = true,
  777. .clkr.hw.init = &(struct clk_init_data){
  778. .name = "cam_cc_mclk0_clk_src",
  779. .parent_data = cam_cc_parent_data_3,
  780. .num_parents = ARRAY_SIZE(cam_cc_parent_data_3),
  781. .ops = &clk_rcg2_ops,
  782. },
  783. .clkr.vdd_data = {
  784. .vdd_class = &vdd_cx,
  785. .num_rate_max = VDD_NUM,
  786. .rate_max = (unsigned long[VDD_NUM]) {
  787. [VDD_LOWER] = 34285714},
  788. },
  789. };
  790. static struct clk_rcg2 cam_cc_mclk1_clk_src = {
  791. .cmd_rcgr = 0x4024,
  792. .mnd_width = 8,
  793. .hid_width = 5,
  794. .parent_map = cam_cc_parent_map_3,
  795. .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
  796. .enable_safe_config = true,
  797. .clkr.hw.init = &(struct clk_init_data){
  798. .name = "cam_cc_mclk1_clk_src",
  799. .parent_data = cam_cc_parent_data_3,
  800. .num_parents = ARRAY_SIZE(cam_cc_parent_data_3),
  801. .ops = &clk_rcg2_ops,
  802. },
  803. .clkr.vdd_data = {
  804. .vdd_class = &vdd_cx,
  805. .num_rate_max = VDD_NUM,
  806. .rate_max = (unsigned long[VDD_NUM]) {
  807. [VDD_LOWER] = 34285714},
  808. },
  809. };
  810. static struct clk_rcg2 cam_cc_mclk2_clk_src = {
  811. .cmd_rcgr = 0x4044,
  812. .mnd_width = 8,
  813. .hid_width = 5,
  814. .parent_map = cam_cc_parent_map_3,
  815. .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
  816. .enable_safe_config = true,
  817. .clkr.hw.init = &(struct clk_init_data){
  818. .name = "cam_cc_mclk2_clk_src",
  819. .parent_data = cam_cc_parent_data_3,
  820. .num_parents = ARRAY_SIZE(cam_cc_parent_data_3),
  821. .ops = &clk_rcg2_ops,
  822. },
  823. .clkr.vdd_data = {
  824. .vdd_class = &vdd_cx,
  825. .num_rate_max = VDD_NUM,
  826. .rate_max = (unsigned long[VDD_NUM]) {
  827. [VDD_LOWER] = 34285714},
  828. },
  829. };
  830. static struct clk_rcg2 cam_cc_mclk3_clk_src = {
  831. .cmd_rcgr = 0x4064,
  832. .mnd_width = 8,
  833. .hid_width = 5,
  834. .parent_map = cam_cc_parent_map_3,
  835. .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
  836. .enable_safe_config = true,
  837. .clkr.hw.init = &(struct clk_init_data){
  838. .name = "cam_cc_mclk3_clk_src",
  839. .parent_data = cam_cc_parent_data_3,
  840. .num_parents = ARRAY_SIZE(cam_cc_parent_data_3),
  841. .ops = &clk_rcg2_ops,
  842. },
  843. .clkr.vdd_data = {
  844. .vdd_class = &vdd_cx,
  845. .num_rate_max = VDD_NUM,
  846. .rate_max = (unsigned long[VDD_NUM]) {
  847. [VDD_LOWER] = 34285714},
  848. },
  849. };
  850. static const struct freq_tbl ftbl_cam_cc_slow_ahb_clk_src[] = {
  851. F(80000000, P_CAM_CC_PLL0_OUT_AUX, 7.5, 0, 0),
  852. { }
  853. };
  854. static struct clk_rcg2 cam_cc_slow_ahb_clk_src = {
  855. .cmd_rcgr = 0x6058,
  856. .mnd_width = 0,
  857. .hid_width = 5,
  858. .parent_map = cam_cc_parent_map_0,
  859. .enable_safe_config = true,
  860. .freq_tbl = ftbl_cam_cc_slow_ahb_clk_src,
  861. .clkr.hw.init = &(struct clk_init_data){
  862. .name = "cam_cc_slow_ahb_clk_src",
  863. .parent_data = cam_cc_parent_data_0,
  864. .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
  865. .ops = &clk_rcg2_ops,
  866. },
  867. .clkr.vdd_data = {
  868. .vdd_class = &vdd_cx,
  869. .num_rate_max = VDD_NUM,
  870. .rate_max = (unsigned long[VDD_NUM]) {
  871. [VDD_LOWER] = 80000000},
  872. },
  873. };
  874. static struct clk_branch cam_cc_bps_ahb_clk = {
  875. .halt_reg = 0x6070,
  876. .halt_check = BRANCH_HALT,
  877. .clkr = {
  878. .enable_reg = 0x6070,
  879. .enable_mask = BIT(0),
  880. .hw.init = &(struct clk_init_data){
  881. .name = "cam_cc_bps_ahb_clk",
  882. .parent_data = &(const struct clk_parent_data){
  883. .hw = &cam_cc_slow_ahb_clk_src.clkr.hw,
  884. },
  885. .num_parents = 1,
  886. .flags = CLK_SET_RATE_PARENT,
  887. .ops = &clk_branch2_ops,
  888. },
  889. },
  890. };
  891. static struct clk_branch cam_cc_bps_areg_clk = {
  892. .halt_reg = 0x6054,
  893. .halt_check = BRANCH_HALT,
  894. .clkr = {
  895. .enable_reg = 0x6054,
  896. .enable_mask = BIT(0),
  897. .hw.init = &(struct clk_init_data){
  898. .name = "cam_cc_bps_areg_clk",
  899. .parent_data = &(const struct clk_parent_data){
  900. .hw = &cam_cc_fast_ahb_clk_src.clkr.hw,
  901. },
  902. .num_parents = 1,
  903. .flags = CLK_SET_RATE_PARENT,
  904. .ops = &clk_branch2_ops,
  905. },
  906. },
  907. };
  908. static struct clk_branch cam_cc_bps_axi_clk = {
  909. .halt_reg = 0x6038,
  910. .halt_check = BRANCH_HALT,
  911. .clkr = {
  912. .enable_reg = 0x6038,
  913. .enable_mask = BIT(0),
  914. .hw.init = &(struct clk_init_data){
  915. .name = "cam_cc_bps_axi_clk",
  916. .ops = &clk_branch2_ops,
  917. },
  918. },
  919. };
  920. static struct clk_branch cam_cc_bps_clk = {
  921. .halt_reg = 0x6028,
  922. .halt_check = BRANCH_HALT,
  923. .clkr = {
  924. .enable_reg = 0x6028,
  925. .enable_mask = BIT(0),
  926. .hw.init = &(struct clk_init_data){
  927. .name = "cam_cc_bps_clk",
  928. .parent_data = &(const struct clk_parent_data){
  929. .hw = &cam_cc_bps_clk_src.clkr.hw,
  930. },
  931. .num_parents = 1,
  932. .flags = CLK_SET_RATE_PARENT,
  933. .ops = &clk_branch2_ops,
  934. },
  935. },
  936. };
  937. static struct clk_branch cam_cc_camnoc_axi_clk = {
  938. .halt_reg = 0xb124,
  939. .halt_check = BRANCH_HALT,
  940. .clkr = {
  941. .enable_reg = 0xb124,
  942. .enable_mask = BIT(0),
  943. .hw.init = &(struct clk_init_data){
  944. .name = "cam_cc_camnoc_axi_clk",
  945. .ops = &clk_branch2_ops,
  946. },
  947. },
  948. };
  949. static struct clk_branch cam_cc_cci_clk = {
  950. .halt_reg = 0xb0f0,
  951. .halt_check = BRANCH_HALT,
  952. .clkr = {
  953. .enable_reg = 0xb0f0,
  954. .enable_mask = BIT(0),
  955. .hw.init = &(struct clk_init_data){
  956. .name = "cam_cc_cci_clk",
  957. .parent_data = &(const struct clk_parent_data){
  958. .hw = &cam_cc_cci_clk_src.clkr.hw,
  959. },
  960. .num_parents = 1,
  961. .flags = CLK_SET_RATE_PARENT,
  962. .ops = &clk_branch2_ops,
  963. },
  964. },
  965. };
  966. static struct clk_branch cam_cc_core_ahb_clk = {
  967. .halt_reg = 0xb144,
  968. .halt_check = BRANCH_HALT_DELAY,
  969. .clkr = {
  970. .enable_reg = 0xb144,
  971. .enable_mask = BIT(0),
  972. .hw.init = &(struct clk_init_data){
  973. .name = "cam_cc_core_ahb_clk",
  974. .parent_data = &(const struct clk_parent_data){
  975. .hw = &cam_cc_slow_ahb_clk_src.clkr.hw,
  976. },
  977. .num_parents = 1,
  978. .flags = CLK_SET_RATE_PARENT,
  979. .ops = &clk_branch2_ops,
  980. },
  981. },
  982. };
  983. static struct clk_branch cam_cc_cpas_ahb_clk = {
  984. .halt_reg = 0xb11c,
  985. .halt_check = BRANCH_HALT,
  986. .clkr = {
  987. .enable_reg = 0xb11c,
  988. .enable_mask = BIT(0),
  989. .hw.init = &(struct clk_init_data){
  990. .name = "cam_cc_cpas_ahb_clk",
  991. .parent_data = &(const struct clk_parent_data){
  992. .hw = &cam_cc_slow_ahb_clk_src.clkr.hw,
  993. },
  994. .num_parents = 1,
  995. .flags = CLK_SET_RATE_PARENT,
  996. .ops = &clk_branch2_ops,
  997. },
  998. },
  999. };
  1000. static struct clk_branch cam_cc_csi0phytimer_clk = {
  1001. .halt_reg = 0x501c,
  1002. .halt_check = BRANCH_HALT,
  1003. .clkr = {
  1004. .enable_reg = 0x501c,
  1005. .enable_mask = BIT(0),
  1006. .hw.init = &(struct clk_init_data){
  1007. .name = "cam_cc_csi0phytimer_clk",
  1008. .parent_data = &(const struct clk_parent_data){
  1009. .hw = &cam_cc_csi0phytimer_clk_src.clkr.hw,
  1010. },
  1011. .num_parents = 1,
  1012. .flags = CLK_SET_RATE_PARENT,
  1013. .ops = &clk_branch2_ops,
  1014. },
  1015. },
  1016. };
  1017. static struct clk_branch cam_cc_csi1phytimer_clk = {
  1018. .halt_reg = 0x5040,
  1019. .halt_check = BRANCH_HALT,
  1020. .clkr = {
  1021. .enable_reg = 0x5040,
  1022. .enable_mask = BIT(0),
  1023. .hw.init = &(struct clk_init_data){
  1024. .name = "cam_cc_csi1phytimer_clk",
  1025. .parent_data = &(const struct clk_parent_data){
  1026. .hw = &cam_cc_csi1phytimer_clk_src.clkr.hw,
  1027. },
  1028. .num_parents = 1,
  1029. .flags = CLK_SET_RATE_PARENT,
  1030. .ops = &clk_branch2_ops,
  1031. },
  1032. },
  1033. };
  1034. static struct clk_branch cam_cc_csi2phytimer_clk = {
  1035. .halt_reg = 0x5064,
  1036. .halt_check = BRANCH_HALT,
  1037. .clkr = {
  1038. .enable_reg = 0x5064,
  1039. .enable_mask = BIT(0),
  1040. .hw.init = &(struct clk_init_data){
  1041. .name = "cam_cc_csi2phytimer_clk",
  1042. .parent_data = &(const struct clk_parent_data){
  1043. .hw = &cam_cc_csi2phytimer_clk_src.clkr.hw,
  1044. },
  1045. .num_parents = 1,
  1046. .flags = CLK_SET_RATE_PARENT,
  1047. .ops = &clk_branch2_ops,
  1048. },
  1049. },
  1050. };
  1051. static struct clk_branch cam_cc_csiphy0_clk = {
  1052. .halt_reg = 0x5020,
  1053. .halt_check = BRANCH_HALT,
  1054. .clkr = {
  1055. .enable_reg = 0x5020,
  1056. .enable_mask = BIT(0),
  1057. .hw.init = &(struct clk_init_data){
  1058. .name = "cam_cc_csiphy0_clk",
  1059. .parent_data = &(const struct clk_parent_data){
  1060. .hw = &cam_cc_cphy_rx_clk_src.clkr.hw,
  1061. },
  1062. .num_parents = 1,
  1063. .flags = CLK_SET_RATE_PARENT,
  1064. .ops = &clk_branch2_ops,
  1065. },
  1066. },
  1067. };
  1068. static struct clk_branch cam_cc_csiphy1_clk = {
  1069. .halt_reg = 0x5044,
  1070. .halt_check = BRANCH_HALT,
  1071. .clkr = {
  1072. .enable_reg = 0x5044,
  1073. .enable_mask = BIT(0),
  1074. .hw.init = &(struct clk_init_data){
  1075. .name = "cam_cc_csiphy1_clk",
  1076. .parent_data = &(const struct clk_parent_data){
  1077. .hw = &cam_cc_cphy_rx_clk_src.clkr.hw,
  1078. },
  1079. .num_parents = 1,
  1080. .flags = CLK_SET_RATE_PARENT,
  1081. .ops = &clk_branch2_ops,
  1082. },
  1083. },
  1084. };
  1085. static struct clk_branch cam_cc_csiphy2_clk = {
  1086. .halt_reg = 0x5068,
  1087. .halt_check = BRANCH_HALT,
  1088. .clkr = {
  1089. .enable_reg = 0x5068,
  1090. .enable_mask = BIT(0),
  1091. .hw.init = &(struct clk_init_data){
  1092. .name = "cam_cc_csiphy2_clk",
  1093. .parent_data = &(const struct clk_parent_data){
  1094. .hw = &cam_cc_cphy_rx_clk_src.clkr.hw,
  1095. },
  1096. .num_parents = 1,
  1097. .flags = CLK_SET_RATE_PARENT,
  1098. .ops = &clk_branch2_ops,
  1099. },
  1100. },
  1101. };
  1102. static struct clk_branch cam_cc_icp_clk = {
  1103. .halt_reg = 0xb0a0,
  1104. .halt_check = BRANCH_HALT,
  1105. .clkr = {
  1106. .enable_reg = 0xb0a0,
  1107. .enable_mask = BIT(0),
  1108. .hw.init = &(struct clk_init_data){
  1109. .name = "cam_cc_icp_clk",
  1110. .parent_data = &(const struct clk_parent_data){
  1111. .hw = &cam_cc_icp_clk_src.clkr.hw,
  1112. },
  1113. .num_parents = 1,
  1114. .flags = CLK_SET_RATE_PARENT,
  1115. .ops = &clk_branch2_ops,
  1116. },
  1117. },
  1118. };
  1119. static struct clk_branch cam_cc_ife_0_axi_clk = {
  1120. .halt_reg = 0x9080,
  1121. .halt_check = BRANCH_HALT,
  1122. .clkr = {
  1123. .enable_reg = 0x9080,
  1124. .enable_mask = BIT(0),
  1125. .hw.init = &(struct clk_init_data){
  1126. .name = "cam_cc_ife_0_axi_clk",
  1127. .ops = &clk_branch2_ops,
  1128. },
  1129. },
  1130. };
  1131. static struct clk_branch cam_cc_ife_0_clk = {
  1132. .halt_reg = 0x9028,
  1133. .halt_check = BRANCH_HALT,
  1134. .clkr = {
  1135. .enable_reg = 0x9028,
  1136. .enable_mask = BIT(0),
  1137. .hw.init = &(struct clk_init_data){
  1138. .name = "cam_cc_ife_0_clk",
  1139. .parent_data = &(const struct clk_parent_data){
  1140. .hw = &cam_cc_ife_0_clk_src.clkr.hw,
  1141. },
  1142. .num_parents = 1,
  1143. .flags = CLK_SET_RATE_PARENT,
  1144. .ops = &clk_branch2_ops,
  1145. },
  1146. },
  1147. };
  1148. static struct clk_branch cam_cc_ife_0_cphy_rx_clk = {
  1149. .halt_reg = 0x907c,
  1150. .halt_check = BRANCH_HALT,
  1151. .clkr = {
  1152. .enable_reg = 0x907c,
  1153. .enable_mask = BIT(0),
  1154. .hw.init = &(struct clk_init_data){
  1155. .name = "cam_cc_ife_0_cphy_rx_clk",
  1156. .parent_data = &(const struct clk_parent_data){
  1157. .hw = &cam_cc_cphy_rx_clk_src.clkr.hw,
  1158. },
  1159. .num_parents = 1,
  1160. .flags = CLK_SET_RATE_PARENT,
  1161. .ops = &clk_branch2_ops,
  1162. },
  1163. },
  1164. };
  1165. static struct clk_branch cam_cc_ife_0_csid_clk = {
  1166. .halt_reg = 0x9054,
  1167. .halt_check = BRANCH_HALT,
  1168. .clkr = {
  1169. .enable_reg = 0x9054,
  1170. .enable_mask = BIT(0),
  1171. .hw.init = &(struct clk_init_data){
  1172. .name = "cam_cc_ife_0_csid_clk",
  1173. .parent_data = &(const struct clk_parent_data){
  1174. .hw = &cam_cc_ife_0_csid_clk_src.clkr.hw,
  1175. },
  1176. .num_parents = 1,
  1177. .flags = CLK_SET_RATE_PARENT,
  1178. .ops = &clk_branch2_ops,
  1179. },
  1180. },
  1181. };
  1182. static struct clk_branch cam_cc_ife_0_dsp_clk = {
  1183. .halt_reg = 0x9038,
  1184. .halt_check = BRANCH_HALT,
  1185. .clkr = {
  1186. .enable_reg = 0x9038,
  1187. .enable_mask = BIT(0),
  1188. .hw.init = &(struct clk_init_data){
  1189. .name = "cam_cc_ife_0_dsp_clk",
  1190. .parent_data = &(const struct clk_parent_data){
  1191. .hw = &cam_cc_ife_0_clk_src.clkr.hw,
  1192. },
  1193. .num_parents = 1,
  1194. .flags = CLK_SET_RATE_PARENT,
  1195. .ops = &clk_branch2_ops,
  1196. },
  1197. },
  1198. };
  1199. static struct clk_branch cam_cc_ife_1_axi_clk = {
  1200. .halt_reg = 0xa058,
  1201. .halt_check = BRANCH_HALT,
  1202. .clkr = {
  1203. .enable_reg = 0xa058,
  1204. .enable_mask = BIT(0),
  1205. .hw.init = &(struct clk_init_data){
  1206. .name = "cam_cc_ife_1_axi_clk",
  1207. .ops = &clk_branch2_ops,
  1208. },
  1209. },
  1210. };
  1211. static struct clk_branch cam_cc_ife_1_clk = {
  1212. .halt_reg = 0xa028,
  1213. .halt_check = BRANCH_HALT,
  1214. .clkr = {
  1215. .enable_reg = 0xa028,
  1216. .enable_mask = BIT(0),
  1217. .hw.init = &(struct clk_init_data){
  1218. .name = "cam_cc_ife_1_clk",
  1219. .parent_data = &(const struct clk_parent_data){
  1220. .hw = &cam_cc_ife_1_clk_src.clkr.hw,
  1221. },
  1222. .num_parents = 1,
  1223. .flags = CLK_SET_RATE_PARENT,
  1224. .ops = &clk_branch2_ops,
  1225. },
  1226. },
  1227. };
  1228. static struct clk_branch cam_cc_ife_1_cphy_rx_clk = {
  1229. .halt_reg = 0xa054,
  1230. .halt_check = BRANCH_HALT,
  1231. .clkr = {
  1232. .enable_reg = 0xa054,
  1233. .enable_mask = BIT(0),
  1234. .hw.init = &(struct clk_init_data){
  1235. .name = "cam_cc_ife_1_cphy_rx_clk",
  1236. .parent_data = &(const struct clk_parent_data){
  1237. .hw = &cam_cc_cphy_rx_clk_src.clkr.hw,
  1238. },
  1239. .num_parents = 1,
  1240. .flags = CLK_SET_RATE_PARENT,
  1241. .ops = &clk_branch2_ops,
  1242. },
  1243. },
  1244. };
  1245. static struct clk_branch cam_cc_ife_1_csid_clk = {
  1246. .halt_reg = 0xa04c,
  1247. .halt_check = BRANCH_HALT,
  1248. .clkr = {
  1249. .enable_reg = 0xa04c,
  1250. .enable_mask = BIT(0),
  1251. .hw.init = &(struct clk_init_data){
  1252. .name = "cam_cc_ife_1_csid_clk",
  1253. .parent_data = &(const struct clk_parent_data){
  1254. .hw = &cam_cc_ife_1_csid_clk_src.clkr.hw,
  1255. },
  1256. .num_parents = 1,
  1257. .flags = CLK_SET_RATE_PARENT,
  1258. .ops = &clk_branch2_ops,
  1259. },
  1260. },
  1261. };
  1262. static struct clk_branch cam_cc_ife_1_dsp_clk = {
  1263. .halt_reg = 0xa030,
  1264. .halt_check = BRANCH_HALT,
  1265. .clkr = {
  1266. .enable_reg = 0xa030,
  1267. .enable_mask = BIT(0),
  1268. .hw.init = &(struct clk_init_data){
  1269. .name = "cam_cc_ife_1_dsp_clk",
  1270. .parent_data = &(const struct clk_parent_data){
  1271. .hw = &cam_cc_ife_1_clk_src.clkr.hw,
  1272. },
  1273. .num_parents = 1,
  1274. .flags = CLK_SET_RATE_PARENT,
  1275. .ops = &clk_branch2_ops,
  1276. },
  1277. },
  1278. };
  1279. static struct clk_branch cam_cc_ife_lite_clk = {
  1280. .halt_reg = 0xb01c,
  1281. .halt_check = BRANCH_HALT,
  1282. .clkr = {
  1283. .enable_reg = 0xb01c,
  1284. .enable_mask = BIT(0),
  1285. .hw.init = &(struct clk_init_data){
  1286. .name = "cam_cc_ife_lite_clk",
  1287. .parent_data = &(const struct clk_parent_data){
  1288. .hw = &cam_cc_ife_lite_clk_src.clkr.hw,
  1289. },
  1290. .num_parents = 1,
  1291. .flags = CLK_SET_RATE_PARENT,
  1292. .ops = &clk_branch2_ops,
  1293. },
  1294. },
  1295. };
  1296. static struct clk_branch cam_cc_ife_lite_cphy_rx_clk = {
  1297. .halt_reg = 0xb044,
  1298. .halt_check = BRANCH_HALT,
  1299. .clkr = {
  1300. .enable_reg = 0xb044,
  1301. .enable_mask = BIT(0),
  1302. .hw.init = &(struct clk_init_data){
  1303. .name = "cam_cc_ife_lite_cphy_rx_clk",
  1304. .parent_data = &(const struct clk_parent_data){
  1305. .hw = &cam_cc_cphy_rx_clk_src.clkr.hw,
  1306. },
  1307. .num_parents = 1,
  1308. .flags = CLK_SET_RATE_PARENT,
  1309. .ops = &clk_branch2_ops,
  1310. },
  1311. },
  1312. };
  1313. static struct clk_branch cam_cc_ife_lite_csid_clk = {
  1314. .halt_reg = 0xb03c,
  1315. .halt_check = BRANCH_HALT,
  1316. .clkr = {
  1317. .enable_reg = 0xb03c,
  1318. .enable_mask = BIT(0),
  1319. .hw.init = &(struct clk_init_data){
  1320. .name = "cam_cc_ife_lite_csid_clk",
  1321. .parent_data = &(const struct clk_parent_data){
  1322. .hw = &cam_cc_ife_lite_csid_clk_src.clkr.hw,
  1323. },
  1324. .num_parents = 1,
  1325. .flags = CLK_SET_RATE_PARENT,
  1326. .ops = &clk_branch2_ops,
  1327. },
  1328. },
  1329. };
  1330. static struct clk_branch cam_cc_ipe_0_ahb_clk = {
  1331. .halt_reg = 0x7040,
  1332. .halt_check = BRANCH_HALT,
  1333. .clkr = {
  1334. .enable_reg = 0x7040,
  1335. .enable_mask = BIT(0),
  1336. .hw.init = &(struct clk_init_data){
  1337. .name = "cam_cc_ipe_0_ahb_clk",
  1338. .parent_data = &(const struct clk_parent_data){
  1339. .hw = &cam_cc_slow_ahb_clk_src.clkr.hw,
  1340. },
  1341. .num_parents = 1,
  1342. .flags = CLK_SET_RATE_PARENT,
  1343. .ops = &clk_branch2_ops,
  1344. },
  1345. },
  1346. };
  1347. static struct clk_branch cam_cc_ipe_0_areg_clk = {
  1348. .halt_reg = 0x703c,
  1349. .halt_check = BRANCH_HALT,
  1350. .clkr = {
  1351. .enable_reg = 0x703c,
  1352. .enable_mask = BIT(0),
  1353. .hw.init = &(struct clk_init_data){
  1354. .name = "cam_cc_ipe_0_areg_clk",
  1355. .parent_data = &(const struct clk_parent_data){
  1356. .hw = &cam_cc_fast_ahb_clk_src.clkr.hw,
  1357. },
  1358. .num_parents = 1,
  1359. .flags = CLK_SET_RATE_PARENT,
  1360. .ops = &clk_branch2_ops,
  1361. },
  1362. },
  1363. };
  1364. static struct clk_branch cam_cc_ipe_0_axi_clk = {
  1365. .halt_reg = 0x7038,
  1366. .halt_check = BRANCH_HALT,
  1367. .clkr = {
  1368. .enable_reg = 0x7038,
  1369. .enable_mask = BIT(0),
  1370. .hw.init = &(struct clk_init_data){
  1371. .name = "cam_cc_ipe_0_axi_clk",
  1372. .ops = &clk_branch2_ops,
  1373. },
  1374. },
  1375. };
  1376. static struct clk_branch cam_cc_ipe_0_clk = {
  1377. .halt_reg = 0x7028,
  1378. .halt_check = BRANCH_HALT,
  1379. .clkr = {
  1380. .enable_reg = 0x7028,
  1381. .enable_mask = BIT(0),
  1382. .hw.init = &(struct clk_init_data){
  1383. .name = "cam_cc_ipe_0_clk",
  1384. .parent_data = &(const struct clk_parent_data){
  1385. .hw = &cam_cc_ipe_0_clk_src.clkr.hw,
  1386. },
  1387. .num_parents = 1,
  1388. .flags = CLK_SET_RATE_PARENT,
  1389. .ops = &clk_branch2_ops,
  1390. },
  1391. },
  1392. };
  1393. static struct clk_branch cam_cc_jpeg_clk = {
  1394. .halt_reg = 0xb064,
  1395. .halt_check = BRANCH_HALT,
  1396. .clkr = {
  1397. .enable_reg = 0xb064,
  1398. .enable_mask = BIT(0),
  1399. .hw.init = &(struct clk_init_data){
  1400. .name = "cam_cc_jpeg_clk",
  1401. .parent_data = &(const struct clk_parent_data){
  1402. .hw = &cam_cc_jpeg_clk_src.clkr.hw,
  1403. },
  1404. .num_parents = 1,
  1405. .flags = CLK_SET_RATE_PARENT,
  1406. .ops = &clk_branch2_ops,
  1407. },
  1408. },
  1409. };
  1410. static struct clk_branch cam_cc_lrme_clk = {
  1411. .halt_reg = 0xb110,
  1412. .halt_check = BRANCH_HALT,
  1413. .clkr = {
  1414. .enable_reg = 0xb110,
  1415. .enable_mask = BIT(0),
  1416. .hw.init = &(struct clk_init_data){
  1417. .name = "cam_cc_lrme_clk",
  1418. .parent_data = &(const struct clk_parent_data){
  1419. .hw = &cam_cc_lrme_clk_src.clkr.hw,
  1420. },
  1421. .num_parents = 1,
  1422. .flags = CLK_SET_RATE_PARENT,
  1423. .ops = &clk_branch2_ops,
  1424. },
  1425. },
  1426. };
  1427. static struct clk_branch cam_cc_mclk0_clk = {
  1428. .halt_reg = 0x401c,
  1429. .halt_check = BRANCH_HALT,
  1430. .clkr = {
  1431. .enable_reg = 0x401c,
  1432. .enable_mask = BIT(0),
  1433. .hw.init = &(struct clk_init_data){
  1434. .name = "cam_cc_mclk0_clk",
  1435. .parent_data = &(const struct clk_parent_data){
  1436. .hw = &cam_cc_mclk0_clk_src.clkr.hw,
  1437. },
  1438. .num_parents = 1,
  1439. .flags = CLK_SET_RATE_PARENT,
  1440. .ops = &clk_branch2_ops,
  1441. },
  1442. },
  1443. };
  1444. static struct clk_branch cam_cc_mclk1_clk = {
  1445. .halt_reg = 0x403c,
  1446. .halt_check = BRANCH_HALT,
  1447. .clkr = {
  1448. .enable_reg = 0x403c,
  1449. .enable_mask = BIT(0),
  1450. .hw.init = &(struct clk_init_data){
  1451. .name = "cam_cc_mclk1_clk",
  1452. .parent_data = &(const struct clk_parent_data){
  1453. .hw = &cam_cc_mclk1_clk_src.clkr.hw,
  1454. },
  1455. .num_parents = 1,
  1456. .flags = CLK_SET_RATE_PARENT,
  1457. .ops = &clk_branch2_ops,
  1458. },
  1459. },
  1460. };
  1461. static struct clk_branch cam_cc_mclk2_clk = {
  1462. .halt_reg = 0x405c,
  1463. .halt_check = BRANCH_HALT,
  1464. .clkr = {
  1465. .enable_reg = 0x405c,
  1466. .enable_mask = BIT(0),
  1467. .hw.init = &(struct clk_init_data){
  1468. .name = "cam_cc_mclk2_clk",
  1469. .parent_data = &(const struct clk_parent_data){
  1470. .hw = &cam_cc_mclk2_clk_src.clkr.hw,
  1471. },
  1472. .num_parents = 1,
  1473. .flags = CLK_SET_RATE_PARENT,
  1474. .ops = &clk_branch2_ops,
  1475. },
  1476. },
  1477. };
  1478. static struct clk_branch cam_cc_mclk3_clk = {
  1479. .halt_reg = 0x407c,
  1480. .halt_check = BRANCH_HALT,
  1481. .clkr = {
  1482. .enable_reg = 0x407c,
  1483. .enable_mask = BIT(0),
  1484. .hw.init = &(struct clk_init_data){
  1485. .name = "cam_cc_mclk3_clk",
  1486. .parent_data = &(const struct clk_parent_data){
  1487. .hw = &cam_cc_mclk3_clk_src.clkr.hw,
  1488. },
  1489. .num_parents = 1,
  1490. .flags = CLK_SET_RATE_PARENT,
  1491. .ops = &clk_branch2_ops,
  1492. },
  1493. },
  1494. };
  1495. static struct clk_branch cam_cc_soc_ahb_clk = {
  1496. .halt_reg = 0xb140,
  1497. .halt_check = BRANCH_HALT,
  1498. .clkr = {
  1499. .enable_reg = 0xb140,
  1500. .enable_mask = BIT(0),
  1501. .hw.init = &(struct clk_init_data){
  1502. .name = "cam_cc_soc_ahb_clk",
  1503. .ops = &clk_branch2_ops,
  1504. },
  1505. },
  1506. };
  1507. static struct clk_branch cam_cc_sys_tmr_clk = {
  1508. .halt_reg = 0xb0a8,
  1509. .halt_check = BRANCH_HALT,
  1510. .clkr = {
  1511. .enable_reg = 0xb0a8,
  1512. .enable_mask = BIT(0),
  1513. .hw.init = &(struct clk_init_data){
  1514. .name = "cam_cc_sys_tmr_clk",
  1515. .ops = &clk_branch2_ops,
  1516. },
  1517. },
  1518. };
  1519. static struct clk_regmap *cam_cc_sm6150_clocks[] = {
  1520. [CAM_CC_BPS_AHB_CLK] = &cam_cc_bps_ahb_clk.clkr,
  1521. [CAM_CC_BPS_AREG_CLK] = &cam_cc_bps_areg_clk.clkr,
  1522. [CAM_CC_BPS_AXI_CLK] = &cam_cc_bps_axi_clk.clkr,
  1523. [CAM_CC_BPS_CLK] = &cam_cc_bps_clk.clkr,
  1524. [CAM_CC_BPS_CLK_SRC] = &cam_cc_bps_clk_src.clkr,
  1525. [CAM_CC_CAMNOC_AXI_CLK] = &cam_cc_camnoc_axi_clk.clkr,
  1526. [CAM_CC_CCI_CLK] = &cam_cc_cci_clk.clkr,
  1527. [CAM_CC_CCI_CLK_SRC] = &cam_cc_cci_clk_src.clkr,
  1528. [CAM_CC_CORE_AHB_CLK] = &cam_cc_core_ahb_clk.clkr,
  1529. [CAM_CC_CPAS_AHB_CLK] = &cam_cc_cpas_ahb_clk.clkr,
  1530. [CAM_CC_CPHY_RX_CLK_SRC] = &cam_cc_cphy_rx_clk_src.clkr,
  1531. [CAM_CC_CSI0PHYTIMER_CLK] = &cam_cc_csi0phytimer_clk.clkr,
  1532. [CAM_CC_CSI0PHYTIMER_CLK_SRC] = &cam_cc_csi0phytimer_clk_src.clkr,
  1533. [CAM_CC_CSI1PHYTIMER_CLK] = &cam_cc_csi1phytimer_clk.clkr,
  1534. [CAM_CC_CSI1PHYTIMER_CLK_SRC] = &cam_cc_csi1phytimer_clk_src.clkr,
  1535. [CAM_CC_CSI2PHYTIMER_CLK] = &cam_cc_csi2phytimer_clk.clkr,
  1536. [CAM_CC_CSI2PHYTIMER_CLK_SRC] = &cam_cc_csi2phytimer_clk_src.clkr,
  1537. [CAM_CC_CSIPHY0_CLK] = &cam_cc_csiphy0_clk.clkr,
  1538. [CAM_CC_CSIPHY1_CLK] = &cam_cc_csiphy1_clk.clkr,
  1539. [CAM_CC_CSIPHY2_CLK] = &cam_cc_csiphy2_clk.clkr,
  1540. [CAM_CC_FAST_AHB_CLK_SRC] = &cam_cc_fast_ahb_clk_src.clkr,
  1541. [CAM_CC_ICP_CLK] = &cam_cc_icp_clk.clkr,
  1542. [CAM_CC_ICP_CLK_SRC] = &cam_cc_icp_clk_src.clkr,
  1543. [CAM_CC_IFE_0_AXI_CLK] = &cam_cc_ife_0_axi_clk.clkr,
  1544. [CAM_CC_IFE_0_CLK] = &cam_cc_ife_0_clk.clkr,
  1545. [CAM_CC_IFE_0_CLK_SRC] = &cam_cc_ife_0_clk_src.clkr,
  1546. [CAM_CC_IFE_0_CPHY_RX_CLK] = &cam_cc_ife_0_cphy_rx_clk.clkr,
  1547. [CAM_CC_IFE_0_CSID_CLK] = &cam_cc_ife_0_csid_clk.clkr,
  1548. [CAM_CC_IFE_0_CSID_CLK_SRC] = &cam_cc_ife_0_csid_clk_src.clkr,
  1549. [CAM_CC_IFE_0_DSP_CLK] = &cam_cc_ife_0_dsp_clk.clkr,
  1550. [CAM_CC_IFE_1_AXI_CLK] = &cam_cc_ife_1_axi_clk.clkr,
  1551. [CAM_CC_IFE_1_CLK] = &cam_cc_ife_1_clk.clkr,
  1552. [CAM_CC_IFE_1_CLK_SRC] = &cam_cc_ife_1_clk_src.clkr,
  1553. [CAM_CC_IFE_1_CPHY_RX_CLK] = &cam_cc_ife_1_cphy_rx_clk.clkr,
  1554. [CAM_CC_IFE_1_CSID_CLK] = &cam_cc_ife_1_csid_clk.clkr,
  1555. [CAM_CC_IFE_1_CSID_CLK_SRC] = &cam_cc_ife_1_csid_clk_src.clkr,
  1556. [CAM_CC_IFE_1_DSP_CLK] = &cam_cc_ife_1_dsp_clk.clkr,
  1557. [CAM_CC_IFE_LITE_CLK] = &cam_cc_ife_lite_clk.clkr,
  1558. [CAM_CC_IFE_LITE_CLK_SRC] = &cam_cc_ife_lite_clk_src.clkr,
  1559. [CAM_CC_IFE_LITE_CPHY_RX_CLK] = &cam_cc_ife_lite_cphy_rx_clk.clkr,
  1560. [CAM_CC_IFE_LITE_CSID_CLK] = &cam_cc_ife_lite_csid_clk.clkr,
  1561. [CAM_CC_IFE_LITE_CSID_CLK_SRC] = &cam_cc_ife_lite_csid_clk_src.clkr,
  1562. [CAM_CC_IPE_0_AHB_CLK] = &cam_cc_ipe_0_ahb_clk.clkr,
  1563. [CAM_CC_IPE_0_AREG_CLK] = &cam_cc_ipe_0_areg_clk.clkr,
  1564. [CAM_CC_IPE_0_AXI_CLK] = &cam_cc_ipe_0_axi_clk.clkr,
  1565. [CAM_CC_IPE_0_CLK] = &cam_cc_ipe_0_clk.clkr,
  1566. [CAM_CC_IPE_0_CLK_SRC] = &cam_cc_ipe_0_clk_src.clkr,
  1567. [CAM_CC_JPEG_CLK] = &cam_cc_jpeg_clk.clkr,
  1568. [CAM_CC_JPEG_CLK_SRC] = &cam_cc_jpeg_clk_src.clkr,
  1569. [CAM_CC_LRME_CLK] = &cam_cc_lrme_clk.clkr,
  1570. [CAM_CC_LRME_CLK_SRC] = &cam_cc_lrme_clk_src.clkr,
  1571. [CAM_CC_MCLK0_CLK] = &cam_cc_mclk0_clk.clkr,
  1572. [CAM_CC_MCLK0_CLK_SRC] = &cam_cc_mclk0_clk_src.clkr,
  1573. [CAM_CC_MCLK1_CLK] = &cam_cc_mclk1_clk.clkr,
  1574. [CAM_CC_MCLK1_CLK_SRC] = &cam_cc_mclk1_clk_src.clkr,
  1575. [CAM_CC_MCLK2_CLK] = &cam_cc_mclk2_clk.clkr,
  1576. [CAM_CC_MCLK2_CLK_SRC] = &cam_cc_mclk2_clk_src.clkr,
  1577. [CAM_CC_MCLK3_CLK] = &cam_cc_mclk3_clk.clkr,
  1578. [CAM_CC_MCLK3_CLK_SRC] = &cam_cc_mclk3_clk_src.clkr,
  1579. [CAM_CC_PLL0] = &cam_cc_pll0.clkr,
  1580. [CAM_CC_PLL1] = &cam_cc_pll1.clkr,
  1581. [CAM_CC_PLL2] = &cam_cc_pll2.clkr,
  1582. [CAM_CC_PLL2_OUT_AUX2] = &cam_cc_pll2_out_aux2.clkr,
  1583. [CAM_CC_PLL3] = &cam_cc_pll3.clkr,
  1584. [CAM_CC_SLOW_AHB_CLK_SRC] = &cam_cc_slow_ahb_clk_src.clkr,
  1585. [CAM_CC_SOC_AHB_CLK] = &cam_cc_soc_ahb_clk.clkr,
  1586. [CAM_CC_SYS_TMR_CLK] = &cam_cc_sys_tmr_clk.clkr,
  1587. };
  1588. static const struct regmap_config cam_cc_sm6150_regmap_config = {
  1589. .reg_bits = 32,
  1590. .reg_stride = 4,
  1591. .val_bits = 32,
  1592. .max_register = 0xd004,
  1593. .fast_io = true,
  1594. };
  1595. static const struct qcom_cc_desc cam_cc_sm6150_desc = {
  1596. .config = &cam_cc_sm6150_regmap_config,
  1597. .clks = cam_cc_sm6150_clocks,
  1598. .num_clks = ARRAY_SIZE(cam_cc_sm6150_clocks),
  1599. };
  1600. static const struct of_device_id cam_cc_sm6150_match_table[] = {
  1601. { .compatible = "qcom,sm6150-camcc" },
  1602. { .compatible = "qcom,sa6155-camcc" },
  1603. { }
  1604. };
  1605. MODULE_DEVICE_TABLE(of, cam_cc_sm6150_match_table);
  1606. static void camcc_sm6150_fixup_sa6155(struct platform_device *pdev)
  1607. {
  1608. vdd_cx.num_levels = VDD_NUM_SA6155;
  1609. vdd_mx.num_levels = VDD_NUM_SA6155;
  1610. vdd_cx.cur_level = VDD_NUM_SA6155;
  1611. vdd_mx.cur_level = VDD_NUM_SA6155;
  1612. }
  1613. static int cam_cc_sm6150_probe(struct platform_device *pdev)
  1614. {
  1615. struct regmap *regmap;
  1616. int ret, is_sa6155;
  1617. vdd_cx.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_cx");
  1618. if (IS_ERR(vdd_cx.regulator[0])) {
  1619. if (!(PTR_ERR(vdd_cx.regulator[0]) == -EPROBE_DEFER))
  1620. dev_err(&pdev->dev, "Unable to get vdd_cx regulator\n");
  1621. return PTR_ERR(vdd_cx.regulator[0]);
  1622. }
  1623. vdd_mx.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_mx");
  1624. if (IS_ERR(vdd_mx.regulator[0])) {
  1625. if (!(PTR_ERR(vdd_mx.regulator[0]) == -EPROBE_DEFER))
  1626. dev_err(&pdev->dev, "Unable to get vdd_mx regulator\n");
  1627. return PTR_ERR(vdd_mx.regulator[0]);
  1628. }
  1629. is_sa6155 = of_device_is_compatible(pdev->dev.of_node,
  1630. "qcom,sa6155-camcc");
  1631. if (is_sa6155)
  1632. camcc_sm6150_fixup_sa6155(pdev);
  1633. regmap = qcom_cc_map(pdev, &cam_cc_sm6150_desc);
  1634. if (IS_ERR(regmap)) {
  1635. pr_err("Failed to map the cam_cc registers\n");
  1636. return PTR_ERR(regmap);
  1637. }
  1638. clk_alpha_pll_configure(&cam_cc_pll0, regmap, cam_cc_pll0.config);
  1639. clk_alpha_pll_configure(&cam_cc_pll1, regmap, cam_cc_pll1.config);
  1640. clk_alpha_pll_configure(&cam_cc_pll2, regmap, cam_cc_pll2.config);
  1641. clk_alpha_pll_configure(&cam_cc_pll3, regmap, cam_cc_pll3.config);
  1642. ret = qcom_cc_really_probe(pdev, &cam_cc_sm6150_desc, regmap);
  1643. if (ret) {
  1644. dev_err(&pdev->dev, "Failed to register CAM CC clocks\n");
  1645. return ret;
  1646. }
  1647. dev_info(&pdev->dev, "Registered CAM CC clocks\n");
  1648. return ret;
  1649. }
  1650. static void cam_cc_sm6150_sync_state(struct device *dev)
  1651. {
  1652. qcom_cc_sync_state(dev, &cam_cc_sm6150_desc);
  1653. }
  1654. static struct platform_driver cam_cc_sm6150_driver = {
  1655. .probe = cam_cc_sm6150_probe,
  1656. .driver = {
  1657. .name = "cam_cc-sm6150",
  1658. .of_match_table = cam_cc_sm6150_match_table,
  1659. .sync_state = cam_cc_sm6150_sync_state,
  1660. },
  1661. };
  1662. static int __init cam_cc_sm6150_init(void)
  1663. {
  1664. return platform_driver_register(&cam_cc_sm6150_driver);
  1665. }
  1666. subsys_initcall(cam_cc_sm6150_init);
  1667. static void __exit cam_cc_sm6150_exit(void)
  1668. {
  1669. platform_driver_unregister(&cam_cc_sm6150_driver);
  1670. }
  1671. module_exit(cam_cc_sm6150_exit);
  1672. MODULE_DESCRIPTION("QTI CAM_CC SM6150 Driver");
  1673. MODULE_LICENSE("GPL");