camcc-sm7150.c 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2018, 2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2024, Danila Tikhonov <danila@jiaxyga.com>
  5. */
  6. #include <linux/clk-provider.h>
  7. #include <linux/mod_devicetable.h>
  8. #include <linux/module.h>
  9. #include <linux/of.h>
  10. #include <linux/platform_device.h>
  11. #include <linux/regmap.h>
  12. #include <dt-bindings/clock/qcom,sm7150-camcc.h>
  13. #include "clk-alpha-pll.h"
  14. #include "clk-branch.h"
  15. #include "clk-rcg.h"
  16. #include "clk-regmap.h"
  17. #include "common.h"
  18. #include "gdsc.h"
  19. enum {
  20. DT_BI_TCXO,
  21. DT_BI_TCXO_AO,
  22. DT_CHIP_SLEEP_CLK,
  23. };
  24. enum {
  25. P_BI_TCXO,
  26. P_BI_TCXO_MX,
  27. P_CAMCC_PLL0_OUT_EVEN,
  28. P_CAMCC_PLL0_OUT_MAIN,
  29. P_CAMCC_PLL0_OUT_ODD,
  30. P_CAMCC_PLL1_OUT_EVEN,
  31. P_CAMCC_PLL2_OUT_AUX,
  32. P_CAMCC_PLL2_OUT_EARLY,
  33. P_CAMCC_PLL2_OUT_MAIN,
  34. P_CAMCC_PLL3_OUT_EVEN,
  35. P_CAMCC_PLL4_OUT_EVEN,
  36. P_CHIP_SLEEP_CLK,
  37. };
  38. static const struct pll_vco fabia_vco[] = {
  39. { 249600000, 2000000000, 0 },
  40. };
  41. /* 1200MHz configuration */
  42. static const struct alpha_pll_config camcc_pll0_config = {
  43. .l = 0x3e,
  44. .alpha = 0x8000,
  45. .post_div_mask = 0xff << 8,
  46. .post_div_val = 0x31 << 8,
  47. .test_ctl_val = 0x40000000,
  48. };
  49. static struct clk_alpha_pll camcc_pll0 = {
  50. .offset = 0x0,
  51. .vco_table = fabia_vco,
  52. .num_vco = ARRAY_SIZE(fabia_vco),
  53. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
  54. .clkr = {
  55. .hw.init = &(const struct clk_init_data) {
  56. .name = "camcc_pll0",
  57. .parent_data = &(const struct clk_parent_data) {
  58. .index = DT_BI_TCXO,
  59. },
  60. .num_parents = 1,
  61. .ops = &clk_alpha_pll_fabia_ops,
  62. },
  63. },
  64. };
  65. static struct clk_fixed_factor camcc_pll0_out_even = {
  66. .mult = 1,
  67. .div = 2,
  68. .hw.init = &(const struct clk_init_data) {
  69. .name = "camcc_pll0_out_even",
  70. .parent_hws = (const struct clk_hw*[]) {
  71. &camcc_pll0.clkr.hw,
  72. },
  73. .num_parents = 1,
  74. .ops = &clk_fixed_factor_ops,
  75. },
  76. };
  77. static struct clk_fixed_factor camcc_pll0_out_odd = {
  78. .mult = 1,
  79. .div = 3,
  80. .hw.init = &(const struct clk_init_data) {
  81. .name = "camcc_pll0_out_odd",
  82. .parent_hws = (const struct clk_hw*[]) {
  83. &camcc_pll0.clkr.hw,
  84. },
  85. .num_parents = 1,
  86. .ops = &clk_fixed_factor_ops,
  87. },
  88. };
  89. /* 680MHz configuration */
  90. static const struct alpha_pll_config camcc_pll1_config = {
  91. .l = 0x23,
  92. .alpha = 0x6aaa,
  93. .post_div_mask = 0xf << 8,
  94. .post_div_val = 0x1 << 8,
  95. .test_ctl_val = 0x40000000,
  96. };
  97. static struct clk_alpha_pll camcc_pll1 = {
  98. .offset = 0x1000,
  99. .vco_table = fabia_vco,
  100. .num_vco = ARRAY_SIZE(fabia_vco),
  101. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
  102. .clkr = {
  103. .hw.init = &(const struct clk_init_data) {
  104. .name = "camcc_pll1",
  105. .parent_data = &(const struct clk_parent_data) {
  106. .index = DT_BI_TCXO,
  107. },
  108. .num_parents = 1,
  109. .ops = &clk_alpha_pll_fabia_ops,
  110. },
  111. },
  112. };
  113. static struct clk_fixed_factor camcc_pll1_out_even = {
  114. .mult = 1,
  115. .div = 2,
  116. .hw.init = &(const struct clk_init_data) {
  117. .name = "camcc_pll1_out_even",
  118. .parent_hws = (const struct clk_hw*[]) {
  119. &camcc_pll1.clkr.hw,
  120. },
  121. .num_parents = 1,
  122. .flags = CLK_SET_RATE_PARENT,
  123. .ops = &clk_fixed_factor_ops,
  124. },
  125. };
  126. /* 1920MHz configuration */
  127. static const struct alpha_pll_config camcc_pll2_config = {
  128. .l = 0x64,
  129. .post_div_val = 0x3 << 8,
  130. .post_div_mask = 0x3 << 8,
  131. .early_output_mask = BIT(3),
  132. .aux_output_mask = BIT(1),
  133. .main_output_mask = BIT(0),
  134. .config_ctl_hi_val = 0x400003d6,
  135. .config_ctl_val = 0x20000954,
  136. };
  137. static struct clk_alpha_pll camcc_pll2 = {
  138. .offset = 0x2000,
  139. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
  140. .clkr = {
  141. .hw.init = &(const struct clk_init_data) {
  142. .name = "camcc_pll2",
  143. .parent_data = &(const struct clk_parent_data) {
  144. .index = DT_BI_TCXO,
  145. },
  146. .num_parents = 1,
  147. .ops = &clk_alpha_pll_agera_ops,
  148. },
  149. },
  150. };
  151. static struct clk_fixed_factor camcc_pll2_out_early = {
  152. .mult = 1,
  153. .div = 2,
  154. .hw.init = &(const struct clk_init_data) {
  155. .name = "camcc_pll2_out_early",
  156. .parent_hws = (const struct clk_hw*[]) {
  157. &camcc_pll2.clkr.hw,
  158. },
  159. .num_parents = 1,
  160. .ops = &clk_fixed_factor_ops,
  161. },
  162. };
  163. static struct clk_alpha_pll_postdiv camcc_pll2_out_aux = {
  164. .offset = 0x2000,
  165. .post_div_shift = 8,
  166. .width = 2,
  167. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
  168. .clkr.hw.init = &(const struct clk_init_data) {
  169. .name = "camcc_pll2_out_aux",
  170. .parent_hws = (const struct clk_hw*[]) {
  171. &camcc_pll2.clkr.hw,
  172. },
  173. .num_parents = 1,
  174. .flags = CLK_SET_RATE_PARENT,
  175. .ops = &clk_alpha_pll_postdiv_ops,
  176. },
  177. };
  178. static struct clk_alpha_pll_postdiv camcc_pll2_out_main = {
  179. .offset = 0x2000,
  180. .post_div_shift = 8,
  181. .width = 2,
  182. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
  183. .clkr.hw.init = &(const struct clk_init_data) {
  184. .name = "camcc_pll2_out_main",
  185. .parent_hws = (const struct clk_hw*[]) {
  186. &camcc_pll2.clkr.hw,
  187. },
  188. .num_parents = 1,
  189. .flags = CLK_SET_RATE_PARENT,
  190. .ops = &clk_alpha_pll_postdiv_ops,
  191. },
  192. };
  193. /* 760MHz configuration */
  194. static const struct alpha_pll_config camcc_pll3_config = {
  195. .l = 0x27,
  196. .alpha = 0x9555,
  197. .post_div_mask = 0xf << 8,
  198. .post_div_val = 0x1 << 8,
  199. .test_ctl_val = 0x40000000,
  200. };
  201. static struct clk_alpha_pll camcc_pll3 = {
  202. .offset = 0x3000,
  203. .vco_table = fabia_vco,
  204. .num_vco = ARRAY_SIZE(fabia_vco),
  205. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
  206. .clkr = {
  207. .hw.init = &(const struct clk_init_data) {
  208. .name = "camcc_pll3",
  209. .parent_data = &(const struct clk_parent_data) {
  210. .index = DT_BI_TCXO,
  211. },
  212. .num_parents = 1,
  213. .ops = &clk_alpha_pll_fabia_ops,
  214. },
  215. },
  216. };
  217. static struct clk_fixed_factor camcc_pll3_out_even = {
  218. .mult = 1,
  219. .div = 2,
  220. .hw.init = &(const struct clk_init_data) {
  221. .name = "camcc_pll3_out_even",
  222. .parent_hws = (const struct clk_hw*[]) {
  223. &camcc_pll3.clkr.hw,
  224. },
  225. .num_parents = 1,
  226. .flags = CLK_SET_RATE_PARENT,
  227. .ops = &clk_fixed_factor_ops,
  228. },
  229. };
  230. static struct clk_alpha_pll camcc_pll4 = {
  231. .offset = 0x4000,
  232. .vco_table = fabia_vco,
  233. .num_vco = ARRAY_SIZE(fabia_vco),
  234. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
  235. .clkr = {
  236. .hw.init = &(const struct clk_init_data) {
  237. .name = "camcc_pll4",
  238. .parent_data = &(const struct clk_parent_data) {
  239. .index = DT_BI_TCXO,
  240. },
  241. .num_parents = 1,
  242. .ops = &clk_alpha_pll_fabia_ops,
  243. },
  244. },
  245. };
  246. static struct clk_fixed_factor camcc_pll4_out_even = {
  247. .mult = 1,
  248. .div = 2,
  249. .hw.init = &(const struct clk_init_data) {
  250. .name = "camcc_pll4_out_even",
  251. .parent_hws = (const struct clk_hw*[]) {
  252. &camcc_pll4.clkr.hw,
  253. },
  254. .num_parents = 1,
  255. .flags = CLK_SET_RATE_PARENT,
  256. .ops = &clk_fixed_factor_ops,
  257. },
  258. };
  259. static const struct parent_map camcc_parent_map_0[] = {
  260. { P_BI_TCXO, 0 },
  261. { P_CAMCC_PLL0_OUT_MAIN, 1 },
  262. { P_CAMCC_PLL0_OUT_EVEN, 2 },
  263. { P_CAMCC_PLL0_OUT_ODD, 3 },
  264. { P_CAMCC_PLL2_OUT_MAIN, 5 },
  265. };
  266. static const struct clk_parent_data camcc_parent_data_0[] = {
  267. { .index = DT_BI_TCXO },
  268. { .hw = &camcc_pll0.clkr.hw },
  269. { .hw = &camcc_pll0_out_even.hw },
  270. { .hw = &camcc_pll0_out_odd.hw },
  271. { .hw = &camcc_pll2_out_main.clkr.hw },
  272. };
  273. static const struct parent_map camcc_parent_map_1[] = {
  274. { P_BI_TCXO, 0 },
  275. { P_CAMCC_PLL0_OUT_MAIN, 1 },
  276. { P_CAMCC_PLL0_OUT_EVEN, 2 },
  277. { P_CAMCC_PLL0_OUT_ODD, 3 },
  278. { P_CAMCC_PLL1_OUT_EVEN, 4 },
  279. { P_CAMCC_PLL2_OUT_EARLY, 5 },
  280. };
  281. static const struct clk_parent_data camcc_parent_data_1[] = {
  282. { .index = DT_BI_TCXO },
  283. { .hw = &camcc_pll0.clkr.hw },
  284. { .hw = &camcc_pll0_out_even.hw },
  285. { .hw = &camcc_pll0_out_odd.hw },
  286. { .hw = &camcc_pll1_out_even.hw },
  287. { .hw = &camcc_pll2_out_early.hw },
  288. };
  289. static const struct parent_map camcc_parent_map_2[] = {
  290. { P_BI_TCXO_MX, 0 },
  291. { P_CAMCC_PLL2_OUT_AUX, 5 },
  292. };
  293. static const struct clk_parent_data camcc_parent_data_2[] = {
  294. { .index = DT_BI_TCXO },
  295. { .hw = &camcc_pll2_out_aux.clkr.hw },
  296. };
  297. static const struct parent_map camcc_parent_map_3[] = {
  298. { P_BI_TCXO, 0 },
  299. { P_CAMCC_PLL0_OUT_MAIN, 1 },
  300. { P_CAMCC_PLL0_OUT_EVEN, 2 },
  301. { P_CAMCC_PLL0_OUT_ODD, 3 },
  302. { P_CAMCC_PLL2_OUT_EARLY, 5 },
  303. { P_CAMCC_PLL4_OUT_EVEN, 6 },
  304. };
  305. static const struct clk_parent_data camcc_parent_data_3[] = {
  306. { .index = DT_BI_TCXO },
  307. { .hw = &camcc_pll0.clkr.hw },
  308. { .hw = &camcc_pll0_out_even.hw },
  309. { .hw = &camcc_pll0_out_odd.hw },
  310. { .hw = &camcc_pll2_out_early.hw },
  311. { .hw = &camcc_pll4_out_even.hw },
  312. };
  313. static const struct parent_map camcc_parent_map_4[] = {
  314. { P_BI_TCXO, 0 },
  315. { P_CAMCC_PLL3_OUT_EVEN, 6 },
  316. };
  317. static const struct clk_parent_data camcc_parent_data_4[] = {
  318. { .index = DT_BI_TCXO },
  319. { .hw = &camcc_pll3_out_even.hw },
  320. };
  321. static const struct parent_map camcc_parent_map_5[] = {
  322. { P_BI_TCXO, 0 },
  323. { P_CAMCC_PLL4_OUT_EVEN, 6 },
  324. };
  325. static const struct clk_parent_data camcc_parent_data_5[] = {
  326. { .index = DT_BI_TCXO },
  327. { .hw = &camcc_pll4_out_even.hw },
  328. };
  329. static const struct parent_map camcc_parent_map_6[] = {
  330. { P_BI_TCXO, 0 },
  331. { P_CAMCC_PLL1_OUT_EVEN, 4 },
  332. };
  333. static const struct clk_parent_data camcc_parent_data_6[] = {
  334. { .index = DT_BI_TCXO },
  335. { .hw = &camcc_pll1_out_even.hw },
  336. };
  337. static const struct parent_map camcc_parent_map_7[] = {
  338. { P_CHIP_SLEEP_CLK, 0 },
  339. };
  340. static const struct clk_parent_data camcc_parent_data_7[] = {
  341. { .index = DT_CHIP_SLEEP_CLK },
  342. };
  343. static const struct parent_map camcc_parent_map_8[] = {
  344. { P_BI_TCXO, 0 },
  345. { P_CAMCC_PLL0_OUT_ODD, 3 },
  346. };
  347. static const struct clk_parent_data camcc_parent_data_8[] = {
  348. { .index = DT_BI_TCXO },
  349. { .hw = &camcc_pll0_out_odd.hw },
  350. };
  351. static const struct parent_map camcc_parent_map_9[] = {
  352. { P_BI_TCXO, 0 },
  353. };
  354. static const struct clk_parent_data camcc_parent_data_9[] = {
  355. { .index = DT_BI_TCXO_AO },
  356. };
  357. static const struct freq_tbl ftbl_camcc_bps_clk_src[] = {
  358. F(19200000, P_BI_TCXO, 1, 0, 0),
  359. F(100000000, P_CAMCC_PLL0_OUT_EVEN, 6, 0, 0),
  360. F(200000000, P_CAMCC_PLL0_OUT_ODD, 2, 0, 0),
  361. F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),
  362. F(480000000, P_CAMCC_PLL2_OUT_MAIN, 1, 0, 0),
  363. F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
  364. { }
  365. };
  366. static struct clk_rcg2 camcc_bps_clk_src = {
  367. .cmd_rcgr = 0x7010,
  368. .mnd_width = 0,
  369. .hid_width = 5,
  370. .parent_map = camcc_parent_map_0,
  371. .freq_tbl = ftbl_camcc_bps_clk_src,
  372. .clkr.hw.init = &(const struct clk_init_data) {
  373. .name = "camcc_bps_clk_src",
  374. .parent_data = camcc_parent_data_0,
  375. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  376. .ops = &clk_rcg2_shared_ops,
  377. },
  378. };
  379. static const struct freq_tbl ftbl_camcc_camnoc_axi_clk_src[] = {
  380. F(19200000, P_BI_TCXO, 1, 0, 0),
  381. F(150000000, P_CAMCC_PLL0_OUT_EVEN, 4, 0, 0),
  382. F(240000000, P_CAMCC_PLL2_OUT_MAIN, 2, 0, 0),
  383. F(320000000, P_CAMCC_PLL2_OUT_MAIN, 1.5, 0, 0),
  384. F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),
  385. F(480000000, P_CAMCC_PLL2_OUT_MAIN, 1, 0, 0),
  386. { }
  387. };
  388. static struct clk_rcg2 camcc_camnoc_axi_clk_src = {
  389. .cmd_rcgr = 0xc12c,
  390. .mnd_width = 0,
  391. .hid_width = 5,
  392. .parent_map = camcc_parent_map_0,
  393. .freq_tbl = ftbl_camcc_camnoc_axi_clk_src,
  394. .clkr.hw.init = &(const struct clk_init_data) {
  395. .name = "camcc_camnoc_axi_clk_src",
  396. .parent_data = camcc_parent_data_0,
  397. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  398. .ops = &clk_rcg2_shared_ops,
  399. },
  400. };
  401. static const struct freq_tbl ftbl_camcc_cci_0_clk_src[] = {
  402. F(19200000, P_BI_TCXO, 1, 0, 0),
  403. F(37500000, P_CAMCC_PLL0_OUT_EVEN, 16, 0, 0),
  404. { }
  405. };
  406. static struct clk_rcg2 camcc_cci_0_clk_src = {
  407. .cmd_rcgr = 0xc0c4,
  408. .mnd_width = 8,
  409. .hid_width = 5,
  410. .parent_map = camcc_parent_map_0,
  411. .freq_tbl = ftbl_camcc_cci_0_clk_src,
  412. .clkr.hw.init = &(const struct clk_init_data) {
  413. .name = "camcc_cci_0_clk_src",
  414. .parent_data = camcc_parent_data_0,
  415. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  416. .ops = &clk_rcg2_ops,
  417. },
  418. };
  419. static struct clk_rcg2 camcc_cci_1_clk_src = {
  420. .cmd_rcgr = 0xc0e0,
  421. .mnd_width = 8,
  422. .hid_width = 5,
  423. .parent_map = camcc_parent_map_0,
  424. .freq_tbl = ftbl_camcc_cci_0_clk_src,
  425. .clkr.hw.init = &(const struct clk_init_data) {
  426. .name = "camcc_cci_1_clk_src",
  427. .parent_data = camcc_parent_data_0,
  428. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  429. .ops = &clk_rcg2_ops,
  430. },
  431. };
  432. static const struct freq_tbl ftbl_camcc_cphy_rx_clk_src[] = {
  433. F(19200000, P_BI_TCXO, 1, 0, 0),
  434. F(300000000, P_CAMCC_PLL0_OUT_EVEN, 2, 0, 0),
  435. F(384000000, P_CAMCC_PLL2_OUT_EARLY, 2.5, 0, 0),
  436. F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),
  437. { }
  438. };
  439. static struct clk_rcg2 camcc_cphy_rx_clk_src = {
  440. .cmd_rcgr = 0xa064,
  441. .mnd_width = 0,
  442. .hid_width = 5,
  443. .parent_map = camcc_parent_map_1,
  444. .freq_tbl = ftbl_camcc_cphy_rx_clk_src,
  445. .clkr.hw.init = &(const struct clk_init_data) {
  446. .name = "camcc_cphy_rx_clk_src",
  447. .parent_data = camcc_parent_data_1,
  448. .num_parents = ARRAY_SIZE(camcc_parent_data_1),
  449. .ops = &clk_rcg2_ops,
  450. },
  451. };
  452. static const struct freq_tbl ftbl_camcc_csi0phytimer_clk_src[] = {
  453. F(19200000, P_BI_TCXO, 1, 0, 0),
  454. F(300000000, P_CAMCC_PLL0_OUT_EVEN, 2, 0, 0),
  455. { }
  456. };
  457. static struct clk_rcg2 camcc_csi0phytimer_clk_src = {
  458. .cmd_rcgr = 0x6004,
  459. .mnd_width = 0,
  460. .hid_width = 5,
  461. .parent_map = camcc_parent_map_0,
  462. .freq_tbl = ftbl_camcc_csi0phytimer_clk_src,
  463. .clkr.hw.init = &(const struct clk_init_data) {
  464. .name = "camcc_csi0phytimer_clk_src",
  465. .parent_data = camcc_parent_data_0,
  466. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  467. .ops = &clk_rcg2_ops,
  468. },
  469. };
  470. static struct clk_rcg2 camcc_csi1phytimer_clk_src = {
  471. .cmd_rcgr = 0x6028,
  472. .mnd_width = 0,
  473. .hid_width = 5,
  474. .parent_map = camcc_parent_map_0,
  475. .freq_tbl = ftbl_camcc_csi0phytimer_clk_src,
  476. .clkr.hw.init = &(const struct clk_init_data) {
  477. .name = "camcc_csi1phytimer_clk_src",
  478. .parent_data = camcc_parent_data_0,
  479. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  480. .ops = &clk_rcg2_ops,
  481. },
  482. };
  483. static struct clk_rcg2 camcc_csi2phytimer_clk_src = {
  484. .cmd_rcgr = 0x604c,
  485. .mnd_width = 0,
  486. .hid_width = 5,
  487. .parent_map = camcc_parent_map_0,
  488. .freq_tbl = ftbl_camcc_csi0phytimer_clk_src,
  489. .clkr.hw.init = &(const struct clk_init_data) {
  490. .name = "camcc_csi2phytimer_clk_src",
  491. .parent_data = camcc_parent_data_0,
  492. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  493. .ops = &clk_rcg2_ops,
  494. },
  495. };
  496. static struct clk_rcg2 camcc_csi3phytimer_clk_src = {
  497. .cmd_rcgr = 0x6070,
  498. .mnd_width = 0,
  499. .hid_width = 5,
  500. .parent_map = camcc_parent_map_0,
  501. .freq_tbl = ftbl_camcc_csi0phytimer_clk_src,
  502. .clkr.hw.init = &(const struct clk_init_data) {
  503. .name = "camcc_csi3phytimer_clk_src",
  504. .parent_data = camcc_parent_data_0,
  505. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  506. .ops = &clk_rcg2_ops,
  507. },
  508. };
  509. static const struct freq_tbl ftbl_camcc_fast_ahb_clk_src[] = {
  510. F(19200000, P_BI_TCXO, 1, 0, 0),
  511. F(50000000, P_CAMCC_PLL0_OUT_EVEN, 12, 0, 0),
  512. F(100000000, P_CAMCC_PLL0_OUT_EVEN, 6, 0, 0),
  513. F(200000000, P_CAMCC_PLL0_OUT_EVEN, 3, 0, 0),
  514. F(300000000, P_CAMCC_PLL0_OUT_MAIN, 4, 0, 0),
  515. F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),
  516. { }
  517. };
  518. static struct clk_rcg2 camcc_fast_ahb_clk_src = {
  519. .cmd_rcgr = 0x703c,
  520. .mnd_width = 0,
  521. .hid_width = 5,
  522. .parent_map = camcc_parent_map_0,
  523. .freq_tbl = ftbl_camcc_fast_ahb_clk_src,
  524. .clkr.hw.init = &(const struct clk_init_data) {
  525. .name = "camcc_fast_ahb_clk_src",
  526. .parent_data = camcc_parent_data_0,
  527. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  528. .ops = &clk_rcg2_ops,
  529. },
  530. };
  531. static const struct freq_tbl ftbl_camcc_fd_core_clk_src[] = {
  532. F(19200000, P_BI_TCXO, 1, 0, 0),
  533. F(380000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0),
  534. F(384000000, P_CAMCC_PLL2_OUT_EARLY, 2.5, 0, 0),
  535. F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),
  536. F(480000000, P_CAMCC_PLL2_OUT_EARLY, 2, 0, 0),
  537. F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
  538. { }
  539. };
  540. static struct clk_rcg2 camcc_fd_core_clk_src = {
  541. .cmd_rcgr = 0xc09c,
  542. .mnd_width = 0,
  543. .hid_width = 5,
  544. .parent_map = camcc_parent_map_3,
  545. .freq_tbl = ftbl_camcc_fd_core_clk_src,
  546. .clkr.hw.init = &(const struct clk_init_data) {
  547. .name = "camcc_fd_core_clk_src",
  548. .parent_data = camcc_parent_data_3,
  549. .num_parents = ARRAY_SIZE(camcc_parent_data_3),
  550. .flags = CLK_SET_RATE_PARENT,
  551. .ops = &clk_rcg2_shared_ops,
  552. },
  553. };
  554. static const struct freq_tbl ftbl_camcc_icp_clk_src[] = {
  555. F(19200000, P_BI_TCXO, 1, 0, 0),
  556. F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),
  557. F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
  558. { }
  559. };
  560. static struct clk_rcg2 camcc_icp_clk_src = {
  561. .cmd_rcgr = 0xc074,
  562. .mnd_width = 0,
  563. .hid_width = 5,
  564. .parent_map = camcc_parent_map_0,
  565. .freq_tbl = ftbl_camcc_icp_clk_src,
  566. .clkr.hw.init = &(const struct clk_init_data) {
  567. .name = "camcc_icp_clk_src",
  568. .parent_data = camcc_parent_data_0,
  569. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  570. .ops = &clk_rcg2_shared_ops,
  571. },
  572. };
  573. static const struct freq_tbl ftbl_camcc_ife_0_clk_src[] = {
  574. F(19200000, P_BI_TCXO, 1, 0, 0),
  575. F(380000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0),
  576. F(510000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0),
  577. F(637000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0),
  578. F(760000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0),
  579. { }
  580. };
  581. static struct clk_rcg2 camcc_ife_0_clk_src = {
  582. .cmd_rcgr = 0xa010,
  583. .mnd_width = 0,
  584. .hid_width = 5,
  585. .parent_map = camcc_parent_map_4,
  586. .freq_tbl = ftbl_camcc_ife_0_clk_src,
  587. .clkr.hw.init = &(const struct clk_init_data) {
  588. .name = "camcc_ife_0_clk_src",
  589. .parent_data = camcc_parent_data_4,
  590. .num_parents = ARRAY_SIZE(camcc_parent_data_4),
  591. .flags = CLK_SET_RATE_PARENT,
  592. .ops = &clk_rcg2_shared_ops,
  593. },
  594. };
  595. static const struct freq_tbl ftbl_camcc_ife_0_csid_clk_src[] = {
  596. F(19200000, P_BI_TCXO, 1, 0, 0),
  597. F(75000000, P_CAMCC_PLL0_OUT_EVEN, 8, 0, 0),
  598. F(300000000, P_CAMCC_PLL0_OUT_EVEN, 2, 0, 0),
  599. F(384000000, P_CAMCC_PLL2_OUT_EARLY, 2.5, 0, 0),
  600. F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),
  601. { }
  602. };
  603. static struct clk_rcg2 camcc_ife_0_csid_clk_src = {
  604. .cmd_rcgr = 0xa03c,
  605. .mnd_width = 0,
  606. .hid_width = 5,
  607. .parent_map = camcc_parent_map_1,
  608. .freq_tbl = ftbl_camcc_ife_0_csid_clk_src,
  609. .clkr.hw.init = &(const struct clk_init_data) {
  610. .name = "camcc_ife_0_csid_clk_src",
  611. .parent_data = camcc_parent_data_1,
  612. .num_parents = ARRAY_SIZE(camcc_parent_data_1),
  613. .ops = &clk_rcg2_shared_ops,
  614. },
  615. };
  616. static const struct freq_tbl ftbl_camcc_ife_1_clk_src[] = {
  617. F(19200000, P_BI_TCXO, 1, 0, 0),
  618. F(380000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0),
  619. F(510000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0),
  620. F(637000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0),
  621. F(760000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0),
  622. { }
  623. };
  624. static struct clk_rcg2 camcc_ife_1_clk_src = {
  625. .cmd_rcgr = 0xb010,
  626. .mnd_width = 0,
  627. .hid_width = 5,
  628. .parent_map = camcc_parent_map_5,
  629. .freq_tbl = ftbl_camcc_ife_1_clk_src,
  630. .clkr.hw.init = &(const struct clk_init_data) {
  631. .name = "camcc_ife_1_clk_src",
  632. .parent_data = camcc_parent_data_5,
  633. .num_parents = ARRAY_SIZE(camcc_parent_data_5),
  634. .flags = CLK_SET_RATE_PARENT,
  635. .ops = &clk_rcg2_shared_ops,
  636. },
  637. };
  638. static struct clk_rcg2 camcc_ife_1_csid_clk_src = {
  639. .cmd_rcgr = 0xb034,
  640. .mnd_width = 0,
  641. .hid_width = 5,
  642. .parent_map = camcc_parent_map_1,
  643. .freq_tbl = ftbl_camcc_ife_0_csid_clk_src,
  644. .clkr.hw.init = &(const struct clk_init_data) {
  645. .name = "camcc_ife_1_csid_clk_src",
  646. .parent_data = camcc_parent_data_1,
  647. .num_parents = ARRAY_SIZE(camcc_parent_data_1),
  648. .ops = &clk_rcg2_shared_ops,
  649. },
  650. };
  651. static const struct freq_tbl ftbl_camcc_ife_lite_clk_src[] = {
  652. F(19200000, P_BI_TCXO, 1, 0, 0),
  653. F(320000000, P_CAMCC_PLL2_OUT_MAIN, 1.5, 0, 0),
  654. F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),
  655. F(480000000, P_CAMCC_PLL2_OUT_MAIN, 1, 0, 0),
  656. F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
  657. { }
  658. };
  659. static struct clk_rcg2 camcc_ife_lite_clk_src = {
  660. .cmd_rcgr = 0xc004,
  661. .mnd_width = 0,
  662. .hid_width = 5,
  663. .parent_map = camcc_parent_map_0,
  664. .freq_tbl = ftbl_camcc_ife_lite_clk_src,
  665. .clkr.hw.init = &(const struct clk_init_data) {
  666. .name = "camcc_ife_lite_clk_src",
  667. .parent_data = camcc_parent_data_0,
  668. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  669. .ops = &clk_rcg2_ops,
  670. },
  671. };
  672. static struct clk_rcg2 camcc_ife_lite_csid_clk_src = {
  673. .cmd_rcgr = 0xc020,
  674. .mnd_width = 0,
  675. .hid_width = 5,
  676. .parent_map = camcc_parent_map_1,
  677. .freq_tbl = ftbl_camcc_cphy_rx_clk_src,
  678. .clkr.hw.init = &(const struct clk_init_data) {
  679. .name = "camcc_ife_lite_csid_clk_src",
  680. .parent_data = camcc_parent_data_1,
  681. .num_parents = ARRAY_SIZE(camcc_parent_data_1),
  682. .ops = &clk_rcg2_shared_ops,
  683. },
  684. };
  685. static const struct freq_tbl ftbl_camcc_ipe_0_clk_src[] = {
  686. F(19200000, P_BI_TCXO, 1, 0, 0),
  687. F(340000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),
  688. F(430000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),
  689. F(520000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),
  690. F(600000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),
  691. { }
  692. };
  693. static struct clk_rcg2 camcc_ipe_0_clk_src = {
  694. .cmd_rcgr = 0x8010,
  695. .mnd_width = 0,
  696. .hid_width = 5,
  697. .parent_map = camcc_parent_map_6,
  698. .freq_tbl = ftbl_camcc_ipe_0_clk_src,
  699. .clkr.hw.init = &(const struct clk_init_data) {
  700. .name = "camcc_ipe_0_clk_src",
  701. .parent_data = camcc_parent_data_6,
  702. .num_parents = ARRAY_SIZE(camcc_parent_data_6),
  703. .flags = CLK_SET_RATE_PARENT,
  704. .ops = &clk_rcg2_shared_ops,
  705. },
  706. };
  707. static struct clk_rcg2 camcc_jpeg_clk_src = {
  708. .cmd_rcgr = 0xc048,
  709. .mnd_width = 0,
  710. .hid_width = 5,
  711. .parent_map = camcc_parent_map_0,
  712. .freq_tbl = ftbl_camcc_bps_clk_src,
  713. .clkr.hw.init = &(const struct clk_init_data) {
  714. .name = "camcc_jpeg_clk_src",
  715. .parent_data = camcc_parent_data_0,
  716. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  717. .ops = &clk_rcg2_shared_ops,
  718. },
  719. };
  720. static const struct freq_tbl ftbl_camcc_lrme_clk_src[] = {
  721. F(19200000, P_BI_TCXO, 1, 0, 0),
  722. F(100000000, P_CAMCC_PLL0_OUT_EVEN, 6, 0, 0),
  723. F(240000000, P_CAMCC_PLL2_OUT_MAIN, 2, 0, 0),
  724. F(300000000, P_CAMCC_PLL0_OUT_EVEN, 2, 0, 0),
  725. F(320000000, P_CAMCC_PLL2_OUT_MAIN, 1.5, 0, 0),
  726. F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),
  727. { }
  728. };
  729. static struct clk_rcg2 camcc_lrme_clk_src = {
  730. .cmd_rcgr = 0xc100,
  731. .mnd_width = 0,
  732. .hid_width = 5,
  733. .parent_map = camcc_parent_map_0,
  734. .freq_tbl = ftbl_camcc_lrme_clk_src,
  735. .clkr.hw.init = &(const struct clk_init_data) {
  736. .name = "camcc_lrme_clk_src",
  737. .parent_data = camcc_parent_data_0,
  738. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  739. .ops = &clk_rcg2_shared_ops,
  740. },
  741. };
  742. static const struct freq_tbl ftbl_camcc_mclk0_clk_src[] = {
  743. F(19200000, P_BI_TCXO_MX, 1, 0, 0),
  744. F(24000000, P_CAMCC_PLL2_OUT_AUX, 1, 1, 20),
  745. F(34285714, P_CAMCC_PLL2_OUT_AUX, 14, 0, 0),
  746. { }
  747. };
  748. static struct clk_rcg2 camcc_mclk0_clk_src = {
  749. .cmd_rcgr = 0x5004,
  750. .mnd_width = 8,
  751. .hid_width = 5,
  752. .parent_map = camcc_parent_map_2,
  753. .freq_tbl = ftbl_camcc_mclk0_clk_src,
  754. .clkr.hw.init = &(const struct clk_init_data) {
  755. .name = "camcc_mclk0_clk_src",
  756. .parent_data = camcc_parent_data_2,
  757. .num_parents = ARRAY_SIZE(camcc_parent_data_2),
  758. .ops = &clk_rcg2_ops,
  759. },
  760. };
  761. static struct clk_rcg2 camcc_mclk1_clk_src = {
  762. .cmd_rcgr = 0x5024,
  763. .mnd_width = 8,
  764. .hid_width = 5,
  765. .parent_map = camcc_parent_map_2,
  766. .freq_tbl = ftbl_camcc_mclk0_clk_src,
  767. .clkr.hw.init = &(const struct clk_init_data) {
  768. .name = "camcc_mclk1_clk_src",
  769. .parent_data = camcc_parent_data_2,
  770. .num_parents = ARRAY_SIZE(camcc_parent_data_2),
  771. .ops = &clk_rcg2_ops,
  772. },
  773. };
  774. static struct clk_rcg2 camcc_mclk2_clk_src = {
  775. .cmd_rcgr = 0x5044,
  776. .mnd_width = 8,
  777. .hid_width = 5,
  778. .parent_map = camcc_parent_map_2,
  779. .freq_tbl = ftbl_camcc_mclk0_clk_src,
  780. .clkr.hw.init = &(const struct clk_init_data) {
  781. .name = "camcc_mclk2_clk_src",
  782. .parent_data = camcc_parent_data_2,
  783. .num_parents = ARRAY_SIZE(camcc_parent_data_2),
  784. .ops = &clk_rcg2_ops,
  785. },
  786. };
  787. static struct clk_rcg2 camcc_mclk3_clk_src = {
  788. .cmd_rcgr = 0x5064,
  789. .mnd_width = 8,
  790. .hid_width = 5,
  791. .parent_map = camcc_parent_map_2,
  792. .freq_tbl = ftbl_camcc_mclk0_clk_src,
  793. .clkr.hw.init = &(const struct clk_init_data) {
  794. .name = "camcc_mclk3_clk_src",
  795. .parent_data = camcc_parent_data_2,
  796. .num_parents = ARRAY_SIZE(camcc_parent_data_2),
  797. .ops = &clk_rcg2_ops,
  798. },
  799. };
  800. static const struct freq_tbl ftbl_camcc_sleep_clk_src[] = {
  801. F(32000, P_CHIP_SLEEP_CLK, 1, 0, 0),
  802. { }
  803. };
  804. static struct clk_rcg2 camcc_sleep_clk_src = {
  805. .cmd_rcgr = 0xc1a4,
  806. .mnd_width = 0,
  807. .hid_width = 5,
  808. .parent_map = camcc_parent_map_7,
  809. .freq_tbl = ftbl_camcc_sleep_clk_src,
  810. .clkr.hw.init = &(const struct clk_init_data) {
  811. .name = "camcc_sleep_clk_src",
  812. .parent_data = camcc_parent_data_7,
  813. .num_parents = ARRAY_SIZE(camcc_parent_data_7),
  814. .ops = &clk_rcg2_ops,
  815. },
  816. };
  817. static const struct freq_tbl ftbl_camcc_slow_ahb_clk_src[] = {
  818. F(19200000, P_BI_TCXO, 1, 0, 0),
  819. F(80000000, P_CAMCC_PLL0_OUT_ODD, 5, 0, 0),
  820. { }
  821. };
  822. static struct clk_rcg2 camcc_slow_ahb_clk_src = {
  823. .cmd_rcgr = 0x7058,
  824. .mnd_width = 0,
  825. .hid_width = 5,
  826. .parent_map = camcc_parent_map_8,
  827. .freq_tbl = ftbl_camcc_slow_ahb_clk_src,
  828. .clkr.hw.init = &(const struct clk_init_data) {
  829. .name = "camcc_slow_ahb_clk_src",
  830. .parent_data = camcc_parent_data_8,
  831. .num_parents = ARRAY_SIZE(camcc_parent_data_8),
  832. .ops = &clk_rcg2_shared_ops,
  833. },
  834. };
  835. static const struct freq_tbl ftbl_camcc_xo_clk_src[] = {
  836. F(19200000, P_BI_TCXO, 1, 0, 0),
  837. { }
  838. };
  839. static struct clk_rcg2 camcc_xo_clk_src = {
  840. .cmd_rcgr = 0xc188,
  841. .mnd_width = 0,
  842. .hid_width = 5,
  843. .parent_map = camcc_parent_map_9,
  844. .freq_tbl = ftbl_camcc_xo_clk_src,
  845. .clkr.hw.init = &(const struct clk_init_data) {
  846. .name = "camcc_xo_clk_src",
  847. .parent_data = camcc_parent_data_9,
  848. .num_parents = ARRAY_SIZE(camcc_parent_data_9),
  849. .ops = &clk_rcg2_ops,
  850. },
  851. };
  852. static struct clk_branch camcc_bps_ahb_clk = {
  853. .halt_reg = 0x7070,
  854. .halt_check = BRANCH_HALT,
  855. .clkr = {
  856. .enable_reg = 0x7070,
  857. .enable_mask = BIT(0),
  858. .hw.init = &(const struct clk_init_data) {
  859. .name = "camcc_bps_ahb_clk",
  860. .parent_hws = (const struct clk_hw*[]) {
  861. &camcc_slow_ahb_clk_src.clkr.hw,
  862. },
  863. .num_parents = 1,
  864. .flags = CLK_SET_RATE_PARENT,
  865. .ops = &clk_branch2_ops,
  866. },
  867. },
  868. };
  869. static struct clk_branch camcc_bps_areg_clk = {
  870. .halt_reg = 0x7054,
  871. .halt_check = BRANCH_HALT,
  872. .clkr = {
  873. .enable_reg = 0x7054,
  874. .enable_mask = BIT(0),
  875. .hw.init = &(const struct clk_init_data) {
  876. .name = "camcc_bps_areg_clk",
  877. .parent_hws = (const struct clk_hw*[]) {
  878. &camcc_fast_ahb_clk_src.clkr.hw,
  879. },
  880. .num_parents = 1,
  881. .flags = CLK_SET_RATE_PARENT,
  882. .ops = &clk_branch2_ops,
  883. },
  884. },
  885. };
  886. static struct clk_branch camcc_bps_axi_clk = {
  887. .halt_reg = 0x7038,
  888. .halt_check = BRANCH_HALT,
  889. .clkr = {
  890. .enable_reg = 0x7038,
  891. .enable_mask = BIT(0),
  892. .hw.init = &(const struct clk_init_data) {
  893. .name = "camcc_bps_axi_clk",
  894. .parent_hws = (const struct clk_hw*[]) {
  895. &camcc_camnoc_axi_clk_src.clkr.hw,
  896. },
  897. .num_parents = 1,
  898. .flags = CLK_SET_RATE_PARENT,
  899. .ops = &clk_branch2_ops,
  900. },
  901. },
  902. };
  903. static struct clk_branch camcc_bps_clk = {
  904. .halt_reg = 0x7028,
  905. .halt_check = BRANCH_HALT,
  906. .clkr = {
  907. .enable_reg = 0x7028,
  908. .enable_mask = BIT(0),
  909. .hw.init = &(const struct clk_init_data) {
  910. .name = "camcc_bps_clk",
  911. .parent_hws = (const struct clk_hw*[]) {
  912. &camcc_bps_clk_src.clkr.hw,
  913. },
  914. .num_parents = 1,
  915. .flags = CLK_SET_RATE_PARENT,
  916. .ops = &clk_branch2_ops,
  917. },
  918. },
  919. };
  920. static struct clk_branch camcc_camnoc_axi_clk = {
  921. .halt_reg = 0xc148,
  922. .halt_check = BRANCH_HALT,
  923. .clkr = {
  924. .enable_reg = 0xc148,
  925. .enable_mask = BIT(0),
  926. .hw.init = &(const struct clk_init_data) {
  927. .name = "camcc_camnoc_axi_clk",
  928. .parent_hws = (const struct clk_hw*[]) {
  929. &camcc_camnoc_axi_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 camcc_camnoc_dcd_xo_clk = {
  938. .halt_reg = 0xc150,
  939. .halt_check = BRANCH_HALT,
  940. .clkr = {
  941. .enable_reg = 0xc150,
  942. .enable_mask = BIT(0),
  943. .hw.init = &(const struct clk_init_data) {
  944. .name = "camcc_camnoc_dcd_xo_clk",
  945. .parent_hws = (const struct clk_hw*[]) {
  946. &camcc_xo_clk_src.clkr.hw,
  947. },
  948. .num_parents = 1,
  949. .flags = CLK_SET_RATE_PARENT,
  950. .ops = &clk_branch2_ops,
  951. },
  952. },
  953. };
  954. static struct clk_branch camcc_cci_0_clk = {
  955. .halt_reg = 0xc0dc,
  956. .halt_check = BRANCH_HALT,
  957. .clkr = {
  958. .enable_reg = 0xc0dc,
  959. .enable_mask = BIT(0),
  960. .hw.init = &(const struct clk_init_data) {
  961. .name = "camcc_cci_0_clk",
  962. .parent_hws = (const struct clk_hw*[]) {
  963. &camcc_cci_0_clk_src.clkr.hw,
  964. },
  965. .num_parents = 1,
  966. .flags = CLK_SET_RATE_PARENT,
  967. .ops = &clk_branch2_ops,
  968. },
  969. },
  970. };
  971. static struct clk_branch camcc_cci_1_clk = {
  972. .halt_reg = 0xc0f8,
  973. .halt_check = BRANCH_HALT,
  974. .clkr = {
  975. .enable_reg = 0xc0f8,
  976. .enable_mask = BIT(0),
  977. .hw.init = &(const struct clk_init_data) {
  978. .name = "camcc_cci_1_clk",
  979. .parent_hws = (const struct clk_hw*[]) {
  980. &camcc_cci_1_clk_src.clkr.hw,
  981. },
  982. .num_parents = 1,
  983. .flags = CLK_SET_RATE_PARENT,
  984. .ops = &clk_branch2_ops,
  985. },
  986. },
  987. };
  988. static struct clk_branch camcc_core_ahb_clk = {
  989. .halt_reg = 0xc184,
  990. .halt_check = BRANCH_HALT_DELAY,
  991. .clkr = {
  992. .enable_reg = 0xc184,
  993. .enable_mask = BIT(0),
  994. .hw.init = &(const struct clk_init_data) {
  995. .name = "camcc_core_ahb_clk",
  996. .parent_hws = (const struct clk_hw*[]) {
  997. &camcc_slow_ahb_clk_src.clkr.hw,
  998. },
  999. .num_parents = 1,
  1000. .flags = CLK_SET_RATE_PARENT,
  1001. .ops = &clk_branch2_ops,
  1002. },
  1003. },
  1004. };
  1005. static struct clk_branch camcc_cpas_ahb_clk = {
  1006. .halt_reg = 0xc124,
  1007. .halt_check = BRANCH_HALT,
  1008. .clkr = {
  1009. .enable_reg = 0xc124,
  1010. .enable_mask = BIT(0),
  1011. .hw.init = &(const struct clk_init_data) {
  1012. .name = "camcc_cpas_ahb_clk",
  1013. .parent_hws = (const struct clk_hw*[]) {
  1014. &camcc_slow_ahb_clk_src.clkr.hw,
  1015. },
  1016. .num_parents = 1,
  1017. .flags = CLK_SET_RATE_PARENT,
  1018. .ops = &clk_branch2_ops,
  1019. },
  1020. },
  1021. };
  1022. static struct clk_branch camcc_csi0phytimer_clk = {
  1023. .halt_reg = 0x601c,
  1024. .halt_check = BRANCH_HALT,
  1025. .clkr = {
  1026. .enable_reg = 0x601c,
  1027. .enable_mask = BIT(0),
  1028. .hw.init = &(const struct clk_init_data) {
  1029. .name = "camcc_csi0phytimer_clk",
  1030. .parent_hws = (const struct clk_hw*[]) {
  1031. &camcc_csi0phytimer_clk_src.clkr.hw,
  1032. },
  1033. .num_parents = 1,
  1034. .flags = CLK_SET_RATE_PARENT,
  1035. .ops = &clk_branch2_ops,
  1036. },
  1037. },
  1038. };
  1039. static struct clk_branch camcc_csi1phytimer_clk = {
  1040. .halt_reg = 0x6040,
  1041. .halt_check = BRANCH_HALT,
  1042. .clkr = {
  1043. .enable_reg = 0x6040,
  1044. .enable_mask = BIT(0),
  1045. .hw.init = &(const struct clk_init_data) {
  1046. .name = "camcc_csi1phytimer_clk",
  1047. .parent_hws = (const struct clk_hw*[]) {
  1048. &camcc_csi1phytimer_clk_src.clkr.hw,
  1049. },
  1050. .num_parents = 1,
  1051. .flags = CLK_SET_RATE_PARENT,
  1052. .ops = &clk_branch2_ops,
  1053. },
  1054. },
  1055. };
  1056. static struct clk_branch camcc_csi2phytimer_clk = {
  1057. .halt_reg = 0x6064,
  1058. .halt_check = BRANCH_HALT,
  1059. .clkr = {
  1060. .enable_reg = 0x6064,
  1061. .enable_mask = BIT(0),
  1062. .hw.init = &(const struct clk_init_data) {
  1063. .name = "camcc_csi2phytimer_clk",
  1064. .parent_hws = (const struct clk_hw*[]) {
  1065. &camcc_csi2phytimer_clk_src.clkr.hw,
  1066. },
  1067. .num_parents = 1,
  1068. .flags = CLK_SET_RATE_PARENT,
  1069. .ops = &clk_branch2_ops,
  1070. },
  1071. },
  1072. };
  1073. static struct clk_branch camcc_csi3phytimer_clk = {
  1074. .halt_reg = 0x6088,
  1075. .halt_check = BRANCH_HALT,
  1076. .clkr = {
  1077. .enable_reg = 0x6088,
  1078. .enable_mask = BIT(0),
  1079. .hw.init = &(const struct clk_init_data) {
  1080. .name = "camcc_csi3phytimer_clk",
  1081. .parent_hws = (const struct clk_hw*[]) {
  1082. &camcc_csi3phytimer_clk_src.clkr.hw,
  1083. },
  1084. .num_parents = 1,
  1085. .flags = CLK_SET_RATE_PARENT,
  1086. .ops = &clk_branch2_ops,
  1087. },
  1088. },
  1089. };
  1090. static struct clk_branch camcc_csiphy0_clk = {
  1091. .halt_reg = 0x6020,
  1092. .halt_check = BRANCH_HALT,
  1093. .clkr = {
  1094. .enable_reg = 0x6020,
  1095. .enable_mask = BIT(0),
  1096. .hw.init = &(const struct clk_init_data) {
  1097. .name = "camcc_csiphy0_clk",
  1098. .parent_hws = (const struct clk_hw*[]) {
  1099. &camcc_cphy_rx_clk_src.clkr.hw,
  1100. },
  1101. .num_parents = 1,
  1102. .flags = CLK_SET_RATE_PARENT,
  1103. .ops = &clk_branch2_ops,
  1104. },
  1105. },
  1106. };
  1107. static struct clk_branch camcc_csiphy1_clk = {
  1108. .halt_reg = 0x6044,
  1109. .halt_check = BRANCH_HALT,
  1110. .clkr = {
  1111. .enable_reg = 0x6044,
  1112. .enable_mask = BIT(0),
  1113. .hw.init = &(const struct clk_init_data) {
  1114. .name = "camcc_csiphy1_clk",
  1115. .parent_hws = (const struct clk_hw*[]) {
  1116. &camcc_cphy_rx_clk_src.clkr.hw,
  1117. },
  1118. .num_parents = 1,
  1119. .flags = CLK_SET_RATE_PARENT,
  1120. .ops = &clk_branch2_ops,
  1121. },
  1122. },
  1123. };
  1124. static struct clk_branch camcc_csiphy2_clk = {
  1125. .halt_reg = 0x6068,
  1126. .halt_check = BRANCH_HALT,
  1127. .clkr = {
  1128. .enable_reg = 0x6068,
  1129. .enable_mask = BIT(0),
  1130. .hw.init = &(const struct clk_init_data) {
  1131. .name = "camcc_csiphy2_clk",
  1132. .parent_hws = (const struct clk_hw*[]) {
  1133. &camcc_cphy_rx_clk_src.clkr.hw,
  1134. },
  1135. .num_parents = 1,
  1136. .flags = CLK_SET_RATE_PARENT,
  1137. .ops = &clk_branch2_ops,
  1138. },
  1139. },
  1140. };
  1141. static struct clk_branch camcc_csiphy3_clk = {
  1142. .halt_reg = 0x608c,
  1143. .halt_check = BRANCH_HALT,
  1144. .clkr = {
  1145. .enable_reg = 0x608c,
  1146. .enable_mask = BIT(0),
  1147. .hw.init = &(const struct clk_init_data) {
  1148. .name = "camcc_csiphy3_clk",
  1149. .parent_hws = (const struct clk_hw*[]) {
  1150. &camcc_cphy_rx_clk_src.clkr.hw,
  1151. },
  1152. .num_parents = 1,
  1153. .flags = CLK_SET_RATE_PARENT,
  1154. .ops = &clk_branch2_ops,
  1155. },
  1156. },
  1157. };
  1158. static struct clk_branch camcc_fd_core_clk = {
  1159. .halt_reg = 0xc0b4,
  1160. .halt_check = BRANCH_HALT,
  1161. .clkr = {
  1162. .enable_reg = 0xc0b4,
  1163. .enable_mask = BIT(0),
  1164. .hw.init = &(const struct clk_init_data) {
  1165. .name = "camcc_fd_core_clk",
  1166. .parent_hws = (const struct clk_hw*[]) {
  1167. &camcc_fd_core_clk_src.clkr.hw,
  1168. },
  1169. .num_parents = 1,
  1170. .flags = CLK_SET_RATE_PARENT,
  1171. .ops = &clk_branch2_ops,
  1172. },
  1173. },
  1174. };
  1175. static struct clk_branch camcc_fd_core_uar_clk = {
  1176. .halt_reg = 0xc0bc,
  1177. .halt_check = BRANCH_HALT,
  1178. .clkr = {
  1179. .enable_reg = 0xc0bc,
  1180. .enable_mask = BIT(0),
  1181. .hw.init = &(const struct clk_init_data) {
  1182. .name = "camcc_fd_core_uar_clk",
  1183. .parent_hws = (const struct clk_hw*[]) {
  1184. &camcc_fd_core_clk_src.clkr.hw,
  1185. },
  1186. .num_parents = 1,
  1187. .flags = CLK_SET_RATE_PARENT,
  1188. .ops = &clk_branch2_ops,
  1189. },
  1190. },
  1191. };
  1192. static struct clk_branch camcc_icp_ahb_clk = {
  1193. .halt_reg = 0xc094,
  1194. .halt_check = BRANCH_HALT,
  1195. .clkr = {
  1196. .enable_reg = 0xc094,
  1197. .enable_mask = BIT(0),
  1198. .hw.init = &(const struct clk_init_data) {
  1199. .name = "camcc_icp_ahb_clk",
  1200. .parent_hws = (const struct clk_hw*[]) {
  1201. &camcc_slow_ahb_clk_src.clkr.hw,
  1202. },
  1203. .num_parents = 1,
  1204. .flags = CLK_SET_RATE_PARENT,
  1205. .ops = &clk_branch2_ops,
  1206. },
  1207. },
  1208. };
  1209. static struct clk_branch camcc_icp_clk = {
  1210. .halt_reg = 0xc08c,
  1211. .halt_check = BRANCH_HALT,
  1212. .clkr = {
  1213. .enable_reg = 0xc08c,
  1214. .enable_mask = BIT(0),
  1215. .hw.init = &(const struct clk_init_data) {
  1216. .name = "camcc_icp_clk",
  1217. .parent_hws = (const struct clk_hw*[]) {
  1218. &camcc_icp_clk_src.clkr.hw,
  1219. },
  1220. .num_parents = 1,
  1221. .flags = CLK_SET_RATE_PARENT,
  1222. .ops = &clk_branch2_ops,
  1223. },
  1224. },
  1225. };
  1226. static struct clk_branch camcc_ife_0_axi_clk = {
  1227. .halt_reg = 0xa080,
  1228. .halt_check = BRANCH_HALT,
  1229. .clkr = {
  1230. .enable_reg = 0xa080,
  1231. .enable_mask = BIT(0),
  1232. .hw.init = &(const struct clk_init_data) {
  1233. .name = "camcc_ife_0_axi_clk",
  1234. .parent_hws = (const struct clk_hw*[]) {
  1235. &camcc_camnoc_axi_clk_src.clkr.hw,
  1236. },
  1237. .num_parents = 1,
  1238. .flags = CLK_SET_RATE_PARENT,
  1239. .ops = &clk_branch2_ops,
  1240. },
  1241. },
  1242. };
  1243. static struct clk_branch camcc_ife_0_clk = {
  1244. .halt_reg = 0xa028,
  1245. .halt_check = BRANCH_HALT,
  1246. .clkr = {
  1247. .enable_reg = 0xa028,
  1248. .enable_mask = BIT(0),
  1249. .hw.init = &(const struct clk_init_data) {
  1250. .name = "camcc_ife_0_clk",
  1251. .parent_hws = (const struct clk_hw*[]) {
  1252. &camcc_ife_0_clk_src.clkr.hw,
  1253. },
  1254. .num_parents = 1,
  1255. .flags = CLK_SET_RATE_PARENT,
  1256. .ops = &clk_branch2_ops,
  1257. },
  1258. },
  1259. };
  1260. static struct clk_branch camcc_ife_0_cphy_rx_clk = {
  1261. .halt_reg = 0xa07c,
  1262. .halt_check = BRANCH_HALT,
  1263. .clkr = {
  1264. .enable_reg = 0xa07c,
  1265. .enable_mask = BIT(0),
  1266. .hw.init = &(const struct clk_init_data) {
  1267. .name = "camcc_ife_0_cphy_rx_clk",
  1268. .parent_hws = (const struct clk_hw*[]) {
  1269. &camcc_cphy_rx_clk_src.clkr.hw,
  1270. },
  1271. .num_parents = 1,
  1272. .flags = CLK_SET_RATE_PARENT,
  1273. .ops = &clk_branch2_ops,
  1274. },
  1275. },
  1276. };
  1277. static struct clk_branch camcc_ife_0_csid_clk = {
  1278. .halt_reg = 0xa054,
  1279. .halt_check = BRANCH_HALT,
  1280. .clkr = {
  1281. .enable_reg = 0xa054,
  1282. .enable_mask = BIT(0),
  1283. .hw.init = &(const struct clk_init_data) {
  1284. .name = "camcc_ife_0_csid_clk",
  1285. .parent_hws = (const struct clk_hw*[]) {
  1286. &camcc_ife_0_csid_clk_src.clkr.hw,
  1287. },
  1288. .num_parents = 1,
  1289. .flags = CLK_SET_RATE_PARENT,
  1290. .ops = &clk_branch2_ops,
  1291. },
  1292. },
  1293. };
  1294. static struct clk_branch camcc_ife_0_dsp_clk = {
  1295. .halt_reg = 0xa038,
  1296. .halt_check = BRANCH_HALT,
  1297. .clkr = {
  1298. .enable_reg = 0xa038,
  1299. .enable_mask = BIT(0),
  1300. .hw.init = &(const struct clk_init_data) {
  1301. .name = "camcc_ife_0_dsp_clk",
  1302. .parent_hws = (const struct clk_hw*[]) {
  1303. &camcc_ife_0_clk_src.clkr.hw,
  1304. },
  1305. .num_parents = 1,
  1306. .flags = CLK_SET_RATE_PARENT,
  1307. .ops = &clk_branch2_ops,
  1308. },
  1309. },
  1310. };
  1311. static struct clk_branch camcc_ife_1_axi_clk = {
  1312. .halt_reg = 0xb058,
  1313. .halt_check = BRANCH_HALT,
  1314. .clkr = {
  1315. .enable_reg = 0xb058,
  1316. .enable_mask = BIT(0),
  1317. .hw.init = &(const struct clk_init_data) {
  1318. .name = "camcc_ife_1_axi_clk",
  1319. .parent_hws = (const struct clk_hw*[]) {
  1320. &camcc_camnoc_axi_clk_src.clkr.hw,
  1321. },
  1322. .num_parents = 1,
  1323. .flags = CLK_SET_RATE_PARENT,
  1324. .ops = &clk_branch2_ops,
  1325. },
  1326. },
  1327. };
  1328. static struct clk_branch camcc_ife_1_clk = {
  1329. .halt_reg = 0xb028,
  1330. .halt_check = BRANCH_HALT,
  1331. .clkr = {
  1332. .enable_reg = 0xb028,
  1333. .enable_mask = BIT(0),
  1334. .hw.init = &(const struct clk_init_data) {
  1335. .name = "camcc_ife_1_clk",
  1336. .parent_hws = (const struct clk_hw*[]) {
  1337. &camcc_ife_1_clk_src.clkr.hw,
  1338. },
  1339. .num_parents = 1,
  1340. .flags = CLK_SET_RATE_PARENT,
  1341. .ops = &clk_branch2_ops,
  1342. },
  1343. },
  1344. };
  1345. static struct clk_branch camcc_ife_1_cphy_rx_clk = {
  1346. .halt_reg = 0xb054,
  1347. .halt_check = BRANCH_HALT,
  1348. .clkr = {
  1349. .enable_reg = 0xb054,
  1350. .enable_mask = BIT(0),
  1351. .hw.init = &(const struct clk_init_data) {
  1352. .name = "camcc_ife_1_cphy_rx_clk",
  1353. .parent_hws = (const struct clk_hw*[]) {
  1354. &camcc_cphy_rx_clk_src.clkr.hw,
  1355. },
  1356. .num_parents = 1,
  1357. .flags = CLK_SET_RATE_PARENT,
  1358. .ops = &clk_branch2_ops,
  1359. },
  1360. },
  1361. };
  1362. static struct clk_branch camcc_ife_1_csid_clk = {
  1363. .halt_reg = 0xb04c,
  1364. .halt_check = BRANCH_HALT,
  1365. .clkr = {
  1366. .enable_reg = 0xb04c,
  1367. .enable_mask = BIT(0),
  1368. .hw.init = &(const struct clk_init_data) {
  1369. .name = "camcc_ife_1_csid_clk",
  1370. .parent_hws = (const struct clk_hw*[]) {
  1371. &camcc_ife_1_csid_clk_src.clkr.hw,
  1372. },
  1373. .num_parents = 1,
  1374. .flags = CLK_SET_RATE_PARENT,
  1375. .ops = &clk_branch2_ops,
  1376. },
  1377. },
  1378. };
  1379. static struct clk_branch camcc_ife_1_dsp_clk = {
  1380. .halt_reg = 0xb030,
  1381. .halt_check = BRANCH_HALT,
  1382. .clkr = {
  1383. .enable_reg = 0xb030,
  1384. .enable_mask = BIT(0),
  1385. .hw.init = &(const struct clk_init_data) {
  1386. .name = "camcc_ife_1_dsp_clk",
  1387. .parent_hws = (const struct clk_hw*[]) {
  1388. &camcc_ife_1_clk_src.clkr.hw,
  1389. },
  1390. .num_parents = 1,
  1391. .flags = CLK_SET_RATE_PARENT,
  1392. .ops = &clk_branch2_ops,
  1393. },
  1394. },
  1395. };
  1396. static struct clk_branch camcc_ife_lite_clk = {
  1397. .halt_reg = 0xc01c,
  1398. .halt_check = BRANCH_HALT,
  1399. .clkr = {
  1400. .enable_reg = 0xc01c,
  1401. .enable_mask = BIT(0),
  1402. .hw.init = &(const struct clk_init_data) {
  1403. .name = "camcc_ife_lite_clk",
  1404. .parent_hws = (const struct clk_hw*[]) {
  1405. &camcc_ife_lite_clk_src.clkr.hw,
  1406. },
  1407. .num_parents = 1,
  1408. .flags = CLK_SET_RATE_PARENT,
  1409. .ops = &clk_branch2_ops,
  1410. },
  1411. },
  1412. };
  1413. static struct clk_branch camcc_ife_lite_cphy_rx_clk = {
  1414. .halt_reg = 0xc040,
  1415. .halt_check = BRANCH_HALT,
  1416. .clkr = {
  1417. .enable_reg = 0xc040,
  1418. .enable_mask = BIT(0),
  1419. .hw.init = &(const struct clk_init_data) {
  1420. .name = "camcc_ife_lite_cphy_rx_clk",
  1421. .parent_hws = (const struct clk_hw*[]) {
  1422. &camcc_cphy_rx_clk_src.clkr.hw,
  1423. },
  1424. .num_parents = 1,
  1425. .flags = CLK_SET_RATE_PARENT,
  1426. .ops = &clk_branch2_ops,
  1427. },
  1428. },
  1429. };
  1430. static struct clk_branch camcc_ife_lite_csid_clk = {
  1431. .halt_reg = 0xc038,
  1432. .halt_check = BRANCH_HALT,
  1433. .clkr = {
  1434. .enable_reg = 0xc038,
  1435. .enable_mask = BIT(0),
  1436. .hw.init = &(const struct clk_init_data) {
  1437. .name = "camcc_ife_lite_csid_clk",
  1438. .parent_hws = (const struct clk_hw*[]) {
  1439. &camcc_ife_lite_csid_clk_src.clkr.hw,
  1440. },
  1441. .num_parents = 1,
  1442. .flags = CLK_SET_RATE_PARENT,
  1443. .ops = &clk_branch2_ops,
  1444. },
  1445. },
  1446. };
  1447. static struct clk_branch camcc_ipe_0_ahb_clk = {
  1448. .halt_reg = 0x8040,
  1449. .halt_check = BRANCH_HALT,
  1450. .clkr = {
  1451. .enable_reg = 0x8040,
  1452. .enable_mask = BIT(0),
  1453. .hw.init = &(const struct clk_init_data) {
  1454. .name = "camcc_ipe_0_ahb_clk",
  1455. .parent_hws = (const struct clk_hw*[]) {
  1456. &camcc_slow_ahb_clk_src.clkr.hw,
  1457. },
  1458. .num_parents = 1,
  1459. .flags = CLK_SET_RATE_PARENT,
  1460. .ops = &clk_branch2_ops,
  1461. },
  1462. },
  1463. };
  1464. static struct clk_branch camcc_ipe_0_areg_clk = {
  1465. .halt_reg = 0x803c,
  1466. .halt_check = BRANCH_HALT,
  1467. .clkr = {
  1468. .enable_reg = 0x803c,
  1469. .enable_mask = BIT(0),
  1470. .hw.init = &(const struct clk_init_data) {
  1471. .name = "camcc_ipe_0_areg_clk",
  1472. .parent_hws = (const struct clk_hw*[]) {
  1473. &camcc_fast_ahb_clk_src.clkr.hw,
  1474. },
  1475. .num_parents = 1,
  1476. .flags = CLK_SET_RATE_PARENT,
  1477. .ops = &clk_branch2_ops,
  1478. },
  1479. },
  1480. };
  1481. static struct clk_branch camcc_ipe_0_axi_clk = {
  1482. .halt_reg = 0x8038,
  1483. .halt_check = BRANCH_HALT,
  1484. .clkr = {
  1485. .enable_reg = 0x8038,
  1486. .enable_mask = BIT(0),
  1487. .hw.init = &(const struct clk_init_data) {
  1488. .name = "camcc_ipe_0_axi_clk",
  1489. .parent_hws = (const struct clk_hw*[]) {
  1490. &camcc_camnoc_axi_clk_src.clkr.hw,
  1491. },
  1492. .num_parents = 1,
  1493. .flags = CLK_SET_RATE_PARENT,
  1494. .ops = &clk_branch2_ops,
  1495. },
  1496. },
  1497. };
  1498. static struct clk_branch camcc_ipe_0_clk = {
  1499. .halt_reg = 0x8028,
  1500. .halt_check = BRANCH_HALT,
  1501. .clkr = {
  1502. .enable_reg = 0x8028,
  1503. .enable_mask = BIT(0),
  1504. .hw.init = &(const struct clk_init_data) {
  1505. .name = "camcc_ipe_0_clk",
  1506. .parent_hws = (const struct clk_hw*[]) {
  1507. &camcc_ipe_0_clk_src.clkr.hw,
  1508. },
  1509. .num_parents = 1,
  1510. .flags = CLK_SET_RATE_PARENT,
  1511. .ops = &clk_branch2_ops,
  1512. },
  1513. },
  1514. };
  1515. static struct clk_branch camcc_ipe_1_ahb_clk = {
  1516. .halt_reg = 0x9028,
  1517. .halt_check = BRANCH_HALT,
  1518. .clkr = {
  1519. .enable_reg = 0x9028,
  1520. .enable_mask = BIT(0),
  1521. .hw.init = &(const struct clk_init_data) {
  1522. .name = "camcc_ipe_1_ahb_clk",
  1523. .parent_hws = (const struct clk_hw*[]) {
  1524. &camcc_slow_ahb_clk_src.clkr.hw,
  1525. },
  1526. .num_parents = 1,
  1527. .flags = CLK_SET_RATE_PARENT,
  1528. .ops = &clk_branch2_ops,
  1529. },
  1530. },
  1531. };
  1532. static struct clk_branch camcc_ipe_1_areg_clk = {
  1533. .halt_reg = 0x9024,
  1534. .halt_check = BRANCH_HALT,
  1535. .clkr = {
  1536. .enable_reg = 0x9024,
  1537. .enable_mask = BIT(0),
  1538. .hw.init = &(const struct clk_init_data) {
  1539. .name = "camcc_ipe_1_areg_clk",
  1540. .parent_hws = (const struct clk_hw*[]) {
  1541. &camcc_fast_ahb_clk_src.clkr.hw,
  1542. },
  1543. .num_parents = 1,
  1544. .flags = CLK_SET_RATE_PARENT,
  1545. .ops = &clk_branch2_ops,
  1546. },
  1547. },
  1548. };
  1549. static struct clk_branch camcc_ipe_1_axi_clk = {
  1550. .halt_reg = 0x9020,
  1551. .halt_check = BRANCH_HALT,
  1552. .clkr = {
  1553. .enable_reg = 0x9020,
  1554. .enable_mask = BIT(0),
  1555. .hw.init = &(const struct clk_init_data) {
  1556. .name = "camcc_ipe_1_axi_clk",
  1557. .parent_hws = (const struct clk_hw*[]) {
  1558. &camcc_camnoc_axi_clk_src.clkr.hw,
  1559. },
  1560. .num_parents = 1,
  1561. .flags = CLK_SET_RATE_PARENT,
  1562. .ops = &clk_branch2_ops,
  1563. },
  1564. },
  1565. };
  1566. static struct clk_branch camcc_ipe_1_clk = {
  1567. .halt_reg = 0x9010,
  1568. .halt_check = BRANCH_HALT,
  1569. .clkr = {
  1570. .enable_reg = 0x9010,
  1571. .enable_mask = BIT(0),
  1572. .hw.init = &(const struct clk_init_data) {
  1573. .name = "camcc_ipe_1_clk",
  1574. .parent_hws = (const struct clk_hw*[]) {
  1575. &camcc_ipe_0_clk_src.clkr.hw,
  1576. },
  1577. .num_parents = 1,
  1578. .flags = CLK_SET_RATE_PARENT,
  1579. .ops = &clk_branch2_ops,
  1580. },
  1581. },
  1582. };
  1583. static struct clk_branch camcc_jpeg_clk = {
  1584. .halt_reg = 0xc060,
  1585. .halt_check = BRANCH_HALT,
  1586. .clkr = {
  1587. .enable_reg = 0xc060,
  1588. .enable_mask = BIT(0),
  1589. .hw.init = &(const struct clk_init_data) {
  1590. .name = "camcc_jpeg_clk",
  1591. .parent_hws = (const struct clk_hw*[]) {
  1592. &camcc_jpeg_clk_src.clkr.hw,
  1593. },
  1594. .num_parents = 1,
  1595. .flags = CLK_SET_RATE_PARENT,
  1596. .ops = &clk_branch2_ops,
  1597. },
  1598. },
  1599. };
  1600. static struct clk_branch camcc_lrme_clk = {
  1601. .halt_reg = 0xc118,
  1602. .halt_check = BRANCH_HALT,
  1603. .clkr = {
  1604. .enable_reg = 0xc118,
  1605. .enable_mask = BIT(0),
  1606. .hw.init = &(const struct clk_init_data) {
  1607. .name = "camcc_lrme_clk",
  1608. .parent_hws = (const struct clk_hw*[]) {
  1609. &camcc_lrme_clk_src.clkr.hw,
  1610. },
  1611. .num_parents = 1,
  1612. .flags = CLK_SET_RATE_PARENT,
  1613. .ops = &clk_branch2_ops,
  1614. },
  1615. },
  1616. };
  1617. static struct clk_branch camcc_mclk0_clk = {
  1618. .halt_reg = 0x501c,
  1619. .halt_check = BRANCH_HALT,
  1620. .clkr = {
  1621. .enable_reg = 0x501c,
  1622. .enable_mask = BIT(0),
  1623. .hw.init = &(const struct clk_init_data) {
  1624. .name = "camcc_mclk0_clk",
  1625. .parent_hws = (const struct clk_hw*[]) {
  1626. &camcc_mclk0_clk_src.clkr.hw,
  1627. },
  1628. .num_parents = 1,
  1629. .flags = CLK_SET_RATE_PARENT,
  1630. .ops = &clk_branch2_ops,
  1631. },
  1632. },
  1633. };
  1634. static struct clk_branch camcc_mclk1_clk = {
  1635. .halt_reg = 0x503c,
  1636. .halt_check = BRANCH_HALT,
  1637. .clkr = {
  1638. .enable_reg = 0x503c,
  1639. .enable_mask = BIT(0),
  1640. .hw.init = &(const struct clk_init_data) {
  1641. .name = "camcc_mclk1_clk",
  1642. .parent_hws = (const struct clk_hw*[]) {
  1643. &camcc_mclk1_clk_src.clkr.hw,
  1644. },
  1645. .num_parents = 1,
  1646. .flags = CLK_SET_RATE_PARENT,
  1647. .ops = &clk_branch2_ops,
  1648. },
  1649. },
  1650. };
  1651. static struct clk_branch camcc_mclk2_clk = {
  1652. .halt_reg = 0x505c,
  1653. .halt_check = BRANCH_HALT,
  1654. .clkr = {
  1655. .enable_reg = 0x505c,
  1656. .enable_mask = BIT(0),
  1657. .hw.init = &(const struct clk_init_data) {
  1658. .name = "camcc_mclk2_clk",
  1659. .parent_hws = (const struct clk_hw*[]) {
  1660. &camcc_mclk2_clk_src.clkr.hw,
  1661. },
  1662. .num_parents = 1,
  1663. .flags = CLK_SET_RATE_PARENT,
  1664. .ops = &clk_branch2_ops,
  1665. },
  1666. },
  1667. };
  1668. static struct clk_branch camcc_mclk3_clk = {
  1669. .halt_reg = 0x507c,
  1670. .halt_check = BRANCH_HALT,
  1671. .clkr = {
  1672. .enable_reg = 0x507c,
  1673. .enable_mask = BIT(0),
  1674. .hw.init = &(const struct clk_init_data) {
  1675. .name = "camcc_mclk3_clk",
  1676. .parent_hws = (const struct clk_hw*[]) {
  1677. &camcc_mclk3_clk_src.clkr.hw,
  1678. },
  1679. .num_parents = 1,
  1680. .flags = CLK_SET_RATE_PARENT,
  1681. .ops = &clk_branch2_ops,
  1682. },
  1683. },
  1684. };
  1685. static struct clk_branch camcc_sleep_clk = {
  1686. .halt_reg = 0xc1bc,
  1687. .halt_check = BRANCH_HALT,
  1688. .clkr = {
  1689. .enable_reg = 0xc1bc,
  1690. .enable_mask = BIT(0),
  1691. .hw.init = &(const struct clk_init_data) {
  1692. .name = "camcc_sleep_clk",
  1693. .parent_hws = (const struct clk_hw*[]) {
  1694. &camcc_sleep_clk_src.clkr.hw,
  1695. },
  1696. .num_parents = 1,
  1697. .flags = CLK_SET_RATE_PARENT,
  1698. .ops = &clk_branch2_ops,
  1699. },
  1700. },
  1701. };
  1702. static struct gdsc camcc_titan_top_gdsc;
  1703. static struct gdsc camcc_bps_gdsc = {
  1704. .gdscr = 0x7004,
  1705. .pd = {
  1706. .name = "camcc_bps_gdsc",
  1707. },
  1708. .flags = HW_CTRL | POLL_CFG_GDSCR,
  1709. .pwrsts = PWRSTS_OFF_ON,
  1710. };
  1711. static struct gdsc camcc_ife_0_gdsc = {
  1712. .gdscr = 0xa004,
  1713. .pd = {
  1714. .name = "camcc_ife_0_gdsc",
  1715. },
  1716. .flags = POLL_CFG_GDSCR,
  1717. .parent = &camcc_titan_top_gdsc.pd,
  1718. .pwrsts = PWRSTS_OFF_ON,
  1719. };
  1720. static struct gdsc camcc_ife_1_gdsc = {
  1721. .gdscr = 0xb004,
  1722. .pd = {
  1723. .name = "camcc_ife_1_gdsc",
  1724. },
  1725. .flags = POLL_CFG_GDSCR,
  1726. .parent = &camcc_titan_top_gdsc.pd,
  1727. .pwrsts = PWRSTS_OFF_ON,
  1728. };
  1729. static struct gdsc camcc_ipe_0_gdsc = {
  1730. .gdscr = 0x8004,
  1731. .pd = {
  1732. .name = "camcc_ipe_0_gdsc",
  1733. },
  1734. .flags = HW_CTRL | POLL_CFG_GDSCR,
  1735. .pwrsts = PWRSTS_OFF_ON,
  1736. };
  1737. static struct gdsc camcc_ipe_1_gdsc = {
  1738. .gdscr = 0x9004,
  1739. .pd = {
  1740. .name = "camcc_ipe_1_gdsc",
  1741. },
  1742. .flags = HW_CTRL | POLL_CFG_GDSCR,
  1743. .pwrsts = PWRSTS_OFF_ON,
  1744. };
  1745. static struct gdsc camcc_titan_top_gdsc = {
  1746. .gdscr = 0xc1c4,
  1747. .pd = {
  1748. .name = "camcc_titan_top_gdsc",
  1749. },
  1750. .flags = POLL_CFG_GDSCR,
  1751. .pwrsts = PWRSTS_OFF_ON,
  1752. };
  1753. struct clk_hw *camcc_sm7150_hws[] = {
  1754. [CAMCC_PLL0_OUT_EVEN] = &camcc_pll0_out_even.hw,
  1755. [CAMCC_PLL0_OUT_ODD] = &camcc_pll0_out_odd.hw,
  1756. [CAMCC_PLL1_OUT_EVEN] = &camcc_pll1_out_even.hw,
  1757. [CAMCC_PLL2_OUT_EARLY] = &camcc_pll2_out_early.hw,
  1758. [CAMCC_PLL3_OUT_EVEN] = &camcc_pll3_out_even.hw,
  1759. [CAMCC_PLL4_OUT_EVEN] = &camcc_pll4_out_even.hw,
  1760. };
  1761. static struct clk_regmap *camcc_sm7150_clocks[] = {
  1762. [CAMCC_BPS_AHB_CLK] = &camcc_bps_ahb_clk.clkr,
  1763. [CAMCC_BPS_AREG_CLK] = &camcc_bps_areg_clk.clkr,
  1764. [CAMCC_BPS_AXI_CLK] = &camcc_bps_axi_clk.clkr,
  1765. [CAMCC_BPS_CLK] = &camcc_bps_clk.clkr,
  1766. [CAMCC_BPS_CLK_SRC] = &camcc_bps_clk_src.clkr,
  1767. [CAMCC_CAMNOC_AXI_CLK] = &camcc_camnoc_axi_clk.clkr,
  1768. [CAMCC_CAMNOC_AXI_CLK_SRC] = &camcc_camnoc_axi_clk_src.clkr,
  1769. [CAMCC_CAMNOC_DCD_XO_CLK] = &camcc_camnoc_dcd_xo_clk.clkr,
  1770. [CAMCC_CCI_0_CLK] = &camcc_cci_0_clk.clkr,
  1771. [CAMCC_CCI_0_CLK_SRC] = &camcc_cci_0_clk_src.clkr,
  1772. [CAMCC_CCI_1_CLK] = &camcc_cci_1_clk.clkr,
  1773. [CAMCC_CCI_1_CLK_SRC] = &camcc_cci_1_clk_src.clkr,
  1774. [CAMCC_CORE_AHB_CLK] = &camcc_core_ahb_clk.clkr,
  1775. [CAMCC_CPAS_AHB_CLK] = &camcc_cpas_ahb_clk.clkr,
  1776. [CAMCC_CPHY_RX_CLK_SRC] = &camcc_cphy_rx_clk_src.clkr,
  1777. [CAMCC_CSI0PHYTIMER_CLK] = &camcc_csi0phytimer_clk.clkr,
  1778. [CAMCC_CSI0PHYTIMER_CLK_SRC] = &camcc_csi0phytimer_clk_src.clkr,
  1779. [CAMCC_CSI1PHYTIMER_CLK] = &camcc_csi1phytimer_clk.clkr,
  1780. [CAMCC_CSI1PHYTIMER_CLK_SRC] = &camcc_csi1phytimer_clk_src.clkr,
  1781. [CAMCC_CSI2PHYTIMER_CLK] = &camcc_csi2phytimer_clk.clkr,
  1782. [CAMCC_CSI2PHYTIMER_CLK_SRC] = &camcc_csi2phytimer_clk_src.clkr,
  1783. [CAMCC_CSI3PHYTIMER_CLK] = &camcc_csi3phytimer_clk.clkr,
  1784. [CAMCC_CSI3PHYTIMER_CLK_SRC] = &camcc_csi3phytimer_clk_src.clkr,
  1785. [CAMCC_CSIPHY0_CLK] = &camcc_csiphy0_clk.clkr,
  1786. [CAMCC_CSIPHY1_CLK] = &camcc_csiphy1_clk.clkr,
  1787. [CAMCC_CSIPHY2_CLK] = &camcc_csiphy2_clk.clkr,
  1788. [CAMCC_CSIPHY3_CLK] = &camcc_csiphy3_clk.clkr,
  1789. [CAMCC_FAST_AHB_CLK_SRC] = &camcc_fast_ahb_clk_src.clkr,
  1790. [CAMCC_FD_CORE_CLK] = &camcc_fd_core_clk.clkr,
  1791. [CAMCC_FD_CORE_CLK_SRC] = &camcc_fd_core_clk_src.clkr,
  1792. [CAMCC_FD_CORE_UAR_CLK] = &camcc_fd_core_uar_clk.clkr,
  1793. [CAMCC_ICP_AHB_CLK] = &camcc_icp_ahb_clk.clkr,
  1794. [CAMCC_ICP_CLK] = &camcc_icp_clk.clkr,
  1795. [CAMCC_ICP_CLK_SRC] = &camcc_icp_clk_src.clkr,
  1796. [CAMCC_IFE_0_AXI_CLK] = &camcc_ife_0_axi_clk.clkr,
  1797. [CAMCC_IFE_0_CLK] = &camcc_ife_0_clk.clkr,
  1798. [CAMCC_IFE_0_CLK_SRC] = &camcc_ife_0_clk_src.clkr,
  1799. [CAMCC_IFE_0_CPHY_RX_CLK] = &camcc_ife_0_cphy_rx_clk.clkr,
  1800. [CAMCC_IFE_0_CSID_CLK] = &camcc_ife_0_csid_clk.clkr,
  1801. [CAMCC_IFE_0_CSID_CLK_SRC] = &camcc_ife_0_csid_clk_src.clkr,
  1802. [CAMCC_IFE_0_DSP_CLK] = &camcc_ife_0_dsp_clk.clkr,
  1803. [CAMCC_IFE_1_AXI_CLK] = &camcc_ife_1_axi_clk.clkr,
  1804. [CAMCC_IFE_1_CLK] = &camcc_ife_1_clk.clkr,
  1805. [CAMCC_IFE_1_CLK_SRC] = &camcc_ife_1_clk_src.clkr,
  1806. [CAMCC_IFE_1_CPHY_RX_CLK] = &camcc_ife_1_cphy_rx_clk.clkr,
  1807. [CAMCC_IFE_1_CSID_CLK] = &camcc_ife_1_csid_clk.clkr,
  1808. [CAMCC_IFE_1_CSID_CLK_SRC] = &camcc_ife_1_csid_clk_src.clkr,
  1809. [CAMCC_IFE_1_DSP_CLK] = &camcc_ife_1_dsp_clk.clkr,
  1810. [CAMCC_IFE_LITE_CLK] = &camcc_ife_lite_clk.clkr,
  1811. [CAMCC_IFE_LITE_CLK_SRC] = &camcc_ife_lite_clk_src.clkr,
  1812. [CAMCC_IFE_LITE_CPHY_RX_CLK] = &camcc_ife_lite_cphy_rx_clk.clkr,
  1813. [CAMCC_IFE_LITE_CSID_CLK] = &camcc_ife_lite_csid_clk.clkr,
  1814. [CAMCC_IFE_LITE_CSID_CLK_SRC] = &camcc_ife_lite_csid_clk_src.clkr,
  1815. [CAMCC_IPE_0_AHB_CLK] = &camcc_ipe_0_ahb_clk.clkr,
  1816. [CAMCC_IPE_0_AREG_CLK] = &camcc_ipe_0_areg_clk.clkr,
  1817. [CAMCC_IPE_0_AXI_CLK] = &camcc_ipe_0_axi_clk.clkr,
  1818. [CAMCC_IPE_0_CLK] = &camcc_ipe_0_clk.clkr,
  1819. [CAMCC_IPE_0_CLK_SRC] = &camcc_ipe_0_clk_src.clkr,
  1820. [CAMCC_IPE_1_AHB_CLK] = &camcc_ipe_1_ahb_clk.clkr,
  1821. [CAMCC_IPE_1_AREG_CLK] = &camcc_ipe_1_areg_clk.clkr,
  1822. [CAMCC_IPE_1_AXI_CLK] = &camcc_ipe_1_axi_clk.clkr,
  1823. [CAMCC_IPE_1_CLK] = &camcc_ipe_1_clk.clkr,
  1824. [CAMCC_JPEG_CLK] = &camcc_jpeg_clk.clkr,
  1825. [CAMCC_JPEG_CLK_SRC] = &camcc_jpeg_clk_src.clkr,
  1826. [CAMCC_LRME_CLK] = &camcc_lrme_clk.clkr,
  1827. [CAMCC_LRME_CLK_SRC] = &camcc_lrme_clk_src.clkr,
  1828. [CAMCC_MCLK0_CLK] = &camcc_mclk0_clk.clkr,
  1829. [CAMCC_MCLK0_CLK_SRC] = &camcc_mclk0_clk_src.clkr,
  1830. [CAMCC_MCLK1_CLK] = &camcc_mclk1_clk.clkr,
  1831. [CAMCC_MCLK1_CLK_SRC] = &camcc_mclk1_clk_src.clkr,
  1832. [CAMCC_MCLK2_CLK] = &camcc_mclk2_clk.clkr,
  1833. [CAMCC_MCLK2_CLK_SRC] = &camcc_mclk2_clk_src.clkr,
  1834. [CAMCC_MCLK3_CLK] = &camcc_mclk3_clk.clkr,
  1835. [CAMCC_MCLK3_CLK_SRC] = &camcc_mclk3_clk_src.clkr,
  1836. [CAMCC_PLL0] = &camcc_pll0.clkr,
  1837. [CAMCC_PLL1] = &camcc_pll1.clkr,
  1838. [CAMCC_PLL2] = &camcc_pll2.clkr,
  1839. [CAMCC_PLL2_OUT_AUX] = &camcc_pll2_out_aux.clkr,
  1840. [CAMCC_PLL2_OUT_MAIN] = &camcc_pll2_out_main.clkr,
  1841. [CAMCC_PLL3] = &camcc_pll3.clkr,
  1842. [CAMCC_PLL4] = &camcc_pll4.clkr,
  1843. [CAMCC_SLEEP_CLK] = &camcc_sleep_clk.clkr,
  1844. [CAMCC_SLEEP_CLK_SRC] = &camcc_sleep_clk_src.clkr,
  1845. [CAMCC_SLOW_AHB_CLK_SRC] = &camcc_slow_ahb_clk_src.clkr,
  1846. [CAMCC_XO_CLK_SRC] = &camcc_xo_clk_src.clkr,
  1847. };
  1848. static struct gdsc *camcc_sm7150_gdscs[] = {
  1849. [BPS_GDSC] = &camcc_bps_gdsc,
  1850. [IFE_0_GDSC] = &camcc_ife_0_gdsc,
  1851. [IFE_1_GDSC] = &camcc_ife_1_gdsc,
  1852. [IPE_0_GDSC] = &camcc_ipe_0_gdsc,
  1853. [IPE_1_GDSC] = &camcc_ipe_1_gdsc,
  1854. [TITAN_TOP_GDSC] = &camcc_titan_top_gdsc,
  1855. };
  1856. static const struct regmap_config camcc_sm7150_regmap_config = {
  1857. .reg_bits = 32,
  1858. .reg_stride = 4,
  1859. .val_bits = 32,
  1860. .max_register = 0xd024,
  1861. .fast_io = true,
  1862. };
  1863. static const struct qcom_cc_desc camcc_sm7150_desc = {
  1864. .config = &camcc_sm7150_regmap_config,
  1865. .clk_hws = camcc_sm7150_hws,
  1866. .num_clk_hws = ARRAY_SIZE(camcc_sm7150_hws),
  1867. .clks = camcc_sm7150_clocks,
  1868. .num_clks = ARRAY_SIZE(camcc_sm7150_clocks),
  1869. .gdscs = camcc_sm7150_gdscs,
  1870. .num_gdscs = ARRAY_SIZE(camcc_sm7150_gdscs),
  1871. };
  1872. static const struct of_device_id camcc_sm7150_match_table[] = {
  1873. { .compatible = "qcom,sm7150-camcc" },
  1874. { }
  1875. };
  1876. MODULE_DEVICE_TABLE(of, camcc_sm7150_match_table);
  1877. static int camcc_sm7150_probe(struct platform_device *pdev)
  1878. {
  1879. struct regmap *regmap;
  1880. regmap = qcom_cc_map(pdev, &camcc_sm7150_desc);
  1881. if (IS_ERR(regmap))
  1882. return PTR_ERR(regmap);
  1883. clk_fabia_pll_configure(&camcc_pll0, regmap, &camcc_pll0_config);
  1884. clk_fabia_pll_configure(&camcc_pll1, regmap, &camcc_pll1_config);
  1885. clk_agera_pll_configure(&camcc_pll2, regmap, &camcc_pll2_config);
  1886. clk_fabia_pll_configure(&camcc_pll3, regmap, &camcc_pll3_config);
  1887. clk_fabia_pll_configure(&camcc_pll4, regmap, &camcc_pll3_config);
  1888. /* Keep some clocks always-on */
  1889. qcom_branch_set_clk_en(regmap, 0xc1a0); /* CAMCC_GDSC_CLK */
  1890. return qcom_cc_really_probe(&pdev->dev, &camcc_sm7150_desc, regmap);
  1891. }
  1892. static struct platform_driver camcc_sm7150_driver = {
  1893. .probe = camcc_sm7150_probe,
  1894. .driver = {
  1895. .name = "camcc-sm7150",
  1896. .of_match_table = camcc_sm7150_match_table,
  1897. },
  1898. };
  1899. module_platform_driver(camcc_sm7150_driver);
  1900. MODULE_DESCRIPTION("Qualcomm SM7150 Camera Clock Controller");
  1901. MODULE_LICENSE("GPL");