mmcc-msm8960.c 60 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704
  1. /*
  2. * Copyright (c) 2013, The Linux Foundation. All rights reserved.
  3. *
  4. * This software is licensed under the terms of the GNU General Public
  5. * License version 2, as published by the Free Software Foundation, and
  6. * may be copied, distributed, and modified under those terms.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. */
  13. #include <linux/kernel.h>
  14. #include <linux/bitops.h>
  15. #include <linux/err.h>
  16. #include <linux/delay.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/module.h>
  19. #include <linux/of.h>
  20. #include <linux/of_device.h>
  21. #include <linux/clk-provider.h>
  22. #include <linux/regmap.h>
  23. #include <linux/reset-controller.h>
  24. #include <dt-bindings/clock/qcom,mmcc-msm8960.h>
  25. #include <dt-bindings/reset/qcom,mmcc-msm8960.h>
  26. #include "common.h"
  27. #include "clk-regmap.h"
  28. #include "clk-pll.h"
  29. #include "clk-rcg.h"
  30. #include "clk-branch.h"
  31. #include "reset.h"
  32. #define P_PXO 0
  33. #define P_PLL8 1
  34. #define P_PLL2 2
  35. #define P_PLL3 3
  36. #define P_PLL15 3
  37. #define F_MN(f, s, _m, _n) { .freq = f, .src = s, .m = _m, .n = _n }
  38. static u8 mmcc_pxo_pll8_pll2_map[] = {
  39. [P_PXO] = 0,
  40. [P_PLL8] = 2,
  41. [P_PLL2] = 1,
  42. };
  43. static const char *mmcc_pxo_pll8_pll2[] = {
  44. "pxo",
  45. "pll8_vote",
  46. "pll2",
  47. };
  48. static u8 mmcc_pxo_pll8_pll2_pll3_map[] = {
  49. [P_PXO] = 0,
  50. [P_PLL8] = 2,
  51. [P_PLL2] = 1,
  52. [P_PLL3] = 3,
  53. };
  54. static const char *mmcc_pxo_pll8_pll2_pll15[] = {
  55. "pxo",
  56. "pll8_vote",
  57. "pll2",
  58. "pll15",
  59. };
  60. static u8 mmcc_pxo_pll8_pll2_pll15_map[] = {
  61. [P_PXO] = 0,
  62. [P_PLL8] = 2,
  63. [P_PLL2] = 1,
  64. [P_PLL15] = 3,
  65. };
  66. static const char *mmcc_pxo_pll8_pll2_pll3[] = {
  67. "pxo",
  68. "pll8_vote",
  69. "pll2",
  70. "pll3",
  71. };
  72. static struct clk_pll pll2 = {
  73. .l_reg = 0x320,
  74. .m_reg = 0x324,
  75. .n_reg = 0x328,
  76. .config_reg = 0x32c,
  77. .mode_reg = 0x31c,
  78. .status_reg = 0x334,
  79. .status_bit = 16,
  80. .clkr.hw.init = &(struct clk_init_data){
  81. .name = "pll2",
  82. .parent_names = (const char *[]){ "pxo" },
  83. .num_parents = 1,
  84. .ops = &clk_pll_ops,
  85. },
  86. };
  87. static struct clk_pll pll15 = {
  88. .l_reg = 0x33c,
  89. .m_reg = 0x340,
  90. .n_reg = 0x344,
  91. .config_reg = 0x348,
  92. .mode_reg = 0x338,
  93. .status_reg = 0x350,
  94. .status_bit = 16,
  95. .clkr.hw.init = &(struct clk_init_data){
  96. .name = "pll15",
  97. .parent_names = (const char *[]){ "pxo" },
  98. .num_parents = 1,
  99. .ops = &clk_pll_ops,
  100. },
  101. };
  102. static const struct pll_config pll15_config = {
  103. .l = 33,
  104. .m = 1,
  105. .n = 3,
  106. .vco_val = 0x2 << 16,
  107. .vco_mask = 0x3 << 16,
  108. .pre_div_val = 0x0,
  109. .pre_div_mask = BIT(19),
  110. .post_div_val = 0x0,
  111. .post_div_mask = 0x3 << 20,
  112. .mn_ena_mask = BIT(22),
  113. .main_output_mask = BIT(23),
  114. };
  115. static struct freq_tbl clk_tbl_cam[] = {
  116. { 6000000, P_PLL8, 4, 1, 16 },
  117. { 8000000, P_PLL8, 4, 1, 12 },
  118. { 12000000, P_PLL8, 4, 1, 8 },
  119. { 16000000, P_PLL8, 4, 1, 6 },
  120. { 19200000, P_PLL8, 4, 1, 5 },
  121. { 24000000, P_PLL8, 4, 1, 4 },
  122. { 32000000, P_PLL8, 4, 1, 3 },
  123. { 48000000, P_PLL8, 4, 1, 2 },
  124. { 64000000, P_PLL8, 3, 1, 2 },
  125. { 96000000, P_PLL8, 4, 0, 0 },
  126. { 128000000, P_PLL8, 3, 0, 0 },
  127. { }
  128. };
  129. static struct clk_rcg camclk0_src = {
  130. .ns_reg = 0x0148,
  131. .md_reg = 0x0144,
  132. .mn = {
  133. .mnctr_en_bit = 5,
  134. .mnctr_reset_bit = 8,
  135. .reset_in_cc = true,
  136. .mnctr_mode_shift = 6,
  137. .n_val_shift = 24,
  138. .m_val_shift = 8,
  139. .width = 8,
  140. },
  141. .p = {
  142. .pre_div_shift = 14,
  143. .pre_div_width = 2,
  144. },
  145. .s = {
  146. .src_sel_shift = 0,
  147. .parent_map = mmcc_pxo_pll8_pll2_map,
  148. },
  149. .freq_tbl = clk_tbl_cam,
  150. .clkr = {
  151. .enable_reg = 0x0140,
  152. .enable_mask = BIT(2),
  153. .hw.init = &(struct clk_init_data){
  154. .name = "camclk0_src",
  155. .parent_names = mmcc_pxo_pll8_pll2,
  156. .num_parents = 3,
  157. .ops = &clk_rcg_ops,
  158. },
  159. },
  160. };
  161. static struct clk_branch camclk0_clk = {
  162. .halt_reg = 0x01e8,
  163. .halt_bit = 15,
  164. .clkr = {
  165. .enable_reg = 0x0140,
  166. .enable_mask = BIT(0),
  167. .hw.init = &(struct clk_init_data){
  168. .name = "camclk0_clk",
  169. .parent_names = (const char *[]){ "camclk0_src" },
  170. .num_parents = 1,
  171. .ops = &clk_branch_ops,
  172. },
  173. },
  174. };
  175. static struct clk_rcg camclk1_src = {
  176. .ns_reg = 0x015c,
  177. .md_reg = 0x0158,
  178. .mn = {
  179. .mnctr_en_bit = 5,
  180. .mnctr_reset_bit = 8,
  181. .reset_in_cc = true,
  182. .mnctr_mode_shift = 6,
  183. .n_val_shift = 24,
  184. .m_val_shift = 8,
  185. .width = 8,
  186. },
  187. .p = {
  188. .pre_div_shift = 14,
  189. .pre_div_width = 2,
  190. },
  191. .s = {
  192. .src_sel_shift = 0,
  193. .parent_map = mmcc_pxo_pll8_pll2_map,
  194. },
  195. .freq_tbl = clk_tbl_cam,
  196. .clkr = {
  197. .enable_reg = 0x0154,
  198. .enable_mask = BIT(2),
  199. .hw.init = &(struct clk_init_data){
  200. .name = "camclk1_src",
  201. .parent_names = mmcc_pxo_pll8_pll2,
  202. .num_parents = 3,
  203. .ops = &clk_rcg_ops,
  204. },
  205. },
  206. };
  207. static struct clk_branch camclk1_clk = {
  208. .halt_reg = 0x01e8,
  209. .halt_bit = 16,
  210. .clkr = {
  211. .enable_reg = 0x0154,
  212. .enable_mask = BIT(0),
  213. .hw.init = &(struct clk_init_data){
  214. .name = "camclk1_clk",
  215. .parent_names = (const char *[]){ "camclk1_src" },
  216. .num_parents = 1,
  217. .ops = &clk_branch_ops,
  218. },
  219. },
  220. };
  221. static struct clk_rcg camclk2_src = {
  222. .ns_reg = 0x0228,
  223. .md_reg = 0x0224,
  224. .mn = {
  225. .mnctr_en_bit = 5,
  226. .mnctr_reset_bit = 8,
  227. .reset_in_cc = true,
  228. .mnctr_mode_shift = 6,
  229. .n_val_shift = 24,
  230. .m_val_shift = 8,
  231. .width = 8,
  232. },
  233. .p = {
  234. .pre_div_shift = 14,
  235. .pre_div_width = 2,
  236. },
  237. .s = {
  238. .src_sel_shift = 0,
  239. .parent_map = mmcc_pxo_pll8_pll2_map,
  240. },
  241. .freq_tbl = clk_tbl_cam,
  242. .clkr = {
  243. .enable_reg = 0x0220,
  244. .enable_mask = BIT(2),
  245. .hw.init = &(struct clk_init_data){
  246. .name = "camclk2_src",
  247. .parent_names = mmcc_pxo_pll8_pll2,
  248. .num_parents = 3,
  249. .ops = &clk_rcg_ops,
  250. },
  251. },
  252. };
  253. static struct clk_branch camclk2_clk = {
  254. .halt_reg = 0x01e8,
  255. .halt_bit = 16,
  256. .clkr = {
  257. .enable_reg = 0x0220,
  258. .enable_mask = BIT(0),
  259. .hw.init = &(struct clk_init_data){
  260. .name = "camclk2_clk",
  261. .parent_names = (const char *[]){ "camclk2_src" },
  262. .num_parents = 1,
  263. .ops = &clk_branch_ops,
  264. },
  265. },
  266. };
  267. static struct freq_tbl clk_tbl_csi[] = {
  268. { 27000000, P_PXO, 1, 0, 0 },
  269. { 85330000, P_PLL8, 1, 2, 9 },
  270. { 177780000, P_PLL2, 1, 2, 9 },
  271. { }
  272. };
  273. static struct clk_rcg csi0_src = {
  274. .ns_reg = 0x0048,
  275. .md_reg = 0x0044,
  276. .mn = {
  277. .mnctr_en_bit = 5,
  278. .mnctr_reset_bit = 7,
  279. .mnctr_mode_shift = 6,
  280. .n_val_shift = 24,
  281. .m_val_shift = 8,
  282. .width = 8,
  283. },
  284. .p = {
  285. .pre_div_shift = 14,
  286. .pre_div_width = 2,
  287. },
  288. .s = {
  289. .src_sel_shift = 0,
  290. .parent_map = mmcc_pxo_pll8_pll2_map,
  291. },
  292. .freq_tbl = clk_tbl_csi,
  293. .clkr = {
  294. .enable_reg = 0x0040,
  295. .enable_mask = BIT(2),
  296. .hw.init = &(struct clk_init_data){
  297. .name = "csi0_src",
  298. .parent_names = mmcc_pxo_pll8_pll2,
  299. .num_parents = 3,
  300. .ops = &clk_rcg_ops,
  301. },
  302. },
  303. };
  304. static struct clk_branch csi0_clk = {
  305. .halt_reg = 0x01cc,
  306. .halt_bit = 13,
  307. .clkr = {
  308. .enable_reg = 0x0040,
  309. .enable_mask = BIT(0),
  310. .hw.init = &(struct clk_init_data){
  311. .parent_names = (const char *[]){ "csi0_src" },
  312. .num_parents = 1,
  313. .name = "csi0_clk",
  314. .ops = &clk_branch_ops,
  315. .flags = CLK_SET_RATE_PARENT,
  316. },
  317. },
  318. };
  319. static struct clk_branch csi0_phy_clk = {
  320. .halt_reg = 0x01e8,
  321. .halt_bit = 9,
  322. .clkr = {
  323. .enable_reg = 0x0040,
  324. .enable_mask = BIT(8),
  325. .hw.init = &(struct clk_init_data){
  326. .parent_names = (const char *[]){ "csi0_src" },
  327. .num_parents = 1,
  328. .name = "csi0_phy_clk",
  329. .ops = &clk_branch_ops,
  330. .flags = CLK_SET_RATE_PARENT,
  331. },
  332. },
  333. };
  334. static struct clk_rcg csi1_src = {
  335. .ns_reg = 0x0010,
  336. .md_reg = 0x0028,
  337. .mn = {
  338. .mnctr_en_bit = 5,
  339. .mnctr_reset_bit = 7,
  340. .mnctr_mode_shift = 6,
  341. .n_val_shift = 24,
  342. .m_val_shift = 8,
  343. .width = 8,
  344. },
  345. .p = {
  346. .pre_div_shift = 14,
  347. .pre_div_width = 2,
  348. },
  349. .s = {
  350. .src_sel_shift = 0,
  351. .parent_map = mmcc_pxo_pll8_pll2_map,
  352. },
  353. .freq_tbl = clk_tbl_csi,
  354. .clkr = {
  355. .enable_reg = 0x0024,
  356. .enable_mask = BIT(2),
  357. .hw.init = &(struct clk_init_data){
  358. .name = "csi1_src",
  359. .parent_names = mmcc_pxo_pll8_pll2,
  360. .num_parents = 3,
  361. .ops = &clk_rcg_ops,
  362. },
  363. },
  364. };
  365. static struct clk_branch csi1_clk = {
  366. .halt_reg = 0x01cc,
  367. .halt_bit = 14,
  368. .clkr = {
  369. .enable_reg = 0x0024,
  370. .enable_mask = BIT(0),
  371. .hw.init = &(struct clk_init_data){
  372. .parent_names = (const char *[]){ "csi1_src" },
  373. .num_parents = 1,
  374. .name = "csi1_clk",
  375. .ops = &clk_branch_ops,
  376. .flags = CLK_SET_RATE_PARENT,
  377. },
  378. },
  379. };
  380. static struct clk_branch csi1_phy_clk = {
  381. .halt_reg = 0x01e8,
  382. .halt_bit = 10,
  383. .clkr = {
  384. .enable_reg = 0x0024,
  385. .enable_mask = BIT(8),
  386. .hw.init = &(struct clk_init_data){
  387. .parent_names = (const char *[]){ "csi1_src" },
  388. .num_parents = 1,
  389. .name = "csi1_phy_clk",
  390. .ops = &clk_branch_ops,
  391. .flags = CLK_SET_RATE_PARENT,
  392. },
  393. },
  394. };
  395. static struct clk_rcg csi2_src = {
  396. .ns_reg = 0x0234,
  397. .md_reg = 0x022c,
  398. .mn = {
  399. .mnctr_en_bit = 5,
  400. .mnctr_reset_bit = 7,
  401. .mnctr_mode_shift = 6,
  402. .n_val_shift = 24,
  403. .m_val_shift = 8,
  404. .width = 8,
  405. },
  406. .p = {
  407. .pre_div_shift = 14,
  408. .pre_div_width = 2,
  409. },
  410. .s = {
  411. .src_sel_shift = 0,
  412. .parent_map = mmcc_pxo_pll8_pll2_map,
  413. },
  414. .freq_tbl = clk_tbl_csi,
  415. .clkr = {
  416. .enable_reg = 0x022c,
  417. .enable_mask = BIT(2),
  418. .hw.init = &(struct clk_init_data){
  419. .name = "csi2_src",
  420. .parent_names = mmcc_pxo_pll8_pll2,
  421. .num_parents = 3,
  422. .ops = &clk_rcg_ops,
  423. },
  424. },
  425. };
  426. static struct clk_branch csi2_clk = {
  427. .halt_reg = 0x01cc,
  428. .halt_bit = 29,
  429. .clkr = {
  430. .enable_reg = 0x022c,
  431. .enable_mask = BIT(0),
  432. .hw.init = &(struct clk_init_data){
  433. .parent_names = (const char *[]){ "csi2_src" },
  434. .num_parents = 1,
  435. .name = "csi2_clk",
  436. .ops = &clk_branch_ops,
  437. .flags = CLK_SET_RATE_PARENT,
  438. },
  439. },
  440. };
  441. static struct clk_branch csi2_phy_clk = {
  442. .halt_reg = 0x01e8,
  443. .halt_bit = 29,
  444. .clkr = {
  445. .enable_reg = 0x022c,
  446. .enable_mask = BIT(8),
  447. .hw.init = &(struct clk_init_data){
  448. .parent_names = (const char *[]){ "csi2_src" },
  449. .num_parents = 1,
  450. .name = "csi2_phy_clk",
  451. .ops = &clk_branch_ops,
  452. .flags = CLK_SET_RATE_PARENT,
  453. },
  454. },
  455. };
  456. struct clk_pix_rdi {
  457. u32 s_reg;
  458. u32 s_mask;
  459. u32 s2_reg;
  460. u32 s2_mask;
  461. struct clk_regmap clkr;
  462. };
  463. #define to_clk_pix_rdi(_hw) \
  464. container_of(to_clk_regmap(_hw), struct clk_pix_rdi, clkr)
  465. static int pix_rdi_set_parent(struct clk_hw *hw, u8 index)
  466. {
  467. int i;
  468. int ret = 0;
  469. u32 val;
  470. struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw);
  471. struct clk *clk = hw->clk;
  472. int num_parents = __clk_get_num_parents(hw->clk);
  473. /*
  474. * These clocks select three inputs via two muxes. One mux selects
  475. * between csi0 and csi1 and the second mux selects between that mux's
  476. * output and csi2. The source and destination selections for each
  477. * mux must be clocking for the switch to succeed so just turn on
  478. * all three sources because it's easier than figuring out what source
  479. * needs to be on at what time.
  480. */
  481. for (i = 0; i < num_parents; i++) {
  482. ret = clk_prepare_enable(clk_get_parent_by_index(clk, i));
  483. if (ret)
  484. goto err;
  485. }
  486. if (index == 2)
  487. val = rdi->s2_mask;
  488. else
  489. val = 0;
  490. regmap_update_bits(rdi->clkr.regmap, rdi->s2_reg, rdi->s2_mask, val);
  491. /*
  492. * Wait at least 6 cycles of slowest clock
  493. * for the glitch-free MUX to fully switch sources.
  494. */
  495. udelay(1);
  496. if (index == 1)
  497. val = rdi->s_mask;
  498. else
  499. val = 0;
  500. regmap_update_bits(rdi->clkr.regmap, rdi->s_reg, rdi->s_mask, val);
  501. /*
  502. * Wait at least 6 cycles of slowest clock
  503. * for the glitch-free MUX to fully switch sources.
  504. */
  505. udelay(1);
  506. err:
  507. for (i--; i >= 0; i--)
  508. clk_disable_unprepare(clk_get_parent_by_index(clk, i));
  509. return ret;
  510. }
  511. static u8 pix_rdi_get_parent(struct clk_hw *hw)
  512. {
  513. u32 val;
  514. struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw);
  515. regmap_read(rdi->clkr.regmap, rdi->s2_reg, &val);
  516. if (val & rdi->s2_mask)
  517. return 2;
  518. regmap_read(rdi->clkr.regmap, rdi->s_reg, &val);
  519. if (val & rdi->s_mask)
  520. return 1;
  521. return 0;
  522. }
  523. static const struct clk_ops clk_ops_pix_rdi = {
  524. .enable = clk_enable_regmap,
  525. .disable = clk_disable_regmap,
  526. .set_parent = pix_rdi_set_parent,
  527. .get_parent = pix_rdi_get_parent,
  528. .determine_rate = __clk_mux_determine_rate,
  529. };
  530. static const char *pix_rdi_parents[] = {
  531. "csi0_clk",
  532. "csi1_clk",
  533. "csi2_clk",
  534. };
  535. static struct clk_pix_rdi csi_pix_clk = {
  536. .s_reg = 0x0058,
  537. .s_mask = BIT(25),
  538. .s2_reg = 0x0238,
  539. .s2_mask = BIT(13),
  540. .clkr = {
  541. .enable_reg = 0x0058,
  542. .enable_mask = BIT(26),
  543. .hw.init = &(struct clk_init_data){
  544. .name = "csi_pix_clk",
  545. .parent_names = pix_rdi_parents,
  546. .num_parents = 3,
  547. .ops = &clk_ops_pix_rdi,
  548. },
  549. },
  550. };
  551. static struct clk_pix_rdi csi_pix1_clk = {
  552. .s_reg = 0x0238,
  553. .s_mask = BIT(8),
  554. .s2_reg = 0x0238,
  555. .s2_mask = BIT(9),
  556. .clkr = {
  557. .enable_reg = 0x0238,
  558. .enable_mask = BIT(10),
  559. .hw.init = &(struct clk_init_data){
  560. .name = "csi_pix1_clk",
  561. .parent_names = pix_rdi_parents,
  562. .num_parents = 3,
  563. .ops = &clk_ops_pix_rdi,
  564. },
  565. },
  566. };
  567. static struct clk_pix_rdi csi_rdi_clk = {
  568. .s_reg = 0x0058,
  569. .s_mask = BIT(12),
  570. .s2_reg = 0x0238,
  571. .s2_mask = BIT(12),
  572. .clkr = {
  573. .enable_reg = 0x0058,
  574. .enable_mask = BIT(13),
  575. .hw.init = &(struct clk_init_data){
  576. .name = "csi_rdi_clk",
  577. .parent_names = pix_rdi_parents,
  578. .num_parents = 3,
  579. .ops = &clk_ops_pix_rdi,
  580. },
  581. },
  582. };
  583. static struct clk_pix_rdi csi_rdi1_clk = {
  584. .s_reg = 0x0238,
  585. .s_mask = BIT(0),
  586. .s2_reg = 0x0238,
  587. .s2_mask = BIT(1),
  588. .clkr = {
  589. .enable_reg = 0x0238,
  590. .enable_mask = BIT(2),
  591. .hw.init = &(struct clk_init_data){
  592. .name = "csi_rdi1_clk",
  593. .parent_names = pix_rdi_parents,
  594. .num_parents = 3,
  595. .ops = &clk_ops_pix_rdi,
  596. },
  597. },
  598. };
  599. static struct clk_pix_rdi csi_rdi2_clk = {
  600. .s_reg = 0x0238,
  601. .s_mask = BIT(4),
  602. .s2_reg = 0x0238,
  603. .s2_mask = BIT(5),
  604. .clkr = {
  605. .enable_reg = 0x0238,
  606. .enable_mask = BIT(6),
  607. .hw.init = &(struct clk_init_data){
  608. .name = "csi_rdi2_clk",
  609. .parent_names = pix_rdi_parents,
  610. .num_parents = 3,
  611. .ops = &clk_ops_pix_rdi,
  612. },
  613. },
  614. };
  615. static struct freq_tbl clk_tbl_csiphytimer[] = {
  616. { 85330000, P_PLL8, 1, 2, 9 },
  617. { 177780000, P_PLL2, 1, 2, 9 },
  618. { }
  619. };
  620. static struct clk_rcg csiphytimer_src = {
  621. .ns_reg = 0x0168,
  622. .md_reg = 0x0164,
  623. .mn = {
  624. .mnctr_en_bit = 5,
  625. .mnctr_reset_bit = 8,
  626. .reset_in_cc = true,
  627. .mnctr_mode_shift = 6,
  628. .n_val_shift = 24,
  629. .m_val_shift = 8,
  630. .width = 8,
  631. },
  632. .p = {
  633. .pre_div_shift = 14,
  634. .pre_div_width = 2,
  635. },
  636. .s = {
  637. .src_sel_shift = 0,
  638. .parent_map = mmcc_pxo_pll8_pll2_map,
  639. },
  640. .freq_tbl = clk_tbl_csiphytimer,
  641. .clkr = {
  642. .enable_reg = 0x0160,
  643. .enable_mask = BIT(2),
  644. .hw.init = &(struct clk_init_data){
  645. .name = "csiphytimer_src",
  646. .parent_names = mmcc_pxo_pll8_pll2,
  647. .num_parents = 3,
  648. .ops = &clk_rcg_ops,
  649. },
  650. },
  651. };
  652. static const char *csixphy_timer_src[] = { "csiphytimer_src" };
  653. static struct clk_branch csiphy0_timer_clk = {
  654. .halt_reg = 0x01e8,
  655. .halt_bit = 17,
  656. .clkr = {
  657. .enable_reg = 0x0160,
  658. .enable_mask = BIT(0),
  659. .hw.init = &(struct clk_init_data){
  660. .parent_names = csixphy_timer_src,
  661. .num_parents = 1,
  662. .name = "csiphy0_timer_clk",
  663. .ops = &clk_branch_ops,
  664. .flags = CLK_SET_RATE_PARENT,
  665. },
  666. },
  667. };
  668. static struct clk_branch csiphy1_timer_clk = {
  669. .halt_reg = 0x01e8,
  670. .halt_bit = 18,
  671. .clkr = {
  672. .enable_reg = 0x0160,
  673. .enable_mask = BIT(9),
  674. .hw.init = &(struct clk_init_data){
  675. .parent_names = csixphy_timer_src,
  676. .num_parents = 1,
  677. .name = "csiphy1_timer_clk",
  678. .ops = &clk_branch_ops,
  679. .flags = CLK_SET_RATE_PARENT,
  680. },
  681. },
  682. };
  683. static struct clk_branch csiphy2_timer_clk = {
  684. .halt_reg = 0x01e8,
  685. .halt_bit = 30,
  686. .clkr = {
  687. .enable_reg = 0x0160,
  688. .enable_mask = BIT(11),
  689. .hw.init = &(struct clk_init_data){
  690. .parent_names = csixphy_timer_src,
  691. .num_parents = 1,
  692. .name = "csiphy2_timer_clk",
  693. .ops = &clk_branch_ops,
  694. .flags = CLK_SET_RATE_PARENT,
  695. },
  696. },
  697. };
  698. static struct freq_tbl clk_tbl_gfx2d[] = {
  699. F_MN( 27000000, P_PXO, 1, 0),
  700. F_MN( 48000000, P_PLL8, 1, 8),
  701. F_MN( 54857000, P_PLL8, 1, 7),
  702. F_MN( 64000000, P_PLL8, 1, 6),
  703. F_MN( 76800000, P_PLL8, 1, 5),
  704. F_MN( 96000000, P_PLL8, 1, 4),
  705. F_MN(128000000, P_PLL8, 1, 3),
  706. F_MN(145455000, P_PLL2, 2, 11),
  707. F_MN(160000000, P_PLL2, 1, 5),
  708. F_MN(177778000, P_PLL2, 2, 9),
  709. F_MN(200000000, P_PLL2, 1, 4),
  710. F_MN(228571000, P_PLL2, 2, 7),
  711. { }
  712. };
  713. static struct clk_dyn_rcg gfx2d0_src = {
  714. .ns_reg[0] = 0x0070,
  715. .ns_reg[1] = 0x0070,
  716. .md_reg[0] = 0x0064,
  717. .md_reg[1] = 0x0068,
  718. .bank_reg = 0x0060,
  719. .mn[0] = {
  720. .mnctr_en_bit = 8,
  721. .mnctr_reset_bit = 25,
  722. .mnctr_mode_shift = 9,
  723. .n_val_shift = 20,
  724. .m_val_shift = 4,
  725. .width = 4,
  726. },
  727. .mn[1] = {
  728. .mnctr_en_bit = 5,
  729. .mnctr_reset_bit = 24,
  730. .mnctr_mode_shift = 6,
  731. .n_val_shift = 16,
  732. .m_val_shift = 4,
  733. .width = 4,
  734. },
  735. .s[0] = {
  736. .src_sel_shift = 3,
  737. .parent_map = mmcc_pxo_pll8_pll2_map,
  738. },
  739. .s[1] = {
  740. .src_sel_shift = 0,
  741. .parent_map = mmcc_pxo_pll8_pll2_map,
  742. },
  743. .mux_sel_bit = 11,
  744. .freq_tbl = clk_tbl_gfx2d,
  745. .clkr = {
  746. .enable_reg = 0x0060,
  747. .enable_mask = BIT(2),
  748. .hw.init = &(struct clk_init_data){
  749. .name = "gfx2d0_src",
  750. .parent_names = mmcc_pxo_pll8_pll2,
  751. .num_parents = 3,
  752. .ops = &clk_dyn_rcg_ops,
  753. },
  754. },
  755. };
  756. static struct clk_branch gfx2d0_clk = {
  757. .halt_reg = 0x01c8,
  758. .halt_bit = 9,
  759. .clkr = {
  760. .enable_reg = 0x0060,
  761. .enable_mask = BIT(0),
  762. .hw.init = &(struct clk_init_data){
  763. .name = "gfx2d0_clk",
  764. .parent_names = (const char *[]){ "gfx2d0_src" },
  765. .num_parents = 1,
  766. .ops = &clk_branch_ops,
  767. .flags = CLK_SET_RATE_PARENT,
  768. },
  769. },
  770. };
  771. static struct clk_dyn_rcg gfx2d1_src = {
  772. .ns_reg[0] = 0x007c,
  773. .ns_reg[1] = 0x007c,
  774. .md_reg[0] = 0x0078,
  775. .md_reg[1] = 0x006c,
  776. .bank_reg = 0x0074,
  777. .mn[0] = {
  778. .mnctr_en_bit = 8,
  779. .mnctr_reset_bit = 25,
  780. .mnctr_mode_shift = 9,
  781. .n_val_shift = 20,
  782. .m_val_shift = 4,
  783. .width = 4,
  784. },
  785. .mn[1] = {
  786. .mnctr_en_bit = 5,
  787. .mnctr_reset_bit = 24,
  788. .mnctr_mode_shift = 6,
  789. .n_val_shift = 16,
  790. .m_val_shift = 4,
  791. .width = 4,
  792. },
  793. .s[0] = {
  794. .src_sel_shift = 3,
  795. .parent_map = mmcc_pxo_pll8_pll2_map,
  796. },
  797. .s[1] = {
  798. .src_sel_shift = 0,
  799. .parent_map = mmcc_pxo_pll8_pll2_map,
  800. },
  801. .mux_sel_bit = 11,
  802. .freq_tbl = clk_tbl_gfx2d,
  803. .clkr = {
  804. .enable_reg = 0x0074,
  805. .enable_mask = BIT(2),
  806. .hw.init = &(struct clk_init_data){
  807. .name = "gfx2d1_src",
  808. .parent_names = mmcc_pxo_pll8_pll2,
  809. .num_parents = 3,
  810. .ops = &clk_dyn_rcg_ops,
  811. },
  812. },
  813. };
  814. static struct clk_branch gfx2d1_clk = {
  815. .halt_reg = 0x01c8,
  816. .halt_bit = 14,
  817. .clkr = {
  818. .enable_reg = 0x0074,
  819. .enable_mask = BIT(0),
  820. .hw.init = &(struct clk_init_data){
  821. .name = "gfx2d1_clk",
  822. .parent_names = (const char *[]){ "gfx2d1_src" },
  823. .num_parents = 1,
  824. .ops = &clk_branch_ops,
  825. .flags = CLK_SET_RATE_PARENT,
  826. },
  827. },
  828. };
  829. static struct freq_tbl clk_tbl_gfx3d[] = {
  830. F_MN( 27000000, P_PXO, 1, 0),
  831. F_MN( 48000000, P_PLL8, 1, 8),
  832. F_MN( 54857000, P_PLL8, 1, 7),
  833. F_MN( 64000000, P_PLL8, 1, 6),
  834. F_MN( 76800000, P_PLL8, 1, 5),
  835. F_MN( 96000000, P_PLL8, 1, 4),
  836. F_MN(128000000, P_PLL8, 1, 3),
  837. F_MN(145455000, P_PLL2, 2, 11),
  838. F_MN(160000000, P_PLL2, 1, 5),
  839. F_MN(177778000, P_PLL2, 2, 9),
  840. F_MN(200000000, P_PLL2, 1, 4),
  841. F_MN(228571000, P_PLL2, 2, 7),
  842. F_MN(266667000, P_PLL2, 1, 3),
  843. F_MN(300000000, P_PLL3, 1, 4),
  844. F_MN(320000000, P_PLL2, 2, 5),
  845. F_MN(400000000, P_PLL2, 1, 2),
  846. { }
  847. };
  848. static struct freq_tbl clk_tbl_gfx3d_8064[] = {
  849. F_MN( 27000000, P_PXO, 0, 0),
  850. F_MN( 48000000, P_PLL8, 1, 8),
  851. F_MN( 54857000, P_PLL8, 1, 7),
  852. F_MN( 64000000, P_PLL8, 1, 6),
  853. F_MN( 76800000, P_PLL8, 1, 5),
  854. F_MN( 96000000, P_PLL8, 1, 4),
  855. F_MN(128000000, P_PLL8, 1, 3),
  856. F_MN(145455000, P_PLL2, 2, 11),
  857. F_MN(160000000, P_PLL2, 1, 5),
  858. F_MN(177778000, P_PLL2, 2, 9),
  859. F_MN(192000000, P_PLL8, 1, 2),
  860. F_MN(200000000, P_PLL2, 1, 4),
  861. F_MN(228571000, P_PLL2, 2, 7),
  862. F_MN(266667000, P_PLL2, 1, 3),
  863. F_MN(320000000, P_PLL2, 2, 5),
  864. F_MN(400000000, P_PLL2, 1, 2),
  865. F_MN(450000000, P_PLL15, 1, 2),
  866. { }
  867. };
  868. static struct clk_dyn_rcg gfx3d_src = {
  869. .ns_reg[0] = 0x008c,
  870. .ns_reg[1] = 0x008c,
  871. .md_reg[0] = 0x0084,
  872. .md_reg[1] = 0x0088,
  873. .bank_reg = 0x0080,
  874. .mn[0] = {
  875. .mnctr_en_bit = 8,
  876. .mnctr_reset_bit = 25,
  877. .mnctr_mode_shift = 9,
  878. .n_val_shift = 18,
  879. .m_val_shift = 4,
  880. .width = 4,
  881. },
  882. .mn[1] = {
  883. .mnctr_en_bit = 5,
  884. .mnctr_reset_bit = 24,
  885. .mnctr_mode_shift = 6,
  886. .n_val_shift = 14,
  887. .m_val_shift = 4,
  888. .width = 4,
  889. },
  890. .s[0] = {
  891. .src_sel_shift = 3,
  892. .parent_map = mmcc_pxo_pll8_pll2_pll3_map,
  893. },
  894. .s[1] = {
  895. .src_sel_shift = 0,
  896. .parent_map = mmcc_pxo_pll8_pll2_pll3_map,
  897. },
  898. .mux_sel_bit = 11,
  899. .freq_tbl = clk_tbl_gfx3d,
  900. .clkr = {
  901. .enable_reg = 0x0080,
  902. .enable_mask = BIT(2),
  903. .hw.init = &(struct clk_init_data){
  904. .name = "gfx3d_src",
  905. .parent_names = mmcc_pxo_pll8_pll2_pll3,
  906. .num_parents = 4,
  907. .ops = &clk_dyn_rcg_ops,
  908. },
  909. },
  910. };
  911. static const struct clk_init_data gfx3d_8064_init = {
  912. .name = "gfx3d_src",
  913. .parent_names = mmcc_pxo_pll8_pll2_pll15,
  914. .num_parents = 4,
  915. .ops = &clk_dyn_rcg_ops,
  916. };
  917. static struct clk_branch gfx3d_clk = {
  918. .halt_reg = 0x01c8,
  919. .halt_bit = 4,
  920. .clkr = {
  921. .enable_reg = 0x0080,
  922. .enable_mask = BIT(0),
  923. .hw.init = &(struct clk_init_data){
  924. .name = "gfx3d_clk",
  925. .parent_names = (const char *[]){ "gfx3d_src" },
  926. .num_parents = 1,
  927. .ops = &clk_branch_ops,
  928. .flags = CLK_SET_RATE_PARENT,
  929. },
  930. },
  931. };
  932. static struct freq_tbl clk_tbl_vcap[] = {
  933. F_MN( 27000000, P_PXO, 0, 0),
  934. F_MN( 54860000, P_PLL8, 1, 7),
  935. F_MN( 64000000, P_PLL8, 1, 6),
  936. F_MN( 76800000, P_PLL8, 1, 5),
  937. F_MN(128000000, P_PLL8, 1, 3),
  938. F_MN(160000000, P_PLL2, 1, 5),
  939. F_MN(200000000, P_PLL2, 1, 4),
  940. { }
  941. };
  942. static struct clk_dyn_rcg vcap_src = {
  943. .ns_reg[0] = 0x021c,
  944. .ns_reg[1] = 0x021c,
  945. .md_reg[0] = 0x01ec,
  946. .md_reg[1] = 0x0218,
  947. .bank_reg = 0x0178,
  948. .mn[0] = {
  949. .mnctr_en_bit = 8,
  950. .mnctr_reset_bit = 23,
  951. .mnctr_mode_shift = 9,
  952. .n_val_shift = 18,
  953. .m_val_shift = 4,
  954. .width = 4,
  955. },
  956. .mn[1] = {
  957. .mnctr_en_bit = 5,
  958. .mnctr_reset_bit = 22,
  959. .mnctr_mode_shift = 6,
  960. .n_val_shift = 14,
  961. .m_val_shift = 4,
  962. .width = 4,
  963. },
  964. .s[0] = {
  965. .src_sel_shift = 3,
  966. .parent_map = mmcc_pxo_pll8_pll2_map,
  967. },
  968. .s[1] = {
  969. .src_sel_shift = 0,
  970. .parent_map = mmcc_pxo_pll8_pll2_map,
  971. },
  972. .mux_sel_bit = 11,
  973. .freq_tbl = clk_tbl_vcap,
  974. .clkr = {
  975. .enable_reg = 0x0178,
  976. .enable_mask = BIT(2),
  977. .hw.init = &(struct clk_init_data){
  978. .name = "vcap_src",
  979. .parent_names = mmcc_pxo_pll8_pll2,
  980. .num_parents = 3,
  981. .ops = &clk_dyn_rcg_ops,
  982. },
  983. },
  984. };
  985. static struct clk_branch vcap_clk = {
  986. .halt_reg = 0x0240,
  987. .halt_bit = 15,
  988. .clkr = {
  989. .enable_reg = 0x0178,
  990. .enable_mask = BIT(0),
  991. .hw.init = &(struct clk_init_data){
  992. .name = "vcap_clk",
  993. .parent_names = (const char *[]){ "vcap_src" },
  994. .num_parents = 1,
  995. .ops = &clk_branch_ops,
  996. .flags = CLK_SET_RATE_PARENT,
  997. },
  998. },
  999. };
  1000. static struct clk_branch vcap_npl_clk = {
  1001. .halt_reg = 0x0240,
  1002. .halt_bit = 25,
  1003. .clkr = {
  1004. .enable_reg = 0x0178,
  1005. .enable_mask = BIT(13),
  1006. .hw.init = &(struct clk_init_data){
  1007. .name = "vcap_npl_clk",
  1008. .parent_names = (const char *[]){ "vcap_src" },
  1009. .num_parents = 1,
  1010. .ops = &clk_branch_ops,
  1011. .flags = CLK_SET_RATE_PARENT,
  1012. },
  1013. },
  1014. };
  1015. static struct freq_tbl clk_tbl_ijpeg[] = {
  1016. { 27000000, P_PXO, 1, 0, 0 },
  1017. { 36570000, P_PLL8, 1, 2, 21 },
  1018. { 54860000, P_PLL8, 7, 0, 0 },
  1019. { 96000000, P_PLL8, 4, 0, 0 },
  1020. { 109710000, P_PLL8, 1, 2, 7 },
  1021. { 128000000, P_PLL8, 3, 0, 0 },
  1022. { 153600000, P_PLL8, 1, 2, 5 },
  1023. { 200000000, P_PLL2, 4, 0, 0 },
  1024. { 228571000, P_PLL2, 1, 2, 7 },
  1025. { 266667000, P_PLL2, 1, 1, 3 },
  1026. { 320000000, P_PLL2, 1, 2, 5 },
  1027. { }
  1028. };
  1029. static struct clk_rcg ijpeg_src = {
  1030. .ns_reg = 0x00a0,
  1031. .md_reg = 0x009c,
  1032. .mn = {
  1033. .mnctr_en_bit = 5,
  1034. .mnctr_reset_bit = 7,
  1035. .mnctr_mode_shift = 6,
  1036. .n_val_shift = 16,
  1037. .m_val_shift = 8,
  1038. .width = 8,
  1039. },
  1040. .p = {
  1041. .pre_div_shift = 12,
  1042. .pre_div_width = 2,
  1043. },
  1044. .s = {
  1045. .src_sel_shift = 0,
  1046. .parent_map = mmcc_pxo_pll8_pll2_map,
  1047. },
  1048. .freq_tbl = clk_tbl_ijpeg,
  1049. .clkr = {
  1050. .enable_reg = 0x0098,
  1051. .enable_mask = BIT(2),
  1052. .hw.init = &(struct clk_init_data){
  1053. .name = "ijpeg_src",
  1054. .parent_names = mmcc_pxo_pll8_pll2,
  1055. .num_parents = 3,
  1056. .ops = &clk_rcg_ops,
  1057. },
  1058. },
  1059. };
  1060. static struct clk_branch ijpeg_clk = {
  1061. .halt_reg = 0x01c8,
  1062. .halt_bit = 24,
  1063. .clkr = {
  1064. .enable_reg = 0x0098,
  1065. .enable_mask = BIT(0),
  1066. .hw.init = &(struct clk_init_data){
  1067. .name = "ijpeg_clk",
  1068. .parent_names = (const char *[]){ "ijpeg_src" },
  1069. .num_parents = 1,
  1070. .ops = &clk_branch_ops,
  1071. .flags = CLK_SET_RATE_PARENT,
  1072. },
  1073. },
  1074. };
  1075. static struct freq_tbl clk_tbl_jpegd[] = {
  1076. { 64000000, P_PLL8, 6 },
  1077. { 76800000, P_PLL8, 5 },
  1078. { 96000000, P_PLL8, 4 },
  1079. { 160000000, P_PLL2, 5 },
  1080. { 200000000, P_PLL2, 4 },
  1081. { }
  1082. };
  1083. static struct clk_rcg jpegd_src = {
  1084. .ns_reg = 0x00ac,
  1085. .p = {
  1086. .pre_div_shift = 12,
  1087. .pre_div_width = 4,
  1088. },
  1089. .s = {
  1090. .src_sel_shift = 0,
  1091. .parent_map = mmcc_pxo_pll8_pll2_map,
  1092. },
  1093. .freq_tbl = clk_tbl_jpegd,
  1094. .clkr = {
  1095. .enable_reg = 0x00a4,
  1096. .enable_mask = BIT(2),
  1097. .hw.init = &(struct clk_init_data){
  1098. .name = "jpegd_src",
  1099. .parent_names = mmcc_pxo_pll8_pll2,
  1100. .num_parents = 3,
  1101. .ops = &clk_rcg_ops,
  1102. },
  1103. },
  1104. };
  1105. static struct clk_branch jpegd_clk = {
  1106. .halt_reg = 0x01c8,
  1107. .halt_bit = 19,
  1108. .clkr = {
  1109. .enable_reg = 0x00a4,
  1110. .enable_mask = BIT(0),
  1111. .hw.init = &(struct clk_init_data){
  1112. .name = "jpegd_clk",
  1113. .parent_names = (const char *[]){ "jpegd_src" },
  1114. .num_parents = 1,
  1115. .ops = &clk_branch_ops,
  1116. .flags = CLK_SET_RATE_PARENT,
  1117. },
  1118. },
  1119. };
  1120. static struct freq_tbl clk_tbl_mdp[] = {
  1121. { 9600000, P_PLL8, 1, 1, 40 },
  1122. { 13710000, P_PLL8, 1, 1, 28 },
  1123. { 27000000, P_PXO, 1, 0, 0 },
  1124. { 29540000, P_PLL8, 1, 1, 13 },
  1125. { 34910000, P_PLL8, 1, 1, 11 },
  1126. { 38400000, P_PLL8, 1, 1, 10 },
  1127. { 59080000, P_PLL8, 1, 2, 13 },
  1128. { 76800000, P_PLL8, 1, 1, 5 },
  1129. { 85330000, P_PLL8, 1, 2, 9 },
  1130. { 96000000, P_PLL8, 1, 1, 4 },
  1131. { 128000000, P_PLL8, 1, 1, 3 },
  1132. { 160000000, P_PLL2, 1, 1, 5 },
  1133. { 177780000, P_PLL2, 1, 2, 9 },
  1134. { 200000000, P_PLL2, 1, 1, 4 },
  1135. { 228571000, P_PLL2, 1, 2, 7 },
  1136. { 266667000, P_PLL2, 1, 1, 3 },
  1137. { }
  1138. };
  1139. static struct clk_dyn_rcg mdp_src = {
  1140. .ns_reg[0] = 0x00d0,
  1141. .ns_reg[1] = 0x00d0,
  1142. .md_reg[0] = 0x00c4,
  1143. .md_reg[1] = 0x00c8,
  1144. .bank_reg = 0x00c0,
  1145. .mn[0] = {
  1146. .mnctr_en_bit = 8,
  1147. .mnctr_reset_bit = 31,
  1148. .mnctr_mode_shift = 9,
  1149. .n_val_shift = 22,
  1150. .m_val_shift = 8,
  1151. .width = 8,
  1152. },
  1153. .mn[1] = {
  1154. .mnctr_en_bit = 5,
  1155. .mnctr_reset_bit = 30,
  1156. .mnctr_mode_shift = 6,
  1157. .n_val_shift = 14,
  1158. .m_val_shift = 8,
  1159. .width = 8,
  1160. },
  1161. .s[0] = {
  1162. .src_sel_shift = 3,
  1163. .parent_map = mmcc_pxo_pll8_pll2_map,
  1164. },
  1165. .s[1] = {
  1166. .src_sel_shift = 0,
  1167. .parent_map = mmcc_pxo_pll8_pll2_map,
  1168. },
  1169. .mux_sel_bit = 11,
  1170. .freq_tbl = clk_tbl_mdp,
  1171. .clkr = {
  1172. .enable_reg = 0x00c0,
  1173. .enable_mask = BIT(2),
  1174. .hw.init = &(struct clk_init_data){
  1175. .name = "mdp_src",
  1176. .parent_names = mmcc_pxo_pll8_pll2,
  1177. .num_parents = 3,
  1178. .ops = &clk_dyn_rcg_ops,
  1179. },
  1180. },
  1181. };
  1182. static struct clk_branch mdp_clk = {
  1183. .halt_reg = 0x01d0,
  1184. .halt_bit = 10,
  1185. .clkr = {
  1186. .enable_reg = 0x00c0,
  1187. .enable_mask = BIT(0),
  1188. .hw.init = &(struct clk_init_data){
  1189. .name = "mdp_clk",
  1190. .parent_names = (const char *[]){ "mdp_src" },
  1191. .num_parents = 1,
  1192. .ops = &clk_branch_ops,
  1193. .flags = CLK_SET_RATE_PARENT,
  1194. },
  1195. },
  1196. };
  1197. static struct clk_branch mdp_lut_clk = {
  1198. .halt_reg = 0x01e8,
  1199. .halt_bit = 13,
  1200. .clkr = {
  1201. .enable_reg = 0x016c,
  1202. .enable_mask = BIT(0),
  1203. .hw.init = &(struct clk_init_data){
  1204. .parent_names = (const char *[]){ "mdp_src" },
  1205. .num_parents = 1,
  1206. .name = "mdp_lut_clk",
  1207. .ops = &clk_branch_ops,
  1208. .flags = CLK_SET_RATE_PARENT,
  1209. },
  1210. },
  1211. };
  1212. static struct clk_branch mdp_vsync_clk = {
  1213. .halt_reg = 0x01cc,
  1214. .halt_bit = 22,
  1215. .clkr = {
  1216. .enable_reg = 0x0058,
  1217. .enable_mask = BIT(6),
  1218. .hw.init = &(struct clk_init_data){
  1219. .name = "mdp_vsync_clk",
  1220. .parent_names = (const char *[]){ "pxo" },
  1221. .num_parents = 1,
  1222. .ops = &clk_branch_ops
  1223. },
  1224. },
  1225. };
  1226. static struct freq_tbl clk_tbl_rot[] = {
  1227. { 27000000, P_PXO, 1 },
  1228. { 29540000, P_PLL8, 13 },
  1229. { 32000000, P_PLL8, 12 },
  1230. { 38400000, P_PLL8, 10 },
  1231. { 48000000, P_PLL8, 8 },
  1232. { 54860000, P_PLL8, 7 },
  1233. { 64000000, P_PLL8, 6 },
  1234. { 76800000, P_PLL8, 5 },
  1235. { 96000000, P_PLL8, 4 },
  1236. { 100000000, P_PLL2, 8 },
  1237. { 114290000, P_PLL2, 7 },
  1238. { 133330000, P_PLL2, 6 },
  1239. { 160000000, P_PLL2, 5 },
  1240. { 200000000, P_PLL2, 4 },
  1241. { }
  1242. };
  1243. static struct clk_dyn_rcg rot_src = {
  1244. .ns_reg[0] = 0x00e8,
  1245. .ns_reg[1] = 0x00e8,
  1246. .bank_reg = 0x00e8,
  1247. .p[0] = {
  1248. .pre_div_shift = 22,
  1249. .pre_div_width = 4,
  1250. },
  1251. .p[1] = {
  1252. .pre_div_shift = 26,
  1253. .pre_div_width = 4,
  1254. },
  1255. .s[0] = {
  1256. .src_sel_shift = 16,
  1257. .parent_map = mmcc_pxo_pll8_pll2_map,
  1258. },
  1259. .s[1] = {
  1260. .src_sel_shift = 19,
  1261. .parent_map = mmcc_pxo_pll8_pll2_map,
  1262. },
  1263. .mux_sel_bit = 30,
  1264. .freq_tbl = clk_tbl_rot,
  1265. .clkr = {
  1266. .enable_reg = 0x00e0,
  1267. .enable_mask = BIT(2),
  1268. .hw.init = &(struct clk_init_data){
  1269. .name = "rot_src",
  1270. .parent_names = mmcc_pxo_pll8_pll2,
  1271. .num_parents = 3,
  1272. .ops = &clk_dyn_rcg_ops,
  1273. },
  1274. },
  1275. };
  1276. static struct clk_branch rot_clk = {
  1277. .halt_reg = 0x01d0,
  1278. .halt_bit = 15,
  1279. .clkr = {
  1280. .enable_reg = 0x00e0,
  1281. .enable_mask = BIT(0),
  1282. .hw.init = &(struct clk_init_data){
  1283. .name = "rot_clk",
  1284. .parent_names = (const char *[]){ "rot_src" },
  1285. .num_parents = 1,
  1286. .ops = &clk_branch_ops,
  1287. .flags = CLK_SET_RATE_PARENT,
  1288. },
  1289. },
  1290. };
  1291. #define P_HDMI_PLL 1
  1292. static u8 mmcc_pxo_hdmi_map[] = {
  1293. [P_PXO] = 0,
  1294. [P_HDMI_PLL] = 3,
  1295. };
  1296. static const char *mmcc_pxo_hdmi[] = {
  1297. "pxo",
  1298. "hdmi_pll",
  1299. };
  1300. static struct freq_tbl clk_tbl_tv[] = {
  1301. { .src = P_HDMI_PLL, .pre_div = 1 },
  1302. { }
  1303. };
  1304. static struct clk_rcg tv_src = {
  1305. .ns_reg = 0x00f4,
  1306. .md_reg = 0x00f0,
  1307. .mn = {
  1308. .mnctr_en_bit = 5,
  1309. .mnctr_reset_bit = 7,
  1310. .mnctr_mode_shift = 6,
  1311. .n_val_shift = 16,
  1312. .m_val_shift = 8,
  1313. .width = 8,
  1314. },
  1315. .p = {
  1316. .pre_div_shift = 14,
  1317. .pre_div_width = 2,
  1318. },
  1319. .s = {
  1320. .src_sel_shift = 0,
  1321. .parent_map = mmcc_pxo_hdmi_map,
  1322. },
  1323. .freq_tbl = clk_tbl_tv,
  1324. .clkr = {
  1325. .enable_reg = 0x00ec,
  1326. .enable_mask = BIT(2),
  1327. .hw.init = &(struct clk_init_data){
  1328. .name = "tv_src",
  1329. .parent_names = mmcc_pxo_hdmi,
  1330. .num_parents = 2,
  1331. .ops = &clk_rcg_bypass_ops,
  1332. .flags = CLK_SET_RATE_PARENT,
  1333. },
  1334. },
  1335. };
  1336. static const char *tv_src_name[] = { "tv_src" };
  1337. static struct clk_branch tv_enc_clk = {
  1338. .halt_reg = 0x01d4,
  1339. .halt_bit = 9,
  1340. .clkr = {
  1341. .enable_reg = 0x00ec,
  1342. .enable_mask = BIT(8),
  1343. .hw.init = &(struct clk_init_data){
  1344. .parent_names = tv_src_name,
  1345. .num_parents = 1,
  1346. .name = "tv_enc_clk",
  1347. .ops = &clk_branch_ops,
  1348. .flags = CLK_SET_RATE_PARENT,
  1349. },
  1350. },
  1351. };
  1352. static struct clk_branch tv_dac_clk = {
  1353. .halt_reg = 0x01d4,
  1354. .halt_bit = 10,
  1355. .clkr = {
  1356. .enable_reg = 0x00ec,
  1357. .enable_mask = BIT(10),
  1358. .hw.init = &(struct clk_init_data){
  1359. .parent_names = tv_src_name,
  1360. .num_parents = 1,
  1361. .name = "tv_dac_clk",
  1362. .ops = &clk_branch_ops,
  1363. .flags = CLK_SET_RATE_PARENT,
  1364. },
  1365. },
  1366. };
  1367. static struct clk_branch mdp_tv_clk = {
  1368. .halt_reg = 0x01d4,
  1369. .halt_bit = 12,
  1370. .clkr = {
  1371. .enable_reg = 0x00ec,
  1372. .enable_mask = BIT(0),
  1373. .hw.init = &(struct clk_init_data){
  1374. .parent_names = tv_src_name,
  1375. .num_parents = 1,
  1376. .name = "mdp_tv_clk",
  1377. .ops = &clk_branch_ops,
  1378. .flags = CLK_SET_RATE_PARENT,
  1379. },
  1380. },
  1381. };
  1382. static struct clk_branch hdmi_tv_clk = {
  1383. .halt_reg = 0x01d4,
  1384. .halt_bit = 11,
  1385. .clkr = {
  1386. .enable_reg = 0x00ec,
  1387. .enable_mask = BIT(12),
  1388. .hw.init = &(struct clk_init_data){
  1389. .parent_names = tv_src_name,
  1390. .num_parents = 1,
  1391. .name = "hdmi_tv_clk",
  1392. .ops = &clk_branch_ops,
  1393. .flags = CLK_SET_RATE_PARENT,
  1394. },
  1395. },
  1396. };
  1397. static struct clk_branch rgb_tv_clk = {
  1398. .halt_reg = 0x0240,
  1399. .halt_bit = 27,
  1400. .clkr = {
  1401. .enable_reg = 0x0124,
  1402. .enable_mask = BIT(14),
  1403. .hw.init = &(struct clk_init_data){
  1404. .parent_names = tv_src_name,
  1405. .num_parents = 1,
  1406. .name = "rgb_tv_clk",
  1407. .ops = &clk_branch_ops,
  1408. .flags = CLK_SET_RATE_PARENT,
  1409. },
  1410. },
  1411. };
  1412. static struct clk_branch npl_tv_clk = {
  1413. .halt_reg = 0x0240,
  1414. .halt_bit = 26,
  1415. .clkr = {
  1416. .enable_reg = 0x0124,
  1417. .enable_mask = BIT(16),
  1418. .hw.init = &(struct clk_init_data){
  1419. .parent_names = tv_src_name,
  1420. .num_parents = 1,
  1421. .name = "npl_tv_clk",
  1422. .ops = &clk_branch_ops,
  1423. .flags = CLK_SET_RATE_PARENT,
  1424. },
  1425. },
  1426. };
  1427. static struct clk_branch hdmi_app_clk = {
  1428. .halt_reg = 0x01cc,
  1429. .halt_bit = 25,
  1430. .clkr = {
  1431. .enable_reg = 0x005c,
  1432. .enable_mask = BIT(11),
  1433. .hw.init = &(struct clk_init_data){
  1434. .parent_names = (const char *[]){ "pxo" },
  1435. .num_parents = 1,
  1436. .name = "hdmi_app_clk",
  1437. .ops = &clk_branch_ops,
  1438. },
  1439. },
  1440. };
  1441. static struct freq_tbl clk_tbl_vcodec[] = {
  1442. F_MN( 27000000, P_PXO, 1, 0),
  1443. F_MN( 32000000, P_PLL8, 1, 12),
  1444. F_MN( 48000000, P_PLL8, 1, 8),
  1445. F_MN( 54860000, P_PLL8, 1, 7),
  1446. F_MN( 96000000, P_PLL8, 1, 4),
  1447. F_MN(133330000, P_PLL2, 1, 6),
  1448. F_MN(200000000, P_PLL2, 1, 4),
  1449. F_MN(228570000, P_PLL2, 2, 7),
  1450. F_MN(266670000, P_PLL2, 1, 3),
  1451. { }
  1452. };
  1453. static struct clk_dyn_rcg vcodec_src = {
  1454. .ns_reg[0] = 0x0100,
  1455. .ns_reg[1] = 0x0100,
  1456. .md_reg[0] = 0x00fc,
  1457. .md_reg[1] = 0x0128,
  1458. .bank_reg = 0x00f8,
  1459. .mn[0] = {
  1460. .mnctr_en_bit = 5,
  1461. .mnctr_reset_bit = 31,
  1462. .mnctr_mode_shift = 6,
  1463. .n_val_shift = 11,
  1464. .m_val_shift = 8,
  1465. .width = 8,
  1466. },
  1467. .mn[1] = {
  1468. .mnctr_en_bit = 10,
  1469. .mnctr_reset_bit = 30,
  1470. .mnctr_mode_shift = 11,
  1471. .n_val_shift = 19,
  1472. .m_val_shift = 8,
  1473. .width = 8,
  1474. },
  1475. .s[0] = {
  1476. .src_sel_shift = 27,
  1477. .parent_map = mmcc_pxo_pll8_pll2_map,
  1478. },
  1479. .s[1] = {
  1480. .src_sel_shift = 0,
  1481. .parent_map = mmcc_pxo_pll8_pll2_map,
  1482. },
  1483. .mux_sel_bit = 13,
  1484. .freq_tbl = clk_tbl_vcodec,
  1485. .clkr = {
  1486. .enable_reg = 0x00f8,
  1487. .enable_mask = BIT(2),
  1488. .hw.init = &(struct clk_init_data){
  1489. .name = "vcodec_src",
  1490. .parent_names = mmcc_pxo_pll8_pll2,
  1491. .num_parents = 3,
  1492. .ops = &clk_dyn_rcg_ops,
  1493. },
  1494. },
  1495. };
  1496. static struct clk_branch vcodec_clk = {
  1497. .halt_reg = 0x01d0,
  1498. .halt_bit = 29,
  1499. .clkr = {
  1500. .enable_reg = 0x00f8,
  1501. .enable_mask = BIT(0),
  1502. .hw.init = &(struct clk_init_data){
  1503. .name = "vcodec_clk",
  1504. .parent_names = (const char *[]){ "vcodec_src" },
  1505. .num_parents = 1,
  1506. .ops = &clk_branch_ops,
  1507. .flags = CLK_SET_RATE_PARENT,
  1508. },
  1509. },
  1510. };
  1511. static struct freq_tbl clk_tbl_vpe[] = {
  1512. { 27000000, P_PXO, 1 },
  1513. { 34909000, P_PLL8, 11 },
  1514. { 38400000, P_PLL8, 10 },
  1515. { 64000000, P_PLL8, 6 },
  1516. { 76800000, P_PLL8, 5 },
  1517. { 96000000, P_PLL8, 4 },
  1518. { 100000000, P_PLL2, 8 },
  1519. { 160000000, P_PLL2, 5 },
  1520. { }
  1521. };
  1522. static struct clk_rcg vpe_src = {
  1523. .ns_reg = 0x0118,
  1524. .p = {
  1525. .pre_div_shift = 12,
  1526. .pre_div_width = 4,
  1527. },
  1528. .s = {
  1529. .src_sel_shift = 0,
  1530. .parent_map = mmcc_pxo_pll8_pll2_map,
  1531. },
  1532. .freq_tbl = clk_tbl_vpe,
  1533. .clkr = {
  1534. .enable_reg = 0x0110,
  1535. .enable_mask = BIT(2),
  1536. .hw.init = &(struct clk_init_data){
  1537. .name = "vpe_src",
  1538. .parent_names = mmcc_pxo_pll8_pll2,
  1539. .num_parents = 3,
  1540. .ops = &clk_rcg_ops,
  1541. },
  1542. },
  1543. };
  1544. static struct clk_branch vpe_clk = {
  1545. .halt_reg = 0x01c8,
  1546. .halt_bit = 28,
  1547. .clkr = {
  1548. .enable_reg = 0x0110,
  1549. .enable_mask = BIT(0),
  1550. .hw.init = &(struct clk_init_data){
  1551. .name = "vpe_clk",
  1552. .parent_names = (const char *[]){ "vpe_src" },
  1553. .num_parents = 1,
  1554. .ops = &clk_branch_ops,
  1555. .flags = CLK_SET_RATE_PARENT,
  1556. },
  1557. },
  1558. };
  1559. static struct freq_tbl clk_tbl_vfe[] = {
  1560. { 13960000, P_PLL8, 1, 2, 55 },
  1561. { 27000000, P_PXO, 1, 0, 0 },
  1562. { 36570000, P_PLL8, 1, 2, 21 },
  1563. { 38400000, P_PLL8, 2, 1, 5 },
  1564. { 45180000, P_PLL8, 1, 2, 17 },
  1565. { 48000000, P_PLL8, 2, 1, 4 },
  1566. { 54860000, P_PLL8, 1, 1, 7 },
  1567. { 64000000, P_PLL8, 2, 1, 3 },
  1568. { 76800000, P_PLL8, 1, 1, 5 },
  1569. { 96000000, P_PLL8, 2, 1, 2 },
  1570. { 109710000, P_PLL8, 1, 2, 7 },
  1571. { 128000000, P_PLL8, 1, 1, 3 },
  1572. { 153600000, P_PLL8, 1, 2, 5 },
  1573. { 200000000, P_PLL2, 2, 1, 2 },
  1574. { 228570000, P_PLL2, 1, 2, 7 },
  1575. { 266667000, P_PLL2, 1, 1, 3 },
  1576. { 320000000, P_PLL2, 1, 2, 5 },
  1577. { }
  1578. };
  1579. static struct clk_rcg vfe_src = {
  1580. .ns_reg = 0x0108,
  1581. .mn = {
  1582. .mnctr_en_bit = 5,
  1583. .mnctr_reset_bit = 7,
  1584. .mnctr_mode_shift = 6,
  1585. .n_val_shift = 16,
  1586. .m_val_shift = 8,
  1587. .width = 8,
  1588. },
  1589. .p = {
  1590. .pre_div_shift = 10,
  1591. .pre_div_width = 1,
  1592. },
  1593. .s = {
  1594. .src_sel_shift = 0,
  1595. .parent_map = mmcc_pxo_pll8_pll2_map,
  1596. },
  1597. .freq_tbl = clk_tbl_vfe,
  1598. .clkr = {
  1599. .enable_reg = 0x0104,
  1600. .enable_mask = BIT(2),
  1601. .hw.init = &(struct clk_init_data){
  1602. .name = "vfe_src",
  1603. .parent_names = mmcc_pxo_pll8_pll2,
  1604. .num_parents = 3,
  1605. .ops = &clk_rcg_ops,
  1606. },
  1607. },
  1608. };
  1609. static struct clk_branch vfe_clk = {
  1610. .halt_reg = 0x01cc,
  1611. .halt_bit = 6,
  1612. .clkr = {
  1613. .enable_reg = 0x0104,
  1614. .enable_mask = BIT(0),
  1615. .hw.init = &(struct clk_init_data){
  1616. .name = "vfe_clk",
  1617. .parent_names = (const char *[]){ "vfe_src" },
  1618. .num_parents = 1,
  1619. .ops = &clk_branch_ops,
  1620. .flags = CLK_SET_RATE_PARENT,
  1621. },
  1622. },
  1623. };
  1624. static struct clk_branch vfe_csi_clk = {
  1625. .halt_reg = 0x01cc,
  1626. .halt_bit = 8,
  1627. .clkr = {
  1628. .enable_reg = 0x0104,
  1629. .enable_mask = BIT(12),
  1630. .hw.init = &(struct clk_init_data){
  1631. .parent_names = (const char *[]){ "vfe_src" },
  1632. .num_parents = 1,
  1633. .name = "vfe_csi_clk",
  1634. .ops = &clk_branch_ops,
  1635. .flags = CLK_SET_RATE_PARENT,
  1636. },
  1637. },
  1638. };
  1639. static struct clk_branch gmem_axi_clk = {
  1640. .halt_reg = 0x01d8,
  1641. .halt_bit = 6,
  1642. .clkr = {
  1643. .enable_reg = 0x0018,
  1644. .enable_mask = BIT(24),
  1645. .hw.init = &(struct clk_init_data){
  1646. .name = "gmem_axi_clk",
  1647. .ops = &clk_branch_ops,
  1648. .flags = CLK_IS_ROOT,
  1649. },
  1650. },
  1651. };
  1652. static struct clk_branch ijpeg_axi_clk = {
  1653. .hwcg_reg = 0x0018,
  1654. .hwcg_bit = 11,
  1655. .halt_reg = 0x01d8,
  1656. .halt_bit = 4,
  1657. .clkr = {
  1658. .enable_reg = 0x0018,
  1659. .enable_mask = BIT(21),
  1660. .hw.init = &(struct clk_init_data){
  1661. .name = "ijpeg_axi_clk",
  1662. .ops = &clk_branch_ops,
  1663. .flags = CLK_IS_ROOT,
  1664. },
  1665. },
  1666. };
  1667. static struct clk_branch mmss_imem_axi_clk = {
  1668. .hwcg_reg = 0x0018,
  1669. .hwcg_bit = 15,
  1670. .halt_reg = 0x01d8,
  1671. .halt_bit = 7,
  1672. .clkr = {
  1673. .enable_reg = 0x0018,
  1674. .enable_mask = BIT(22),
  1675. .hw.init = &(struct clk_init_data){
  1676. .name = "mmss_imem_axi_clk",
  1677. .ops = &clk_branch_ops,
  1678. .flags = CLK_IS_ROOT,
  1679. },
  1680. },
  1681. };
  1682. static struct clk_branch jpegd_axi_clk = {
  1683. .halt_reg = 0x01d8,
  1684. .halt_bit = 5,
  1685. .clkr = {
  1686. .enable_reg = 0x0018,
  1687. .enable_mask = BIT(25),
  1688. .hw.init = &(struct clk_init_data){
  1689. .name = "jpegd_axi_clk",
  1690. .ops = &clk_branch_ops,
  1691. .flags = CLK_IS_ROOT,
  1692. },
  1693. },
  1694. };
  1695. static struct clk_branch vcodec_axi_b_clk = {
  1696. .hwcg_reg = 0x0114,
  1697. .hwcg_bit = 22,
  1698. .halt_reg = 0x01e8,
  1699. .halt_bit = 25,
  1700. .clkr = {
  1701. .enable_reg = 0x0114,
  1702. .enable_mask = BIT(23),
  1703. .hw.init = &(struct clk_init_data){
  1704. .name = "vcodec_axi_b_clk",
  1705. .ops = &clk_branch_ops,
  1706. .flags = CLK_IS_ROOT,
  1707. },
  1708. },
  1709. };
  1710. static struct clk_branch vcodec_axi_a_clk = {
  1711. .hwcg_reg = 0x0114,
  1712. .hwcg_bit = 24,
  1713. .halt_reg = 0x01e8,
  1714. .halt_bit = 26,
  1715. .clkr = {
  1716. .enable_reg = 0x0114,
  1717. .enable_mask = BIT(25),
  1718. .hw.init = &(struct clk_init_data){
  1719. .name = "vcodec_axi_a_clk",
  1720. .ops = &clk_branch_ops,
  1721. .flags = CLK_IS_ROOT,
  1722. },
  1723. },
  1724. };
  1725. static struct clk_branch vcodec_axi_clk = {
  1726. .hwcg_reg = 0x0018,
  1727. .hwcg_bit = 13,
  1728. .halt_reg = 0x01d8,
  1729. .halt_bit = 3,
  1730. .clkr = {
  1731. .enable_reg = 0x0018,
  1732. .enable_mask = BIT(19),
  1733. .hw.init = &(struct clk_init_data){
  1734. .name = "vcodec_axi_clk",
  1735. .ops = &clk_branch_ops,
  1736. .flags = CLK_IS_ROOT,
  1737. },
  1738. },
  1739. };
  1740. static struct clk_branch vfe_axi_clk = {
  1741. .halt_reg = 0x01d8,
  1742. .halt_bit = 0,
  1743. .clkr = {
  1744. .enable_reg = 0x0018,
  1745. .enable_mask = BIT(18),
  1746. .hw.init = &(struct clk_init_data){
  1747. .name = "vfe_axi_clk",
  1748. .ops = &clk_branch_ops,
  1749. .flags = CLK_IS_ROOT,
  1750. },
  1751. },
  1752. };
  1753. static struct clk_branch mdp_axi_clk = {
  1754. .hwcg_reg = 0x0018,
  1755. .hwcg_bit = 16,
  1756. .halt_reg = 0x01d8,
  1757. .halt_bit = 8,
  1758. .clkr = {
  1759. .enable_reg = 0x0018,
  1760. .enable_mask = BIT(23),
  1761. .hw.init = &(struct clk_init_data){
  1762. .name = "mdp_axi_clk",
  1763. .ops = &clk_branch_ops,
  1764. .flags = CLK_IS_ROOT,
  1765. },
  1766. },
  1767. };
  1768. static struct clk_branch rot_axi_clk = {
  1769. .hwcg_reg = 0x0020,
  1770. .hwcg_bit = 25,
  1771. .halt_reg = 0x01d8,
  1772. .halt_bit = 2,
  1773. .clkr = {
  1774. .enable_reg = 0x0020,
  1775. .enable_mask = BIT(24),
  1776. .hw.init = &(struct clk_init_data){
  1777. .name = "rot_axi_clk",
  1778. .ops = &clk_branch_ops,
  1779. .flags = CLK_IS_ROOT,
  1780. },
  1781. },
  1782. };
  1783. static struct clk_branch vcap_axi_clk = {
  1784. .halt_reg = 0x0240,
  1785. .halt_bit = 20,
  1786. .hwcg_reg = 0x0244,
  1787. .hwcg_bit = 11,
  1788. .clkr = {
  1789. .enable_reg = 0x0244,
  1790. .enable_mask = BIT(12),
  1791. .hw.init = &(struct clk_init_data){
  1792. .name = "vcap_axi_clk",
  1793. .ops = &clk_branch_ops,
  1794. .flags = CLK_IS_ROOT,
  1795. },
  1796. },
  1797. };
  1798. static struct clk_branch vpe_axi_clk = {
  1799. .hwcg_reg = 0x0020,
  1800. .hwcg_bit = 27,
  1801. .halt_reg = 0x01d8,
  1802. .halt_bit = 1,
  1803. .clkr = {
  1804. .enable_reg = 0x0020,
  1805. .enable_mask = BIT(26),
  1806. .hw.init = &(struct clk_init_data){
  1807. .name = "vpe_axi_clk",
  1808. .ops = &clk_branch_ops,
  1809. .flags = CLK_IS_ROOT,
  1810. },
  1811. },
  1812. };
  1813. static struct clk_branch gfx3d_axi_clk = {
  1814. .hwcg_reg = 0x0244,
  1815. .hwcg_bit = 24,
  1816. .halt_reg = 0x0240,
  1817. .halt_bit = 30,
  1818. .clkr = {
  1819. .enable_reg = 0x0244,
  1820. .enable_mask = BIT(25),
  1821. .hw.init = &(struct clk_init_data){
  1822. .name = "gfx3d_axi_clk",
  1823. .ops = &clk_branch_ops,
  1824. .flags = CLK_IS_ROOT,
  1825. },
  1826. },
  1827. };
  1828. static struct clk_branch amp_ahb_clk = {
  1829. .halt_reg = 0x01dc,
  1830. .halt_bit = 18,
  1831. .clkr = {
  1832. .enable_reg = 0x0008,
  1833. .enable_mask = BIT(24),
  1834. .hw.init = &(struct clk_init_data){
  1835. .name = "amp_ahb_clk",
  1836. .ops = &clk_branch_ops,
  1837. .flags = CLK_IS_ROOT,
  1838. },
  1839. },
  1840. };
  1841. static struct clk_branch csi_ahb_clk = {
  1842. .halt_reg = 0x01dc,
  1843. .halt_bit = 16,
  1844. .clkr = {
  1845. .enable_reg = 0x0008,
  1846. .enable_mask = BIT(7),
  1847. .hw.init = &(struct clk_init_data){
  1848. .name = "csi_ahb_clk",
  1849. .ops = &clk_branch_ops,
  1850. .flags = CLK_IS_ROOT
  1851. },
  1852. },
  1853. };
  1854. static struct clk_branch dsi_m_ahb_clk = {
  1855. .halt_reg = 0x01dc,
  1856. .halt_bit = 19,
  1857. .clkr = {
  1858. .enable_reg = 0x0008,
  1859. .enable_mask = BIT(9),
  1860. .hw.init = &(struct clk_init_data){
  1861. .name = "dsi_m_ahb_clk",
  1862. .ops = &clk_branch_ops,
  1863. .flags = CLK_IS_ROOT,
  1864. },
  1865. },
  1866. };
  1867. static struct clk_branch dsi_s_ahb_clk = {
  1868. .hwcg_reg = 0x0038,
  1869. .hwcg_bit = 20,
  1870. .halt_reg = 0x01dc,
  1871. .halt_bit = 21,
  1872. .clkr = {
  1873. .enable_reg = 0x0008,
  1874. .enable_mask = BIT(18),
  1875. .hw.init = &(struct clk_init_data){
  1876. .name = "dsi_s_ahb_clk",
  1877. .ops = &clk_branch_ops,
  1878. .flags = CLK_IS_ROOT,
  1879. },
  1880. },
  1881. };
  1882. static struct clk_branch dsi2_m_ahb_clk = {
  1883. .halt_reg = 0x01d8,
  1884. .halt_bit = 18,
  1885. .clkr = {
  1886. .enable_reg = 0x0008,
  1887. .enable_mask = BIT(17),
  1888. .hw.init = &(struct clk_init_data){
  1889. .name = "dsi2_m_ahb_clk",
  1890. .ops = &clk_branch_ops,
  1891. .flags = CLK_IS_ROOT
  1892. },
  1893. },
  1894. };
  1895. static struct clk_branch dsi2_s_ahb_clk = {
  1896. .hwcg_reg = 0x0038,
  1897. .hwcg_bit = 15,
  1898. .halt_reg = 0x01dc,
  1899. .halt_bit = 20,
  1900. .clkr = {
  1901. .enable_reg = 0x0008,
  1902. .enable_mask = BIT(22),
  1903. .hw.init = &(struct clk_init_data){
  1904. .name = "dsi2_s_ahb_clk",
  1905. .ops = &clk_branch_ops,
  1906. .flags = CLK_IS_ROOT,
  1907. },
  1908. },
  1909. };
  1910. static struct clk_branch gfx2d0_ahb_clk = {
  1911. .hwcg_reg = 0x0038,
  1912. .hwcg_bit = 28,
  1913. .halt_reg = 0x01dc,
  1914. .halt_bit = 2,
  1915. .clkr = {
  1916. .enable_reg = 0x0008,
  1917. .enable_mask = BIT(19),
  1918. .hw.init = &(struct clk_init_data){
  1919. .name = "gfx2d0_ahb_clk",
  1920. .ops = &clk_branch_ops,
  1921. .flags = CLK_IS_ROOT,
  1922. },
  1923. },
  1924. };
  1925. static struct clk_branch gfx2d1_ahb_clk = {
  1926. .hwcg_reg = 0x0038,
  1927. .hwcg_bit = 29,
  1928. .halt_reg = 0x01dc,
  1929. .halt_bit = 3,
  1930. .clkr = {
  1931. .enable_reg = 0x0008,
  1932. .enable_mask = BIT(2),
  1933. .hw.init = &(struct clk_init_data){
  1934. .name = "gfx2d1_ahb_clk",
  1935. .ops = &clk_branch_ops,
  1936. .flags = CLK_IS_ROOT,
  1937. },
  1938. },
  1939. };
  1940. static struct clk_branch gfx3d_ahb_clk = {
  1941. .hwcg_reg = 0x0038,
  1942. .hwcg_bit = 27,
  1943. .halt_reg = 0x01dc,
  1944. .halt_bit = 4,
  1945. .clkr = {
  1946. .enable_reg = 0x0008,
  1947. .enable_mask = BIT(3),
  1948. .hw.init = &(struct clk_init_data){
  1949. .name = "gfx3d_ahb_clk",
  1950. .ops = &clk_branch_ops,
  1951. .flags = CLK_IS_ROOT,
  1952. },
  1953. },
  1954. };
  1955. static struct clk_branch hdmi_m_ahb_clk = {
  1956. .hwcg_reg = 0x0038,
  1957. .hwcg_bit = 21,
  1958. .halt_reg = 0x01dc,
  1959. .halt_bit = 5,
  1960. .clkr = {
  1961. .enable_reg = 0x0008,
  1962. .enable_mask = BIT(14),
  1963. .hw.init = &(struct clk_init_data){
  1964. .name = "hdmi_m_ahb_clk",
  1965. .ops = &clk_branch_ops,
  1966. .flags = CLK_IS_ROOT,
  1967. },
  1968. },
  1969. };
  1970. static struct clk_branch hdmi_s_ahb_clk = {
  1971. .hwcg_reg = 0x0038,
  1972. .hwcg_bit = 22,
  1973. .halt_reg = 0x01dc,
  1974. .halt_bit = 6,
  1975. .clkr = {
  1976. .enable_reg = 0x0008,
  1977. .enable_mask = BIT(4),
  1978. .hw.init = &(struct clk_init_data){
  1979. .name = "hdmi_s_ahb_clk",
  1980. .ops = &clk_branch_ops,
  1981. .flags = CLK_IS_ROOT,
  1982. },
  1983. },
  1984. };
  1985. static struct clk_branch ijpeg_ahb_clk = {
  1986. .halt_reg = 0x01dc,
  1987. .halt_bit = 9,
  1988. .clkr = {
  1989. .enable_reg = 0x0008,
  1990. .enable_mask = BIT(5),
  1991. .hw.init = &(struct clk_init_data){
  1992. .name = "ijpeg_ahb_clk",
  1993. .ops = &clk_branch_ops,
  1994. .flags = CLK_IS_ROOT
  1995. },
  1996. },
  1997. };
  1998. static struct clk_branch mmss_imem_ahb_clk = {
  1999. .hwcg_reg = 0x0038,
  2000. .hwcg_bit = 12,
  2001. .halt_reg = 0x01dc,
  2002. .halt_bit = 10,
  2003. .clkr = {
  2004. .enable_reg = 0x0008,
  2005. .enable_mask = BIT(6),
  2006. .hw.init = &(struct clk_init_data){
  2007. .name = "mmss_imem_ahb_clk",
  2008. .ops = &clk_branch_ops,
  2009. .flags = CLK_IS_ROOT
  2010. },
  2011. },
  2012. };
  2013. static struct clk_branch jpegd_ahb_clk = {
  2014. .halt_reg = 0x01dc,
  2015. .halt_bit = 7,
  2016. .clkr = {
  2017. .enable_reg = 0x0008,
  2018. .enable_mask = BIT(21),
  2019. .hw.init = &(struct clk_init_data){
  2020. .name = "jpegd_ahb_clk",
  2021. .ops = &clk_branch_ops,
  2022. .flags = CLK_IS_ROOT,
  2023. },
  2024. },
  2025. };
  2026. static struct clk_branch mdp_ahb_clk = {
  2027. .halt_reg = 0x01dc,
  2028. .halt_bit = 11,
  2029. .clkr = {
  2030. .enable_reg = 0x0008,
  2031. .enable_mask = BIT(10),
  2032. .hw.init = &(struct clk_init_data){
  2033. .name = "mdp_ahb_clk",
  2034. .ops = &clk_branch_ops,
  2035. .flags = CLK_IS_ROOT,
  2036. },
  2037. },
  2038. };
  2039. static struct clk_branch rot_ahb_clk = {
  2040. .halt_reg = 0x01dc,
  2041. .halt_bit = 13,
  2042. .clkr = {
  2043. .enable_reg = 0x0008,
  2044. .enable_mask = BIT(12),
  2045. .hw.init = &(struct clk_init_data){
  2046. .name = "rot_ahb_clk",
  2047. .ops = &clk_branch_ops,
  2048. .flags = CLK_IS_ROOT
  2049. },
  2050. },
  2051. };
  2052. static struct clk_branch smmu_ahb_clk = {
  2053. .hwcg_reg = 0x0008,
  2054. .hwcg_bit = 26,
  2055. .halt_reg = 0x01dc,
  2056. .halt_bit = 22,
  2057. .clkr = {
  2058. .enable_reg = 0x0008,
  2059. .enable_mask = BIT(15),
  2060. .hw.init = &(struct clk_init_data){
  2061. .name = "smmu_ahb_clk",
  2062. .ops = &clk_branch_ops,
  2063. .flags = CLK_IS_ROOT,
  2064. },
  2065. },
  2066. };
  2067. static struct clk_branch tv_enc_ahb_clk = {
  2068. .halt_reg = 0x01dc,
  2069. .halt_bit = 23,
  2070. .clkr = {
  2071. .enable_reg = 0x0008,
  2072. .enable_mask = BIT(25),
  2073. .hw.init = &(struct clk_init_data){
  2074. .name = "tv_enc_ahb_clk",
  2075. .ops = &clk_branch_ops,
  2076. .flags = CLK_IS_ROOT,
  2077. },
  2078. },
  2079. };
  2080. static struct clk_branch vcap_ahb_clk = {
  2081. .halt_reg = 0x0240,
  2082. .halt_bit = 23,
  2083. .clkr = {
  2084. .enable_reg = 0x0248,
  2085. .enable_mask = BIT(1),
  2086. .hw.init = &(struct clk_init_data){
  2087. .name = "vcap_ahb_clk",
  2088. .ops = &clk_branch_ops,
  2089. .flags = CLK_IS_ROOT,
  2090. },
  2091. },
  2092. };
  2093. static struct clk_branch vcodec_ahb_clk = {
  2094. .hwcg_reg = 0x0038,
  2095. .hwcg_bit = 26,
  2096. .halt_reg = 0x01dc,
  2097. .halt_bit = 12,
  2098. .clkr = {
  2099. .enable_reg = 0x0008,
  2100. .enable_mask = BIT(11),
  2101. .hw.init = &(struct clk_init_data){
  2102. .name = "vcodec_ahb_clk",
  2103. .ops = &clk_branch_ops,
  2104. .flags = CLK_IS_ROOT,
  2105. },
  2106. },
  2107. };
  2108. static struct clk_branch vfe_ahb_clk = {
  2109. .halt_reg = 0x01dc,
  2110. .halt_bit = 14,
  2111. .clkr = {
  2112. .enable_reg = 0x0008,
  2113. .enable_mask = BIT(13),
  2114. .hw.init = &(struct clk_init_data){
  2115. .name = "vfe_ahb_clk",
  2116. .ops = &clk_branch_ops,
  2117. .flags = CLK_IS_ROOT,
  2118. },
  2119. },
  2120. };
  2121. static struct clk_branch vpe_ahb_clk = {
  2122. .halt_reg = 0x01dc,
  2123. .halt_bit = 15,
  2124. .clkr = {
  2125. .enable_reg = 0x0008,
  2126. .enable_mask = BIT(16),
  2127. .hw.init = &(struct clk_init_data){
  2128. .name = "vpe_ahb_clk",
  2129. .ops = &clk_branch_ops,
  2130. .flags = CLK_IS_ROOT,
  2131. },
  2132. },
  2133. };
  2134. static struct clk_regmap *mmcc_msm8960_clks[] = {
  2135. [TV_ENC_AHB_CLK] = &tv_enc_ahb_clk.clkr,
  2136. [AMP_AHB_CLK] = &amp_ahb_clk.clkr,
  2137. [DSI2_S_AHB_CLK] = &dsi2_s_ahb_clk.clkr,
  2138. [JPEGD_AHB_CLK] = &jpegd_ahb_clk.clkr,
  2139. [GFX2D0_AHB_CLK] = &gfx2d0_ahb_clk.clkr,
  2140. [DSI_S_AHB_CLK] = &dsi_s_ahb_clk.clkr,
  2141. [DSI2_M_AHB_CLK] = &dsi2_m_ahb_clk.clkr,
  2142. [VPE_AHB_CLK] = &vpe_ahb_clk.clkr,
  2143. [SMMU_AHB_CLK] = &smmu_ahb_clk.clkr,
  2144. [HDMI_M_AHB_CLK] = &hdmi_m_ahb_clk.clkr,
  2145. [VFE_AHB_CLK] = &vfe_ahb_clk.clkr,
  2146. [ROT_AHB_CLK] = &rot_ahb_clk.clkr,
  2147. [VCODEC_AHB_CLK] = &vcodec_ahb_clk.clkr,
  2148. [MDP_AHB_CLK] = &mdp_ahb_clk.clkr,
  2149. [DSI_M_AHB_CLK] = &dsi_m_ahb_clk.clkr,
  2150. [CSI_AHB_CLK] = &csi_ahb_clk.clkr,
  2151. [MMSS_IMEM_AHB_CLK] = &mmss_imem_ahb_clk.clkr,
  2152. [IJPEG_AHB_CLK] = &ijpeg_ahb_clk.clkr,
  2153. [HDMI_S_AHB_CLK] = &hdmi_s_ahb_clk.clkr,
  2154. [GFX3D_AHB_CLK] = &gfx3d_ahb_clk.clkr,
  2155. [GFX2D1_AHB_CLK] = &gfx2d1_ahb_clk.clkr,
  2156. [JPEGD_AXI_CLK] = &jpegd_axi_clk.clkr,
  2157. [GMEM_AXI_CLK] = &gmem_axi_clk.clkr,
  2158. [MDP_AXI_CLK] = &mdp_axi_clk.clkr,
  2159. [MMSS_IMEM_AXI_CLK] = &mmss_imem_axi_clk.clkr,
  2160. [IJPEG_AXI_CLK] = &ijpeg_axi_clk.clkr,
  2161. [GFX3D_AXI_CLK] = &gfx3d_axi_clk.clkr,
  2162. [VCODEC_AXI_CLK] = &vcodec_axi_clk.clkr,
  2163. [VFE_AXI_CLK] = &vfe_axi_clk.clkr,
  2164. [VPE_AXI_CLK] = &vpe_axi_clk.clkr,
  2165. [ROT_AXI_CLK] = &rot_axi_clk.clkr,
  2166. [VCODEC_AXI_A_CLK] = &vcodec_axi_a_clk.clkr,
  2167. [VCODEC_AXI_B_CLK] = &vcodec_axi_b_clk.clkr,
  2168. [CSI0_SRC] = &csi0_src.clkr,
  2169. [CSI0_CLK] = &csi0_clk.clkr,
  2170. [CSI0_PHY_CLK] = &csi0_phy_clk.clkr,
  2171. [CSI1_SRC] = &csi1_src.clkr,
  2172. [CSI1_CLK] = &csi1_clk.clkr,
  2173. [CSI1_PHY_CLK] = &csi1_phy_clk.clkr,
  2174. [CSI2_SRC] = &csi2_src.clkr,
  2175. [CSI2_CLK] = &csi2_clk.clkr,
  2176. [CSI2_PHY_CLK] = &csi2_phy_clk.clkr,
  2177. [CSI_PIX_CLK] = &csi_pix_clk.clkr,
  2178. [CSI_RDI_CLK] = &csi_rdi_clk.clkr,
  2179. [MDP_VSYNC_CLK] = &mdp_vsync_clk.clkr,
  2180. [HDMI_APP_CLK] = &hdmi_app_clk.clkr,
  2181. [CSI_PIX1_CLK] = &csi_pix1_clk.clkr,
  2182. [CSI_RDI2_CLK] = &csi_rdi2_clk.clkr,
  2183. [CSI_RDI1_CLK] = &csi_rdi1_clk.clkr,
  2184. [GFX2D0_SRC] = &gfx2d0_src.clkr,
  2185. [GFX2D0_CLK] = &gfx2d0_clk.clkr,
  2186. [GFX2D1_SRC] = &gfx2d1_src.clkr,
  2187. [GFX2D1_CLK] = &gfx2d1_clk.clkr,
  2188. [GFX3D_SRC] = &gfx3d_src.clkr,
  2189. [GFX3D_CLK] = &gfx3d_clk.clkr,
  2190. [IJPEG_SRC] = &ijpeg_src.clkr,
  2191. [IJPEG_CLK] = &ijpeg_clk.clkr,
  2192. [JPEGD_SRC] = &jpegd_src.clkr,
  2193. [JPEGD_CLK] = &jpegd_clk.clkr,
  2194. [MDP_SRC] = &mdp_src.clkr,
  2195. [MDP_CLK] = &mdp_clk.clkr,
  2196. [MDP_LUT_CLK] = &mdp_lut_clk.clkr,
  2197. [ROT_SRC] = &rot_src.clkr,
  2198. [ROT_CLK] = &rot_clk.clkr,
  2199. [TV_ENC_CLK] = &tv_enc_clk.clkr,
  2200. [TV_DAC_CLK] = &tv_dac_clk.clkr,
  2201. [HDMI_TV_CLK] = &hdmi_tv_clk.clkr,
  2202. [MDP_TV_CLK] = &mdp_tv_clk.clkr,
  2203. [TV_SRC] = &tv_src.clkr,
  2204. [VCODEC_SRC] = &vcodec_src.clkr,
  2205. [VCODEC_CLK] = &vcodec_clk.clkr,
  2206. [VFE_SRC] = &vfe_src.clkr,
  2207. [VFE_CLK] = &vfe_clk.clkr,
  2208. [VFE_CSI_CLK] = &vfe_csi_clk.clkr,
  2209. [VPE_SRC] = &vpe_src.clkr,
  2210. [VPE_CLK] = &vpe_clk.clkr,
  2211. [CAMCLK0_SRC] = &camclk0_src.clkr,
  2212. [CAMCLK0_CLK] = &camclk0_clk.clkr,
  2213. [CAMCLK1_SRC] = &camclk1_src.clkr,
  2214. [CAMCLK1_CLK] = &camclk1_clk.clkr,
  2215. [CAMCLK2_SRC] = &camclk2_src.clkr,
  2216. [CAMCLK2_CLK] = &camclk2_clk.clkr,
  2217. [CSIPHYTIMER_SRC] = &csiphytimer_src.clkr,
  2218. [CSIPHY2_TIMER_CLK] = &csiphy2_timer_clk.clkr,
  2219. [CSIPHY1_TIMER_CLK] = &csiphy1_timer_clk.clkr,
  2220. [CSIPHY0_TIMER_CLK] = &csiphy0_timer_clk.clkr,
  2221. [PLL2] = &pll2.clkr,
  2222. };
  2223. static const struct qcom_reset_map mmcc_msm8960_resets[] = {
  2224. [VPE_AXI_RESET] = { 0x0208, 15 },
  2225. [IJPEG_AXI_RESET] = { 0x0208, 14 },
  2226. [MPD_AXI_RESET] = { 0x0208, 13 },
  2227. [VFE_AXI_RESET] = { 0x0208, 9 },
  2228. [SP_AXI_RESET] = { 0x0208, 8 },
  2229. [VCODEC_AXI_RESET] = { 0x0208, 7 },
  2230. [ROT_AXI_RESET] = { 0x0208, 6 },
  2231. [VCODEC_AXI_A_RESET] = { 0x0208, 5 },
  2232. [VCODEC_AXI_B_RESET] = { 0x0208, 4 },
  2233. [FAB_S3_AXI_RESET] = { 0x0208, 3 },
  2234. [FAB_S2_AXI_RESET] = { 0x0208, 2 },
  2235. [FAB_S1_AXI_RESET] = { 0x0208, 1 },
  2236. [FAB_S0_AXI_RESET] = { 0x0208 },
  2237. [SMMU_GFX3D_ABH_RESET] = { 0x020c, 31 },
  2238. [SMMU_VPE_AHB_RESET] = { 0x020c, 30 },
  2239. [SMMU_VFE_AHB_RESET] = { 0x020c, 29 },
  2240. [SMMU_ROT_AHB_RESET] = { 0x020c, 28 },
  2241. [SMMU_VCODEC_B_AHB_RESET] = { 0x020c, 27 },
  2242. [SMMU_VCODEC_A_AHB_RESET] = { 0x020c, 26 },
  2243. [SMMU_MDP1_AHB_RESET] = { 0x020c, 25 },
  2244. [SMMU_MDP0_AHB_RESET] = { 0x020c, 24 },
  2245. [SMMU_JPEGD_AHB_RESET] = { 0x020c, 23 },
  2246. [SMMU_IJPEG_AHB_RESET] = { 0x020c, 22 },
  2247. [SMMU_GFX2D0_AHB_RESET] = { 0x020c, 21 },
  2248. [SMMU_GFX2D1_AHB_RESET] = { 0x020c, 20 },
  2249. [APU_AHB_RESET] = { 0x020c, 18 },
  2250. [CSI_AHB_RESET] = { 0x020c, 17 },
  2251. [TV_ENC_AHB_RESET] = { 0x020c, 15 },
  2252. [VPE_AHB_RESET] = { 0x020c, 14 },
  2253. [FABRIC_AHB_RESET] = { 0x020c, 13 },
  2254. [GFX2D0_AHB_RESET] = { 0x020c, 12 },
  2255. [GFX2D1_AHB_RESET] = { 0x020c, 11 },
  2256. [GFX3D_AHB_RESET] = { 0x020c, 10 },
  2257. [HDMI_AHB_RESET] = { 0x020c, 9 },
  2258. [MSSS_IMEM_AHB_RESET] = { 0x020c, 8 },
  2259. [IJPEG_AHB_RESET] = { 0x020c, 7 },
  2260. [DSI_M_AHB_RESET] = { 0x020c, 6 },
  2261. [DSI_S_AHB_RESET] = { 0x020c, 5 },
  2262. [JPEGD_AHB_RESET] = { 0x020c, 4 },
  2263. [MDP_AHB_RESET] = { 0x020c, 3 },
  2264. [ROT_AHB_RESET] = { 0x020c, 2 },
  2265. [VCODEC_AHB_RESET] = { 0x020c, 1 },
  2266. [VFE_AHB_RESET] = { 0x020c, 0 },
  2267. [DSI2_M_AHB_RESET] = { 0x0210, 31 },
  2268. [DSI2_S_AHB_RESET] = { 0x0210, 30 },
  2269. [CSIPHY2_RESET] = { 0x0210, 29 },
  2270. [CSI_PIX1_RESET] = { 0x0210, 28 },
  2271. [CSIPHY0_RESET] = { 0x0210, 27 },
  2272. [CSIPHY1_RESET] = { 0x0210, 26 },
  2273. [DSI2_RESET] = { 0x0210, 25 },
  2274. [VFE_CSI_RESET] = { 0x0210, 24 },
  2275. [MDP_RESET] = { 0x0210, 21 },
  2276. [AMP_RESET] = { 0x0210, 20 },
  2277. [JPEGD_RESET] = { 0x0210, 19 },
  2278. [CSI1_RESET] = { 0x0210, 18 },
  2279. [VPE_RESET] = { 0x0210, 17 },
  2280. [MMSS_FABRIC_RESET] = { 0x0210, 16 },
  2281. [VFE_RESET] = { 0x0210, 15 },
  2282. [GFX2D0_RESET] = { 0x0210, 14 },
  2283. [GFX2D1_RESET] = { 0x0210, 13 },
  2284. [GFX3D_RESET] = { 0x0210, 12 },
  2285. [HDMI_RESET] = { 0x0210, 11 },
  2286. [MMSS_IMEM_RESET] = { 0x0210, 10 },
  2287. [IJPEG_RESET] = { 0x0210, 9 },
  2288. [CSI0_RESET] = { 0x0210, 8 },
  2289. [DSI_RESET] = { 0x0210, 7 },
  2290. [VCODEC_RESET] = { 0x0210, 6 },
  2291. [MDP_TV_RESET] = { 0x0210, 4 },
  2292. [MDP_VSYNC_RESET] = { 0x0210, 3 },
  2293. [ROT_RESET] = { 0x0210, 2 },
  2294. [TV_HDMI_RESET] = { 0x0210, 1 },
  2295. [TV_ENC_RESET] = { 0x0210 },
  2296. [CSI2_RESET] = { 0x0214, 2 },
  2297. [CSI_RDI1_RESET] = { 0x0214, 1 },
  2298. [CSI_RDI2_RESET] = { 0x0214 },
  2299. };
  2300. static struct clk_regmap *mmcc_apq8064_clks[] = {
  2301. [AMP_AHB_CLK] = &amp_ahb_clk.clkr,
  2302. [DSI2_S_AHB_CLK] = &dsi2_s_ahb_clk.clkr,
  2303. [JPEGD_AHB_CLK] = &jpegd_ahb_clk.clkr,
  2304. [DSI_S_AHB_CLK] = &dsi_s_ahb_clk.clkr,
  2305. [DSI2_M_AHB_CLK] = &dsi2_m_ahb_clk.clkr,
  2306. [VPE_AHB_CLK] = &vpe_ahb_clk.clkr,
  2307. [SMMU_AHB_CLK] = &smmu_ahb_clk.clkr,
  2308. [HDMI_M_AHB_CLK] = &hdmi_m_ahb_clk.clkr,
  2309. [VFE_AHB_CLK] = &vfe_ahb_clk.clkr,
  2310. [ROT_AHB_CLK] = &rot_ahb_clk.clkr,
  2311. [VCODEC_AHB_CLK] = &vcodec_ahb_clk.clkr,
  2312. [MDP_AHB_CLK] = &mdp_ahb_clk.clkr,
  2313. [DSI_M_AHB_CLK] = &dsi_m_ahb_clk.clkr,
  2314. [CSI_AHB_CLK] = &csi_ahb_clk.clkr,
  2315. [MMSS_IMEM_AHB_CLK] = &mmss_imem_ahb_clk.clkr,
  2316. [IJPEG_AHB_CLK] = &ijpeg_ahb_clk.clkr,
  2317. [HDMI_S_AHB_CLK] = &hdmi_s_ahb_clk.clkr,
  2318. [GFX3D_AHB_CLK] = &gfx3d_ahb_clk.clkr,
  2319. [JPEGD_AXI_CLK] = &jpegd_axi_clk.clkr,
  2320. [GMEM_AXI_CLK] = &gmem_axi_clk.clkr,
  2321. [MDP_AXI_CLK] = &mdp_axi_clk.clkr,
  2322. [MMSS_IMEM_AXI_CLK] = &mmss_imem_axi_clk.clkr,
  2323. [IJPEG_AXI_CLK] = &ijpeg_axi_clk.clkr,
  2324. [GFX3D_AXI_CLK] = &gfx3d_axi_clk.clkr,
  2325. [VCODEC_AXI_CLK] = &vcodec_axi_clk.clkr,
  2326. [VFE_AXI_CLK] = &vfe_axi_clk.clkr,
  2327. [VPE_AXI_CLK] = &vpe_axi_clk.clkr,
  2328. [ROT_AXI_CLK] = &rot_axi_clk.clkr,
  2329. [VCODEC_AXI_A_CLK] = &vcodec_axi_a_clk.clkr,
  2330. [VCODEC_AXI_B_CLK] = &vcodec_axi_b_clk.clkr,
  2331. [CSI0_SRC] = &csi0_src.clkr,
  2332. [CSI0_CLK] = &csi0_clk.clkr,
  2333. [CSI0_PHY_CLK] = &csi0_phy_clk.clkr,
  2334. [CSI1_SRC] = &csi1_src.clkr,
  2335. [CSI1_CLK] = &csi1_clk.clkr,
  2336. [CSI1_PHY_CLK] = &csi1_phy_clk.clkr,
  2337. [CSI2_SRC] = &csi2_src.clkr,
  2338. [CSI2_CLK] = &csi2_clk.clkr,
  2339. [CSI2_PHY_CLK] = &csi2_phy_clk.clkr,
  2340. [CSI_PIX_CLK] = &csi_pix_clk.clkr,
  2341. [CSI_RDI_CLK] = &csi_rdi_clk.clkr,
  2342. [MDP_VSYNC_CLK] = &mdp_vsync_clk.clkr,
  2343. [HDMI_APP_CLK] = &hdmi_app_clk.clkr,
  2344. [CSI_PIX1_CLK] = &csi_pix1_clk.clkr,
  2345. [CSI_RDI2_CLK] = &csi_rdi2_clk.clkr,
  2346. [CSI_RDI1_CLK] = &csi_rdi1_clk.clkr,
  2347. [GFX3D_SRC] = &gfx3d_src.clkr,
  2348. [GFX3D_CLK] = &gfx3d_clk.clkr,
  2349. [IJPEG_SRC] = &ijpeg_src.clkr,
  2350. [IJPEG_CLK] = &ijpeg_clk.clkr,
  2351. [JPEGD_SRC] = &jpegd_src.clkr,
  2352. [JPEGD_CLK] = &jpegd_clk.clkr,
  2353. [MDP_SRC] = &mdp_src.clkr,
  2354. [MDP_CLK] = &mdp_clk.clkr,
  2355. [MDP_LUT_CLK] = &mdp_lut_clk.clkr,
  2356. [ROT_SRC] = &rot_src.clkr,
  2357. [ROT_CLK] = &rot_clk.clkr,
  2358. [TV_DAC_CLK] = &tv_dac_clk.clkr,
  2359. [HDMI_TV_CLK] = &hdmi_tv_clk.clkr,
  2360. [MDP_TV_CLK] = &mdp_tv_clk.clkr,
  2361. [TV_SRC] = &tv_src.clkr,
  2362. [VCODEC_SRC] = &vcodec_src.clkr,
  2363. [VCODEC_CLK] = &vcodec_clk.clkr,
  2364. [VFE_SRC] = &vfe_src.clkr,
  2365. [VFE_CLK] = &vfe_clk.clkr,
  2366. [VFE_CSI_CLK] = &vfe_csi_clk.clkr,
  2367. [VPE_SRC] = &vpe_src.clkr,
  2368. [VPE_CLK] = &vpe_clk.clkr,
  2369. [CAMCLK0_SRC] = &camclk0_src.clkr,
  2370. [CAMCLK0_CLK] = &camclk0_clk.clkr,
  2371. [CAMCLK1_SRC] = &camclk1_src.clkr,
  2372. [CAMCLK1_CLK] = &camclk1_clk.clkr,
  2373. [CAMCLK2_SRC] = &camclk2_src.clkr,
  2374. [CAMCLK2_CLK] = &camclk2_clk.clkr,
  2375. [CSIPHYTIMER_SRC] = &csiphytimer_src.clkr,
  2376. [CSIPHY2_TIMER_CLK] = &csiphy2_timer_clk.clkr,
  2377. [CSIPHY1_TIMER_CLK] = &csiphy1_timer_clk.clkr,
  2378. [CSIPHY0_TIMER_CLK] = &csiphy0_timer_clk.clkr,
  2379. [PLL2] = &pll2.clkr,
  2380. [RGB_TV_CLK] = &rgb_tv_clk.clkr,
  2381. [NPL_TV_CLK] = &npl_tv_clk.clkr,
  2382. [VCAP_AHB_CLK] = &vcap_ahb_clk.clkr,
  2383. [VCAP_AXI_CLK] = &vcap_axi_clk.clkr,
  2384. [VCAP_SRC] = &vcap_src.clkr,
  2385. [VCAP_CLK] = &vcap_clk.clkr,
  2386. [VCAP_NPL_CLK] = &vcap_npl_clk.clkr,
  2387. [PLL15] = &pll15.clkr,
  2388. };
  2389. static const struct qcom_reset_map mmcc_apq8064_resets[] = {
  2390. [GFX3D_AXI_RESET] = { 0x0208, 17 },
  2391. [VCAP_AXI_RESET] = { 0x0208, 16 },
  2392. [VPE_AXI_RESET] = { 0x0208, 15 },
  2393. [IJPEG_AXI_RESET] = { 0x0208, 14 },
  2394. [MPD_AXI_RESET] = { 0x0208, 13 },
  2395. [VFE_AXI_RESET] = { 0x0208, 9 },
  2396. [SP_AXI_RESET] = { 0x0208, 8 },
  2397. [VCODEC_AXI_RESET] = { 0x0208, 7 },
  2398. [ROT_AXI_RESET] = { 0x0208, 6 },
  2399. [VCODEC_AXI_A_RESET] = { 0x0208, 5 },
  2400. [VCODEC_AXI_B_RESET] = { 0x0208, 4 },
  2401. [FAB_S3_AXI_RESET] = { 0x0208, 3 },
  2402. [FAB_S2_AXI_RESET] = { 0x0208, 2 },
  2403. [FAB_S1_AXI_RESET] = { 0x0208, 1 },
  2404. [FAB_S0_AXI_RESET] = { 0x0208 },
  2405. [SMMU_GFX3D_ABH_RESET] = { 0x020c, 31 },
  2406. [SMMU_VPE_AHB_RESET] = { 0x020c, 30 },
  2407. [SMMU_VFE_AHB_RESET] = { 0x020c, 29 },
  2408. [SMMU_ROT_AHB_RESET] = { 0x020c, 28 },
  2409. [SMMU_VCODEC_B_AHB_RESET] = { 0x020c, 27 },
  2410. [SMMU_VCODEC_A_AHB_RESET] = { 0x020c, 26 },
  2411. [SMMU_MDP1_AHB_RESET] = { 0x020c, 25 },
  2412. [SMMU_MDP0_AHB_RESET] = { 0x020c, 24 },
  2413. [SMMU_JPEGD_AHB_RESET] = { 0x020c, 23 },
  2414. [SMMU_IJPEG_AHB_RESET] = { 0x020c, 22 },
  2415. [APU_AHB_RESET] = { 0x020c, 18 },
  2416. [CSI_AHB_RESET] = { 0x020c, 17 },
  2417. [TV_ENC_AHB_RESET] = { 0x020c, 15 },
  2418. [VPE_AHB_RESET] = { 0x020c, 14 },
  2419. [FABRIC_AHB_RESET] = { 0x020c, 13 },
  2420. [GFX3D_AHB_RESET] = { 0x020c, 10 },
  2421. [HDMI_AHB_RESET] = { 0x020c, 9 },
  2422. [MSSS_IMEM_AHB_RESET] = { 0x020c, 8 },
  2423. [IJPEG_AHB_RESET] = { 0x020c, 7 },
  2424. [DSI_M_AHB_RESET] = { 0x020c, 6 },
  2425. [DSI_S_AHB_RESET] = { 0x020c, 5 },
  2426. [JPEGD_AHB_RESET] = { 0x020c, 4 },
  2427. [MDP_AHB_RESET] = { 0x020c, 3 },
  2428. [ROT_AHB_RESET] = { 0x020c, 2 },
  2429. [VCODEC_AHB_RESET] = { 0x020c, 1 },
  2430. [VFE_AHB_RESET] = { 0x020c, 0 },
  2431. [SMMU_VCAP_AHB_RESET] = { 0x0200, 3 },
  2432. [VCAP_AHB_RESET] = { 0x0200, 2 },
  2433. [DSI2_M_AHB_RESET] = { 0x0200, 1 },
  2434. [DSI2_S_AHB_RESET] = { 0x0200, 0 },
  2435. [CSIPHY2_RESET] = { 0x0210, 31 },
  2436. [CSI_PIX1_RESET] = { 0x0210, 30 },
  2437. [CSIPHY0_RESET] = { 0x0210, 29 },
  2438. [CSIPHY1_RESET] = { 0x0210, 28 },
  2439. [CSI_RDI_RESET] = { 0x0210, 27 },
  2440. [CSI_PIX_RESET] = { 0x0210, 26 },
  2441. [DSI2_RESET] = { 0x0210, 25 },
  2442. [VFE_CSI_RESET] = { 0x0210, 24 },
  2443. [MDP_RESET] = { 0x0210, 21 },
  2444. [AMP_RESET] = { 0x0210, 20 },
  2445. [JPEGD_RESET] = { 0x0210, 19 },
  2446. [CSI1_RESET] = { 0x0210, 18 },
  2447. [VPE_RESET] = { 0x0210, 17 },
  2448. [MMSS_FABRIC_RESET] = { 0x0210, 16 },
  2449. [VFE_RESET] = { 0x0210, 15 },
  2450. [GFX3D_RESET] = { 0x0210, 12 },
  2451. [HDMI_RESET] = { 0x0210, 11 },
  2452. [MMSS_IMEM_RESET] = { 0x0210, 10 },
  2453. [IJPEG_RESET] = { 0x0210, 9 },
  2454. [CSI0_RESET] = { 0x0210, 8 },
  2455. [DSI_RESET] = { 0x0210, 7 },
  2456. [VCODEC_RESET] = { 0x0210, 6 },
  2457. [MDP_TV_RESET] = { 0x0210, 4 },
  2458. [MDP_VSYNC_RESET] = { 0x0210, 3 },
  2459. [ROT_RESET] = { 0x0210, 2 },
  2460. [TV_HDMI_RESET] = { 0x0210, 1 },
  2461. [VCAP_NPL_RESET] = { 0x0214, 4 },
  2462. [VCAP_RESET] = { 0x0214, 3 },
  2463. [CSI2_RESET] = { 0x0214, 2 },
  2464. [CSI_RDI1_RESET] = { 0x0214, 1 },
  2465. [CSI_RDI2_RESET] = { 0x0214 },
  2466. };
  2467. static const struct regmap_config mmcc_msm8960_regmap_config = {
  2468. .reg_bits = 32,
  2469. .reg_stride = 4,
  2470. .val_bits = 32,
  2471. .max_register = 0x334,
  2472. .fast_io = true,
  2473. };
  2474. static const struct regmap_config mmcc_apq8064_regmap_config = {
  2475. .reg_bits = 32,
  2476. .reg_stride = 4,
  2477. .val_bits = 32,
  2478. .max_register = 0x350,
  2479. .fast_io = true,
  2480. };
  2481. static const struct qcom_cc_desc mmcc_msm8960_desc = {
  2482. .config = &mmcc_msm8960_regmap_config,
  2483. .clks = mmcc_msm8960_clks,
  2484. .num_clks = ARRAY_SIZE(mmcc_msm8960_clks),
  2485. .resets = mmcc_msm8960_resets,
  2486. .num_resets = ARRAY_SIZE(mmcc_msm8960_resets),
  2487. };
  2488. static const struct qcom_cc_desc mmcc_apq8064_desc = {
  2489. .config = &mmcc_apq8064_regmap_config,
  2490. .clks = mmcc_apq8064_clks,
  2491. .num_clks = ARRAY_SIZE(mmcc_apq8064_clks),
  2492. .resets = mmcc_apq8064_resets,
  2493. .num_resets = ARRAY_SIZE(mmcc_apq8064_resets),
  2494. };
  2495. static const struct of_device_id mmcc_msm8960_match_table[] = {
  2496. { .compatible = "qcom,mmcc-msm8960", .data = &mmcc_msm8960_desc },
  2497. { .compatible = "qcom,mmcc-apq8064", .data = &mmcc_apq8064_desc },
  2498. { }
  2499. };
  2500. MODULE_DEVICE_TABLE(of, mmcc_msm8960_match_table);
  2501. static int mmcc_msm8960_probe(struct platform_device *pdev)
  2502. {
  2503. const struct of_device_id *match;
  2504. struct regmap *regmap;
  2505. bool is_8064;
  2506. struct device *dev = &pdev->dev;
  2507. match = of_match_device(mmcc_msm8960_match_table, dev);
  2508. if (!match)
  2509. return -EINVAL;
  2510. is_8064 = of_device_is_compatible(dev->of_node, "qcom,mmcc-apq8064");
  2511. if (is_8064) {
  2512. gfx3d_src.freq_tbl = clk_tbl_gfx3d_8064;
  2513. gfx3d_src.clkr.hw.init = &gfx3d_8064_init;
  2514. gfx3d_src.s[0].parent_map = mmcc_pxo_pll8_pll2_pll15_map;
  2515. gfx3d_src.s[1].parent_map = mmcc_pxo_pll8_pll2_pll15_map;
  2516. }
  2517. regmap = qcom_cc_map(pdev, match->data);
  2518. if (IS_ERR(regmap))
  2519. return PTR_ERR(regmap);
  2520. clk_pll_configure_sr(&pll15, regmap, &pll15_config, false);
  2521. return qcom_cc_really_probe(pdev, match->data, regmap);
  2522. }
  2523. static int mmcc_msm8960_remove(struct platform_device *pdev)
  2524. {
  2525. qcom_cc_remove(pdev);
  2526. return 0;
  2527. }
  2528. static struct platform_driver mmcc_msm8960_driver = {
  2529. .probe = mmcc_msm8960_probe,
  2530. .remove = mmcc_msm8960_remove,
  2531. .driver = {
  2532. .name = "mmcc-msm8960",
  2533. .of_match_table = mmcc_msm8960_match_table,
  2534. },
  2535. };
  2536. module_platform_driver(mmcc_msm8960_driver);
  2537. MODULE_DESCRIPTION("QCOM MMCC MSM8960 Driver");
  2538. MODULE_LICENSE("GPL v2");
  2539. MODULE_ALIAS("platform:mmcc-msm8960");