scg.c 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090
  1. /*
  2. * Copyright (C) 2016 Freescale Semiconductor, Inc.
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <div64.h>
  8. #include <asm/io.h>
  9. #include <errno.h>
  10. #include <asm/arch/imx-regs.h>
  11. #include <asm/arch/pcc.h>
  12. #include <asm/arch/sys_proto.h>
  13. DECLARE_GLOBAL_DATA_PTR;
  14. scg_p scg1_regs = (scg_p)SCG1_RBASE;
  15. static u32 scg_src_get_rate(enum scg_clk clksrc)
  16. {
  17. u32 reg;
  18. switch (clksrc) {
  19. case SCG_SOSC_CLK:
  20. reg = readl(&scg1_regs->sosccsr);
  21. if (!(reg & SCG_SOSC_CSR_SOSCVLD_MASK))
  22. return 0;
  23. return 24000000;
  24. case SCG_FIRC_CLK:
  25. reg = readl(&scg1_regs->firccsr);
  26. if (!(reg & SCG_FIRC_CSR_FIRCVLD_MASK))
  27. return 0;
  28. return 48000000;
  29. case SCG_SIRC_CLK:
  30. reg = readl(&scg1_regs->sirccsr);
  31. if (!(reg & SCG_SIRC_CSR_SIRCVLD_MASK))
  32. return 0;
  33. return 16000000;
  34. case SCG_ROSC_CLK:
  35. reg = readl(&scg1_regs->rtccsr);
  36. if (!(reg & SCG_ROSC_CSR_ROSCVLD_MASK))
  37. return 0;
  38. return 32768;
  39. default:
  40. break;
  41. }
  42. return 0;
  43. }
  44. static u32 scg_sircdiv_get_rate(enum scg_clk clk)
  45. {
  46. u32 reg, val, rate;
  47. u32 shift, mask;
  48. switch (clk) {
  49. case SCG_SIRC_DIV1_CLK:
  50. mask = SCG_SIRCDIV_DIV1_MASK;
  51. shift = SCG_SIRCDIV_DIV1_SHIFT;
  52. break;
  53. case SCG_SIRC_DIV2_CLK:
  54. mask = SCG_SIRCDIV_DIV2_MASK;
  55. shift = SCG_SIRCDIV_DIV2_SHIFT;
  56. break;
  57. case SCG_SIRC_DIV3_CLK:
  58. mask = SCG_SIRCDIV_DIV3_MASK;
  59. shift = SCG_SIRCDIV_DIV3_SHIFT;
  60. break;
  61. default:
  62. return 0;
  63. }
  64. reg = readl(&scg1_regs->sirccsr);
  65. if (!(reg & SCG_SIRC_CSR_SIRCVLD_MASK))
  66. return 0;
  67. reg = readl(&scg1_regs->sircdiv);
  68. val = (reg & mask) >> shift;
  69. if (!val) /*clock disabled*/
  70. return 0;
  71. rate = scg_src_get_rate(SCG_SIRC_CLK);
  72. rate = rate / (1 << (val - 1));
  73. return rate;
  74. }
  75. static u32 scg_fircdiv_get_rate(enum scg_clk clk)
  76. {
  77. u32 reg, val, rate;
  78. u32 shift, mask;
  79. switch (clk) {
  80. case SCG_FIRC_DIV1_CLK:
  81. mask = SCG_FIRCDIV_DIV1_MASK;
  82. shift = SCG_FIRCDIV_DIV1_SHIFT;
  83. break;
  84. case SCG_FIRC_DIV2_CLK:
  85. mask = SCG_FIRCDIV_DIV2_MASK;
  86. shift = SCG_FIRCDIV_DIV2_SHIFT;
  87. break;
  88. case SCG_FIRC_DIV3_CLK:
  89. mask = SCG_FIRCDIV_DIV3_MASK;
  90. shift = SCG_FIRCDIV_DIV3_SHIFT;
  91. break;
  92. default:
  93. return 0;
  94. }
  95. reg = readl(&scg1_regs->firccsr);
  96. if (!(reg & SCG_FIRC_CSR_FIRCVLD_MASK))
  97. return 0;
  98. reg = readl(&scg1_regs->fircdiv);
  99. val = (reg & mask) >> shift;
  100. if (!val) /*clock disabled*/
  101. return 0;
  102. rate = scg_src_get_rate(SCG_FIRC_CLK);
  103. rate = rate / (1 << (val - 1));
  104. return rate;
  105. }
  106. static u32 scg_soscdiv_get_rate(enum scg_clk clk)
  107. {
  108. u32 reg, val, rate;
  109. u32 shift, mask;
  110. switch (clk) {
  111. case SCG_SOSC_DIV1_CLK:
  112. mask = SCG_SOSCDIV_DIV1_MASK;
  113. shift = SCG_SOSCDIV_DIV1_SHIFT;
  114. break;
  115. case SCG_SOSC_DIV2_CLK:
  116. mask = SCG_SOSCDIV_DIV2_MASK;
  117. shift = SCG_SOSCDIV_DIV2_SHIFT;
  118. break;
  119. case SCG_SOSC_DIV3_CLK:
  120. mask = SCG_SOSCDIV_DIV3_MASK;
  121. shift = SCG_SOSCDIV_DIV3_SHIFT;
  122. break;
  123. default:
  124. return 0;
  125. }
  126. reg = readl(&scg1_regs->sosccsr);
  127. if (!(reg & SCG_SOSC_CSR_SOSCVLD_MASK))
  128. return 0;
  129. reg = readl(&scg1_regs->soscdiv);
  130. val = (reg & mask) >> shift;
  131. if (!val) /*clock disabled*/
  132. return 0;
  133. rate = scg_src_get_rate(SCG_SOSC_CLK);
  134. rate = rate / (1 << (val - 1));
  135. return rate;
  136. }
  137. static u32 scg_apll_pfd_get_rate(enum scg_clk clk)
  138. {
  139. u32 reg, val, rate;
  140. u32 shift, mask, gate, valid;
  141. switch (clk) {
  142. case SCG_APLL_PFD0_CLK:
  143. gate = SCG_PLL_PFD0_GATE_MASK;
  144. valid = SCG_PLL_PFD0_VALID_MASK;
  145. mask = SCG_PLL_PFD0_FRAC_MASK;
  146. shift = SCG_PLL_PFD0_FRAC_SHIFT;
  147. break;
  148. case SCG_APLL_PFD1_CLK:
  149. gate = SCG_PLL_PFD1_GATE_MASK;
  150. valid = SCG_PLL_PFD1_VALID_MASK;
  151. mask = SCG_PLL_PFD1_FRAC_MASK;
  152. shift = SCG_PLL_PFD1_FRAC_SHIFT;
  153. break;
  154. case SCG_APLL_PFD2_CLK:
  155. gate = SCG_PLL_PFD2_GATE_MASK;
  156. valid = SCG_PLL_PFD2_VALID_MASK;
  157. mask = SCG_PLL_PFD2_FRAC_MASK;
  158. shift = SCG_PLL_PFD2_FRAC_SHIFT;
  159. break;
  160. case SCG_APLL_PFD3_CLK:
  161. gate = SCG_PLL_PFD3_GATE_MASK;
  162. valid = SCG_PLL_PFD3_VALID_MASK;
  163. mask = SCG_PLL_PFD3_FRAC_MASK;
  164. shift = SCG_PLL_PFD3_FRAC_SHIFT;
  165. break;
  166. default:
  167. return 0;
  168. }
  169. reg = readl(&scg1_regs->apllpfd);
  170. if (reg & gate || !(reg & valid))
  171. return 0;
  172. clk_debug("scg_apll_pfd_get_rate reg 0x%x\n", reg);
  173. val = (reg & mask) >> shift;
  174. rate = decode_pll(PLL_A7_APLL);
  175. rate = rate / val * 18;
  176. clk_debug("scg_apll_pfd_get_rate rate %u\n", rate);
  177. return rate;
  178. }
  179. static u32 scg_spll_pfd_get_rate(enum scg_clk clk)
  180. {
  181. u32 reg, val, rate;
  182. u32 shift, mask, gate, valid;
  183. switch (clk) {
  184. case SCG_SPLL_PFD0_CLK:
  185. gate = SCG_PLL_PFD0_GATE_MASK;
  186. valid = SCG_PLL_PFD0_VALID_MASK;
  187. mask = SCG_PLL_PFD0_FRAC_MASK;
  188. shift = SCG_PLL_PFD0_FRAC_SHIFT;
  189. break;
  190. case SCG_SPLL_PFD1_CLK:
  191. gate = SCG_PLL_PFD1_GATE_MASK;
  192. valid = SCG_PLL_PFD1_VALID_MASK;
  193. mask = SCG_PLL_PFD1_FRAC_MASK;
  194. shift = SCG_PLL_PFD1_FRAC_SHIFT;
  195. break;
  196. case SCG_SPLL_PFD2_CLK:
  197. gate = SCG_PLL_PFD2_GATE_MASK;
  198. valid = SCG_PLL_PFD2_VALID_MASK;
  199. mask = SCG_PLL_PFD2_FRAC_MASK;
  200. shift = SCG_PLL_PFD2_FRAC_SHIFT;
  201. break;
  202. case SCG_SPLL_PFD3_CLK:
  203. gate = SCG_PLL_PFD3_GATE_MASK;
  204. valid = SCG_PLL_PFD3_VALID_MASK;
  205. mask = SCG_PLL_PFD3_FRAC_MASK;
  206. shift = SCG_PLL_PFD3_FRAC_SHIFT;
  207. break;
  208. default:
  209. return 0;
  210. }
  211. reg = readl(&scg1_regs->spllpfd);
  212. if (reg & gate || !(reg & valid))
  213. return 0;
  214. clk_debug("scg_spll_pfd_get_rate reg 0x%x\n", reg);
  215. val = (reg & mask) >> shift;
  216. rate = decode_pll(PLL_A7_SPLL);
  217. rate = rate / val * 18;
  218. clk_debug("scg_spll_pfd_get_rate rate %u\n", rate);
  219. return rate;
  220. }
  221. static u32 scg_apll_get_rate(void)
  222. {
  223. u32 reg, val, rate;
  224. reg = readl(&scg1_regs->apllcfg);
  225. val = (reg & SCG_PLL_CFG_PLLSEL_MASK) >> SCG_PLL_CFG_PLLSEL_SHIFT;
  226. if (!val) {
  227. /* APLL clock after two dividers */
  228. rate = decode_pll(PLL_A7_APLL);
  229. val = (reg & SCG_PLL_CFG_POSTDIV1_MASK) >>
  230. SCG_PLL_CFG_POSTDIV1_SHIFT;
  231. rate = rate / (val + 1);
  232. val = (reg & SCG_PLL_CFG_POSTDIV2_MASK) >>
  233. SCG_PLL_CFG_POSTDIV2_SHIFT;
  234. rate = rate / (val + 1);
  235. } else {
  236. /* APLL PFD clock */
  237. val = (reg & SCG_PLL_CFG_PFDSEL_MASK) >>
  238. SCG_PLL_CFG_PFDSEL_SHIFT;
  239. rate = scg_apll_pfd_get_rate(SCG_APLL_PFD0_CLK + val);
  240. }
  241. return rate;
  242. }
  243. static u32 scg_spll_get_rate(void)
  244. {
  245. u32 reg, val, rate;
  246. reg = readl(&scg1_regs->spllcfg);
  247. val = (reg & SCG_PLL_CFG_PLLSEL_MASK) >> SCG_PLL_CFG_PLLSEL_SHIFT;
  248. clk_debug("scg_spll_get_rate reg 0x%x\n", reg);
  249. if (!val) {
  250. /* APLL clock after two dividers */
  251. rate = decode_pll(PLL_A7_SPLL);
  252. val = (reg & SCG_PLL_CFG_POSTDIV1_MASK) >>
  253. SCG_PLL_CFG_POSTDIV1_SHIFT;
  254. rate = rate / (val + 1);
  255. val = (reg & SCG_PLL_CFG_POSTDIV2_MASK) >>
  256. SCG_PLL_CFG_POSTDIV2_SHIFT;
  257. rate = rate / (val + 1);
  258. clk_debug("scg_spll_get_rate SPLL %u\n", rate);
  259. } else {
  260. /* APLL PFD clock */
  261. val = (reg & SCG_PLL_CFG_PFDSEL_MASK) >>
  262. SCG_PLL_CFG_PFDSEL_SHIFT;
  263. rate = scg_spll_pfd_get_rate(SCG_SPLL_PFD0_CLK + val);
  264. clk_debug("scg_spll_get_rate PFD %u\n", rate);
  265. }
  266. return rate;
  267. }
  268. static u32 scg_ddr_get_rate(void)
  269. {
  270. u32 reg, val, rate, div;
  271. reg = readl(&scg1_regs->ddrccr);
  272. val = (reg & SCG_DDRCCR_DDRCS_MASK) >> SCG_DDRCCR_DDRCS_SHIFT;
  273. div = (reg & SCG_DDRCCR_DDRDIV_MASK) >> SCG_DDRCCR_DDRDIV_SHIFT;
  274. if (!div)
  275. return 0;
  276. if (!val) {
  277. reg = readl(&scg1_regs->apllcfg);
  278. val = (reg & SCG_PLL_CFG_PFDSEL_MASK) >>
  279. SCG_PLL_CFG_PFDSEL_SHIFT;
  280. rate = scg_apll_pfd_get_rate(SCG_APLL_PFD0_CLK + val);
  281. } else {
  282. rate = decode_pll(PLL_USB);
  283. }
  284. rate = rate / (1 << (div - 1));
  285. return rate;
  286. }
  287. static u32 scg_nic_get_rate(enum scg_clk clk)
  288. {
  289. u32 reg, val, rate;
  290. u32 shift, mask;
  291. reg = readl(&scg1_regs->niccsr);
  292. val = (reg & SCG_NICCSR_NICCS_MASK) >> SCG_NICCSR_NICCS_SHIFT;
  293. clk_debug("scg_nic_get_rate niccsr 0x%x\n", reg);
  294. if (!val)
  295. rate = scg_src_get_rate(SCG_FIRC_CLK);
  296. else
  297. rate = scg_ddr_get_rate();
  298. clk_debug("scg_nic_get_rate parent rate %u\n", rate);
  299. val = (reg & SCG_NICCSR_NIC0DIV_MASK) >> SCG_NICCSR_NIC0DIV_SHIFT;
  300. rate = rate / (val + 1);
  301. clk_debug("scg_nic_get_rate NIC0 rate %u\n", rate);
  302. switch (clk) {
  303. case SCG_NIC0_CLK:
  304. return rate;
  305. case SCG_GPU_CLK:
  306. mask = SCG_NICCSR_GPUDIV_MASK;
  307. shift = SCG_NICCSR_GPUDIV_SHIFT;
  308. break;
  309. case SCG_NIC1_EXT_CLK:
  310. case SCG_NIC1_BUS_CLK:
  311. case SCG_NIC1_CLK:
  312. mask = SCG_NICCSR_NIC1DIV_MASK;
  313. shift = SCG_NICCSR_NIC1DIV_SHIFT;
  314. break;
  315. default:
  316. return 0;
  317. }
  318. val = (reg & mask) >> shift;
  319. rate = rate / (val + 1);
  320. clk_debug("scg_nic_get_rate NIC1 rate %u\n", rate);
  321. switch (clk) {
  322. case SCG_GPU_CLK:
  323. case SCG_NIC1_CLK:
  324. return rate;
  325. case SCG_NIC1_EXT_CLK:
  326. mask = SCG_NICCSR_NIC1EXTDIV_MASK;
  327. shift = SCG_NICCSR_NIC1EXTDIV_SHIFT;
  328. break;
  329. case SCG_NIC1_BUS_CLK:
  330. mask = SCG_NICCSR_NIC1BUSDIV_MASK;
  331. shift = SCG_NICCSR_NIC1BUSDIV_SHIFT;
  332. break;
  333. default:
  334. return 0;
  335. }
  336. val = (reg & mask) >> shift;
  337. rate = rate / (val + 1);
  338. clk_debug("scg_nic_get_rate NIC1 bus rate %u\n", rate);
  339. return rate;
  340. }
  341. static enum scg_clk scg_scs_array[4] = {
  342. SCG_SOSC_CLK, SCG_SIRC_CLK, SCG_FIRC_CLK, SCG_ROSC_CLK,
  343. };
  344. static u32 scg_sys_get_rate(enum scg_clk clk)
  345. {
  346. u32 reg, val, rate;
  347. if (clk != SCG_CORE_CLK && clk != SCG_BUS_CLK)
  348. return 0;
  349. reg = readl(&scg1_regs->csr);
  350. val = (reg & SCG_CCR_SCS_MASK) >> SCG_CCR_SCS_SHIFT;
  351. clk_debug("scg_sys_get_rate reg 0x%x\n", reg);
  352. switch (val) {
  353. case SCG_SCS_SYS_OSC:
  354. case SCG_SCS_SLOW_IRC:
  355. case SCG_SCS_FAST_IRC:
  356. case SCG_SCS_RTC_OSC:
  357. rate = scg_src_get_rate(scg_scs_array[val]);
  358. break;
  359. case 5:
  360. rate = scg_apll_get_rate();
  361. break;
  362. case 6:
  363. rate = scg_spll_get_rate();
  364. break;
  365. default:
  366. return 0;
  367. }
  368. clk_debug("scg_sys_get_rate parent rate %u\n", rate);
  369. val = (reg & SCG_CCR_DIVCORE_MASK) >> SCG_CCR_DIVCORE_SHIFT;
  370. rate = rate / (val + 1);
  371. if (clk == SCG_BUS_CLK) {
  372. val = (reg & SCG_CCR_DIVBUS_MASK) >> SCG_CCR_DIVBUS_SHIFT;
  373. rate = rate / (val + 1);
  374. }
  375. return rate;
  376. }
  377. u32 decode_pll(enum pll_clocks pll)
  378. {
  379. u32 reg, pre_div, infreq, mult;
  380. u32 num, denom;
  381. /*
  382. * Alought there are four choices for the bypass src,
  383. * we choose OSC_24M which is the default set in ROM.
  384. */
  385. switch (pll) {
  386. case PLL_A7_SPLL:
  387. reg = readl(&scg1_regs->spllcsr);
  388. if (!(reg & SCG_SPLL_CSR_SPLLVLD_MASK))
  389. return 0;
  390. reg = readl(&scg1_regs->spllcfg);
  391. pre_div = (reg & SCG_PLL_CFG_PREDIV_MASK) >>
  392. SCG_PLL_CFG_PREDIV_SHIFT;
  393. pre_div += 1;
  394. mult = (reg & SCG1_SPLL_CFG_MULT_MASK) >>
  395. SCG_PLL_CFG_MULT_SHIFT;
  396. infreq = (reg & SCG_PLL_CFG_CLKSRC_MASK) >>
  397. SCG_PLL_CFG_CLKSRC_SHIFT;
  398. if (!infreq)
  399. infreq = scg_src_get_rate(SCG_SOSC_CLK);
  400. else
  401. infreq = scg_src_get_rate(SCG_FIRC_CLK);
  402. num = readl(&scg1_regs->spllnum);
  403. denom = readl(&scg1_regs->splldenom);
  404. infreq = infreq / pre_div;
  405. return infreq * mult + infreq * num / denom;
  406. case PLL_A7_APLL:
  407. reg = readl(&scg1_regs->apllcsr);
  408. if (!(reg & SCG_APLL_CSR_APLLVLD_MASK))
  409. return 0;
  410. reg = readl(&scg1_regs->apllcfg);
  411. pre_div = (reg & SCG_PLL_CFG_PREDIV_MASK) >>
  412. SCG_PLL_CFG_PREDIV_SHIFT;
  413. pre_div += 1;
  414. mult = (reg & SCG_APLL_CFG_MULT_MASK) >>
  415. SCG_PLL_CFG_MULT_SHIFT;
  416. infreq = (reg & SCG_PLL_CFG_CLKSRC_MASK) >>
  417. SCG_PLL_CFG_CLKSRC_SHIFT;
  418. if (!infreq)
  419. infreq = scg_src_get_rate(SCG_SOSC_CLK);
  420. else
  421. infreq = scg_src_get_rate(SCG_FIRC_CLK);
  422. num = readl(&scg1_regs->apllnum);
  423. denom = readl(&scg1_regs->aplldenom);
  424. infreq = infreq / pre_div;
  425. return infreq * mult + infreq * num / denom;
  426. case PLL_USB:
  427. reg = readl(&scg1_regs->upllcsr);
  428. if (!(reg & SCG_UPLL_CSR_UPLLVLD_MASK))
  429. return 0;
  430. return 480000000u;
  431. case PLL_MIPI:
  432. return 480000000u;
  433. default:
  434. printf("Unsupported pll clocks %d\n", pll);
  435. break;
  436. }
  437. return 0;
  438. }
  439. u32 scg_clk_get_rate(enum scg_clk clk)
  440. {
  441. switch (clk) {
  442. case SCG_SIRC_DIV1_CLK:
  443. case SCG_SIRC_DIV2_CLK:
  444. case SCG_SIRC_DIV3_CLK:
  445. return scg_sircdiv_get_rate(clk);
  446. case SCG_FIRC_DIV1_CLK:
  447. case SCG_FIRC_DIV2_CLK:
  448. case SCG_FIRC_DIV3_CLK:
  449. return scg_fircdiv_get_rate(clk);
  450. case SCG_SOSC_DIV1_CLK:
  451. case SCG_SOSC_DIV2_CLK:
  452. case SCG_SOSC_DIV3_CLK:
  453. return scg_soscdiv_get_rate(clk);
  454. case SCG_CORE_CLK:
  455. case SCG_BUS_CLK:
  456. return scg_sys_get_rate(clk);
  457. case SCG_SPLL_PFD0_CLK:
  458. case SCG_SPLL_PFD1_CLK:
  459. case SCG_SPLL_PFD2_CLK:
  460. case SCG_SPLL_PFD3_CLK:
  461. return scg_spll_pfd_get_rate(clk);
  462. case SCG_APLL_PFD0_CLK:
  463. case SCG_APLL_PFD1_CLK:
  464. case SCG_APLL_PFD2_CLK:
  465. case SCG_APLL_PFD3_CLK:
  466. return scg_apll_pfd_get_rate(clk);
  467. case SCG_DDR_CLK:
  468. return scg_ddr_get_rate();
  469. case SCG_NIC0_CLK:
  470. case SCG_GPU_CLK:
  471. case SCG_NIC1_CLK:
  472. case SCG_NIC1_BUS_CLK:
  473. case SCG_NIC1_EXT_CLK:
  474. return scg_nic_get_rate(clk);
  475. case USB_PLL_OUT:
  476. return decode_pll(PLL_USB);
  477. case MIPI_PLL_OUT:
  478. return decode_pll(PLL_MIPI);
  479. case SCG_SOSC_CLK:
  480. case SCG_FIRC_CLK:
  481. case SCG_SIRC_CLK:
  482. case SCG_ROSC_CLK:
  483. return scg_src_get_rate(clk);
  484. default:
  485. return 0;
  486. }
  487. }
  488. int scg_enable_pll_pfd(enum scg_clk clk, u32 frac)
  489. {
  490. u32 reg;
  491. u32 shift, mask, gate, valid;
  492. u32 addr;
  493. if (frac < 12 || frac > 35)
  494. return -EINVAL;
  495. switch (clk) {
  496. case SCG_SPLL_PFD0_CLK:
  497. case SCG_APLL_PFD0_CLK:
  498. gate = SCG_PLL_PFD0_GATE_MASK;
  499. valid = SCG_PLL_PFD0_VALID_MASK;
  500. mask = SCG_PLL_PFD0_FRAC_MASK;
  501. shift = SCG_PLL_PFD0_FRAC_SHIFT;
  502. if (clk == SCG_SPLL_PFD0_CLK)
  503. addr = (u32)(&scg1_regs->spllpfd);
  504. else
  505. addr = (u32)(&scg1_regs->apllpfd);
  506. break;
  507. case SCG_SPLL_PFD1_CLK:
  508. case SCG_APLL_PFD1_CLK:
  509. gate = SCG_PLL_PFD1_GATE_MASK;
  510. valid = SCG_PLL_PFD1_VALID_MASK;
  511. mask = SCG_PLL_PFD1_FRAC_MASK;
  512. shift = SCG_PLL_PFD1_FRAC_SHIFT;
  513. if (clk == SCG_SPLL_PFD1_CLK)
  514. addr = (u32)(&scg1_regs->spllpfd);
  515. else
  516. addr = (u32)(&scg1_regs->apllpfd);
  517. break;
  518. case SCG_SPLL_PFD2_CLK:
  519. case SCG_APLL_PFD2_CLK:
  520. gate = SCG_PLL_PFD2_GATE_MASK;
  521. valid = SCG_PLL_PFD2_VALID_MASK;
  522. mask = SCG_PLL_PFD2_FRAC_MASK;
  523. shift = SCG_PLL_PFD2_FRAC_SHIFT;
  524. if (clk == SCG_SPLL_PFD2_CLK)
  525. addr = (u32)(&scg1_regs->spllpfd);
  526. else
  527. addr = (u32)(&scg1_regs->apllpfd);
  528. break;
  529. case SCG_SPLL_PFD3_CLK:
  530. case SCG_APLL_PFD3_CLK:
  531. gate = SCG_PLL_PFD3_GATE_MASK;
  532. valid = SCG_PLL_PFD3_VALID_MASK;
  533. mask = SCG_PLL_PFD3_FRAC_MASK;
  534. shift = SCG_PLL_PFD3_FRAC_SHIFT;
  535. if (clk == SCG_SPLL_PFD3_CLK)
  536. addr = (u32)(&scg1_regs->spllpfd);
  537. else
  538. addr = (u32)(&scg1_regs->apllpfd);
  539. break;
  540. default:
  541. return -EINVAL;
  542. }
  543. /* Gate the PFD */
  544. reg = readl(addr);
  545. reg |= gate;
  546. writel(reg, addr);
  547. /* Write Frac divider */
  548. reg &= ~mask;
  549. reg |= (frac << shift) & mask;
  550. writel(reg, addr);
  551. /*
  552. * Un-gate the PFD
  553. * (Need un-gate before checking valid, not align with RM)
  554. */
  555. reg &= ~gate;
  556. writel(reg, addr);
  557. /* Wait for PFD clock being valid */
  558. do {
  559. reg = readl(addr);
  560. } while (!(reg & valid));
  561. return 0;
  562. }
  563. #define SIM_MISC_CTRL0_USB_PLL_EN_MASK (0x1 << 2)
  564. int scg_enable_usb_pll(bool usb_control)
  565. {
  566. u32 sosc_rate;
  567. s32 timeout = 1000000;
  568. u32 reg;
  569. struct usbphy_regs *usbphy =
  570. (struct usbphy_regs *)USBPHY_RBASE;
  571. sosc_rate = scg_src_get_rate(SCG_SOSC_CLK);
  572. if (!sosc_rate)
  573. return -EPERM;
  574. reg = readl(SIM0_RBASE + 0x3C);
  575. if (usb_control)
  576. reg &= ~SIM_MISC_CTRL0_USB_PLL_EN_MASK;
  577. else
  578. reg |= SIM_MISC_CTRL0_USB_PLL_EN_MASK;
  579. writel(reg, SIM0_RBASE + 0x3C);
  580. if (!(readl(&usbphy->usb1_pll_480_ctrl) & PLL_USB_LOCK_MASK)) {
  581. writel(0x1c00000, &usbphy->usb1_pll_480_ctrl_clr);
  582. switch (sosc_rate) {
  583. case 24000000:
  584. writel(0xc00000, &usbphy->usb1_pll_480_ctrl_set);
  585. break;
  586. case 30000000:
  587. writel(0x800000, &usbphy->usb1_pll_480_ctrl_set);
  588. break;
  589. case 19200000:
  590. writel(0x1400000, &usbphy->usb1_pll_480_ctrl_set);
  591. break;
  592. default:
  593. writel(0xc00000, &usbphy->usb1_pll_480_ctrl_set);
  594. break;
  595. }
  596. /* Enable the regulator first */
  597. writel(PLL_USB_REG_ENABLE_MASK,
  598. &usbphy->usb1_pll_480_ctrl_set);
  599. /* Wait at least 15us */
  600. udelay(15);
  601. /* Enable the power */
  602. writel(PLL_USB_PWR_MASK, &usbphy->usb1_pll_480_ctrl_set);
  603. /* Wait lock */
  604. while (timeout--) {
  605. if (readl(&usbphy->usb1_pll_480_ctrl) &
  606. PLL_USB_LOCK_MASK)
  607. break;
  608. }
  609. if (timeout <= 0) {
  610. /* If timeout, we power down the pll */
  611. writel(PLL_USB_PWR_MASK,
  612. &usbphy->usb1_pll_480_ctrl_clr);
  613. return -ETIME;
  614. }
  615. }
  616. /* Clear the bypass */
  617. writel(PLL_USB_BYPASS_MASK, &usbphy->usb1_pll_480_ctrl_clr);
  618. /* Enable the PLL clock out to USB */
  619. writel((PLL_USB_EN_USB_CLKS_MASK | PLL_USB_ENABLE_MASK),
  620. &usbphy->usb1_pll_480_ctrl_set);
  621. if (!usb_control) {
  622. while (timeout--) {
  623. if (readl(&scg1_regs->upllcsr) &
  624. SCG_UPLL_CSR_UPLLVLD_MASK)
  625. break;
  626. }
  627. if (timeout <= 0) {
  628. reg = readl(SIM0_RBASE + 0x3C);
  629. reg &= ~SIM_MISC_CTRL0_USB_PLL_EN_MASK;
  630. writel(reg, SIM0_RBASE + 0x3C);
  631. return -ETIME;
  632. }
  633. }
  634. return 0;
  635. }
  636. /* A7 domain system clock source is SPLL */
  637. #define SCG1_RCCR_SCS_NUM ((SCG_SCS_SYS_PLL) << SCG_CCR_SCS_SHIFT)
  638. /* A7 Core clck = SPLL PFD0 / 1 = 500MHz / 1 = 500MHz */
  639. #define SCG1_RCCR_DIVCORE_NUM ((0x0) << SCG_CCR_DIVCORE_SHIFT)
  640. #define SCG1_RCCR_CFG_MASK (SCG_CCR_SCS_MASK | SCG_CCR_DIVBUS_MASK)
  641. /* A7 Plat clck = A7 Core Clock / 2 = 250MHz / 1 = 250MHz */
  642. #define SCG1_RCCR_DIVBUS_NUM ((0x1) << SCG_CCR_DIVBUS_SHIFT)
  643. #define SCG1_RCCR_CFG_NUM (SCG1_RCCR_SCS_NUM | SCG1_RCCR_DIVBUS_NUM)
  644. void scg_a7_rccr_init(void)
  645. {
  646. u32 rccr_reg_val = 0;
  647. rccr_reg_val = readl(&scg1_regs->rccr);
  648. rccr_reg_val &= (~SCG1_RCCR_CFG_MASK);
  649. rccr_reg_val |= (SCG1_RCCR_CFG_NUM);
  650. writel(rccr_reg_val, &scg1_regs->rccr);
  651. }
  652. /* POSTDIV2 = 1 */
  653. #define SCG1_SPLL_CFG_POSTDIV2_NUM ((0x0) << SCG_PLL_CFG_POSTDIV2_SHIFT)
  654. /* POSTDIV1 = 1 */
  655. #define SCG1_SPLL_CFG_POSTDIV1_NUM ((0x0) << SCG_PLL_CFG_POSTDIV1_SHIFT)
  656. /* MULT = 22 */
  657. #define SCG1_SPLL_CFG_MULT_NUM ((22) << SCG_PLL_CFG_MULT_SHIFT)
  658. /* PFD0 output clock selected */
  659. #define SCG1_SPLL_CFG_PFDSEL_NUM ((0) << SCG_PLL_CFG_PFDSEL_SHIFT)
  660. /* PREDIV = 1 */
  661. #define SCG1_SPLL_CFG_PREDIV_NUM ((0x0) << SCG_PLL_CFG_PREDIV_SHIFT)
  662. /* SPLL output clocks (including PFD outputs) selected */
  663. #define SCG1_SPLL_CFG_BYPASS_NUM ((0x0) << SCG_PLL_CFG_BYPASS_SHIFT)
  664. /* SPLL PFD output clock selected */
  665. #define SCG1_SPLL_CFG_PLLSEL_NUM ((0x1) << SCG_PLL_CFG_PLLSEL_SHIFT)
  666. /* Clock source is System OSC */
  667. #define SCG1_SPLL_CFG_CLKSRC_NUM ((0x0) << SCG_PLL_CFG_CLKSRC_SHIFT)
  668. #define SCG1_SPLL_CFG_NUM_24M_OSC (SCG1_SPLL_CFG_POSTDIV2_NUM | \
  669. SCG1_SPLL_CFG_POSTDIV1_NUM | \
  670. (22 << SCG_PLL_CFG_MULT_SHIFT) | \
  671. SCG1_SPLL_CFG_PFDSEL_NUM | \
  672. SCG1_SPLL_CFG_PREDIV_NUM | \
  673. SCG1_SPLL_CFG_BYPASS_NUM | \
  674. SCG1_SPLL_CFG_PLLSEL_NUM | \
  675. SCG1_SPLL_CFG_CLKSRC_NUM)
  676. /*413Mhz = A7 SPLL(528MHz) * 18/23 */
  677. #define SCG1_SPLL_PFD0_FRAC_NUM ((23) << SCG_PLL_PFD0_FRAC_SHIFT)
  678. void scg_a7_spll_init(void)
  679. {
  680. u32 val = 0;
  681. /* Disable A7 System PLL */
  682. val = readl(&scg1_regs->spllcsr);
  683. val &= ~SCG_SPLL_CSR_SPLLEN_MASK;
  684. writel(val, &scg1_regs->spllcsr);
  685. /*
  686. * Per block guide,
  687. * "When changing PFD values, it is recommneded PFDx clock
  688. * gets gated first by writing a value of 1 to PFDx_CLKGATE register,
  689. * then program the new PFD value, then poll the PFDx_VALID
  690. * flag to set before writing a value of 0 to PFDx_CLKGATE
  691. * to ungate the PFDx clock and allow PFDx clock to run"
  692. */
  693. /* Gate off A7 SPLL PFD0 ~ PDF4 */
  694. val = readl(&scg1_regs->spllpfd);
  695. val |= (SCG_PLL_PFD3_GATE_MASK |
  696. SCG_PLL_PFD2_GATE_MASK |
  697. SCG_PLL_PFD1_GATE_MASK |
  698. SCG_PLL_PFD0_GATE_MASK);
  699. writel(val, &scg1_regs->spllpfd);
  700. /* ================ A7 SPLL Configuration Start ============== */
  701. /* Configure A7 System PLL */
  702. writel(SCG1_SPLL_CFG_NUM_24M_OSC, &scg1_regs->spllcfg);
  703. /* Enable A7 System PLL */
  704. val = readl(&scg1_regs->spllcsr);
  705. val |= SCG_SPLL_CSR_SPLLEN_MASK;
  706. writel(val, &scg1_regs->spllcsr);
  707. /* Wait for A7 SPLL clock ready */
  708. while (!(readl(&scg1_regs->spllcsr) & SCG_SPLL_CSR_SPLLVLD_MASK))
  709. ;
  710. /* Configure A7 SPLL PFD0 */
  711. val = readl(&scg1_regs->spllpfd);
  712. val &= ~SCG_PLL_PFD0_FRAC_MASK;
  713. val |= SCG1_SPLL_PFD0_FRAC_NUM;
  714. writel(val, &scg1_regs->spllpfd);
  715. /* Un-gate A7 SPLL PFD0 */
  716. val = readl(&scg1_regs->spllpfd);
  717. val &= ~SCG_PLL_PFD0_GATE_MASK;
  718. writel(val, &scg1_regs->spllpfd);
  719. /* Wait for A7 SPLL PFD0 clock being valid */
  720. while (!(readl(&scg1_regs->spllpfd) & SCG_PLL_PFD0_VALID_MASK))
  721. ;
  722. /* ================ A7 SPLL Configuration End ============== */
  723. }
  724. /* DDR clock source is APLL PFD0 (396MHz) */
  725. #define SCG1_DDRCCR_DDRCS_NUM ((0x0) << SCG_DDRCCR_DDRCS_SHIFT)
  726. /* DDR clock = APLL PFD0 / 1 = 396MHz / 1 = 396MHz */
  727. #define SCG1_DDRCCR_DDRDIV_NUM ((0x1) << SCG_DDRCCR_DDRDIV_SHIFT)
  728. /* DDR clock = APLL PFD0 / 2 = 396MHz / 2 = 198MHz */
  729. #define SCG1_DDRCCR_DDRDIV_LF_NUM ((0x2) << SCG_DDRCCR_DDRDIV_SHIFT)
  730. #define SCG1_DDRCCR_CFG_NUM (SCG1_DDRCCR_DDRCS_NUM | \
  731. SCG1_DDRCCR_DDRDIV_NUM)
  732. #define SCG1_DDRCCR_CFG_LF_NUM (SCG1_DDRCCR_DDRCS_NUM | \
  733. SCG1_DDRCCR_DDRDIV_LF_NUM)
  734. void scg_a7_ddrclk_init(void)
  735. {
  736. writel(SCG1_DDRCCR_CFG_NUM, &scg1_regs->ddrccr);
  737. }
  738. /* SCG1(A7) APLLCFG configurations */
  739. /* divide by 1 <<28 */
  740. #define SCG1_APLL_CFG_POSTDIV2_NUM ((0x0) << SCG_PLL_CFG_POSTDIV2_SHIFT)
  741. /* divide by 1 <<24 */
  742. #define SCG1_APLL_CFG_POSTDIV1_NUM ((0x0) << SCG_PLL_CFG_POSTDIV1_SHIFT)
  743. /* MULT is 22 <<16 */
  744. #define SCG1_APLL_CFG_MULT_NUM ((22) << SCG_PLL_CFG_MULT_SHIFT)
  745. /* PFD0 output clock selected <<14 */
  746. #define SCG1_APLL_CFG_PFDSEL_NUM ((0) << SCG_PLL_CFG_PFDSEL_SHIFT)
  747. /* PREDIV = 1 <<8 */
  748. #define SCG1_APLL_CFG_PREDIV_NUM ((0x0) << SCG_PLL_CFG_PREDIV_SHIFT)
  749. /* APLL output clocks (including PFD outputs) selected <<2 */
  750. #define SCG1_APLL_CFG_BYPASS_NUM ((0x0) << SCG_PLL_CFG_BYPASS_SHIFT)
  751. /* APLL PFD output clock selected <<1 */
  752. #define SCG1_APLL_CFG_PLLSEL_NUM ((0x0) << SCG_PLL_CFG_PLLSEL_SHIFT)
  753. /* Clock source is System OSC <<0 */
  754. #define SCG1_APLL_CFG_CLKSRC_NUM ((0x0) << SCG_PLL_CFG_CLKSRC_SHIFT)
  755. /*
  756. * A7 APLL = 24MHz / 1 * 22 / 1 / 1 = 528MHz,
  757. * system PLL is sourced from APLL,
  758. * APLL clock source is system OSC (24MHz)
  759. */
  760. #define SCG1_APLL_CFG_NUM_24M_OSC (SCG1_APLL_CFG_POSTDIV2_NUM | \
  761. SCG1_APLL_CFG_POSTDIV1_NUM | \
  762. (22 << SCG_PLL_CFG_MULT_SHIFT) | \
  763. SCG1_APLL_CFG_PFDSEL_NUM | \
  764. SCG1_APLL_CFG_PREDIV_NUM | \
  765. SCG1_APLL_CFG_BYPASS_NUM | \
  766. SCG1_APLL_CFG_PLLSEL_NUM | \
  767. SCG1_APLL_CFG_CLKSRC_NUM)
  768. /* PFD0 Freq = A7 APLL(528MHz) * 18 / 27 = 352MHz */
  769. #define SCG1_APLL_PFD0_FRAC_NUM (27)
  770. void scg_a7_apll_init(void)
  771. {
  772. u32 val = 0;
  773. /* Disable A7 Auxiliary PLL */
  774. val = readl(&scg1_regs->apllcsr);
  775. val &= ~SCG_APLL_CSR_APLLEN_MASK;
  776. writel(val, &scg1_regs->apllcsr);
  777. /* Gate off A7 APLL PFD0 ~ PDF4 */
  778. val = readl(&scg1_regs->apllpfd);
  779. val |= 0x80808080;
  780. writel(val, &scg1_regs->apllpfd);
  781. /* ================ A7 APLL Configuration Start ============== */
  782. /* Configure A7 Auxiliary PLL */
  783. writel(SCG1_APLL_CFG_NUM_24M_OSC, &scg1_regs->apllcfg);
  784. /* Enable A7 Auxiliary PLL */
  785. val = readl(&scg1_regs->apllcsr);
  786. val |= SCG_APLL_CSR_APLLEN_MASK;
  787. writel(val, &scg1_regs->apllcsr);
  788. /* Wait for A7 APLL clock ready */
  789. while (!(readl(&scg1_regs->apllcsr) & SCG_APLL_CSR_APLLVLD_MASK))
  790. ;
  791. /* Configure A7 APLL PFD0 */
  792. val = readl(&scg1_regs->apllpfd);
  793. val &= ~SCG_PLL_PFD0_FRAC_MASK;
  794. val |= SCG1_APLL_PFD0_FRAC_NUM;
  795. writel(val, &scg1_regs->apllpfd);
  796. /* Un-gate A7 APLL PFD0 */
  797. val = readl(&scg1_regs->apllpfd);
  798. val &= ~SCG_PLL_PFD0_GATE_MASK;
  799. writel(val, &scg1_regs->apllpfd);
  800. /* Wait for A7 APLL PFD0 clock being valid */
  801. while (!(readl(&scg1_regs->apllpfd) & SCG_PLL_PFD0_VALID_MASK))
  802. ;
  803. }
  804. /* SCG1(A7) FIRC DIV configurations */
  805. /* Disable FIRC DIV3 */
  806. #define SCG1_FIRCDIV_DIV3_NUM ((0x0) << SCG_FIRCDIV_DIV3_SHIFT)
  807. /* FIRC DIV2 = 48MHz / 1 = 48MHz */
  808. #define SCG1_FIRCDIV_DIV2_NUM ((0x1) << SCG_FIRCDIV_DIV2_SHIFT)
  809. /* Disable FIRC DIV1 */
  810. #define SCG1_FIRCDIV_DIV1_NUM ((0x0) << SCG_FIRCDIV_DIV1_SHIFT)
  811. void scg_a7_firc_init(void)
  812. {
  813. /* Wait for FIRC clock ready */
  814. while (!(readl(&scg1_regs->firccsr) & SCG_FIRC_CSR_FIRCVLD_MASK))
  815. ;
  816. /* Configure A7 FIRC DIV1 ~ DIV3 */
  817. writel((SCG1_FIRCDIV_DIV3_NUM |
  818. SCG1_FIRCDIV_DIV2_NUM |
  819. SCG1_FIRCDIV_DIV1_NUM), &scg1_regs->fircdiv);
  820. }
  821. /* SCG1(A7) NICCCR configurations */
  822. /* NIC clock source is DDR clock (396/198MHz) */
  823. #define SCG1_NICCCR_NICCS_NUM ((0x1) << SCG_NICCCR_NICCS_SHIFT)
  824. /* NIC0 clock = DDR Clock / 2 = 396MHz / 2 = 198MHz */
  825. #define SCG1_NICCCR_NIC0_DIV_NUM ((0x1) << SCG_NICCCR_NIC0_DIV_SHIFT)
  826. /* NIC0 clock = DDR Clock / 1 = 198MHz / 1 = 198MHz */
  827. #define SCG1_NICCCR_NIC0_DIV_LF_NUM ((0x0) << SCG_NICCCR_NIC0_DIV_SHIFT)
  828. /* NIC1 clock = NIC0 Clock / 1 = 198MHz / 2 = 198MHz */
  829. #define SCG1_NICCCR_NIC1_DIV_NUM ((0x0) << SCG_NICCCR_NIC1_DIV_SHIFT)
  830. /* NIC1 bus clock = NIC1 Clock / 3 = 198MHz / 3 = 66MHz */
  831. #define SCG1_NICCCR_NIC1_DIVBUS_NUM ((0x2) << SCG_NICCCR_NIC1_DIVBUS_SHIFT)
  832. #define SCG1_NICCCR_CFG_NUM (SCG1_NICCCR_NICCS_NUM | \
  833. SCG1_NICCCR_NIC0_DIV_NUM | \
  834. SCG1_NICCCR_NIC1_DIV_NUM | \
  835. SCG1_NICCCR_NIC1_DIVBUS_NUM)
  836. void scg_a7_nicclk_init(void)
  837. {
  838. writel(SCG1_NICCCR_CFG_NUM, &scg1_regs->nicccr);
  839. }
  840. /* SCG1(A7) FIRC DIV configurations */
  841. /* Enable FIRC DIV3 */
  842. #define SCG1_SOSCDIV_DIV3_NUM ((0x1) << SCG_SOSCDIV_DIV3_SHIFT)
  843. /* FIRC DIV2 = 48MHz / 1 = 48MHz */
  844. #define SCG1_SOSCDIV_DIV2_NUM ((0x1) << SCG_SOSCDIV_DIV2_SHIFT)
  845. /* Enable FIRC DIV1 */
  846. #define SCG1_SOSCDIV_DIV1_NUM ((0x1) << SCG_SOSCDIV_DIV1_SHIFT)
  847. void scg_a7_soscdiv_init(void)
  848. {
  849. /* Wait for FIRC clock ready */
  850. while (!(readl(&scg1_regs->sosccsr) & SCG_SOSC_CSR_SOSCVLD_MASK))
  851. ;
  852. /* Configure A7 FIRC DIV1 ~ DIV3 */
  853. writel((SCG1_SOSCDIV_DIV3_NUM | SCG1_SOSCDIV_DIV2_NUM |
  854. SCG1_SOSCDIV_DIV1_NUM), &scg1_regs->soscdiv);
  855. }
  856. void scg_a7_sys_clk_sel(enum scg_sys_src clk)
  857. {
  858. u32 rccr_reg_val = 0;
  859. clk_debug("%s: system clock selected as %s\n", "[SCG]",
  860. clk == SCG_SCS_SYS_OSC ? "SYS_OSC" :
  861. clk == SCG_SCS_SLOW_IRC ? "SLOW_IRC" :
  862. clk == SCG_SCS_FAST_IRC ? "FAST_IRC" :
  863. clk == SCG_SCS_RTC_OSC ? "RTC_OSC" :
  864. clk == SCG_SCS_AUX_PLL ? "AUX_PLL" :
  865. clk == SCG_SCS_SYS_PLL ? "SYS_PLL" :
  866. clk == SCG_SCS_USBPHY_PLL ? "USBPHY_PLL" :
  867. "Invalid source"
  868. );
  869. rccr_reg_val = readl(&scg1_regs->rccr);
  870. rccr_reg_val &= ~SCG_CCR_SCS_MASK;
  871. rccr_reg_val |= (clk << SCG_CCR_SCS_SHIFT);
  872. writel(rccr_reg_val, &scg1_regs->rccr);
  873. }
  874. void scg_a7_info(void)
  875. {
  876. debug("SCG Version: 0x%x\n", readl(&scg1_regs->verid));
  877. debug("SCG Parameter: 0x%x\n", readl(&scg1_regs->param));
  878. debug("SCG RCCR Value: 0x%x\n", readl(&scg1_regs->rccr));
  879. debug("SCG Clock Status: 0x%x\n", readl(&scg1_regs->csr));
  880. }