mtk_dcm_autogen.c 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2015. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. #include <mtk_dcm.h>
  32. #include <debug.h>
  33. #include <stdlib.h>
  34. #include <string.h>
  35. #include <sys/types.h>
  36. #include <arch/arm.h>
  37. #include <arch/arm/mmu.h>
  38. #include <arch/ops.h>
  39. #include <target/board.h>
  40. #include <platform/mt_reg_base.h>
  41. #include <platform/mt_typedefs.h>
  42. #include <platform/sync_write.h>
  43. #include <mtk_dcm_autogen.h>
  44. #define IOMEM(a) (a)
  45. #define __raw_readl(addr) DRV_Reg32(addr)
  46. extern unsigned long mt_secure_call(unsigned long, unsigned long, unsigned long, unsigned long);
  47. #define MTK_SIP_KERNEL_MCSI_NS_ACCESS 0x8200028B
  48. #define mcsi_reg_read(offset) \
  49. mt_secure_call(MTK_SIP_KERNEL_MCSI_NS_ACCESS, 0, offset, 0)
  50. #define mcsi_reg_write(val, offset) \
  51. mt_secure_call(MTK_SIP_KERNEL_MCSI_NS_ACCESS, 1, offset, val)
  52. #define reg_read(addr) __raw_readl(addr)
  53. #define reg_write(addr, val) mt_reg_sync_writel((val), ((void *)addr))
  54. #define MCUSYS_SMC_WRITE(addr, val) reg_write(addr, val)
  55. #define MCSI_SMC_WRITE(addr, val) mcsi_reg_write(val, (addr##_PHYS & 0xFFFF))
  56. #define MCSI_SMC_READ(addr) mcsi_reg_read(addr##_PHYS & 0xFFFF)
  57. /* Below from DCM autogen. */
  58. #define INFRACFG_AO_DCM_INFRABUS_GROUP_REG0_MASK ((0x1 << 0) | \
  59. (0x1 << 1) | \
  60. (0x1 << 2) | \
  61. (0x1 << 3) | \
  62. (0x1 << 4) | \
  63. (0x1f << 5) | \
  64. (0x1 << 20) | \
  65. (0x1 << 21) | \
  66. (0x1 << 22) | \
  67. (0x1 << 23) | \
  68. (0x1 << 30))
  69. #define INFRACFG_AO_DCM_INFRABUS_GROUP_REG0_ON ((0x1 << 0) | \
  70. (0x1 << 1) | \
  71. (0x0 << 2) | \
  72. (0x0 << 3) | \
  73. (0x0 << 4) | \
  74. (0x10 << 5) | \
  75. (0x1 << 20) | \
  76. (0x1 << 21) | \
  77. (0x1 << 22) | \
  78. (0x1 << 23) | \
  79. (0x1 << 30))
  80. #define INFRACFG_AO_DCM_INFRABUS_GROUP_REG0_OFF ((0x0 << 0) | \
  81. (0x0 << 1) | \
  82. (0x0 << 2) | \
  83. (0x0 << 3) | \
  84. (0x0 << 4) | \
  85. (0x10 << 5) | \
  86. (0x0 << 20) | \
  87. (0x1 << 21) | \
  88. (0x1 << 22) | \
  89. (0x0 << 23) | \
  90. (0x0 << 30))
  91. #if 0
  92. static unsigned int infracfg_ao_infra_dcm_rg_sfsel_get(void)
  93. {
  94. return (reg_read(INFRA_BUS_DCM_CTRL) >> 10) & 0x1f;
  95. }
  96. #endif
  97. static void infracfg_ao_infra_dcm_rg_sfsel_set(unsigned int val)
  98. {
  99. reg_write(INFRA_BUS_DCM_CTRL,
  100. (reg_read(INFRA_BUS_DCM_CTRL) &
  101. ~(0x1f << 10)) |
  102. (val & 0x1f) << 10);
  103. }
  104. bool dcm_infracfg_ao_dcm_infrabus_group_is_on(void)
  105. {
  106. bool ret = true;
  107. ret &= ((reg_read(INFRA_BUS_DCM_CTRL) &
  108. INFRACFG_AO_DCM_INFRABUS_GROUP_REG0_MASK) ==
  109. (unsigned int) INFRACFG_AO_DCM_INFRABUS_GROUP_REG0_ON);
  110. return ret;
  111. }
  112. void dcm_infracfg_ao_dcm_infrabus_group(int on)
  113. {
  114. if (on) {
  115. /* TINFO = "Turn ON DCM 'infracfg_ao_dcm_infrabus_group'" */
  116. infracfg_ao_infra_dcm_rg_sfsel_set(0x1);
  117. reg_write(INFRA_BUS_DCM_CTRL,
  118. (reg_read(INFRA_BUS_DCM_CTRL) &
  119. ~INFRACFG_AO_DCM_INFRABUS_GROUP_REG0_MASK) |
  120. INFRACFG_AO_DCM_INFRABUS_GROUP_REG0_ON);
  121. } else {
  122. /* TINFO = "Turn OFF DCM 'infracfg_ao_dcm_infrabus_group'" */
  123. infracfg_ao_infra_dcm_rg_sfsel_set(0x1);
  124. reg_write(INFRA_BUS_DCM_CTRL,
  125. (reg_read(INFRA_BUS_DCM_CTRL) &
  126. ~INFRACFG_AO_DCM_INFRABUS_GROUP_REG0_MASK) |
  127. INFRACFG_AO_DCM_INFRABUS_GROUP_REG0_OFF);
  128. }
  129. }
  130. #define INFRACFG_AO_DCM_MEM_GROUP_REG0_MASK ((0x1 << 0) | \
  131. (0x1 << 6) | \
  132. (0x1 << 7) | \
  133. (0x1 << 8) | \
  134. (0x7f << 9) | \
  135. (0x1f << 16) | \
  136. (0x1f << 21) | \
  137. (0x1 << 26) | \
  138. (0x1 << 27) | \
  139. (0x1 << 28) | \
  140. (0x1 << 29) | \
  141. (0x1 << 31))
  142. #define INFRACFG_AO_DCM_MEM_GROUP_REG1_MASK ((0x1 << 0) | \
  143. (0x1 << 6) | \
  144. (0x1 << 7) | \
  145. (0x1 << 8) | \
  146. (0x1f << 16) | \
  147. (0x1f << 21) | \
  148. (0x1 << 26))
  149. #define INFRACFG_AO_DCM_MEM_GROUP_REG0_ON ((0x0 << 0) | \
  150. (0x0 << 6) | \
  151. (0x1 << 7) | \
  152. (0x1 << 8) | \
  153. (0x0 << 9) | \
  154. (0x0 << 16) | \
  155. (0x1f << 21) | \
  156. (0x0 << 26) | \
  157. (0x1 << 27) | \
  158. (0x0 << 28) | \
  159. (0x0 << 29) | \
  160. (0x0 << 31))
  161. #define INFRACFG_AO_DCM_MEM_GROUP_REG1_ON ((0x0 << 0) | \
  162. (0x0 << 6) | \
  163. (0x1 << 7) | \
  164. (0x1 << 8) | \
  165. (0x0 << 16) | \
  166. (0x1f << 21) | \
  167. (0x0 << 26))
  168. #define INFRACFG_AO_DCM_MEM_GROUP_REG0_OFF ((0x0 << 0) | \
  169. (0x0 << 6) | \
  170. (0x1 << 7) | \
  171. (0x1 << 8) | \
  172. (0x0 << 9) | \
  173. (0x0 << 16) | \
  174. (0x1f << 21) | \
  175. (0x0 << 26) | \
  176. (0x1 << 27) | \
  177. (0x0 << 28) | \
  178. (0x0 << 29) | \
  179. (0x0 << 31))
  180. #define INFRACFG_AO_DCM_MEM_GROUP_REG1_OFF ((0x0 << 0) | \
  181. (0x0 << 6) | \
  182. (0x1 << 7) | \
  183. (0x1 << 8) | \
  184. (0x0 << 16) | \
  185. (0x1f << 21) | \
  186. (0x0 << 26))
  187. bool dcm_infracfg_ao_dcm_mem_group_is_on(void)
  188. {
  189. bool ret = true;
  190. ret &= ((reg_read(MEM_DCM_CTRL) &
  191. INFRACFG_AO_DCM_MEM_GROUP_REG0_MASK) ==
  192. (unsigned int) INFRACFG_AO_DCM_MEM_GROUP_REG0_ON);
  193. ret &= ((reg_read(DFS_MEM_DCM_CTRL) &
  194. INFRACFG_AO_DCM_MEM_GROUP_REG1_MASK) ==
  195. (unsigned int) INFRACFG_AO_DCM_MEM_GROUP_REG1_ON);
  196. return ret;
  197. }
  198. void dcm_infracfg_ao_dcm_mem_group(int on)
  199. {
  200. if (on) {
  201. /* TINFO = "Turn ON DCM 'infracfg_ao_dcm_mem_group'" */
  202. reg_write(MEM_DCM_CTRL,
  203. (reg_read(MEM_DCM_CTRL) &
  204. ~INFRACFG_AO_DCM_MEM_GROUP_REG0_MASK) |
  205. INFRACFG_AO_DCM_MEM_GROUP_REG0_ON);
  206. reg_write(DFS_MEM_DCM_CTRL,
  207. (reg_read(DFS_MEM_DCM_CTRL) &
  208. ~INFRACFG_AO_DCM_MEM_GROUP_REG1_MASK) |
  209. INFRACFG_AO_DCM_MEM_GROUP_REG1_ON);
  210. } else {
  211. /* TINFO = "Turn OFF DCM 'infracfg_ao_dcm_mem_group'" */
  212. reg_write(MEM_DCM_CTRL,
  213. (reg_read(MEM_DCM_CTRL) &
  214. ~INFRACFG_AO_DCM_MEM_GROUP_REG0_MASK) |
  215. INFRACFG_AO_DCM_MEM_GROUP_REG0_OFF);
  216. reg_write(DFS_MEM_DCM_CTRL,
  217. (reg_read(DFS_MEM_DCM_CTRL) &
  218. ~INFRACFG_AO_DCM_MEM_GROUP_REG1_MASK) |
  219. INFRACFG_AO_DCM_MEM_GROUP_REG1_OFF);
  220. }
  221. }
  222. #define INFRACFG_AO_DCM_PERIBUS_GROUP_REG0_MASK ((0x1 << 0) | \
  223. (0x1 << 1) | \
  224. (0x1 << 3) | \
  225. (0x1 << 4) | \
  226. (0x1f << 5) | \
  227. (0x1f << 15) | \
  228. (0x1 << 20) | \
  229. (0x1 << 21) | \
  230. (0x1 << 22) | \
  231. (0x1f << 23) | \
  232. (0x1 << 28) | \
  233. (0x1 << 29))
  234. #define INFRACFG_AO_DCM_PERIBUS_GROUP_REG1_MASK ((0xf << 0))
  235. #define INFRACFG_AO_DCM_PERIBUS_GROUP_REG0_ON ((0x1 << 0) | \
  236. (0x1 << 1) | \
  237. (0x0 << 3) | \
  238. (0x0 << 4) | \
  239. (0x1f << 5) | \
  240. (0x1f << 15) | \
  241. (0x1 << 20) | \
  242. (0x1 << 21) | \
  243. (0x1 << 22) | \
  244. (0x0 << 23) | \
  245. (0x1 << 28) | \
  246. (0x1 << 29))
  247. #define INFRACFG_AO_DCM_PERIBUS_GROUP_REG1_ON ((0x0 << 0))
  248. #define INFRACFG_AO_DCM_PERIBUS_GROUP_REG0_OFF ((0x0 << 0) | \
  249. (0x0 << 1) | \
  250. (0x0 << 3) | \
  251. (0x0 << 4) | \
  252. (0x1f << 5) | \
  253. (0x0 << 15) | \
  254. (0x0 << 20) | \
  255. (0x0 << 21) | \
  256. (0x0 << 22) | \
  257. (0x0 << 23) | \
  258. (0x0 << 28) | \
  259. (0x0 << 29))
  260. #define INFRACFG_AO_DCM_PERIBUS_GROUP_REG1_OFF ((0xf << 0))
  261. #if 0
  262. static unsigned int infracfg_ao_peri_dcm_rg_sfsel_get(void)
  263. {
  264. return (reg_read(PERI_BUS_DCM_CTRL) >> 10) & 0x1f;
  265. }
  266. #endif
  267. static void infracfg_ao_peri_dcm_rg_sfsel_set(unsigned int val)
  268. {
  269. reg_write(PERI_BUS_DCM_CTRL,
  270. (reg_read(PERI_BUS_DCM_CTRL) &
  271. ~(0x1f << 10)) |
  272. (val & 0x1f) << 10);
  273. }
  274. bool dcm_infracfg_ao_dcm_peribus_group_is_on(void)
  275. {
  276. bool ret = true;
  277. ret &= ((reg_read(PERI_BUS_DCM_CTRL) &
  278. INFRACFG_AO_DCM_PERIBUS_GROUP_REG0_MASK) ==
  279. (unsigned int) INFRACFG_AO_DCM_PERIBUS_GROUP_REG0_ON);
  280. ret &= ((reg_read(P2P_RX_CLK_ON) &
  281. INFRACFG_AO_DCM_PERIBUS_GROUP_REG1_MASK) ==
  282. (unsigned int) INFRACFG_AO_DCM_PERIBUS_GROUP_REG1_ON);
  283. return ret;
  284. }
  285. void dcm_infracfg_ao_dcm_peribus_group(int on)
  286. {
  287. if (on) {
  288. /* TINFO = "Turn ON DCM 'infracfg_ao_dcm_peribus_group'" */
  289. infracfg_ao_peri_dcm_rg_sfsel_set(0x0);
  290. reg_write(PERI_BUS_DCM_CTRL,
  291. (reg_read(PERI_BUS_DCM_CTRL) &
  292. ~INFRACFG_AO_DCM_PERIBUS_GROUP_REG0_MASK) |
  293. INFRACFG_AO_DCM_PERIBUS_GROUP_REG0_ON);
  294. reg_write(P2P_RX_CLK_ON,
  295. (reg_read(P2P_RX_CLK_ON) &
  296. ~INFRACFG_AO_DCM_PERIBUS_GROUP_REG1_MASK) |
  297. INFRACFG_AO_DCM_PERIBUS_GROUP_REG1_ON);
  298. } else {
  299. /* TINFO = "Turn OFF DCM 'infracfg_ao_dcm_peribus_group'" */
  300. infracfg_ao_peri_dcm_rg_sfsel_set(0x0);
  301. reg_write(PERI_BUS_DCM_CTRL,
  302. (reg_read(PERI_BUS_DCM_CTRL) &
  303. ~INFRACFG_AO_DCM_PERIBUS_GROUP_REG0_MASK) |
  304. INFRACFG_AO_DCM_PERIBUS_GROUP_REG0_OFF);
  305. reg_write(P2P_RX_CLK_ON,
  306. (reg_read(P2P_RX_CLK_ON) &
  307. ~INFRACFG_AO_DCM_PERIBUS_GROUP_REG1_MASK) |
  308. INFRACFG_AO_DCM_PERIBUS_GROUP_REG1_OFF);
  309. }
  310. }
  311. #define INFRACFG_AO_DCM_SSUSB_GROUP_REG0_MASK ((0x1 << 31))
  312. #define INFRACFG_AO_DCM_SSUSB_GROUP_REG0_ON ((0x1 << 31))
  313. #define INFRACFG_AO_DCM_SSUSB_GROUP_REG0_OFF ((0x0 << 31))
  314. bool dcm_infracfg_ao_dcm_ssusb_group_is_on(void)
  315. {
  316. bool ret = true;
  317. ret &= ((reg_read(PERI_BUS_DCM_CTRL) &
  318. INFRACFG_AO_DCM_SSUSB_GROUP_REG0_MASK) ==
  319. (unsigned int) INFRACFG_AO_DCM_SSUSB_GROUP_REG0_ON);
  320. return ret;
  321. }
  322. void dcm_infracfg_ao_dcm_ssusb_group(int on)
  323. {
  324. if (on) {
  325. /* TINFO = "Turn ON DCM 'infracfg_ao_dcm_ssusb_group'" */
  326. reg_write(PERI_BUS_DCM_CTRL,
  327. (reg_read(PERI_BUS_DCM_CTRL) &
  328. ~INFRACFG_AO_DCM_SSUSB_GROUP_REG0_MASK) |
  329. INFRACFG_AO_DCM_SSUSB_GROUP_REG0_ON);
  330. } else {
  331. /* TINFO = "Turn OFF DCM 'infracfg_ao_dcm_ssusb_group'" */
  332. reg_write(PERI_BUS_DCM_CTRL,
  333. (reg_read(PERI_BUS_DCM_CTRL) &
  334. ~INFRACFG_AO_DCM_SSUSB_GROUP_REG0_MASK) |
  335. INFRACFG_AO_DCM_SSUSB_GROUP_REG0_OFF);
  336. }
  337. }
  338. #define MP0_CPUCFG_MP0_RGU_DCM_REG0_MASK ((0x1 << 0))
  339. #define MP0_CPUCFG_MP0_RGU_DCM_REG0_ON ((0x1 << 0))
  340. #define MP0_CPUCFG_MP0_RGU_DCM_REG0_OFF ((0x0 << 0))
  341. bool dcm_mp0_cpucfg_mp0_rgu_dcm_is_on(void)
  342. {
  343. bool ret = true;
  344. ret &= ((reg_read(MP0_CPUCFG_MP0_RGU_DCM_CONFIG) &
  345. MP0_CPUCFG_MP0_RGU_DCM_REG0_MASK) ==
  346. (unsigned int) MP0_CPUCFG_MP0_RGU_DCM_REG0_ON);
  347. return ret;
  348. }
  349. void dcm_mp0_cpucfg_mp0_rgu_dcm(int on)
  350. {
  351. if (on) {
  352. /* TINFO = "Turn ON DCM 'mp0_cpucfg_mp0_rgu_dcm'" */
  353. reg_write(MP0_CPUCFG_MP0_RGU_DCM_CONFIG,
  354. (reg_read(MP0_CPUCFG_MP0_RGU_DCM_CONFIG) &
  355. ~MP0_CPUCFG_MP0_RGU_DCM_REG0_MASK) |
  356. MP0_CPUCFG_MP0_RGU_DCM_REG0_ON);
  357. } else {
  358. /* TINFO = "Turn OFF DCM 'mp0_cpucfg_mp0_rgu_dcm'" */
  359. reg_write(MP0_CPUCFG_MP0_RGU_DCM_CONFIG,
  360. (reg_read(MP0_CPUCFG_MP0_RGU_DCM_CONFIG) &
  361. ~MP0_CPUCFG_MP0_RGU_DCM_REG0_MASK) |
  362. MP0_CPUCFG_MP0_RGU_DCM_REG0_OFF);
  363. }
  364. }
  365. #define MCU_MISCCFG_ADB400_DCM_REG0_MASK ((0x1 << 0) | \
  366. (0x1 << 2) | \
  367. (0x1 << 6))
  368. #define MCU_MISCCFG_ADB400_DCM_REG0_ON ((0x1 << 0) | \
  369. (0x1 << 2) | \
  370. (0x1 << 6))
  371. #define MCU_MISCCFG_ADB400_DCM_REG0_OFF ((0x0 << 0) | \
  372. (0x0 << 2) | \
  373. (0x0 << 6))
  374. bool dcm_mcu_misccfg_adb400_dcm_is_on(void)
  375. {
  376. bool ret = true;
  377. ret &= ((reg_read(CCI_ADB400_DCM_CONFIG) &
  378. MCU_MISCCFG_ADB400_DCM_REG0_MASK) ==
  379. (unsigned int) MCU_MISCCFG_ADB400_DCM_REG0_ON);
  380. return ret;
  381. }
  382. void dcm_mcu_misccfg_adb400_dcm(int on)
  383. {
  384. if (on) {
  385. /* TINFO = "Turn ON DCM 'mcu_misccfg_adb400_dcm'" */
  386. reg_write(CCI_ADB400_DCM_CONFIG,
  387. (reg_read(CCI_ADB400_DCM_CONFIG) &
  388. ~MCU_MISCCFG_ADB400_DCM_REG0_MASK) |
  389. MCU_MISCCFG_ADB400_DCM_REG0_ON);
  390. } else {
  391. /* TINFO = "Turn OFF DCM 'mcu_misccfg_adb400_dcm'" */
  392. reg_write(CCI_ADB400_DCM_CONFIG,
  393. (reg_read(CCI_ADB400_DCM_CONFIG) &
  394. ~MCU_MISCCFG_ADB400_DCM_REG0_MASK) |
  395. MCU_MISCCFG_ADB400_DCM_REG0_OFF);
  396. }
  397. }
  398. #define MCU_MISCCFG_BUS_ARM_PLL_DIVIDER_DCM_REG0_MASK ((0x1 << 11))
  399. #define MCU_MISCCFG_BUS_ARM_PLL_DIVIDER_DCM_REG0_ON ((0x1 << 11))
  400. #define MCU_MISCCFG_BUS_ARM_PLL_DIVIDER_DCM_REG0_OFF ((0x0 << 11))
  401. bool dcm_mcu_misccfg_bus_arm_pll_divider_dcm_is_on(void)
  402. {
  403. bool ret = true;
  404. ret &= ((reg_read(BUS_PLL_DIVIDER_CFG) &
  405. MCU_MISCCFG_BUS_ARM_PLL_DIVIDER_DCM_REG0_MASK) ==
  406. (unsigned int) MCU_MISCCFG_BUS_ARM_PLL_DIVIDER_DCM_REG0_ON);
  407. return ret;
  408. }
  409. void dcm_mcu_misccfg_bus_arm_pll_divider_dcm(int on)
  410. {
  411. if (on) {
  412. /* TINFO = "Turn ON DCM 'mcu_misccfg_bus_arm_pll_divider_dcm'" */
  413. reg_write(BUS_PLL_DIVIDER_CFG,
  414. (reg_read(BUS_PLL_DIVIDER_CFG) &
  415. ~MCU_MISCCFG_BUS_ARM_PLL_DIVIDER_DCM_REG0_MASK) |
  416. MCU_MISCCFG_BUS_ARM_PLL_DIVIDER_DCM_REG0_ON);
  417. } else {
  418. /* TINFO = "Turn OFF DCM 'mcu_misccfg_bus_arm_pll_divider_dcm'" */
  419. reg_write(BUS_PLL_DIVIDER_CFG,
  420. (reg_read(BUS_PLL_DIVIDER_CFG) &
  421. ~MCU_MISCCFG_BUS_ARM_PLL_DIVIDER_DCM_REG0_MASK) |
  422. MCU_MISCCFG_BUS_ARM_PLL_DIVIDER_DCM_REG0_OFF);
  423. }
  424. }
  425. #define MCU_MISCCFG_BUS_CLOCK_DCM_REG0_MASK ((0x1 << 8))
  426. #define MCU_MISCCFG_BUS_CLOCK_DCM_REG0_ON ((0x1 << 8))
  427. #define MCU_MISCCFG_BUS_CLOCK_DCM_REG0_OFF ((0x0 << 8))
  428. bool dcm_mcu_misccfg_bus_clock_dcm_is_on(void)
  429. {
  430. bool ret = true;
  431. ret &= ((reg_read(CCI_CLK_CTRL) &
  432. MCU_MISCCFG_BUS_CLOCK_DCM_REG0_MASK) ==
  433. (unsigned int) MCU_MISCCFG_BUS_CLOCK_DCM_REG0_ON);
  434. return ret;
  435. }
  436. void dcm_mcu_misccfg_bus_clock_dcm(int on)
  437. {
  438. if (on) {
  439. /* TINFO = "Turn ON DCM 'mcu_misccfg_bus_clock_dcm'" */
  440. reg_write(CCI_CLK_CTRL,
  441. (reg_read(CCI_CLK_CTRL) &
  442. ~MCU_MISCCFG_BUS_CLOCK_DCM_REG0_MASK) |
  443. MCU_MISCCFG_BUS_CLOCK_DCM_REG0_ON);
  444. } else {
  445. /* TINFO = "Turn OFF DCM 'mcu_misccfg_bus_clock_dcm'" */
  446. reg_write(CCI_CLK_CTRL,
  447. (reg_read(CCI_CLK_CTRL) &
  448. ~MCU_MISCCFG_BUS_CLOCK_DCM_REG0_MASK) |
  449. MCU_MISCCFG_BUS_CLOCK_DCM_REG0_OFF);
  450. }
  451. }
  452. #define MCU_MISCCFG_BUS_FABRIC_DCM_REG0_MASK ((0x1 << 0) | \
  453. (0x1 << 1) | \
  454. (0x1 << 2) | \
  455. (0x1 << 3) | \
  456. (0x1 << 4) | \
  457. (0x1 << 5) | \
  458. (0x1 << 8) | \
  459. (0x1 << 9) | \
  460. (0x1 << 10) | \
  461. (0x1 << 11) | \
  462. (0x1 << 12) | \
  463. (0x1 << 18) | \
  464. (0x1 << 21))
  465. #define MCU_MISCCFG_BUS_FABRIC_DCM_REG0_ON ((0x1 << 0) | \
  466. (0x1 << 1) | \
  467. (0x1 << 2) | \
  468. (0x1 << 3) | \
  469. (0x1 << 4) | \
  470. (0x1 << 5) | \
  471. (0x1 << 8) | \
  472. (0x1 << 9) | \
  473. (0x1 << 10) | \
  474. (0x1 << 11) | \
  475. (0x1 << 12) | \
  476. (0x1 << 18) | \
  477. (0x1 << 21))
  478. #define MCU_MISCCFG_BUS_FABRIC_DCM_REG0_OFF ((0x0 << 0) | \
  479. (0x0 << 1) | \
  480. (0x0 << 2) | \
  481. (0x0 << 3) | \
  482. (0x0 << 4) | \
  483. (0x0 << 5) | \
  484. (0x0 << 8) | \
  485. (0x0 << 9) | \
  486. (0x0 << 10) | \
  487. (0x0 << 11) | \
  488. (0x0 << 12) | \
  489. (0x0 << 18) | \
  490. (0x0 << 21))
  491. bool dcm_mcu_misccfg_bus_fabric_dcm_is_on(void)
  492. {
  493. bool ret = true;
  494. ret &= ((reg_read(BUS_FABRIC_DCM_CTRL) &
  495. MCU_MISCCFG_BUS_FABRIC_DCM_REG0_MASK) ==
  496. (unsigned int) MCU_MISCCFG_BUS_FABRIC_DCM_REG0_ON);
  497. return ret;
  498. }
  499. void dcm_mcu_misccfg_bus_fabric_dcm(int on)
  500. {
  501. if (on) {
  502. /* TINFO = "Turn ON DCM 'mcu_misccfg_bus_fabric_dcm'" */
  503. reg_write(BUS_FABRIC_DCM_CTRL,
  504. (reg_read(BUS_FABRIC_DCM_CTRL) &
  505. ~MCU_MISCCFG_BUS_FABRIC_DCM_REG0_MASK) |
  506. MCU_MISCCFG_BUS_FABRIC_DCM_REG0_ON);
  507. } else {
  508. /* TINFO = "Turn OFF DCM 'mcu_misccfg_bus_fabric_dcm'" */
  509. reg_write(BUS_FABRIC_DCM_CTRL,
  510. (reg_read(BUS_FABRIC_DCM_CTRL) &
  511. ~MCU_MISCCFG_BUS_FABRIC_DCM_REG0_MASK) |
  512. MCU_MISCCFG_BUS_FABRIC_DCM_REG0_OFF);
  513. }
  514. }
  515. #define MCU_MISCCFG_GIC_SYNC_DCM_REG0_MASK ((0x1 << 0))
  516. #define MCU_MISCCFG_GIC_SYNC_DCM_REG0_ON ((0x1 << 0))
  517. #define MCU_MISCCFG_GIC_SYNC_DCM_REG0_OFF ((0x0 << 0))
  518. bool dcm_mcu_misccfg_gic_sync_dcm_is_on(void)
  519. {
  520. bool ret = true;
  521. ret &= ((reg_read(MP_GIC_RGU_SYNC_DCM) &
  522. MCU_MISCCFG_GIC_SYNC_DCM_REG0_MASK) ==
  523. (unsigned int) MCU_MISCCFG_GIC_SYNC_DCM_REG0_ON);
  524. return ret;
  525. }
  526. void dcm_mcu_misccfg_gic_sync_dcm(int on)
  527. {
  528. if (on) {
  529. /* TINFO = "Turn ON DCM 'mcu_misccfg_gic_sync_dcm'" */
  530. reg_write(MP_GIC_RGU_SYNC_DCM,
  531. (reg_read(MP_GIC_RGU_SYNC_DCM) &
  532. ~MCU_MISCCFG_GIC_SYNC_DCM_REG0_MASK) |
  533. MCU_MISCCFG_GIC_SYNC_DCM_REG0_ON);
  534. } else {
  535. /* TINFO = "Turn OFF DCM 'mcu_misccfg_gic_sync_dcm'" */
  536. reg_write(MP_GIC_RGU_SYNC_DCM,
  537. (reg_read(MP_GIC_RGU_SYNC_DCM) &
  538. ~MCU_MISCCFG_GIC_SYNC_DCM_REG0_MASK) |
  539. MCU_MISCCFG_GIC_SYNC_DCM_REG0_OFF);
  540. }
  541. }
  542. #define MCU_MISCCFG_L2_SHARED_DCM_REG0_MASK ((0x1 << 0))
  543. #define MCU_MISCCFG_L2_SHARED_DCM_REG0_ON ((0x1 << 0))
  544. #define MCU_MISCCFG_L2_SHARED_DCM_REG0_OFF ((0x0 << 0))
  545. bool dcm_mcu_misccfg_l2_shared_dcm_is_on(void)
  546. {
  547. bool ret = true;
  548. ret &= ((reg_read(L2C_SRAM_CTRL) &
  549. MCU_MISCCFG_L2_SHARED_DCM_REG0_MASK) ==
  550. (unsigned int) MCU_MISCCFG_L2_SHARED_DCM_REG0_ON);
  551. return ret;
  552. }
  553. void dcm_mcu_misccfg_l2_shared_dcm(int on)
  554. {
  555. if (on) {
  556. /* TINFO = "Turn ON DCM 'mcu_misccfg_l2_shared_dcm'" */
  557. reg_write(L2C_SRAM_CTRL,
  558. (reg_read(L2C_SRAM_CTRL) &
  559. ~MCU_MISCCFG_L2_SHARED_DCM_REG0_MASK) |
  560. MCU_MISCCFG_L2_SHARED_DCM_REG0_ON);
  561. } else {
  562. /* TINFO = "Turn OFF DCM 'mcu_misccfg_l2_shared_dcm'" */
  563. reg_write(L2C_SRAM_CTRL,
  564. (reg_read(L2C_SRAM_CTRL) &
  565. ~MCU_MISCCFG_L2_SHARED_DCM_REG0_MASK) |
  566. MCU_MISCCFG_L2_SHARED_DCM_REG0_OFF);
  567. }
  568. }
  569. #define MCU_MISCCFG_MCU_MISC_DCM_REG0_MASK ((0x1 << 0))
  570. #define MCU_MISCCFG_MCU_MISC_DCM_REG0_ON ((0x1 << 0))
  571. #define MCU_MISCCFG_MCU_MISC_DCM_REG0_OFF ((0x0 << 0))
  572. bool dcm_mcu_misccfg_mcu_misc_dcm_is_on(void)
  573. {
  574. bool ret = true;
  575. ret &= ((reg_read(MCU_MISC_DCM_CTRL) &
  576. MCU_MISCCFG_MCU_MISC_DCM_REG0_MASK) ==
  577. (unsigned int) MCU_MISCCFG_MCU_MISC_DCM_REG0_ON);
  578. return ret;
  579. }
  580. void dcm_mcu_misccfg_mcu_misc_dcm(int on)
  581. {
  582. if (on) {
  583. /* TINFO = "Turn ON DCM 'mcu_misccfg_mcu_misc_dcm'" */
  584. reg_write(MCU_MISC_DCM_CTRL,
  585. (reg_read(MCU_MISC_DCM_CTRL) &
  586. ~MCU_MISCCFG_MCU_MISC_DCM_REG0_MASK) |
  587. MCU_MISCCFG_MCU_MISC_DCM_REG0_ON);
  588. } else {
  589. /* TINFO = "Turn OFF DCM 'mcu_misccfg_mcu_misc_dcm'" */
  590. reg_write(MCU_MISC_DCM_CTRL,
  591. (reg_read(MCU_MISC_DCM_CTRL) &
  592. ~MCU_MISCCFG_MCU_MISC_DCM_REG0_MASK) |
  593. MCU_MISCCFG_MCU_MISC_DCM_REG0_OFF);
  594. }
  595. }
  596. #define DRAMC_CH0_TOP0_DDRPHY_REG0_MASK ((0x1 << 8) | \
  597. (0x1 << 9) | \
  598. (0x1 << 10) | \
  599. (0x1 << 11) | \
  600. (0x1 << 12) | \
  601. (0x1 << 13) | \
  602. (0x1 << 14) | \
  603. (0x1 << 15) | \
  604. (0x1 << 16) | \
  605. (0x1 << 17) | \
  606. (0x1 << 19))
  607. #define DRAMC_CH0_TOP0_DDRPHY_REG1_MASK ((0x1 << 6) | \
  608. (0x1 << 7) | \
  609. (0x1 << 26))
  610. #define DRAMC_CH0_TOP0_DDRPHY_REG2_MASK ((0x1 << 26) | \
  611. (0x1 << 27))
  612. #define DRAMC_CH0_TOP0_DDRPHY_REG0_ON ((0x0 << 8) | \
  613. (0x0 << 9) | \
  614. (0x0 << 10) | \
  615. (0x0 << 11) | \
  616. (0x0 << 12) | \
  617. (0x0 << 13) | \
  618. (0x0 << 14) | \
  619. (0x0 << 15) | \
  620. (0x0 << 16) | \
  621. (0x0 << 17) | \
  622. (0x0 << 19))
  623. #define DRAMC_CH0_TOP0_DDRPHY_REG1_ON ((0x0 << 6) | \
  624. (0x0 << 7) | \
  625. (0x0 << 26))
  626. #define DRAMC_CH0_TOP0_DDRPHY_REG2_ON ((0x0 << 26) | \
  627. (0x0 << 27))
  628. #define DRAMC_CH0_TOP0_DDRPHY_REG0_OFF ((0x1 << 8) | \
  629. (0x1 << 9) | \
  630. (0x1 << 10) | \
  631. (0x1 << 11) | \
  632. (0x1 << 12) | \
  633. (0x1 << 13) | \
  634. (0x1 << 14) | \
  635. (0x1 << 15) | \
  636. (0x1 << 16) | \
  637. (0x1 << 17) | \
  638. (0x1 << 19))
  639. #define DRAMC_CH0_TOP0_DDRPHY_REG1_OFF ((0x1 << 6) | \
  640. (0x1 << 7) | \
  641. (0x0 << 26))
  642. #define DRAMC_CH0_TOP0_DDRPHY_REG2_OFF ((0x1 << 26) | \
  643. (0x1 << 27))
  644. #if 0
  645. static unsigned int dramc_ch0_top0_rg_mem_dcm_idle_fsel_get(void)
  646. {
  647. return (reg_read(DRAMC_CH0_TOP0_MISC_CG_CTRL2) >> 21) & 0x1f;
  648. }
  649. #endif
  650. static void dramc_ch0_top0_rg_mem_dcm_idle_fsel_set(unsigned int val)
  651. {
  652. reg_write(DRAMC_CH0_TOP0_MISC_CG_CTRL2,
  653. (reg_read(DRAMC_CH0_TOP0_MISC_CG_CTRL2) &
  654. ~(0x1f << 21)) |
  655. (val & 0x1f) << 21);
  656. }
  657. bool dcm_dramc_ch0_top0_ddrphy_is_on(void)
  658. {
  659. bool ret = true;
  660. ret &= ((reg_read(DRAMC_CH0_TOP0_MISC_CG_CTRL0) &
  661. DRAMC_CH0_TOP0_DDRPHY_REG0_MASK) ==
  662. (unsigned int) DRAMC_CH0_TOP0_DDRPHY_REG0_ON);
  663. ret &= ((reg_read(DRAMC_CH0_TOP0_MISC_CG_CTRL2) &
  664. DRAMC_CH0_TOP0_DDRPHY_REG1_MASK) ==
  665. (unsigned int) DRAMC_CH0_TOP0_DDRPHY_REG1_ON);
  666. ret &= ((reg_read(DRAMC_CH0_TOP0_MISC_CTRL3) &
  667. DRAMC_CH0_TOP0_DDRPHY_REG2_MASK) ==
  668. (unsigned int) DRAMC_CH0_TOP0_DDRPHY_REG2_ON);
  669. return ret;
  670. }
  671. void dcm_dramc_ch0_top0_ddrphy(int on)
  672. {
  673. if (on) {
  674. /* TINFO = "Turn ON DCM 'dramc_ch0_top0_ddrphy'" */
  675. dramc_ch0_top0_rg_mem_dcm_idle_fsel_set(0x8);
  676. reg_write(DRAMC_CH0_TOP0_MISC_CG_CTRL0,
  677. (reg_read(DRAMC_CH0_TOP0_MISC_CG_CTRL0) &
  678. ~DRAMC_CH0_TOP0_DDRPHY_REG0_MASK) |
  679. DRAMC_CH0_TOP0_DDRPHY_REG0_ON);
  680. reg_write(DRAMC_CH0_TOP0_MISC_CG_CTRL2,
  681. (reg_read(DRAMC_CH0_TOP0_MISC_CG_CTRL2) &
  682. ~DRAMC_CH0_TOP0_DDRPHY_REG1_MASK) |
  683. DRAMC_CH0_TOP0_DDRPHY_REG1_ON);
  684. reg_write(DRAMC_CH0_TOP0_MISC_CTRL3,
  685. (reg_read(DRAMC_CH0_TOP0_MISC_CTRL3) &
  686. ~DRAMC_CH0_TOP0_DDRPHY_REG2_MASK) |
  687. DRAMC_CH0_TOP0_DDRPHY_REG2_ON);
  688. } else {
  689. /* TINFO = "Turn OFF DCM 'dramc_ch0_top0_ddrphy'" */
  690. dramc_ch0_top0_rg_mem_dcm_idle_fsel_set(0x0);
  691. reg_write(DRAMC_CH0_TOP0_MISC_CG_CTRL0,
  692. (reg_read(DRAMC_CH0_TOP0_MISC_CG_CTRL0) &
  693. ~DRAMC_CH0_TOP0_DDRPHY_REG0_MASK) |
  694. DRAMC_CH0_TOP0_DDRPHY_REG0_OFF);
  695. reg_write(DRAMC_CH0_TOP0_MISC_CG_CTRL2,
  696. (reg_read(DRAMC_CH0_TOP0_MISC_CG_CTRL2) &
  697. ~DRAMC_CH0_TOP0_DDRPHY_REG1_MASK) |
  698. DRAMC_CH0_TOP0_DDRPHY_REG1_OFF);
  699. reg_write(DRAMC_CH0_TOP0_MISC_CTRL3,
  700. (reg_read(DRAMC_CH0_TOP0_MISC_CTRL3) &
  701. ~DRAMC_CH0_TOP0_DDRPHY_REG2_MASK) |
  702. DRAMC_CH0_TOP0_DDRPHY_REG2_OFF);
  703. }
  704. }
  705. #define DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG0_MASK ((0x1 << 0) | \
  706. (0x1 << 1) | \
  707. (0x1 << 2) | \
  708. (0x1 << 26) | \
  709. (0x1 << 30) | \
  710. (0x1 << 31))
  711. #define DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG1_MASK ((0x1 << 31))
  712. #define DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG0_ON ((0x1 << 0) | \
  713. (0x1 << 1) | \
  714. (0x1 << 2) | \
  715. (0x0 << 26) | \
  716. (0x1 << 30) | \
  717. (0x1 << 31))
  718. #define DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG1_ON ((0x1 << 31))
  719. #define DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG0_OFF ((0x0 << 0) | \
  720. (0x0 << 1) | \
  721. (0x0 << 2) | \
  722. (0x1 << 26) | \
  723. (0x0 << 30) | \
  724. (0x0 << 31))
  725. #define DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG1_OFF ((0x0 << 31))
  726. bool dcm_dramc_ch0_top1_dcm_dramc_group_is_on(void)
  727. {
  728. bool ret = true;
  729. ret &= ((reg_read(DRAMC_CH0_TOP1_DRAMC_PD_CTRL) &
  730. DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG0_MASK) ==
  731. (unsigned int) DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG0_ON);
  732. ret &= ((reg_read(DRAMC_CH0_TOP1_CLKAR) &
  733. DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG1_MASK) ==
  734. (unsigned int) DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG1_ON);
  735. return ret;
  736. }
  737. void dcm_dramc_ch0_top1_dcm_dramc_group(int on)
  738. {
  739. if (on) {
  740. /* TINFO = "Turn ON DCM 'dramc_ch0_top1_dcm_dramc_group'" */
  741. reg_write(DRAMC_CH0_TOP1_DRAMC_PD_CTRL,
  742. (reg_read(DRAMC_CH0_TOP1_DRAMC_PD_CTRL) &
  743. ~DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG0_MASK) |
  744. DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG0_ON);
  745. reg_write(DRAMC_CH0_TOP1_CLKAR,
  746. (reg_read(DRAMC_CH0_TOP1_CLKAR) &
  747. ~DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG1_MASK) |
  748. DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG1_ON);
  749. } else {
  750. /* TINFO = "Turn OFF DCM 'dramc_ch0_top1_dcm_dramc_group'" */
  751. reg_write(DRAMC_CH0_TOP1_DRAMC_PD_CTRL,
  752. (reg_read(DRAMC_CH0_TOP1_DRAMC_PD_CTRL) &
  753. ~DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG0_MASK) |
  754. DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG0_OFF);
  755. reg_write(DRAMC_CH0_TOP1_CLKAR,
  756. (reg_read(DRAMC_CH0_TOP1_CLKAR) &
  757. ~DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG1_MASK) |
  758. DRAMC_CH0_TOP1_DCM_DRAMC_GROUP_REG1_OFF);
  759. }
  760. }
  761. #define CHN0_EMI_DCM_EMI_GROUP_REG0_MASK ((0xff << 24))
  762. #define CHN0_EMI_DCM_EMI_GROUP_REG0_ON ((0x0 << 24))
  763. #define CHN0_EMI_DCM_EMI_GROUP_REG0_OFF ((0xff << 24))
  764. bool dcm_chn0_emi_dcm_emi_group_is_on(void)
  765. {
  766. bool ret = true;
  767. ret &= ((reg_read(CHN0_EMI_CHN_EMI_CONB) &
  768. CHN0_EMI_DCM_EMI_GROUP_REG0_MASK) ==
  769. (unsigned int) CHN0_EMI_DCM_EMI_GROUP_REG0_ON);
  770. return ret;
  771. }
  772. void dcm_chn0_emi_dcm_emi_group(int on)
  773. {
  774. if (on) {
  775. /* TINFO = "Turn ON DCM 'chn0_emi_dcm_emi_group'" */
  776. reg_write(CHN0_EMI_CHN_EMI_CONB,
  777. (reg_read(CHN0_EMI_CHN_EMI_CONB) &
  778. ~CHN0_EMI_DCM_EMI_GROUP_REG0_MASK) |
  779. CHN0_EMI_DCM_EMI_GROUP_REG0_ON);
  780. } else {
  781. /* TINFO = "Turn OFF DCM 'chn0_emi_dcm_emi_group'" */
  782. reg_write(CHN0_EMI_CHN_EMI_CONB,
  783. (reg_read(CHN0_EMI_CHN_EMI_CONB) &
  784. ~CHN0_EMI_DCM_EMI_GROUP_REG0_MASK) |
  785. CHN0_EMI_DCM_EMI_GROUP_REG0_OFF);
  786. }
  787. }
  788. #define DRAMC_CH1_TOP0_DDRPHY_REG0_MASK ((0x1 << 8) | \
  789. (0x1 << 9) | \
  790. (0x1 << 10) | \
  791. (0x1 << 11) | \
  792. (0x1 << 12) | \
  793. (0x1 << 13) | \
  794. (0x1 << 14) | \
  795. (0x1 << 15) | \
  796. (0x1 << 16) | \
  797. (0x1 << 17) | \
  798. (0x1 << 19))
  799. #define DRAMC_CH1_TOP0_DDRPHY_REG1_MASK ((0x1 << 6) | \
  800. (0x1 << 7) | \
  801. (0x1 << 26))
  802. #define DRAMC_CH1_TOP0_DDRPHY_REG2_MASK ((0x1 << 26) | \
  803. (0x1 << 27))
  804. #define DRAMC_CH1_TOP0_DDRPHY_REG0_ON ((0x0 << 8) | \
  805. (0x0 << 9) | \
  806. (0x0 << 10) | \
  807. (0x0 << 11) | \
  808. (0x0 << 12) | \
  809. (0x0 << 13) | \
  810. (0x0 << 14) | \
  811. (0x0 << 15) | \
  812. (0x0 << 16) | \
  813. (0x0 << 17) | \
  814. (0x0 << 19))
  815. #define DRAMC_CH1_TOP0_DDRPHY_REG1_ON ((0x0 << 6) | \
  816. (0x0 << 7) | \
  817. (0x0 << 26))
  818. #define DRAMC_CH1_TOP0_DDRPHY_REG2_ON ((0x0 << 26) | \
  819. (0x0 << 27))
  820. #define DRAMC_CH1_TOP0_DDRPHY_REG0_OFF ((0x1 << 8) | \
  821. (0x1 << 9) | \
  822. (0x1 << 10) | \
  823. (0x1 << 11) | \
  824. (0x1 << 12) | \
  825. (0x1 << 13) | \
  826. (0x1 << 14) | \
  827. (0x1 << 15) | \
  828. (0x1 << 16) | \
  829. (0x1 << 17) | \
  830. (0x1 << 19))
  831. #define DRAMC_CH1_TOP0_DDRPHY_REG1_OFF ((0x1 << 6) | \
  832. (0x1 << 7) | \
  833. (0x0 << 26))
  834. #define DRAMC_CH1_TOP0_DDRPHY_REG2_OFF ((0x1 << 26) | \
  835. (0x1 << 27))
  836. #if 0
  837. static unsigned int dramc_ch1_top0_rg_mem_dcm_idle_fsel_get(void)
  838. {
  839. return (reg_read(DRAMC_CH1_TOP0_MISC_CG_CTRL2) >> 21) & 0x1f;
  840. }
  841. #endif
  842. static void dramc_ch1_top0_rg_mem_dcm_idle_fsel_set(unsigned int val)
  843. {
  844. reg_write(DRAMC_CH1_TOP0_MISC_CG_CTRL2,
  845. (reg_read(DRAMC_CH1_TOP0_MISC_CG_CTRL2) &
  846. ~(0x1f << 21)) |
  847. (val & 0x1f) << 21);
  848. }
  849. bool dcm_dramc_ch1_top0_ddrphy_is_on(void)
  850. {
  851. bool ret = true;
  852. ret &= ((reg_read(DRAMC_CH1_TOP0_MISC_CG_CTRL0) &
  853. DRAMC_CH1_TOP0_DDRPHY_REG0_MASK) ==
  854. (unsigned int) DRAMC_CH1_TOP0_DDRPHY_REG0_ON);
  855. ret &= ((reg_read(DRAMC_CH1_TOP0_MISC_CG_CTRL2) &
  856. DRAMC_CH1_TOP0_DDRPHY_REG1_MASK) ==
  857. (unsigned int) DRAMC_CH1_TOP0_DDRPHY_REG1_ON);
  858. ret &= ((reg_read(DRAMC_CH1_TOP0_MISC_CTRL3) &
  859. DRAMC_CH1_TOP0_DDRPHY_REG2_MASK) ==
  860. (unsigned int) DRAMC_CH1_TOP0_DDRPHY_REG2_ON);
  861. return ret;
  862. }
  863. void dcm_dramc_ch1_top0_ddrphy(int on)
  864. {
  865. if (on) {
  866. /* TINFO = "Turn ON DCM 'dramc_ch1_top0_ddrphy'" */
  867. dramc_ch1_top0_rg_mem_dcm_idle_fsel_set(0x8);
  868. reg_write(DRAMC_CH1_TOP0_MISC_CG_CTRL0,
  869. (reg_read(DRAMC_CH1_TOP0_MISC_CG_CTRL0) &
  870. ~DRAMC_CH1_TOP0_DDRPHY_REG0_MASK) |
  871. DRAMC_CH1_TOP0_DDRPHY_REG0_ON);
  872. reg_write(DRAMC_CH1_TOP0_MISC_CG_CTRL2,
  873. (reg_read(DRAMC_CH1_TOP0_MISC_CG_CTRL2) &
  874. ~DRAMC_CH1_TOP0_DDRPHY_REG1_MASK) |
  875. DRAMC_CH1_TOP0_DDRPHY_REG1_ON);
  876. reg_write(DRAMC_CH1_TOP0_MISC_CTRL3,
  877. (reg_read(DRAMC_CH1_TOP0_MISC_CTRL3) &
  878. ~DRAMC_CH1_TOP0_DDRPHY_REG2_MASK) |
  879. DRAMC_CH1_TOP0_DDRPHY_REG2_ON);
  880. } else {
  881. /* TINFO = "Turn OFF DCM 'dramc_ch1_top0_ddrphy'" */
  882. dramc_ch1_top0_rg_mem_dcm_idle_fsel_set(0x0);
  883. reg_write(DRAMC_CH1_TOP0_MISC_CG_CTRL0,
  884. (reg_read(DRAMC_CH1_TOP0_MISC_CG_CTRL0) &
  885. ~DRAMC_CH1_TOP0_DDRPHY_REG0_MASK) |
  886. DRAMC_CH1_TOP0_DDRPHY_REG0_OFF);
  887. reg_write(DRAMC_CH1_TOP0_MISC_CG_CTRL2,
  888. (reg_read(DRAMC_CH1_TOP0_MISC_CG_CTRL2) &
  889. ~DRAMC_CH1_TOP0_DDRPHY_REG1_MASK) |
  890. DRAMC_CH1_TOP0_DDRPHY_REG1_OFF);
  891. reg_write(DRAMC_CH1_TOP0_MISC_CTRL3,
  892. (reg_read(DRAMC_CH1_TOP0_MISC_CTRL3) &
  893. ~DRAMC_CH1_TOP0_DDRPHY_REG2_MASK) |
  894. DRAMC_CH1_TOP0_DDRPHY_REG2_OFF);
  895. }
  896. }
  897. #define DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG0_MASK ((0x1 << 0) | \
  898. (0x1 << 1) | \
  899. (0x1 << 2) | \
  900. (0x1 << 26) | \
  901. (0x1 << 30) | \
  902. (0x1 << 31))
  903. #define DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG1_MASK ((0x1 << 31))
  904. #define DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG0_ON ((0x1 << 0) | \
  905. (0x1 << 1) | \
  906. (0x1 << 2) | \
  907. (0x0 << 26) | \
  908. (0x1 << 30) | \
  909. (0x1 << 31))
  910. #define DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG1_ON ((0x1 << 31))
  911. #define DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG0_OFF ((0x0 << 0) | \
  912. (0x0 << 1) | \
  913. (0x0 << 2) | \
  914. (0x1 << 26) | \
  915. (0x0 << 30) | \
  916. (0x0 << 31))
  917. #define DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG1_OFF ((0x0 << 31))
  918. bool dcm_dramc_ch1_top1_dcm_dramc_group_is_on(void)
  919. {
  920. bool ret = true;
  921. ret &= ((reg_read(DRAMC_CH1_TOP1_DRAMC_PD_CTRL) &
  922. DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG0_MASK) ==
  923. (unsigned int) DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG0_ON);
  924. ret &= ((reg_read(DRAMC_CH1_TOP1_CLKAR) &
  925. DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG1_MASK) ==
  926. (unsigned int) DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG1_ON);
  927. return ret;
  928. }
  929. void dcm_dramc_ch1_top1_dcm_dramc_group(int on)
  930. {
  931. if (on) {
  932. /* TINFO = "Turn ON DCM 'dramc_ch1_top1_dcm_dramc_group'" */
  933. reg_write(DRAMC_CH1_TOP1_DRAMC_PD_CTRL,
  934. (reg_read(DRAMC_CH1_TOP1_DRAMC_PD_CTRL) &
  935. ~DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG0_MASK) |
  936. DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG0_ON);
  937. reg_write(DRAMC_CH1_TOP1_CLKAR,
  938. (reg_read(DRAMC_CH1_TOP1_CLKAR) &
  939. ~DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG1_MASK) |
  940. DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG1_ON);
  941. } else {
  942. /* TINFO = "Turn OFF DCM 'dramc_ch1_top1_dcm_dramc_group'" */
  943. reg_write(DRAMC_CH1_TOP1_DRAMC_PD_CTRL,
  944. (reg_read(DRAMC_CH1_TOP1_DRAMC_PD_CTRL) &
  945. ~DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG0_MASK) |
  946. DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG0_OFF);
  947. reg_write(DRAMC_CH1_TOP1_CLKAR,
  948. (reg_read(DRAMC_CH1_TOP1_CLKAR) &
  949. ~DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG1_MASK) |
  950. DRAMC_CH1_TOP1_DCM_DRAMC_GROUP_REG1_OFF);
  951. }
  952. }
  953. #define CHN1_EMI_DCM_EMI_GROUP_REG0_MASK ((0xff << 24))
  954. #define CHN1_EMI_DCM_EMI_GROUP_REG0_ON ((0x0 << 24))
  955. #define CHN1_EMI_DCM_EMI_GROUP_REG0_OFF ((0xff << 24))
  956. bool dcm_chn1_emi_dcm_emi_group_is_on(void)
  957. {
  958. bool ret = true;
  959. ret &= ((reg_read(CHN1_EMI_CHN_EMI_CONB) &
  960. CHN1_EMI_DCM_EMI_GROUP_REG0_MASK) ==
  961. (unsigned int) CHN1_EMI_DCM_EMI_GROUP_REG0_ON);
  962. return ret;
  963. }
  964. void dcm_chn1_emi_dcm_emi_group(int on)
  965. {
  966. if (on) {
  967. /* TINFO = "Turn ON DCM 'chn1_emi_dcm_emi_group'" */
  968. reg_write(CHN1_EMI_CHN_EMI_CONB,
  969. (reg_read(CHN1_EMI_CHN_EMI_CONB) &
  970. ~CHN1_EMI_DCM_EMI_GROUP_REG0_MASK) |
  971. CHN1_EMI_DCM_EMI_GROUP_REG0_ON);
  972. } else {
  973. /* TINFO = "Turn OFF DCM 'chn1_emi_dcm_emi_group'" */
  974. reg_write(CHN1_EMI_CHN_EMI_CONB,
  975. (reg_read(CHN1_EMI_CHN_EMI_CONB) &
  976. ~CHN1_EMI_DCM_EMI_GROUP_REG0_MASK) |
  977. CHN1_EMI_DCM_EMI_GROUP_REG0_OFF);
  978. }
  979. }