gcc-ipq4019.c 32 KB

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