gcc-ipq4019.c 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352
  1. /*
  2. * Copyright (c) 2015 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/err.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/module.h>
  17. #include <linux/of.h>
  18. #include <linux/of_device.h>
  19. #include <linux/clk-provider.h>
  20. #include <linux/regmap.h>
  21. #include <linux/reset-controller.h>
  22. #include <dt-bindings/clock/qcom,gcc-ipq4019.h>
  23. #include "common.h"
  24. #include "clk-regmap.h"
  25. #include "clk-rcg.h"
  26. #include "clk-branch.h"
  27. #include "reset.h"
  28. enum {
  29. P_XO,
  30. P_FEPLL200,
  31. P_FEPLL500,
  32. P_DDRPLL,
  33. P_FEPLLWCSS2G,
  34. P_FEPLLWCSS5G,
  35. P_FEPLL125DLY,
  36. P_DDRPLLAPSS,
  37. };
  38. static struct parent_map gcc_xo_200_500_map[] = {
  39. { P_XO, 0 },
  40. { P_FEPLL200, 1 },
  41. { P_FEPLL500, 2 },
  42. };
  43. static const char * const gcc_xo_200_500[] = {
  44. "xo",
  45. "fepll200",
  46. "fepll500",
  47. };
  48. static struct parent_map gcc_xo_200_map[] = {
  49. { P_XO, 0 },
  50. { P_FEPLL200, 1 },
  51. };
  52. static const char * const gcc_xo_200[] = {
  53. "xo",
  54. "fepll200",
  55. };
  56. static struct parent_map gcc_xo_200_spi_map[] = {
  57. { P_XO, 0 },
  58. { P_FEPLL200, 2 },
  59. };
  60. static const char * const gcc_xo_200_spi[] = {
  61. "xo",
  62. "fepll200",
  63. };
  64. static struct parent_map gcc_xo_sdcc1_500_map[] = {
  65. { P_XO, 0 },
  66. { P_DDRPLL, 1 },
  67. { P_FEPLL500, 2 },
  68. };
  69. static const char * const gcc_xo_sdcc1_500[] = {
  70. "xo",
  71. "ddrpll",
  72. "fepll500",
  73. };
  74. static struct parent_map gcc_xo_wcss2g_map[] = {
  75. { P_XO, 0 },
  76. { P_FEPLLWCSS2G, 1 },
  77. };
  78. static const char * const gcc_xo_wcss2g[] = {
  79. "xo",
  80. "fepllwcss2g",
  81. };
  82. static struct parent_map gcc_xo_wcss5g_map[] = {
  83. { P_XO, 0 },
  84. { P_FEPLLWCSS5G, 1 },
  85. };
  86. static const char * const gcc_xo_wcss5g[] = {
  87. "xo",
  88. "fepllwcss5g",
  89. };
  90. static struct parent_map gcc_xo_125_dly_map[] = {
  91. { P_XO, 0 },
  92. { P_FEPLL125DLY, 1 },
  93. };
  94. static const char * const gcc_xo_125_dly[] = {
  95. "xo",
  96. "fepll125dly",
  97. };
  98. static struct parent_map gcc_xo_ddr_500_200_map[] = {
  99. { P_XO, 0 },
  100. { P_FEPLL200, 3 },
  101. { P_FEPLL500, 2 },
  102. { P_DDRPLLAPSS, 1 },
  103. };
  104. static const char * const gcc_xo_ddr_500_200[] = {
  105. "xo",
  106. "fepll200",
  107. "fepll500",
  108. "ddrpllapss",
  109. };
  110. #define F(f, s, h, m, n) { (f), (s), (2 * (h) - 1), (m), (n) }
  111. static const struct freq_tbl ftbl_gcc_audio_pwm_clk[] = {
  112. F(48000000, P_XO, 1, 0, 0),
  113. F(200000000, P_FEPLL200, 1, 0, 0),
  114. { }
  115. };
  116. static struct clk_rcg2 audio_clk_src = {
  117. .cmd_rcgr = 0x1b000,
  118. .hid_width = 5,
  119. .parent_map = gcc_xo_200_map,
  120. .freq_tbl = ftbl_gcc_audio_pwm_clk,
  121. .clkr.hw.init = &(struct clk_init_data){
  122. .name = "audio_clk_src",
  123. .parent_names = gcc_xo_200,
  124. .num_parents = 2,
  125. .ops = &clk_rcg2_ops,
  126. },
  127. };
  128. static struct clk_branch gcc_audio_ahb_clk = {
  129. .halt_reg = 0x1b010,
  130. .clkr = {
  131. .enable_reg = 0x1b010,
  132. .enable_mask = BIT(0),
  133. .hw.init = &(struct clk_init_data){
  134. .name = "gcc_audio_ahb_clk",
  135. .parent_names = (const char *[]){
  136. "pcnoc_clk_src",
  137. },
  138. .flags = CLK_SET_RATE_PARENT,
  139. .num_parents = 1,
  140. .ops = &clk_branch2_ops,
  141. },
  142. },
  143. };
  144. static struct clk_branch gcc_audio_pwm_clk = {
  145. .halt_reg = 0x1b00C,
  146. .clkr = {
  147. .enable_reg = 0x1b00C,
  148. .enable_mask = BIT(0),
  149. .hw.init = &(struct clk_init_data){
  150. .name = "gcc_audio_pwm_clk",
  151. .parent_names = (const char *[]){
  152. "audio_clk_src",
  153. },
  154. .flags = CLK_SET_RATE_PARENT,
  155. .num_parents = 1,
  156. .ops = &clk_branch2_ops,
  157. },
  158. },
  159. };
  160. static const struct freq_tbl ftbl_gcc_blsp1_qup1_2_i2c_apps_clk[] = {
  161. F(19050000, P_FEPLL200, 10.5, 1, 1),
  162. { }
  163. };
  164. static struct clk_rcg2 blsp1_qup1_i2c_apps_clk_src = {
  165. .cmd_rcgr = 0x200c,
  166. .hid_width = 5,
  167. .parent_map = gcc_xo_200_map,
  168. .freq_tbl = ftbl_gcc_blsp1_qup1_2_i2c_apps_clk,
  169. .clkr.hw.init = &(struct clk_init_data){
  170. .name = "blsp1_qup1_i2c_apps_clk_src",
  171. .parent_names = gcc_xo_200,
  172. .num_parents = 2,
  173. .ops = &clk_rcg2_ops,
  174. },
  175. };
  176. static struct clk_branch gcc_blsp1_qup1_i2c_apps_clk = {
  177. .halt_reg = 0x2008,
  178. .clkr = {
  179. .enable_reg = 0x2008,
  180. .enable_mask = BIT(0),
  181. .hw.init = &(struct clk_init_data){
  182. .name = "gcc_blsp1_qup1_i2c_apps_clk",
  183. .parent_names = (const char *[]){
  184. "blsp1_qup1_i2c_apps_clk_src",
  185. },
  186. .num_parents = 1,
  187. .ops = &clk_branch2_ops,
  188. .flags = CLK_SET_RATE_PARENT,
  189. },
  190. },
  191. };
  192. static struct clk_rcg2 blsp1_qup2_i2c_apps_clk_src = {
  193. .cmd_rcgr = 0x3000,
  194. .hid_width = 5,
  195. .parent_map = gcc_xo_200_map,
  196. .freq_tbl = ftbl_gcc_blsp1_qup1_2_i2c_apps_clk,
  197. .clkr.hw.init = &(struct clk_init_data){
  198. .name = "blsp1_qup2_i2c_apps_clk_src",
  199. .parent_names = gcc_xo_200,
  200. .num_parents = 2,
  201. .ops = &clk_rcg2_ops,
  202. },
  203. };
  204. static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = {
  205. .halt_reg = 0x3010,
  206. .clkr = {
  207. .enable_reg = 0x3010,
  208. .enable_mask = BIT(0),
  209. .hw.init = &(struct clk_init_data){
  210. .name = "gcc_blsp1_qup2_i2c_apps_clk",
  211. .parent_names = (const char *[]){
  212. "blsp1_qup2_i2c_apps_clk_src",
  213. },
  214. .num_parents = 1,
  215. .ops = &clk_branch2_ops,
  216. .flags = CLK_SET_RATE_PARENT,
  217. },
  218. },
  219. };
  220. static const struct freq_tbl ftbl_gcc_blsp1_qup1_2_spi_apps_clk[] = {
  221. F(960000, P_XO, 12, 1, 4),
  222. F(4800000, P_XO, 1, 1, 10),
  223. F(9600000, P_XO, 1, 1, 5),
  224. F(15000000, P_XO, 1, 1, 3),
  225. F(19200000, P_XO, 1, 2, 5),
  226. F(24000000, P_XO, 1, 1, 2),
  227. F(48000000, P_XO, 1, 0, 0),
  228. { }
  229. };
  230. static struct clk_rcg2 blsp1_qup1_spi_apps_clk_src = {
  231. .cmd_rcgr = 0x2024,
  232. .mnd_width = 8,
  233. .hid_width = 5,
  234. .parent_map = gcc_xo_200_spi_map,
  235. .freq_tbl = ftbl_gcc_blsp1_qup1_2_spi_apps_clk,
  236. .clkr.hw.init = &(struct clk_init_data){
  237. .name = "blsp1_qup1_spi_apps_clk_src",
  238. .parent_names = gcc_xo_200_spi,
  239. .num_parents = 2,
  240. .ops = &clk_rcg2_ops,
  241. },
  242. };
  243. static struct clk_branch gcc_blsp1_qup1_spi_apps_clk = {
  244. .halt_reg = 0x2004,
  245. .clkr = {
  246. .enable_reg = 0x2004,
  247. .enable_mask = BIT(0),
  248. .hw.init = &(struct clk_init_data){
  249. .name = "gcc_blsp1_qup1_spi_apps_clk",
  250. .parent_names = (const char *[]){
  251. "blsp1_qup1_spi_apps_clk_src",
  252. },
  253. .num_parents = 1,
  254. .ops = &clk_branch2_ops,
  255. .flags = CLK_SET_RATE_PARENT,
  256. },
  257. },
  258. };
  259. static struct clk_rcg2 blsp1_qup2_spi_apps_clk_src = {
  260. .cmd_rcgr = 0x3014,
  261. .mnd_width = 8,
  262. .hid_width = 5,
  263. .freq_tbl = ftbl_gcc_blsp1_qup1_2_spi_apps_clk,
  264. .parent_map = gcc_xo_200_spi_map,
  265. .clkr.hw.init = &(struct clk_init_data){
  266. .name = "blsp1_qup2_spi_apps_clk_src",
  267. .parent_names = gcc_xo_200_spi,
  268. .num_parents = 2,
  269. .ops = &clk_rcg2_ops,
  270. },
  271. };
  272. static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = {
  273. .halt_reg = 0x300c,
  274. .clkr = {
  275. .enable_reg = 0x300c,
  276. .enable_mask = BIT(0),
  277. .hw.init = &(struct clk_init_data){
  278. .name = "gcc_blsp1_qup2_spi_apps_clk",
  279. .parent_names = (const char *[]){
  280. "blsp1_qup2_spi_apps_clk_src",
  281. },
  282. .num_parents = 1,
  283. .ops = &clk_branch2_ops,
  284. .flags = CLK_SET_RATE_PARENT,
  285. },
  286. },
  287. };
  288. static const struct freq_tbl ftbl_gcc_blsp1_uart1_2_apps_clk[] = {
  289. F(1843200, P_FEPLL200, 1, 144, 15625),
  290. F(3686400, P_FEPLL200, 1, 288, 15625),
  291. F(7372800, P_FEPLL200, 1, 576, 15625),
  292. F(14745600, P_FEPLL200, 1, 1152, 15625),
  293. F(16000000, P_FEPLL200, 1, 2, 25),
  294. F(24000000, P_XO, 1, 1, 2),
  295. F(32000000, P_FEPLL200, 1, 4, 25),
  296. F(40000000, P_FEPLL200, 1, 1, 5),
  297. F(46400000, P_FEPLL200, 1, 29, 125),
  298. F(48000000, P_XO, 1, 0, 0),
  299. { }
  300. };
  301. static struct clk_rcg2 blsp1_uart1_apps_clk_src = {
  302. .cmd_rcgr = 0x2044,
  303. .mnd_width = 16,
  304. .hid_width = 5,
  305. .freq_tbl = ftbl_gcc_blsp1_uart1_2_apps_clk,
  306. .parent_map = gcc_xo_200_spi_map,
  307. .clkr.hw.init = &(struct clk_init_data){
  308. .name = "blsp1_uart1_apps_clk_src",
  309. .parent_names = gcc_xo_200_spi,
  310. .num_parents = 2,
  311. .ops = &clk_rcg2_ops,
  312. },
  313. };
  314. static struct clk_branch gcc_blsp1_uart1_apps_clk = {
  315. .halt_reg = 0x203c,
  316. .clkr = {
  317. .enable_reg = 0x203c,
  318. .enable_mask = BIT(0),
  319. .hw.init = &(struct clk_init_data){
  320. .name = "gcc_blsp1_uart1_apps_clk",
  321. .parent_names = (const char *[]){
  322. "blsp1_uart1_apps_clk_src",
  323. },
  324. .flags = CLK_SET_RATE_PARENT,
  325. .num_parents = 1,
  326. .ops = &clk_branch2_ops,
  327. },
  328. },
  329. };
  330. static struct clk_rcg2 blsp1_uart2_apps_clk_src = {
  331. .cmd_rcgr = 0x3034,
  332. .mnd_width = 16,
  333. .hid_width = 5,
  334. .freq_tbl = ftbl_gcc_blsp1_uart1_2_apps_clk,
  335. .parent_map = gcc_xo_200_spi_map,
  336. .clkr.hw.init = &(struct clk_init_data){
  337. .name = "blsp1_uart2_apps_clk_src",
  338. .parent_names = gcc_xo_200_spi,
  339. .num_parents = 2,
  340. .ops = &clk_rcg2_ops,
  341. },
  342. };
  343. static struct clk_branch gcc_blsp1_uart2_apps_clk = {
  344. .halt_reg = 0x302c,
  345. .clkr = {
  346. .enable_reg = 0x302c,
  347. .enable_mask = BIT(0),
  348. .hw.init = &(struct clk_init_data){
  349. .name = "gcc_blsp1_uart2_apps_clk",
  350. .parent_names = (const char *[]){
  351. "blsp1_uart2_apps_clk_src",
  352. },
  353. .num_parents = 1,
  354. .ops = &clk_branch2_ops,
  355. .flags = CLK_SET_RATE_PARENT,
  356. },
  357. },
  358. };
  359. static const struct freq_tbl ftbl_gcc_gp_clk[] = {
  360. F(1250000, P_FEPLL200, 1, 16, 0),
  361. F(2500000, P_FEPLL200, 1, 8, 0),
  362. F(5000000, P_FEPLL200, 1, 4, 0),
  363. { }
  364. };
  365. static struct clk_rcg2 gp1_clk_src = {
  366. .cmd_rcgr = 0x8004,
  367. .mnd_width = 8,
  368. .hid_width = 5,
  369. .freq_tbl = ftbl_gcc_gp_clk,
  370. .parent_map = gcc_xo_200_map,
  371. .clkr.hw.init = &(struct clk_init_data){
  372. .name = "gp1_clk_src",
  373. .parent_names = gcc_xo_200,
  374. .num_parents = 2,
  375. .ops = &clk_rcg2_ops,
  376. },
  377. };
  378. static struct clk_branch gcc_gp1_clk = {
  379. .halt_reg = 0x8000,
  380. .clkr = {
  381. .enable_reg = 0x8000,
  382. .enable_mask = BIT(0),
  383. .hw.init = &(struct clk_init_data){
  384. .name = "gcc_gp1_clk",
  385. .parent_names = (const char *[]){
  386. "gp1_clk_src",
  387. },
  388. .num_parents = 1,
  389. .ops = &clk_branch2_ops,
  390. .flags = CLK_SET_RATE_PARENT,
  391. },
  392. },
  393. };
  394. static struct clk_rcg2 gp2_clk_src = {
  395. .cmd_rcgr = 0x9004,
  396. .mnd_width = 8,
  397. .hid_width = 5,
  398. .freq_tbl = ftbl_gcc_gp_clk,
  399. .parent_map = gcc_xo_200_map,
  400. .clkr.hw.init = &(struct clk_init_data){
  401. .name = "gp2_clk_src",
  402. .parent_names = gcc_xo_200,
  403. .num_parents = 2,
  404. .ops = &clk_rcg2_ops,
  405. },
  406. };
  407. static struct clk_branch gcc_gp2_clk = {
  408. .halt_reg = 0x9000,
  409. .clkr = {
  410. .enable_reg = 0x9000,
  411. .enable_mask = BIT(0),
  412. .hw.init = &(struct clk_init_data){
  413. .name = "gcc_gp2_clk",
  414. .parent_names = (const char *[]){
  415. "gp2_clk_src",
  416. },
  417. .num_parents = 1,
  418. .ops = &clk_branch2_ops,
  419. .flags = CLK_SET_RATE_PARENT,
  420. },
  421. },
  422. };
  423. static struct clk_rcg2 gp3_clk_src = {
  424. .cmd_rcgr = 0xa004,
  425. .mnd_width = 8,
  426. .hid_width = 5,
  427. .freq_tbl = ftbl_gcc_gp_clk,
  428. .parent_map = gcc_xo_200_map,
  429. .clkr.hw.init = &(struct clk_init_data){
  430. .name = "gp3_clk_src",
  431. .parent_names = gcc_xo_200,
  432. .num_parents = 2,
  433. .ops = &clk_rcg2_ops,
  434. },
  435. };
  436. static struct clk_branch gcc_gp3_clk = {
  437. .halt_reg = 0xa000,
  438. .clkr = {
  439. .enable_reg = 0xa000,
  440. .enable_mask = BIT(0),
  441. .hw.init = &(struct clk_init_data){
  442. .name = "gcc_gp3_clk",
  443. .parent_names = (const char *[]){
  444. "gp3_clk_src",
  445. },
  446. .num_parents = 1,
  447. .ops = &clk_branch2_ops,
  448. .flags = CLK_SET_RATE_PARENT,
  449. },
  450. },
  451. };
  452. static const struct freq_tbl ftbl_gcc_sdcc1_apps_clk[] = {
  453. F(144000, P_XO, 1, 3, 240),
  454. F(400000, P_XO, 1, 1, 0),
  455. F(20000000, P_FEPLL500, 1, 1, 25),
  456. F(25000000, P_FEPLL500, 1, 1, 20),
  457. F(50000000, P_FEPLL500, 1, 1, 10),
  458. F(100000000, P_FEPLL500, 1, 1, 5),
  459. F(193000000, P_DDRPLL, 1, 0, 0),
  460. { }
  461. };
  462. static struct clk_rcg2 sdcc1_apps_clk_src = {
  463. .cmd_rcgr = 0x18004,
  464. .hid_width = 5,
  465. .freq_tbl = ftbl_gcc_sdcc1_apps_clk,
  466. .parent_map = gcc_xo_sdcc1_500_map,
  467. .clkr.hw.init = &(struct clk_init_data){
  468. .name = "sdcc1_apps_clk_src",
  469. .parent_names = gcc_xo_sdcc1_500,
  470. .num_parents = 3,
  471. .ops = &clk_rcg2_ops,
  472. .flags = CLK_SET_RATE_PARENT,
  473. },
  474. };
  475. static const struct freq_tbl ftbl_gcc_apps_clk[] = {
  476. F(48000000, P_XO, 1, 0, 0),
  477. F(200000000, P_FEPLL200, 1, 0, 0),
  478. F(500000000, P_FEPLL500, 1, 0, 0),
  479. F(626000000, P_DDRPLLAPSS, 1, 0, 0),
  480. { }
  481. };
  482. static struct clk_rcg2 apps_clk_src = {
  483. .cmd_rcgr = 0x1900c,
  484. .hid_width = 5,
  485. .freq_tbl = ftbl_gcc_apps_clk,
  486. .parent_map = gcc_xo_ddr_500_200_map,
  487. .clkr.hw.init = &(struct clk_init_data){
  488. .name = "apps_clk_src",
  489. .parent_names = gcc_xo_ddr_500_200,
  490. .num_parents = 4,
  491. .ops = &clk_rcg2_ops,
  492. },
  493. };
  494. static const struct freq_tbl ftbl_gcc_apps_ahb_clk[] = {
  495. F(48000000, P_XO, 1, 0, 0),
  496. F(100000000, P_FEPLL200, 2, 0, 0),
  497. { }
  498. };
  499. static struct clk_rcg2 apps_ahb_clk_src = {
  500. .cmd_rcgr = 0x19014,
  501. .hid_width = 5,
  502. .parent_map = gcc_xo_200_500_map,
  503. .freq_tbl = ftbl_gcc_apps_ahb_clk,
  504. .clkr.hw.init = &(struct clk_init_data){
  505. .name = "apps_ahb_clk_src",
  506. .parent_names = gcc_xo_200_500,
  507. .num_parents = 3,
  508. .ops = &clk_rcg2_ops,
  509. },
  510. };
  511. static struct clk_branch gcc_apss_ahb_clk = {
  512. .halt_reg = 0x19004,
  513. .halt_check = BRANCH_HALT_VOTED,
  514. .clkr = {
  515. .enable_reg = 0x6000,
  516. .enable_mask = BIT(14),
  517. .hw.init = &(struct clk_init_data){
  518. .name = "gcc_apss_ahb_clk",
  519. .parent_names = (const char *[]){
  520. "apps_ahb_clk_src",
  521. },
  522. .num_parents = 1,
  523. .ops = &clk_branch2_ops,
  524. .flags = CLK_SET_RATE_PARENT,
  525. },
  526. },
  527. };
  528. static struct clk_branch gcc_blsp1_ahb_clk = {
  529. .halt_reg = 0x1008,
  530. .halt_check = BRANCH_HALT_VOTED,
  531. .clkr = {
  532. .enable_reg = 0x6000,
  533. .enable_mask = BIT(10),
  534. .hw.init = &(struct clk_init_data){
  535. .name = "gcc_blsp1_ahb_clk",
  536. .parent_names = (const char *[]){
  537. "pcnoc_clk_src",
  538. },
  539. .num_parents = 1,
  540. .ops = &clk_branch2_ops,
  541. },
  542. },
  543. };
  544. static struct clk_branch gcc_dcd_xo_clk = {
  545. .halt_reg = 0x2103c,
  546. .clkr = {
  547. .enable_reg = 0x2103c,
  548. .enable_mask = BIT(0),
  549. .hw.init = &(struct clk_init_data){
  550. .name = "gcc_dcd_xo_clk",
  551. .parent_names = (const char *[]){
  552. "xo",
  553. },
  554. .num_parents = 1,
  555. .ops = &clk_branch2_ops,
  556. },
  557. },
  558. };
  559. static struct clk_branch gcc_boot_rom_ahb_clk = {
  560. .halt_reg = 0x1300c,
  561. .clkr = {
  562. .enable_reg = 0x1300c,
  563. .enable_mask = BIT(0),
  564. .hw.init = &(struct clk_init_data){
  565. .name = "gcc_boot_rom_ahb_clk",
  566. .parent_names = (const char *[]){
  567. "pcnoc_clk_src",
  568. },
  569. .num_parents = 1,
  570. .ops = &clk_branch2_ops,
  571. .flags = CLK_SET_RATE_PARENT,
  572. },
  573. },
  574. };
  575. static struct clk_branch gcc_crypto_ahb_clk = {
  576. .halt_reg = 0x16024,
  577. .halt_check = BRANCH_HALT_VOTED,
  578. .clkr = {
  579. .enable_reg = 0x6000,
  580. .enable_mask = BIT(0),
  581. .hw.init = &(struct clk_init_data){
  582. .name = "gcc_crypto_ahb_clk",
  583. .parent_names = (const char *[]){
  584. "pcnoc_clk_src",
  585. },
  586. .num_parents = 1,
  587. .ops = &clk_branch2_ops,
  588. },
  589. },
  590. };
  591. static struct clk_branch gcc_crypto_axi_clk = {
  592. .halt_reg = 0x16020,
  593. .halt_check = BRANCH_HALT_VOTED,
  594. .clkr = {
  595. .enable_reg = 0x6000,
  596. .enable_mask = BIT(1),
  597. .hw.init = &(struct clk_init_data){
  598. .name = "gcc_crypto_axi_clk",
  599. .parent_names = (const char *[]){
  600. "fepll125",
  601. },
  602. .num_parents = 1,
  603. .ops = &clk_branch2_ops,
  604. },
  605. },
  606. };
  607. static struct clk_branch gcc_crypto_clk = {
  608. .halt_reg = 0x1601c,
  609. .halt_check = BRANCH_HALT_VOTED,
  610. .clkr = {
  611. .enable_reg = 0x6000,
  612. .enable_mask = BIT(2),
  613. .hw.init = &(struct clk_init_data){
  614. .name = "gcc_crypto_clk",
  615. .parent_names = (const char *[]){
  616. "fepll125",
  617. },
  618. .num_parents = 1,
  619. .ops = &clk_branch2_ops,
  620. },
  621. },
  622. };
  623. static struct clk_branch gcc_ess_clk = {
  624. .halt_reg = 0x12010,
  625. .clkr = {
  626. .enable_reg = 0x12010,
  627. .enable_mask = BIT(0),
  628. .hw.init = &(struct clk_init_data){
  629. .name = "gcc_ess_clk",
  630. .parent_names = (const char *[]){
  631. "fephy_125m_dly_clk_src",
  632. },
  633. .num_parents = 1,
  634. .ops = &clk_branch2_ops,
  635. .flags = CLK_SET_RATE_PARENT,
  636. },
  637. },
  638. };
  639. static struct clk_branch gcc_imem_axi_clk = {
  640. .halt_reg = 0xe004,
  641. .halt_check = BRANCH_HALT_VOTED,
  642. .clkr = {
  643. .enable_reg = 0x6000,
  644. .enable_mask = BIT(17),
  645. .hw.init = &(struct clk_init_data){
  646. .name = "gcc_imem_axi_clk",
  647. .parent_names = (const char *[]){
  648. "fepll200",
  649. },
  650. .num_parents = 1,
  651. .ops = &clk_branch2_ops,
  652. },
  653. },
  654. };
  655. static struct clk_branch gcc_imem_cfg_ahb_clk = {
  656. .halt_reg = 0xe008,
  657. .clkr = {
  658. .enable_reg = 0xe008,
  659. .enable_mask = BIT(0),
  660. .hw.init = &(struct clk_init_data){
  661. .name = "gcc_imem_cfg_ahb_clk",
  662. .parent_names = (const char *[]){
  663. "pcnoc_clk_src",
  664. },
  665. .num_parents = 1,
  666. .ops = &clk_branch2_ops,
  667. },
  668. },
  669. };
  670. static struct clk_branch gcc_pcie_ahb_clk = {
  671. .halt_reg = 0x1d00c,
  672. .clkr = {
  673. .enable_reg = 0x1d00c,
  674. .enable_mask = BIT(0),
  675. .hw.init = &(struct clk_init_data){
  676. .name = "gcc_pcie_ahb_clk",
  677. .parent_names = (const char *[]){
  678. "pcnoc_clk_src",
  679. },
  680. .num_parents = 1,
  681. .ops = &clk_branch2_ops,
  682. },
  683. },
  684. };
  685. static struct clk_branch gcc_pcie_axi_m_clk = {
  686. .halt_reg = 0x1d004,
  687. .clkr = {
  688. .enable_reg = 0x1d004,
  689. .enable_mask = BIT(0),
  690. .hw.init = &(struct clk_init_data){
  691. .name = "gcc_pcie_axi_m_clk",
  692. .parent_names = (const char *[]){
  693. "fepll200",
  694. },
  695. .num_parents = 1,
  696. .ops = &clk_branch2_ops,
  697. },
  698. },
  699. };
  700. static struct clk_branch gcc_pcie_axi_s_clk = {
  701. .halt_reg = 0x1d008,
  702. .clkr = {
  703. .enable_reg = 0x1d008,
  704. .enable_mask = BIT(0),
  705. .hw.init = &(struct clk_init_data){
  706. .name = "gcc_pcie_axi_s_clk",
  707. .parent_names = (const char *[]){
  708. "fepll200",
  709. },
  710. .num_parents = 1,
  711. .ops = &clk_branch2_ops,
  712. },
  713. },
  714. };
  715. static struct clk_branch gcc_prng_ahb_clk = {
  716. .halt_reg = 0x13004,
  717. .halt_check = BRANCH_HALT_VOTED,
  718. .clkr = {
  719. .enable_reg = 0x6000,
  720. .enable_mask = BIT(8),
  721. .hw.init = &(struct clk_init_data){
  722. .name = "gcc_prng_ahb_clk",
  723. .parent_names = (const char *[]){
  724. "pcnoc_clk_src",
  725. },
  726. .num_parents = 1,
  727. .ops = &clk_branch2_ops,
  728. },
  729. },
  730. };
  731. static struct clk_branch gcc_qpic_ahb_clk = {
  732. .halt_reg = 0x1c008,
  733. .clkr = {
  734. .enable_reg = 0x1c008,
  735. .enable_mask = BIT(0),
  736. .hw.init = &(struct clk_init_data){
  737. .name = "gcc_qpic_ahb_clk",
  738. .parent_names = (const char *[]){
  739. "pcnoc_clk_src",
  740. },
  741. .num_parents = 1,
  742. .ops = &clk_branch2_ops,
  743. },
  744. },
  745. };
  746. static struct clk_branch gcc_qpic_clk = {
  747. .halt_reg = 0x1c004,
  748. .clkr = {
  749. .enable_reg = 0x1c004,
  750. .enable_mask = BIT(0),
  751. .hw.init = &(struct clk_init_data){
  752. .name = "gcc_qpic_clk",
  753. .parent_names = (const char *[]){
  754. "pcnoc_clk_src",
  755. },
  756. .num_parents = 1,
  757. .ops = &clk_branch2_ops,
  758. },
  759. },
  760. };
  761. static struct clk_branch gcc_sdcc1_ahb_clk = {
  762. .halt_reg = 0x18010,
  763. .clkr = {
  764. .enable_reg = 0x18010,
  765. .enable_mask = BIT(0),
  766. .hw.init = &(struct clk_init_data){
  767. .name = "gcc_sdcc1_ahb_clk",
  768. .parent_names = (const char *[]){
  769. "pcnoc_clk_src",
  770. },
  771. .num_parents = 1,
  772. .ops = &clk_branch2_ops,
  773. },
  774. },
  775. };
  776. static struct clk_branch gcc_sdcc1_apps_clk = {
  777. .halt_reg = 0x1800c,
  778. .clkr = {
  779. .enable_reg = 0x1800c,
  780. .enable_mask = BIT(0),
  781. .hw.init = &(struct clk_init_data){
  782. .name = "gcc_sdcc1_apps_clk",
  783. .parent_names = (const char *[]){
  784. "sdcc1_apps_clk_src",
  785. },
  786. .num_parents = 1,
  787. .ops = &clk_branch2_ops,
  788. .flags = CLK_SET_RATE_PARENT,
  789. },
  790. },
  791. };
  792. static struct clk_branch gcc_tlmm_ahb_clk = {
  793. .halt_reg = 0x5004,
  794. .halt_check = BRANCH_HALT_VOTED,
  795. .clkr = {
  796. .enable_reg = 0x6000,
  797. .enable_mask = BIT(5),
  798. .hw.init = &(struct clk_init_data){
  799. .name = "gcc_tlmm_ahb_clk",
  800. .parent_names = (const char *[]){
  801. "pcnoc_clk_src",
  802. },
  803. .num_parents = 1,
  804. .ops = &clk_branch2_ops,
  805. },
  806. },
  807. };
  808. static struct clk_branch gcc_usb2_master_clk = {
  809. .halt_reg = 0x1e00c,
  810. .clkr = {
  811. .enable_reg = 0x1e00c,
  812. .enable_mask = BIT(0),
  813. .hw.init = &(struct clk_init_data){
  814. .name = "gcc_usb2_master_clk",
  815. .parent_names = (const char *[]){
  816. "pcnoc_clk_src",
  817. },
  818. .num_parents = 1,
  819. .ops = &clk_branch2_ops,
  820. },
  821. },
  822. };
  823. static struct clk_branch gcc_usb2_sleep_clk = {
  824. .halt_reg = 0x1e010,
  825. .clkr = {
  826. .enable_reg = 0x1e010,
  827. .enable_mask = BIT(0),
  828. .hw.init = &(struct clk_init_data){
  829. .name = "gcc_usb2_sleep_clk",
  830. .parent_names = (const char *[]){
  831. "gcc_sleep_clk_src",
  832. },
  833. .num_parents = 1,
  834. .ops = &clk_branch2_ops,
  835. },
  836. },
  837. };
  838. static struct clk_branch gcc_usb2_mock_utmi_clk = {
  839. .halt_reg = 0x1e014,
  840. .clkr = {
  841. .enable_reg = 0x1e014,
  842. .enable_mask = BIT(0),
  843. .hw.init = &(struct clk_init_data){
  844. .name = "gcc_usb2_mock_utmi_clk",
  845. .parent_names = (const char *[]){
  846. "usb30_mock_utmi_clk_src",
  847. },
  848. .num_parents = 1,
  849. .ops = &clk_branch2_ops,
  850. .flags = CLK_SET_RATE_PARENT,
  851. },
  852. },
  853. };
  854. static const struct freq_tbl ftbl_gcc_usb30_mock_utmi_clk[] = {
  855. F(2000000, P_FEPLL200, 10, 0, 0),
  856. { }
  857. };
  858. static struct clk_rcg2 usb30_mock_utmi_clk_src = {
  859. .cmd_rcgr = 0x1e000,
  860. .hid_width = 5,
  861. .parent_map = gcc_xo_200_map,
  862. .freq_tbl = ftbl_gcc_usb30_mock_utmi_clk,
  863. .clkr.hw.init = &(struct clk_init_data){
  864. .name = "usb30_mock_utmi_clk_src",
  865. .parent_names = gcc_xo_200,
  866. .num_parents = 2,
  867. .ops = &clk_rcg2_ops,
  868. },
  869. };
  870. static struct clk_branch gcc_usb3_master_clk = {
  871. .halt_reg = 0x1e028,
  872. .clkr = {
  873. .enable_reg = 0x1e028,
  874. .enable_mask = BIT(0),
  875. .hw.init = &(struct clk_init_data){
  876. .name = "gcc_usb3_master_clk",
  877. .parent_names = (const char *[]){
  878. "fepll125",
  879. },
  880. .num_parents = 1,
  881. .ops = &clk_branch2_ops,
  882. },
  883. },
  884. };
  885. static struct clk_branch gcc_usb3_sleep_clk = {
  886. .halt_reg = 0x1e02C,
  887. .clkr = {
  888. .enable_reg = 0x1e02C,
  889. .enable_mask = BIT(0),
  890. .hw.init = &(struct clk_init_data){
  891. .name = "gcc_usb3_sleep_clk",
  892. .parent_names = (const char *[]){
  893. "gcc_sleep_clk_src",
  894. },
  895. .num_parents = 1,
  896. .ops = &clk_branch2_ops,
  897. },
  898. },
  899. };
  900. static struct clk_branch gcc_usb3_mock_utmi_clk = {
  901. .halt_reg = 0x1e030,
  902. .clkr = {
  903. .enable_reg = 0x1e030,
  904. .enable_mask = BIT(0),
  905. .hw.init = &(struct clk_init_data){
  906. .name = "gcc_usb3_mock_utmi_clk",
  907. .parent_names = (const char *[]){
  908. "usb30_mock_utmi_clk_src",
  909. },
  910. .num_parents = 1,
  911. .ops = &clk_branch2_ops,
  912. .flags = CLK_SET_RATE_PARENT,
  913. },
  914. },
  915. };
  916. static const struct freq_tbl ftbl_gcc_fephy_dly_clk[] = {
  917. F(125000000, P_FEPLL125DLY, 1, 0, 0),
  918. { }
  919. };
  920. static struct clk_rcg2 fephy_125m_dly_clk_src = {
  921. .cmd_rcgr = 0x12000,
  922. .hid_width = 5,
  923. .parent_map = gcc_xo_125_dly_map,
  924. .freq_tbl = ftbl_gcc_fephy_dly_clk,
  925. .clkr.hw.init = &(struct clk_init_data){
  926. .name = "fephy_125m_dly_clk_src",
  927. .parent_names = gcc_xo_125_dly,
  928. .num_parents = 2,
  929. .ops = &clk_rcg2_ops,
  930. },
  931. };
  932. static const struct freq_tbl ftbl_gcc_wcss2g_clk[] = {
  933. F(48000000, P_XO, 1, 0, 0),
  934. F(250000000, P_FEPLLWCSS2G, 1, 0, 0),
  935. { }
  936. };
  937. static struct clk_rcg2 wcss2g_clk_src = {
  938. .cmd_rcgr = 0x1f000,
  939. .hid_width = 5,
  940. .freq_tbl = ftbl_gcc_wcss2g_clk,
  941. .parent_map = gcc_xo_wcss2g_map,
  942. .clkr.hw.init = &(struct clk_init_data){
  943. .name = "wcss2g_clk_src",
  944. .parent_names = gcc_xo_wcss2g,
  945. .num_parents = 2,
  946. .ops = &clk_rcg2_ops,
  947. .flags = CLK_SET_RATE_PARENT,
  948. },
  949. };
  950. static struct clk_branch gcc_wcss2g_clk = {
  951. .halt_reg = 0x1f00C,
  952. .clkr = {
  953. .enable_reg = 0x1f00C,
  954. .enable_mask = BIT(0),
  955. .hw.init = &(struct clk_init_data){
  956. .name = "gcc_wcss2g_clk",
  957. .parent_names = (const char *[]){
  958. "wcss2g_clk_src",
  959. },
  960. .num_parents = 1,
  961. .ops = &clk_branch2_ops,
  962. .flags = CLK_SET_RATE_PARENT,
  963. },
  964. },
  965. };
  966. static struct clk_branch gcc_wcss2g_ref_clk = {
  967. .halt_reg = 0x1f00C,
  968. .clkr = {
  969. .enable_reg = 0x1f00C,
  970. .enable_mask = BIT(0),
  971. .hw.init = &(struct clk_init_data){
  972. .name = "gcc_wcss2g_ref_clk",
  973. .parent_names = (const char *[]){
  974. "xo",
  975. },
  976. .num_parents = 1,
  977. .ops = &clk_branch2_ops,
  978. .flags = CLK_SET_RATE_PARENT,
  979. },
  980. },
  981. };
  982. static struct clk_branch gcc_wcss2g_rtc_clk = {
  983. .halt_reg = 0x1f010,
  984. .clkr = {
  985. .enable_reg = 0x1f010,
  986. .enable_mask = BIT(0),
  987. .hw.init = &(struct clk_init_data){
  988. .name = "gcc_wcss2g_rtc_clk",
  989. .parent_names = (const char *[]){
  990. "gcc_sleep_clk_src",
  991. },
  992. .num_parents = 1,
  993. .ops = &clk_branch2_ops,
  994. },
  995. },
  996. };
  997. static const struct freq_tbl ftbl_gcc_wcss5g_clk[] = {
  998. F(48000000, P_XO, 1, 0, 0),
  999. F(250000000, P_FEPLLWCSS5G, 1, 0, 0),
  1000. { }
  1001. };
  1002. static struct clk_rcg2 wcss5g_clk_src = {
  1003. .cmd_rcgr = 0x20000,
  1004. .hid_width = 5,
  1005. .parent_map = gcc_xo_wcss5g_map,
  1006. .freq_tbl = ftbl_gcc_wcss5g_clk,
  1007. .clkr.hw.init = &(struct clk_init_data){
  1008. .name = "wcss5g_clk_src",
  1009. .parent_names = gcc_xo_wcss5g,
  1010. .num_parents = 2,
  1011. .ops = &clk_rcg2_ops,
  1012. },
  1013. };
  1014. static struct clk_branch gcc_wcss5g_clk = {
  1015. .halt_reg = 0x2000c,
  1016. .clkr = {
  1017. .enable_reg = 0x2000c,
  1018. .enable_mask = BIT(0),
  1019. .hw.init = &(struct clk_init_data){
  1020. .name = "gcc_wcss5g_clk",
  1021. .parent_names = (const char *[]){
  1022. "wcss5g_clk_src",
  1023. },
  1024. .num_parents = 1,
  1025. .ops = &clk_branch2_ops,
  1026. .flags = CLK_SET_RATE_PARENT,
  1027. },
  1028. },
  1029. };
  1030. static struct clk_branch gcc_wcss5g_ref_clk = {
  1031. .halt_reg = 0x2000c,
  1032. .clkr = {
  1033. .enable_reg = 0x2000c,
  1034. .enable_mask = BIT(0),
  1035. .hw.init = &(struct clk_init_data){
  1036. .name = "gcc_wcss5g_ref_clk",
  1037. .parent_names = (const char *[]){
  1038. "xo",
  1039. },
  1040. .num_parents = 1,
  1041. .ops = &clk_branch2_ops,
  1042. .flags = CLK_SET_RATE_PARENT,
  1043. },
  1044. },
  1045. };
  1046. static struct clk_branch gcc_wcss5g_rtc_clk = {
  1047. .halt_reg = 0x20010,
  1048. .clkr = {
  1049. .enable_reg = 0x20010,
  1050. .enable_mask = BIT(0),
  1051. .hw.init = &(struct clk_init_data){
  1052. .name = "gcc_wcss5g_rtc_clk",
  1053. .parent_names = (const char *[]){
  1054. "gcc_sleep_clk_src",
  1055. },
  1056. .num_parents = 1,
  1057. .ops = &clk_branch2_ops,
  1058. .flags = CLK_SET_RATE_PARENT,
  1059. },
  1060. },
  1061. };
  1062. static struct clk_regmap *gcc_ipq4019_clocks[] = {
  1063. [AUDIO_CLK_SRC] = &audio_clk_src.clkr,
  1064. [BLSP1_QUP1_I2C_APPS_CLK_SRC] = &blsp1_qup1_i2c_apps_clk_src.clkr,
  1065. [BLSP1_QUP1_SPI_APPS_CLK_SRC] = &blsp1_qup1_spi_apps_clk_src.clkr,
  1066. [BLSP1_QUP2_I2C_APPS_CLK_SRC] = &blsp1_qup2_i2c_apps_clk_src.clkr,
  1067. [BLSP1_QUP2_SPI_APPS_CLK_SRC] = &blsp1_qup2_spi_apps_clk_src.clkr,
  1068. [BLSP1_UART1_APPS_CLK_SRC] = &blsp1_uart1_apps_clk_src.clkr,
  1069. [BLSP1_UART2_APPS_CLK_SRC] = &blsp1_uart2_apps_clk_src.clkr,
  1070. [GCC_USB3_MOCK_UTMI_CLK_SRC] = &usb30_mock_utmi_clk_src.clkr,
  1071. [GCC_APPS_CLK_SRC] = &apps_clk_src.clkr,
  1072. [GCC_APPS_AHB_CLK_SRC] = &apps_ahb_clk_src.clkr,
  1073. [GP1_CLK_SRC] = &gp1_clk_src.clkr,
  1074. [GP2_CLK_SRC] = &gp2_clk_src.clkr,
  1075. [GP3_CLK_SRC] = &gp3_clk_src.clkr,
  1076. [SDCC1_APPS_CLK_SRC] = &sdcc1_apps_clk_src.clkr,
  1077. [FEPHY_125M_DLY_CLK_SRC] = &fephy_125m_dly_clk_src.clkr,
  1078. [WCSS2G_CLK_SRC] = &wcss2g_clk_src.clkr,
  1079. [WCSS5G_CLK_SRC] = &wcss5g_clk_src.clkr,
  1080. [GCC_APSS_AHB_CLK] = &gcc_apss_ahb_clk.clkr,
  1081. [GCC_AUDIO_AHB_CLK] = &gcc_audio_ahb_clk.clkr,
  1082. [GCC_AUDIO_PWM_CLK] = &gcc_audio_pwm_clk.clkr,
  1083. [GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr,
  1084. [GCC_BLSP1_QUP1_I2C_APPS_CLK] = &gcc_blsp1_qup1_i2c_apps_clk.clkr,
  1085. [GCC_BLSP1_QUP1_SPI_APPS_CLK] = &gcc_blsp1_qup1_spi_apps_clk.clkr,
  1086. [GCC_BLSP1_QUP2_I2C_APPS_CLK] = &gcc_blsp1_qup2_i2c_apps_clk.clkr,
  1087. [GCC_BLSP1_QUP2_SPI_APPS_CLK] = &gcc_blsp1_qup2_spi_apps_clk.clkr,
  1088. [GCC_BLSP1_UART1_APPS_CLK] = &gcc_blsp1_uart1_apps_clk.clkr,
  1089. [GCC_BLSP1_UART2_APPS_CLK] = &gcc_blsp1_uart2_apps_clk.clkr,
  1090. [GCC_DCD_XO_CLK] = &gcc_dcd_xo_clk.clkr,
  1091. [GCC_GP1_CLK] = &gcc_gp1_clk.clkr,
  1092. [GCC_GP2_CLK] = &gcc_gp2_clk.clkr,
  1093. [GCC_GP3_CLK] = &gcc_gp3_clk.clkr,
  1094. [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
  1095. [GCC_CRYPTO_AHB_CLK] = &gcc_crypto_ahb_clk.clkr,
  1096. [GCC_CRYPTO_AXI_CLK] = &gcc_crypto_axi_clk.clkr,
  1097. [GCC_CRYPTO_CLK] = &gcc_crypto_clk.clkr,
  1098. [GCC_ESS_CLK] = &gcc_ess_clk.clkr,
  1099. [GCC_IMEM_AXI_CLK] = &gcc_imem_axi_clk.clkr,
  1100. [GCC_IMEM_CFG_AHB_CLK] = &gcc_imem_cfg_ahb_clk.clkr,
  1101. [GCC_PCIE_AHB_CLK] = &gcc_pcie_ahb_clk.clkr,
  1102. [GCC_PCIE_AXI_M_CLK] = &gcc_pcie_axi_m_clk.clkr,
  1103. [GCC_PCIE_AXI_S_CLK] = &gcc_pcie_axi_s_clk.clkr,
  1104. [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
  1105. [GCC_QPIC_AHB_CLK] = &gcc_qpic_ahb_clk.clkr,
  1106. [GCC_QPIC_CLK] = &gcc_qpic_clk.clkr,
  1107. [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr,
  1108. [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr,
  1109. [GCC_TLMM_AHB_CLK] = &gcc_tlmm_ahb_clk.clkr,
  1110. [GCC_USB2_MASTER_CLK] = &gcc_usb2_master_clk.clkr,
  1111. [GCC_USB2_SLEEP_CLK] = &gcc_usb2_sleep_clk.clkr,
  1112. [GCC_USB2_MOCK_UTMI_CLK] = &gcc_usb2_mock_utmi_clk.clkr,
  1113. [GCC_USB3_MASTER_CLK] = &gcc_usb3_master_clk.clkr,
  1114. [GCC_USB3_SLEEP_CLK] = &gcc_usb3_sleep_clk.clkr,
  1115. [GCC_USB3_MOCK_UTMI_CLK] = &gcc_usb3_mock_utmi_clk.clkr,
  1116. [GCC_WCSS2G_CLK] = &gcc_wcss2g_clk.clkr,
  1117. [GCC_WCSS2G_REF_CLK] = &gcc_wcss2g_ref_clk.clkr,
  1118. [GCC_WCSS2G_RTC_CLK] = &gcc_wcss2g_rtc_clk.clkr,
  1119. [GCC_WCSS5G_CLK] = &gcc_wcss5g_clk.clkr,
  1120. [GCC_WCSS5G_REF_CLK] = &gcc_wcss5g_ref_clk.clkr,
  1121. [GCC_WCSS5G_RTC_CLK] = &gcc_wcss5g_rtc_clk.clkr,
  1122. };
  1123. static const struct qcom_reset_map gcc_ipq4019_resets[] = {
  1124. [WIFI0_CPU_INIT_RESET] = { 0x1f008, 5 },
  1125. [WIFI0_RADIO_SRIF_RESET] = { 0x1f008, 4 },
  1126. [WIFI0_RADIO_WARM_RESET] = { 0x1f008, 3 },
  1127. [WIFI0_RADIO_COLD_RESET] = { 0x1f008, 2 },
  1128. [WIFI0_CORE_WARM_RESET] = { 0x1f008, 1 },
  1129. [WIFI0_CORE_COLD_RESET] = { 0x1f008, 0 },
  1130. [WIFI1_CPU_INIT_RESET] = { 0x20008, 5 },
  1131. [WIFI1_RADIO_SRIF_RESET] = { 0x20008, 4 },
  1132. [WIFI1_RADIO_WARM_RESET] = { 0x20008, 3 },
  1133. [WIFI1_RADIO_COLD_RESET] = { 0x20008, 2 },
  1134. [WIFI1_CORE_WARM_RESET] = { 0x20008, 1 },
  1135. [WIFI1_CORE_COLD_RESET] = { 0x20008, 0 },
  1136. [USB3_UNIPHY_PHY_ARES] = { 0x1e038, 5 },
  1137. [USB3_HSPHY_POR_ARES] = { 0x1e038, 4 },
  1138. [USB3_HSPHY_S_ARES] = { 0x1e038, 2 },
  1139. [USB2_HSPHY_POR_ARES] = { 0x1e01c, 4 },
  1140. [USB2_HSPHY_S_ARES] = { 0x1e01c, 2 },
  1141. [PCIE_PHY_AHB_ARES] = { 0x1d010, 11 },
  1142. [PCIE_AHB_ARES] = { 0x1d010, 10 },
  1143. [PCIE_PWR_ARES] = { 0x1d010, 9 },
  1144. [PCIE_PIPE_STICKY_ARES] = { 0x1d010, 8 },
  1145. [PCIE_AXI_M_STICKY_ARES] = { 0x1d010, 7 },
  1146. [PCIE_PHY_ARES] = { 0x1d010, 6 },
  1147. [PCIE_PARF_XPU_ARES] = { 0x1d010, 5 },
  1148. [PCIE_AXI_S_XPU_ARES] = { 0x1d010, 4 },
  1149. [PCIE_AXI_M_VMIDMT_ARES] = { 0x1d010, 3 },
  1150. [PCIE_PIPE_ARES] = { 0x1d010, 2 },
  1151. [PCIE_AXI_S_ARES] = { 0x1d010, 1 },
  1152. [PCIE_AXI_M_ARES] = { 0x1d010, 0 },
  1153. [ESS_RESET] = { 0x12008, 0},
  1154. [GCC_BLSP1_BCR] = {0x01000, 0},
  1155. [GCC_BLSP1_QUP1_BCR] = {0x02000, 0},
  1156. [GCC_BLSP1_UART1_BCR] = {0x02038, 0},
  1157. [GCC_BLSP1_QUP2_BCR] = {0x03008, 0},
  1158. [GCC_BLSP1_UART2_BCR] = {0x03028, 0},
  1159. [GCC_BIMC_BCR] = {0x04000, 0},
  1160. [GCC_TLMM_BCR] = {0x05000, 0},
  1161. [GCC_IMEM_BCR] = {0x0E000, 0},
  1162. [GCC_ESS_BCR] = {0x12008, 0},
  1163. [GCC_PRNG_BCR] = {0x13000, 0},
  1164. [GCC_BOOT_ROM_BCR] = {0x13008, 0},
  1165. [GCC_CRYPTO_BCR] = {0x16000, 0},
  1166. [GCC_SDCC1_BCR] = {0x18000, 0},
  1167. [GCC_SEC_CTRL_BCR] = {0x1A000, 0},
  1168. [GCC_AUDIO_BCR] = {0x1B008, 0},
  1169. [GCC_QPIC_BCR] = {0x1C000, 0},
  1170. [GCC_PCIE_BCR] = {0x1D000, 0},
  1171. [GCC_USB2_BCR] = {0x1E008, 0},
  1172. [GCC_USB2_PHY_BCR] = {0x1E018, 0},
  1173. [GCC_USB3_BCR] = {0x1E024, 0},
  1174. [GCC_USB3_PHY_BCR] = {0x1E034, 0},
  1175. [GCC_SYSTEM_NOC_BCR] = {0x21000, 0},
  1176. [GCC_PCNOC_BCR] = {0x2102C, 0},
  1177. [GCC_DCD_BCR] = {0x21038, 0},
  1178. [GCC_SNOC_BUS_TIMEOUT0_BCR] = {0x21064, 0},
  1179. [GCC_SNOC_BUS_TIMEOUT1_BCR] = {0x2106C, 0},
  1180. [GCC_SNOC_BUS_TIMEOUT2_BCR] = {0x21074, 0},
  1181. [GCC_SNOC_BUS_TIMEOUT3_BCR] = {0x2107C, 0},
  1182. [GCC_PCNOC_BUS_TIMEOUT0_BCR] = {0x21084, 0},
  1183. [GCC_PCNOC_BUS_TIMEOUT1_BCR] = {0x2108C, 0},
  1184. [GCC_PCNOC_BUS_TIMEOUT2_BCR] = {0x21094, 0},
  1185. [GCC_PCNOC_BUS_TIMEOUT3_BCR] = {0x2109C, 0},
  1186. [GCC_PCNOC_BUS_TIMEOUT4_BCR] = {0x210A4, 0},
  1187. [GCC_PCNOC_BUS_TIMEOUT5_BCR] = {0x210AC, 0},
  1188. [GCC_PCNOC_BUS_TIMEOUT6_BCR] = {0x210B4, 0},
  1189. [GCC_PCNOC_BUS_TIMEOUT7_BCR] = {0x210BC, 0},
  1190. [GCC_PCNOC_BUS_TIMEOUT8_BCR] = {0x210C4, 0},
  1191. [GCC_PCNOC_BUS_TIMEOUT9_BCR] = {0x210CC, 0},
  1192. [GCC_TCSR_BCR] = {0x22000, 0},
  1193. [GCC_MPM_BCR] = {0x24000, 0},
  1194. [GCC_SPDM_BCR] = {0x25000, 0},
  1195. };
  1196. static const struct regmap_config gcc_ipq4019_regmap_config = {
  1197. .reg_bits = 32,
  1198. .reg_stride = 4,
  1199. .val_bits = 32,
  1200. .max_register = 0x2dfff,
  1201. .fast_io = true,
  1202. };
  1203. static const struct qcom_cc_desc gcc_ipq4019_desc = {
  1204. .config = &gcc_ipq4019_regmap_config,
  1205. .clks = gcc_ipq4019_clocks,
  1206. .num_clks = ARRAY_SIZE(gcc_ipq4019_clocks),
  1207. .resets = gcc_ipq4019_resets,
  1208. .num_resets = ARRAY_SIZE(gcc_ipq4019_resets),
  1209. };
  1210. static const struct of_device_id gcc_ipq4019_match_table[] = {
  1211. { .compatible = "qcom,gcc-ipq4019" },
  1212. { }
  1213. };
  1214. MODULE_DEVICE_TABLE(of, gcc_ipq4019_match_table);
  1215. static int gcc_ipq4019_probe(struct platform_device *pdev)
  1216. {
  1217. struct device *dev = &pdev->dev;
  1218. clk_register_fixed_rate(dev, "fepll125", "xo", 0, 200000000);
  1219. clk_register_fixed_rate(dev, "fepll125dly", "xo", 0, 200000000);
  1220. clk_register_fixed_rate(dev, "fepllwcss2g", "xo", 0, 200000000);
  1221. clk_register_fixed_rate(dev, "fepllwcss5g", "xo", 0, 200000000);
  1222. clk_register_fixed_rate(dev, "fepll200", "xo", 0, 200000000);
  1223. clk_register_fixed_rate(dev, "fepll500", "xo", 0, 200000000);
  1224. clk_register_fixed_rate(dev, "ddrpllapss", "xo", 0, 666000000);
  1225. return qcom_cc_probe(pdev, &gcc_ipq4019_desc);
  1226. }
  1227. static struct platform_driver gcc_ipq4019_driver = {
  1228. .probe = gcc_ipq4019_probe,
  1229. .driver = {
  1230. .name = "qcom,gcc-ipq4019",
  1231. .of_match_table = gcc_ipq4019_match_table,
  1232. },
  1233. };
  1234. static int __init gcc_ipq4019_init(void)
  1235. {
  1236. return platform_driver_register(&gcc_ipq4019_driver);
  1237. }
  1238. core_initcall(gcc_ipq4019_init);
  1239. static void __exit gcc_ipq4019_exit(void)
  1240. {
  1241. platform_driver_unregister(&gcc_ipq4019_driver);
  1242. }
  1243. module_exit(gcc_ipq4019_exit);
  1244. MODULE_ALIAS("platform:gcc-ipq4019");
  1245. MODULE_LICENSE("GPL v2");
  1246. MODULE_DESCRIPTION("QCOM GCC IPQ4019 driver");