mt_dcm_autogen.c 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627
  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. #ifdef __KERNEL__
  32. #include <mt-plat/mtk_io.h>
  33. #include <mt-plat/sync_write.h>
  34. #include <mach/mtk_secure_api.h>
  35. #else /* ! __KERNEL__ */
  36. #ifdef __CTP__
  37. #include "sync_write.h"
  38. #include "common.h"
  39. #else
  40. #ifdef __RTL__
  41. #include "cmessage.h"
  42. #include "API.h"
  43. #else /* __LK__ */
  44. #include <debug.h>
  45. #include <stdlib.h>
  46. #include <string.h>
  47. #include <sys/types.h>
  48. #include <arch/arm.h>
  49. #include <arch/arm/mmu.h>
  50. #include <arch/ops.h>
  51. #include <target/board.h>
  52. #include <platform/mt_reg_base.h>
  53. #include <platform/mt_typedefs.h>
  54. #include <platform/sync_write.h>
  55. #endif
  56. #endif
  57. #endif
  58. #include "mt_dcm_autogen.h"
  59. #ifndef __KERNEL__
  60. #define IOMEM(a) (a)
  61. #ifdef __CTP__
  62. #define __raw_readl(a) (*(volatile unsigned long*)(a))
  63. /* #define dsb() do { __asm__ __volatile__ ("dsb\n\t"); } while(0) */
  64. #define mt_reg_sync_writel(val, addr) ({ *(unsigned long *)(addr) = val; dsb(); })
  65. #define unlikely(a) (a)
  66. #else /* __LK__ */
  67. extern unsigned long mt_secure_call(unsigned long, unsigned long, unsigned long, unsigned long);
  68. #define MTK_SIP_KERNEL_MCSI_A_WRITE 0x82000289
  69. #define MTK_SIP_KERNEL_MCSI_A_READ 0x8200028A
  70. #define mcsi_a_smc_read_phy(addr) \
  71. mt_secure_call(MTK_SIP_KERNEL_MCSI_A_READ, addr, 0, 0)
  72. #define mcsi_a_smc_write_phy(addr, val) \
  73. mt_secure_call(MTK_SIP_KERNEL_MCSI_A_WRITE, addr, val, 0)
  74. #define __raw_readl(addr) DRV_Reg32(addr)
  75. #endif
  76. #endif
  77. #define reg_read(addr) __raw_readl(IOMEM(addr))
  78. #define reg_write(addr, val) mt_reg_sync_writel((val), ((void *)addr))
  79. #if defined(__KERNEL__) /* for KERNEL */
  80. #if defined(CONFIG_ARM_PSCI) || defined(CONFIG_MTK_PSCI)
  81. #define MCUSYS_SMC_WRITE(addr, val) mcusys_smc_write_phy(addr##_PHYS, val)
  82. #define MCSI_A_SMC_WRITE(addr, val) mcsi_a_smc_write_phy(addr##_PHYS, val)
  83. #define MCSI_A_SMC_READ(addr) mcsi_a_smc_read_phy(addr##_PHYS)
  84. #else
  85. #define MCUSYS_SMC_WRITE(addr, val) mcusys_smc_write(addr, val)
  86. #define MCSI_A_SMC_WRITE(addr, val) reg_write(addr, val)
  87. #define MCSI_A_SMC_READ(addr) reg_read(addr)
  88. #endif
  89. #else /* !defined(__KERNEL__), for CTP */
  90. #ifdef __CTP__
  91. #define MCUSYS_SMC_WRITE(addr, val) reg_write(addr, val)
  92. #define MCSI_A_SMC_WRITE(addr, val) reg_write(addr, val)
  93. #define MCSI_A_SMC_READ(addr) reg_read(addr)
  94. #else /* __LK__ */
  95. #define MCUSYS_SMC_WRITE(addr, val) reg_write(addr, val)
  96. #define MCSI_A_SMC_WRITE(addr, val) mcsi_a_smc_write_phy(addr##_PHYS, val)
  97. #define MCSI_A_SMC_READ(addr) mcsi_a_smc_read_phy(addr##_PHYS)
  98. #endif /* ifdef __CTP__ */
  99. #endif /* defined(__KERNEL__) */
  100. #define INFRACFG_AO_DCM_INFRA_BUS_REG0_MASK ((0x1 << 0) | \
  101. (0x1 << 1) | \
  102. (0x1 << 2) | \
  103. (0x1 << 3) | \
  104. (0x1 << 4) | \
  105. (0x1 << 20) | \
  106. (0x1 << 21) | \
  107. (0x1 << 22))
  108. #define INFRACFG_AO_DCM_INFRA_BUS_REG0_ON ((0x1 << 0) | \
  109. (0x1 << 1) | \
  110. (0x0 << 2) | \
  111. (0x0 << 3) | \
  112. (0x0 << 4) | \
  113. (0x1 << 20) | \
  114. (0x1 << 21) | \
  115. (0x1 << 22))
  116. #define INFRACFG_AO_DCM_INFRA_BUS_REG0_OFF ((0x0 << 0) | \
  117. (0x0 << 1) | \
  118. (0x0 << 2) | \
  119. (0x0 << 3) | \
  120. (0x0 << 4) | \
  121. (0x0 << 20) | \
  122. (0x1 << 21) | \
  123. (0x1 << 22))
  124. #if 0
  125. static unsigned int infracfg_ao_infra_dcm_rg_fsel_get(void)
  126. {
  127. return (reg_read(INFRA_BUS_DCM_CTRL) >> 5) & 0x1f;
  128. }
  129. #endif
  130. #if 0
  131. static unsigned int infracfg_ao_infra_dcm_rg_sfsel_get(void)
  132. {
  133. return (reg_read(INFRA_BUS_DCM_CTRL) >> 10) & 0x1f;
  134. }
  135. #endif
  136. static void infracfg_ao_infra_dcm_rg_fsel_set(unsigned int val)
  137. {
  138. reg_write(INFRA_BUS_DCM_CTRL,
  139. (reg_read(INFRA_BUS_DCM_CTRL) &
  140. ~(0x1f << 5)) |
  141. (val & 0x1f) << 5);
  142. }
  143. static void infracfg_ao_infra_dcm_rg_sfsel_set(unsigned int val)
  144. {
  145. reg_write(INFRA_BUS_DCM_CTRL,
  146. (reg_read(INFRA_BUS_DCM_CTRL) &
  147. ~(0x1f << 10)) |
  148. (val & 0x1f) << 10);
  149. }
  150. bool dcm_infracfg_ao_dcm_infra_bus_is_on(int on)
  151. {
  152. bool ret = false;
  153. ret &= !!(reg_read(INFRA_BUS_DCM_CTRL) &
  154. ~INFRACFG_AO_DCM_INFRA_BUS_REG0_MASK &
  155. INFRACFG_AO_DCM_INFRA_BUS_REG0_ON);
  156. return ret;
  157. }
  158. void dcm_infracfg_ao_dcm_infra_bus(int on)
  159. {
  160. if (on) {
  161. /* TINFO = "Turn ON DCM 'infracfg_ao_dcm_infra_bus'" */
  162. infracfg_ao_infra_dcm_rg_fsel_set(0x10);
  163. infracfg_ao_infra_dcm_rg_sfsel_set(0x1);
  164. reg_write(INFRA_BUS_DCM_CTRL,
  165. (reg_read(INFRA_BUS_DCM_CTRL) &
  166. ~INFRACFG_AO_DCM_INFRA_BUS_REG0_MASK) |
  167. INFRACFG_AO_DCM_INFRA_BUS_REG0_ON);
  168. } else {
  169. /* TINFO = "Turn OFF DCM 'infracfg_ao_dcm_infra_bus'" */
  170. infracfg_ao_infra_dcm_rg_fsel_set(0x10);
  171. infracfg_ao_infra_dcm_rg_sfsel_set(0x1);
  172. reg_write(INFRA_BUS_DCM_CTRL,
  173. (reg_read(INFRA_BUS_DCM_CTRL) &
  174. ~INFRACFG_AO_DCM_INFRA_BUS_REG0_MASK) |
  175. INFRACFG_AO_DCM_INFRA_BUS_REG0_OFF);
  176. }
  177. }
  178. #define INFRACFG_AO_DCM_PERI_BUS_REG0_MASK ((0x1 << 0) | \
  179. (0x1 << 1) | \
  180. (0x1 << 3) | \
  181. (0x1 << 4) | \
  182. (0x1f << 15) | \
  183. (0x1 << 20) | \
  184. (0x1 << 21) | \
  185. /* (0x1 << 22) | remove PMIC HWDCM setting due to PMIC Wrapper issue */ \
  186. (0x1 << 28) | \
  187. (0x1 << 29) | \
  188. (0x1 << 31))
  189. #define INFRACFG_AO_DCM_PERI_BUS_REG0_ON ((0x1 << 0) | \
  190. (0x1 << 1) | \
  191. (0x0 << 3) | \
  192. (0x0 << 4) | \
  193. (0x1f << 15) | \
  194. (0x1 << 20) | \
  195. (0x1 << 21) | \
  196. /* (0x1 << 22) | remove PMIC HWDCM setting due to PMIC Wrapper issue */ \
  197. (0x1 << 28) | \
  198. (0x1 << 29) | \
  199. (0x1 << 31))
  200. #define INFRACFG_AO_DCM_PERI_BUS_REG0_OFF ((0x0 << 0) | \
  201. (0x0 << 1) | \
  202. (0x0 << 3) | \
  203. (0x0 << 4) | \
  204. (0x0 << 15) | \
  205. (0x0 << 20) | \
  206. (0x0 << 21) | \
  207. /* (0x0 << 22) | remove PMIC HWDCM setting due to PMIC Wrapper issue */ \
  208. (0x0 << 28) | \
  209. (0x0 << 29) | \
  210. (0x0 << 31))
  211. #if 0
  212. static unsigned int infracfg_ao_peri_dcm_rg_fsel_get(void)
  213. {
  214. return (reg_read(PERI_BUS_DCM_CTRL) >> 5) & 0x1f;
  215. }
  216. #endif
  217. #if 0
  218. static unsigned int infracfg_ao_peri_dcm_rg_sfsel_get(void)
  219. {
  220. return (reg_read(PERI_BUS_DCM_CTRL) >> 10) & 0x1f;
  221. }
  222. #endif
  223. #if 0
  224. static unsigned int infracfg_ao_pmic_cnt_mst_rg_sfsel_get(void)
  225. {
  226. return (reg_read(PERI_BUS_DCM_CTRL) >> 23) & 0x1f;
  227. }
  228. #endif
  229. static void infracfg_ao_peri_dcm_rg_fsel_set(unsigned int val)
  230. {
  231. reg_write(PERI_BUS_DCM_CTRL,
  232. (reg_read(PERI_BUS_DCM_CTRL) &
  233. ~(0x1f << 5)) |
  234. (val & 0x1f) << 5);
  235. }
  236. static void infracfg_ao_peri_dcm_rg_sfsel_set(unsigned int val)
  237. {
  238. reg_write(PERI_BUS_DCM_CTRL,
  239. (reg_read(PERI_BUS_DCM_CTRL) &
  240. ~(0x1f << 10)) |
  241. (val & 0x1f) << 10);
  242. }
  243. static void infracfg_ao_pmic_cnt_mst_rg_sfsel_set(unsigned int val)
  244. {
  245. reg_write(PERI_BUS_DCM_CTRL,
  246. (reg_read(PERI_BUS_DCM_CTRL) &
  247. ~(0x1f << 23)) |
  248. (val & 0x1f) << 23);
  249. }
  250. bool dcm_infracfg_ao_dcm_peri_bus_is_on(int on)
  251. {
  252. bool ret = false;
  253. ret &= !!(reg_read(PERI_BUS_DCM_CTRL) &
  254. ~INFRACFG_AO_DCM_PERI_BUS_REG0_MASK &
  255. INFRACFG_AO_DCM_PERI_BUS_REG0_ON);
  256. return ret;
  257. }
  258. void dcm_infracfg_ao_dcm_peri_bus(int on)
  259. {
  260. if (on) {
  261. /* TINFO = "Turn ON DCM 'infracfg_ao_dcm_peri_bus'" */
  262. infracfg_ao_peri_dcm_rg_fsel_set(0x1f);
  263. infracfg_ao_peri_dcm_rg_sfsel_set(0x0);
  264. infracfg_ao_pmic_cnt_mst_rg_sfsel_set(0x0);
  265. reg_write(PERI_BUS_DCM_CTRL,
  266. (reg_read(PERI_BUS_DCM_CTRL) &
  267. ~INFRACFG_AO_DCM_PERI_BUS_REG0_MASK) |
  268. INFRACFG_AO_DCM_PERI_BUS_REG0_ON);
  269. } else {
  270. /* TINFO = "Turn OFF DCM 'infracfg_ao_dcm_peri_bus'" */
  271. infracfg_ao_peri_dcm_rg_fsel_set(0x1f);
  272. infracfg_ao_peri_dcm_rg_sfsel_set(0x1f);
  273. infracfg_ao_pmic_cnt_mst_rg_sfsel_set(0x0);
  274. reg_write(PERI_BUS_DCM_CTRL,
  275. (reg_read(PERI_BUS_DCM_CTRL) &
  276. ~INFRACFG_AO_DCM_PERI_BUS_REG0_MASK) |
  277. INFRACFG_AO_DCM_PERI_BUS_REG0_OFF);
  278. }
  279. }
  280. #define INFRACFG_AO_INFRA_MD_FMEM_REG0_MASK ((0x1 << 28))
  281. #define INFRACFG_AO_INFRA_MD_FMEM_REG0_ON ((0x1 << 28))
  282. #define INFRACFG_AO_INFRA_MD_FMEM_REG0_OFF ((0x0 << 28))
  283. bool dcm_infracfg_ao_infra_md_fmem_is_on(int on)
  284. {
  285. bool ret = false;
  286. ret &= !!(reg_read(INFRA_MISC) &
  287. ~INFRACFG_AO_INFRA_MD_FMEM_REG0_MASK &
  288. INFRACFG_AO_INFRA_MD_FMEM_REG0_ON);
  289. return ret;
  290. }
  291. void dcm_infracfg_ao_infra_md_fmem(int on)
  292. {
  293. if (on) {
  294. /* TINFO = "Turn ON DCM 'infracfg_ao_infra_md_fmem'" */
  295. reg_write(INFRA_MISC,
  296. (reg_read(INFRA_MISC) &
  297. ~INFRACFG_AO_INFRA_MD_FMEM_REG0_MASK) |
  298. INFRACFG_AO_INFRA_MD_FMEM_REG0_ON);
  299. } else {
  300. /* TINFO = "Turn OFF DCM 'infracfg_ao_infra_md_fmem'" */
  301. reg_write(INFRA_MISC,
  302. (reg_read(INFRA_MISC) &
  303. ~INFRACFG_AO_INFRA_MD_FMEM_REG0_MASK) |
  304. INFRACFG_AO_INFRA_MD_FMEM_REG0_OFF);
  305. }
  306. }
  307. #define INFRACFG_AO_P2P_RXCLK_CTRL_REG0_MASK ((0xf << 0))
  308. #define INFRACFG_AO_P2P_RXCLK_CTRL_REG0_ON ((0x0 << 0))
  309. #define INFRACFG_AO_P2P_RXCLK_CTRL_REG0_OFF ((0x0 << 0))
  310. bool dcm_infracfg_ao_p2p_rxclk_ctrl_is_on(int on)
  311. {
  312. bool ret = false;
  313. ret &= !!(reg_read(P2P_RX_CLK_ON) &
  314. ~INFRACFG_AO_P2P_RXCLK_CTRL_REG0_MASK &
  315. INFRACFG_AO_P2P_RXCLK_CTRL_REG0_ON);
  316. return ret;
  317. }
  318. void dcm_infracfg_ao_p2p_rxclk_ctrl(int on)
  319. {
  320. if (on) {
  321. /* TINFO = "Turn ON DCM 'infracfg_ao_p2p_rxclk_ctrl'" */
  322. reg_write(P2P_RX_CLK_ON,
  323. (reg_read(P2P_RX_CLK_ON) &
  324. ~INFRACFG_AO_P2P_RXCLK_CTRL_REG0_MASK) |
  325. INFRACFG_AO_P2P_RXCLK_CTRL_REG0_ON);
  326. } else {
  327. /* TINFO = "Turn OFF DCM 'infracfg_ao_p2p_rxclk_ctrl'" */
  328. reg_write(P2P_RX_CLK_ON,
  329. (reg_read(P2P_RX_CLK_ON) &
  330. ~INFRACFG_AO_P2P_RXCLK_CTRL_REG0_MASK) |
  331. INFRACFG_AO_P2P_RXCLK_CTRL_REG0_OFF);
  332. }
  333. }
  334. /*******************************************************************************************
  335. * Software workaround for INFRA_TOPCKGEN_DCMCTL register bit 18 17 16 shifting
  336. * Root cause : HW RTL register read value 18 17 16 bit wrong match to 17 16 15
  337. * This workaround is for left shift 1 for bit (15, 16, 17) after read register(0x10001010)
  338. *******************************************************************************************/
  339. #if 0
  340. #define INFRA_TOPCKGEN_DCMCTL_SW_WORKAROUND_MASK ((0x1 << 15) | \
  341. (0x1 << 16) | \
  342. (0x1 << 17))
  343. #define INFRA_TOPCKGEN_DCMCTL_SW_WORKAROUND(reg) ((reg & ~INFRA_TOPCKGEN_DCMCTL_SW_WORKAROUND_MASK) | \
  344. (reg & INFRA_TOPCKGEN_DCMCTL_SW_WORKAROUND_MASK) << 1)
  345. #endif
  346. /******************************************************************************/
  347. #define INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE1_MASK ((0x1 << 3))
  348. #define INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE1_ON ((0x1 << 3))
  349. #define INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE1_OFF ((0x0 << 3))
  350. bool dcm_infracfg_ao_mcu_armpll_bus_is_on(int on)
  351. {
  352. bool ret = false;
  353. ret &= !!(reg_read(INFRA_TOPCKGEN_DCMCTL) &
  354. ~INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE1_MASK &
  355. INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE1_ON);
  356. return ret;
  357. }
  358. void dcm_infracfg_ao_mcu_armpll_bus_mode1(int on)
  359. {
  360. if (on) {
  361. /* TINFO = "Turn ON DCM 'infracfg_ao_mcu_armpll_bus'" */
  362. reg_write(INFRA_TOPCKGEN_DCMCTL,
  363. (reg_read(INFRA_TOPCKGEN_DCMCTL) &
  364. ~INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE1_MASK) |
  365. INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE1_ON);
  366. } else {
  367. /* TINFO = "Turn OFF DCM 'infracfg_ao_mcu_armpll_bus'" */
  368. reg_write(INFRA_TOPCKGEN_DCMCTL,
  369. (reg_read(INFRA_TOPCKGEN_DCMCTL) &
  370. ~INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE1_MASK) |
  371. INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE1_OFF);
  372. }
  373. }
  374. #define INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE2_MASK ((0x1 << 3) | \
  375. (0x1 << 14) | \
  376. (0x1 << 18))
  377. #define INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE2_ON ((0x1 << 3) | \
  378. (0x1 << 14) | \
  379. (0x1 << 18))
  380. #define INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE2_OFF ((0x0 << 3) | \
  381. (0x0 << 14) | \
  382. (0x0 << 18))
  383. void dcm_infracfg_ao_mcu_armpll_bus_mode2(int on)
  384. {
  385. if (on) {
  386. /* TINFO = "Turn ON DCM 'infracfg_ao_mcu_armpll_bus'" */
  387. reg_write(INFRA_TOPCKGEN_DCMCTL,
  388. (reg_read(INFRA_TOPCKGEN_DCMCTL) &
  389. ~INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE2_MASK) |
  390. INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE2_ON);
  391. #if 0
  392. reg_write(INFRA_TOPCKGEN_DCMCTL,
  393. (INFRA_TOPCKGEN_DCMCTL_SW_WORKAROUND(reg_read(INFRA_TOPCKGEN_DCMCTL)) &
  394. ~INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE2_MASK) |
  395. INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE2_ON);
  396. #endif
  397. } else {
  398. /* TINFO = "Turn OFF DCM 'infracfg_ao_mcu_armpll_bus'" */
  399. reg_write(INFRA_TOPCKGEN_DCMCTL,
  400. (reg_read(INFRA_TOPCKGEN_DCMCTL) &
  401. ~INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE2_MASK) |
  402. INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE2_OFF);
  403. #if 0
  404. reg_write(INFRA_TOPCKGEN_DCMCTL,
  405. (INFRA_TOPCKGEN_DCMCTL_SW_WORKAROUND(reg_read(INFRA_TOPCKGEN_DCMCTL)) &
  406. ~INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE2_MASK) |
  407. INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE2_OFF);
  408. #endif
  409. }
  410. }
  411. #define INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE1_MASK ((0x1 << 1))
  412. #define INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE1_ON ((0x1 << 1))
  413. #define INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE1_OFF ((0x0 << 1))
  414. bool dcm_infracfg_ao_mcu_armpll_ca7l_is_on(int on)
  415. {
  416. bool ret = false;
  417. ret &= !!(reg_read(INFRA_TOPCKGEN_DCMCTL) &
  418. ~INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE1_MASK &
  419. INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE1_ON);
  420. return ret;
  421. }
  422. void dcm_infracfg_ao_mcu_armpll_ca7l_mode1(int on)
  423. {
  424. if (on) {
  425. /* TINFO = "Turn ON DCM 'infracfg_ao_mcu_armpll_ca7l'" */
  426. reg_write(INFRA_TOPCKGEN_DCMCTL,
  427. (reg_read(INFRA_TOPCKGEN_DCMCTL) &
  428. ~INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE1_MASK) |
  429. INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE1_ON);
  430. } else {
  431. /* TINFO = "Turn OFF DCM 'infracfg_ao_mcu_armpll_ca7l'" */
  432. reg_write(INFRA_TOPCKGEN_DCMCTL,
  433. (reg_read(INFRA_TOPCKGEN_DCMCTL) &
  434. ~INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE1_MASK) |
  435. INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE1_OFF);
  436. }
  437. }
  438. #define INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE2_MASK ((0x1 << 1) | \
  439. (0x1 << 12) | \
  440. (0x1 << 16))
  441. #define INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE2_ON ((0x1 << 1) | \
  442. (0x1 << 12) | \
  443. (0x1 << 16))
  444. #define INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE2_OFF ((0x0 << 1) | \
  445. (0x0 << 12) | \
  446. (0x0 << 16))
  447. void dcm_infracfg_ao_mcu_armpll_ca7l_mode2(int on)
  448. {
  449. if (on) {
  450. /* TINFO = "Turn ON DCM 'infracfg_ao_mcu_armpll_ca7l'" */
  451. reg_write(INFRA_TOPCKGEN_DCMCTL,
  452. (reg_read(INFRA_TOPCKGEN_DCMCTL) &
  453. ~INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE2_MASK) |
  454. INFRACFG_AO_MCU_ARMPLL_BUS_REG0_MODE2_ON);
  455. #if 0
  456. reg_write(INFRA_TOPCKGEN_DCMCTL,
  457. (INFRA_TOPCKGEN_DCMCTL_SW_WORKAROUND(reg_read(INFRA_TOPCKGEN_DCMCTL)) &
  458. ~INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE2_MASK) |
  459. INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE2_ON);
  460. #endif
  461. } else {
  462. /* TINFO = "Turn OFF DCM 'infracfg_ao_mcu_armpll_ca7l'" */
  463. reg_write(INFRA_TOPCKGEN_DCMCTL,
  464. (reg_read(INFRA_TOPCKGEN_DCMCTL) &
  465. ~INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE2_MASK) |
  466. INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE2_OFF);
  467. #if 0
  468. reg_write(INFRA_TOPCKGEN_DCMCTL,
  469. (INFRA_TOPCKGEN_DCMCTL_SW_WORKAROUND(reg_read(INFRA_TOPCKGEN_DCMCTL)) &
  470. ~INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE2_MASK) |
  471. INFRACFG_AO_MCU_ARMPLL_CA7L_REG0_MODE2_OFF);
  472. #endif
  473. }
  474. }
  475. #define INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE1_MASK ((0x1 << 2))
  476. #define INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE1_ON ((0x1 << 2))
  477. #define INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE1_OFF ((0x0 << 2))
  478. bool dcm_infracfg_ao_mcu_armpll_ca7ll_is_on(int on)
  479. {
  480. bool ret = false;
  481. ret &= !!(reg_read(INFRA_TOPCKGEN_DCMCTL) &
  482. ~INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE1_MASK &
  483. INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE1_ON);
  484. return ret;
  485. }
  486. void dcm_infracfg_ao_mcu_armpll_ca7ll_mode1(int on)
  487. {
  488. if (on) {
  489. /* TINFO = "Turn ON DCM 'infracfg_ao_mcu_armpll_ca7ll'" */
  490. reg_write(INFRA_TOPCKGEN_DCMCTL,
  491. (reg_read(INFRA_TOPCKGEN_DCMCTL) &
  492. ~INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE1_MASK) |
  493. INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE1_ON);
  494. } else {
  495. /* TINFO = "Turn OFF DCM 'infracfg_ao_mcu_armpll_ca7ll'" */
  496. reg_write(INFRA_TOPCKGEN_DCMCTL,
  497. (reg_read(INFRA_TOPCKGEN_DCMCTL) &
  498. ~INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE1_MASK) |
  499. INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE1_OFF);
  500. }
  501. }
  502. #define INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE2_MASK ((0x1 << 2) | \
  503. (0x1 << 13) | \
  504. (0x1 << 17))
  505. #define INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE2_ON ((0x1 << 2) | \
  506. (0x1 << 13) | \
  507. (0x1 << 17))
  508. #define INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE2_OFF ((0x0 << 2) | \
  509. (0x0 << 13) | \
  510. (0x0 << 17))
  511. void dcm_infracfg_ao_mcu_armpll_ca7ll_mode2(int on)
  512. {
  513. if (on) {
  514. /* TINFO = "Turn ON DCM 'infracfg_ao_mcu_armpll_ca7ll'" */
  515. reg_write(INFRA_TOPCKGEN_DCMCTL,
  516. (reg_read(INFRA_TOPCKGEN_DCMCTL) &
  517. ~INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE2_MASK) |
  518. INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE2_ON);
  519. #if 0
  520. reg_write(INFRA_TOPCKGEN_DCMCTL,
  521. (INFRA_TOPCKGEN_DCMCTL_SW_WORKAROUND(reg_read(INFRA_TOPCKGEN_DCMCTL)) &
  522. ~INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE2_MASK) |
  523. INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE2_ON);
  524. #endif
  525. } else {
  526. /* TINFO = "Turn OFF DCM 'infracfg_ao_mcu_armpll_ca7ll'" */
  527. reg_write(INFRA_TOPCKGEN_DCMCTL,
  528. (reg_read(INFRA_TOPCKGEN_DCMCTL) &
  529. ~INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE2_MASK) |
  530. INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE2_OFF);
  531. #if 0
  532. reg_write(INFRA_TOPCKGEN_DCMCTL,
  533. (INFRA_TOPCKGEN_DCMCTL_SW_WORKAROUND(reg_read(INFRA_TOPCKGEN_DCMCTL)) &
  534. ~INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE2_MASK) |
  535. INFRACFG_AO_MCU_ARMPLL_CA7LL_REG0_MODE2_OFF);
  536. #endif
  537. }
  538. }
  539. #define MCSI_A_REG0_MASK ((0xffff << 16))
  540. #define MCSI_A_REG0_ON ((0xffff << 16))
  541. #define MCSI_A_REG0_OFF ((0x0 << 16))
  542. bool dcm_mcsi_a_is_on(int on)
  543. {
  544. bool ret = false;
  545. ret &= !!(MCSI_A_SMC_READ(MCSI_A_DCM) &
  546. ~MCSI_A_REG0_MASK &
  547. MCSI_A_REG0_ON);
  548. return ret;
  549. }
  550. void dcm_mcsi_a(int on)
  551. {
  552. if (on) {
  553. /* TINFO = "Turn ON DCM 'dcm_mcsi_a'" */
  554. MCSI_A_SMC_WRITE(MCSI_A_DCM,
  555. (MCSI_A_SMC_READ(MCSI_A_DCM) &
  556. ~MCSI_A_REG0_MASK) |
  557. MCSI_A_REG0_ON);
  558. } else {
  559. /* TINFO = "Turn OFF DCM 'dcm_mcsi_a'" */
  560. MCSI_A_SMC_WRITE(MCSI_A_DCM,
  561. (MCSI_A_SMC_READ(MCSI_A_DCM) &
  562. ~MCSI_A_REG0_MASK) |
  563. MCSI_A_REG0_OFF);
  564. }
  565. }
  566. #define MP0_CPUCFG_DCM_MCU_BUS_REG0_MASK ((0xf << 0))
  567. #define MP0_CPUCFG_DCM_MCU_BUS_REG0_ON ((0x0 << 0))
  568. #define MP0_CPUCFG_DCM_MCU_BUS_REG0_OFF ((0xf << 0))
  569. bool dcm_mp0_cpucfg_dcm_mcu_bus_is_on(int on)
  570. {
  571. bool ret = false;
  572. ret &= !!(reg_read(MP0_DBG_PWR_CTRL) &
  573. ~MP0_CPUCFG_DCM_MCU_BUS_REG0_MASK &
  574. MP0_CPUCFG_DCM_MCU_BUS_REG0_ON);
  575. return ret;
  576. }
  577. void dcm_mp0_cpucfg_dcm_mcu_bus(int on)
  578. {
  579. if (on) {
  580. /* TINFO = "Turn ON DCM 'mp0_cpucfg_dcm_mcu_bus'" */
  581. reg_write(MP0_DBG_PWR_CTRL,
  582. (reg_read(MP0_DBG_PWR_CTRL) &
  583. ~MP0_CPUCFG_DCM_MCU_BUS_REG0_MASK) |
  584. MP0_CPUCFG_DCM_MCU_BUS_REG0_ON);
  585. } else {
  586. /* TINFO = "Turn OFF DCM 'mp0_cpucfg_dcm_mcu_bus'" */
  587. reg_write(MP0_DBG_PWR_CTRL,
  588. (reg_read(MP0_DBG_PWR_CTRL) &
  589. ~MP0_CPUCFG_DCM_MCU_BUS_REG0_MASK) |
  590. MP0_CPUCFG_DCM_MCU_BUS_REG0_OFF);
  591. }
  592. }
  593. #define MP1_CPUCFG_DCM_MCU_BUS_REG0_MASK ((0xf << 0))
  594. #define MP1_CPUCFG_DCM_MCU_BUS_REG0_ON ((0x0 << 0))
  595. #define MP1_CPUCFG_DCM_MCU_BUS_REG0_OFF ((0xf << 0))
  596. bool dcm_mp1_cpucfg_dcm_mcu_bus_is_on(int on)
  597. {
  598. bool ret = false;
  599. ret &= !!(reg_read(MP1_DBG_PWR_CTRL) &
  600. ~MP1_CPUCFG_DCM_MCU_BUS_REG0_MASK &
  601. MP1_CPUCFG_DCM_MCU_BUS_REG0_ON);
  602. return ret;
  603. }
  604. void dcm_mp1_cpucfg_dcm_mcu_bus(int on)
  605. {
  606. if (on) {
  607. /* TINFO = "Turn ON DCM 'mp1_cpucfg_dcm_mcu_bus'" */
  608. reg_write(MP1_DBG_PWR_CTRL,
  609. (reg_read(MP1_DBG_PWR_CTRL) &
  610. ~MP1_CPUCFG_DCM_MCU_BUS_REG0_MASK) |
  611. MP1_CPUCFG_DCM_MCU_BUS_REG0_ON);
  612. } else {
  613. /* TINFO = "Turn OFF DCM 'mp1_cpucfg_dcm_mcu_bus'" */
  614. reg_write(MP1_DBG_PWR_CTRL,
  615. (reg_read(MP1_DBG_PWR_CTRL) &
  616. ~MP1_CPUCFG_DCM_MCU_BUS_REG0_MASK) |
  617. MP1_CPUCFG_DCM_MCU_BUS_REG0_OFF);
  618. }
  619. }
  620. #define MCU_MISCCFG_MP0_LAST_CORE_DCM_REG0_MASK ((0x1 << 31))
  621. #define MCU_MISCCFG_MP0_LAST_CORE_DCM_REG0_ON ((0x1 << 31))
  622. #define MCU_MISCCFG_MP0_LAST_CORE_DCM_REG0_OFF ((0x0 << 31))
  623. bool dcm_mcu_misccfg_mp0_last_core_dcm_is_on(int on)
  624. {
  625. bool ret = false;
  626. ret &= !!(reg_read(MP0_LAST_CORE_DCM) &
  627. ~MCU_MISCCFG_MP0_LAST_CORE_DCM_REG0_MASK &
  628. MCU_MISCCFG_MP0_LAST_CORE_DCM_REG0_ON);
  629. return ret;
  630. }
  631. void dcm_mcu_misccfg_mp0_last_core_dcm(int on)
  632. {
  633. if (on) {
  634. /* TINFO = "Enable last core idle mp0 armpll divider" */
  635. reg_write(MP0_LAST_CORE_DCM,
  636. (reg_read(MP0_LAST_CORE_DCM) &
  637. ~MCU_MISCCFG_MP0_LAST_CORE_DCM_REG0_MASK) |
  638. MCU_MISCCFG_MP0_LAST_CORE_DCM_REG0_ON);
  639. } else {
  640. /* TINFO = "Disable last core idle mp0 armpll divider" */
  641. reg_write(MP0_LAST_CORE_DCM,
  642. (reg_read(MP0_LAST_CORE_DCM) &
  643. ~MCU_MISCCFG_MP0_LAST_CORE_DCM_REG0_MASK) |
  644. MCU_MISCCFG_MP0_LAST_CORE_DCM_REG0_OFF);
  645. }
  646. }
  647. #define MCU_MISCCFG_MP1_LAST_CORE_DCM_REG0_MASK ((0x1 << 31))
  648. #define MCU_MISCCFG_MP1_LAST_CORE_DCM_REG0_ON ((0x1 << 31))
  649. #define MCU_MISCCFG_MP1_LAST_CORE_DCM_REG0_OFF ((0x0 << 31))
  650. bool dcm_mcu_misccfg_mp1_last_core_dcm_is_on(int on)
  651. {
  652. bool ret = false;
  653. ret &= !!(reg_read(MP1_LAST_CORE_DCM) &
  654. ~MCU_MISCCFG_MP1_LAST_CORE_DCM_REG0_MASK &
  655. MCU_MISCCFG_MP1_LAST_CORE_DCM_REG0_ON);
  656. return ret;
  657. }
  658. void dcm_mcu_misccfg_mp1_last_core_dcm(int on)
  659. {
  660. if (on) {
  661. /* TINFO = "Enable last core idle mp1 armpll divider" */
  662. reg_write(MP1_LAST_CORE_DCM,
  663. (reg_read(MP1_LAST_CORE_DCM) &
  664. ~MCU_MISCCFG_MP1_LAST_CORE_DCM_REG0_MASK) |
  665. MCU_MISCCFG_MP1_LAST_CORE_DCM_REG0_ON);
  666. } else {
  667. /* TINFO = "Disable last core idle mp1 armpll divider" */
  668. reg_write(MP1_LAST_CORE_DCM,
  669. (reg_read(MP1_LAST_CORE_DCM) &
  670. ~MCU_MISCCFG_MP1_LAST_CORE_DCM_REG0_MASK) |
  671. MCU_MISCCFG_MP1_LAST_CORE_DCM_REG0_OFF);
  672. }
  673. }
  674. #define MCU_MISCCFG_CCI_SYNC_DCM_REG0_MASK ((0x1 << 0))
  675. #define MCU_MISCCFG_CCI_SYNC_DCM_REG0_ON ((0x1 << 0))
  676. #define MCU_MISCCFG_CCI_SYNC_DCM_REG0_OFF ((0x0 << 0))
  677. bool dcm_mcu_misccfg_cci_sync_dcm_is_on(int on)
  678. {
  679. bool ret = false;
  680. ret &= !!(reg_read(SYNC_DCM_CONFIG) &
  681. ~MCU_MISCCFG_CCI_SYNC_DCM_REG0_MASK &
  682. MCU_MISCCFG_CCI_SYNC_DCM_REG0_ON);
  683. return ret;
  684. }
  685. void dcm_mcu_misccfg_cci_sync_dcm(int on)
  686. {
  687. if (on) {
  688. /* TINFO = "Turn ON DCM 'mcu_misccfg_cci_sync_dcm'" */
  689. reg_write(SYNC_DCM_CONFIG,
  690. (reg_read(SYNC_DCM_CONFIG) &
  691. ~MCU_MISCCFG_CCI_SYNC_DCM_REG0_MASK) |
  692. MCU_MISCCFG_CCI_SYNC_DCM_REG0_ON);
  693. } else {
  694. /* TINFO = "Turn OFF DCM 'mcu_misccfg_cci_sync_dcm'" */
  695. reg_write(SYNC_DCM_CONFIG,
  696. (reg_read(SYNC_DCM_CONFIG) &
  697. ~MCU_MISCCFG_CCI_SYNC_DCM_REG0_MASK) |
  698. MCU_MISCCFG_CCI_SYNC_DCM_REG0_OFF);
  699. }
  700. }
  701. #define MCU_MISCCFG_MP0_SYNC_DCM_REG0_MASK ((0x1 << 8))
  702. #define MCU_MISCCFG_MP0_SYNC_DCM_REG0_ON ((0x1 << 8))
  703. #define MCU_MISCCFG_MP0_SYNC_DCM_REG0_OFF ((0x0 << 8))
  704. bool dcm_mcu_misccfg_mp0_sync_dcm_is_on(int on)
  705. {
  706. bool ret = false;
  707. ret &= !!(reg_read(SYNC_DCM_CONFIG) &
  708. ~MCU_MISCCFG_MP0_SYNC_DCM_REG0_MASK &
  709. MCU_MISCCFG_MP0_SYNC_DCM_REG0_ON);
  710. return ret;
  711. }
  712. void dcm_mcu_misccfg_mp0_sync_dcm(int on)
  713. {
  714. if (on) {
  715. /* TINFO = "Turn ON DCM 'mcu_misccfg_mp0_sync_dcm'" */
  716. reg_write(SYNC_DCM_CONFIG,
  717. (reg_read(SYNC_DCM_CONFIG) &
  718. ~MCU_MISCCFG_MP0_SYNC_DCM_REG0_MASK) |
  719. MCU_MISCCFG_MP0_SYNC_DCM_REG0_ON);
  720. } else {
  721. /* TINFO = "Turn OFF DCM 'mcu_misccfg_mp0_sync_dcm'" */
  722. reg_write(SYNC_DCM_CONFIG,
  723. (reg_read(SYNC_DCM_CONFIG) &
  724. ~MCU_MISCCFG_MP0_SYNC_DCM_REG0_MASK) |
  725. MCU_MISCCFG_MP0_SYNC_DCM_REG0_OFF);
  726. }
  727. }
  728. #define MCU_MISCCFG_MP0_STALL_DCM_REG0_MASK ((0x1 << 7))
  729. #define MCU_MISCCFG_MP0_STALL_DCM_REG0_ON ((0x1 << 7))
  730. #define MCU_MISCCFG_MP0_STALL_DCM_REG0_OFF ((0x0 << 7))
  731. bool dcm_mcu_misccfg_mp0_stall_dcm_is_on(int on)
  732. {
  733. bool ret = false;
  734. ret &= !!(reg_read(SYNC_DCM_CLUSTER_CONFIG) &
  735. ~MCU_MISCCFG_MP0_STALL_DCM_REG0_MASK &
  736. MCU_MISCCFG_MP0_STALL_DCM_REG0_ON);
  737. return ret;
  738. }
  739. void dcm_mcu_misccfg_mp0_stall_dcm(int on)
  740. {
  741. if (on) {
  742. /* TINFO = "Turn ON DCM 'mcu_misccfg_mp0_stall_dcm'" */
  743. reg_write(SYNC_DCM_CLUSTER_CONFIG,
  744. (reg_read(SYNC_DCM_CLUSTER_CONFIG) &
  745. ~MCU_MISCCFG_MP0_STALL_DCM_REG0_MASK) |
  746. MCU_MISCCFG_MP0_STALL_DCM_REG0_ON);
  747. } else {
  748. /* TINFO = "Turn OFF DCM 'mcu_misccfg_mp0_stall_dcm'" */
  749. reg_write(SYNC_DCM_CLUSTER_CONFIG,
  750. (reg_read(SYNC_DCM_CLUSTER_CONFIG) &
  751. ~MCU_MISCCFG_MP0_STALL_DCM_REG0_MASK) |
  752. MCU_MISCCFG_MP0_STALL_DCM_REG0_OFF);
  753. }
  754. }
  755. #define MCU_MISCCFG_MP1_SYNC_DCM_REG0_MASK ((0x1 << 16))
  756. #define MCU_MISCCFG_MP1_SYNC_DCM_REG0_ON ((0x1 << 16))
  757. #define MCU_MISCCFG_MP1_SYNC_DCM_REG0_OFF ((0x0 << 16))
  758. bool dcm_mcu_misccfg_mp1_sync_dcm_is_on(int on)
  759. {
  760. bool ret = false;
  761. ret &= !!(reg_read(SYNC_DCM_CONFIG) &
  762. ~MCU_MISCCFG_MP1_SYNC_DCM_REG0_MASK &
  763. MCU_MISCCFG_MP1_SYNC_DCM_REG0_ON);
  764. return ret;
  765. }
  766. void dcm_mcu_misccfg_mp1_sync_dcm(int on)
  767. {
  768. if (on) {
  769. /* TINFO = "Turn ON DCM 'mcu_misccfg_mp1_sync_dcm'" */
  770. reg_write(SYNC_DCM_CONFIG,
  771. (reg_read(SYNC_DCM_CONFIG) &
  772. ~MCU_MISCCFG_MP1_SYNC_DCM_REG0_MASK) |
  773. MCU_MISCCFG_MP1_SYNC_DCM_REG0_ON);
  774. } else {
  775. /* TINFO = "Turn OFF DCM 'mcu_misccfg_mp1_sync_dcm'" */
  776. reg_write(SYNC_DCM_CONFIG,
  777. (reg_read(SYNC_DCM_CONFIG) &
  778. ~MCU_MISCCFG_MP1_SYNC_DCM_REG0_MASK) |
  779. MCU_MISCCFG_MP1_SYNC_DCM_REG0_OFF);
  780. }
  781. }
  782. #define MCU_MISCCFG_MP1_STALL_DCM_REG0_MASK ((0x1 << 15))
  783. #define MCU_MISCCFG_MP1_STALL_DCM_REG0_ON ((0x1 << 15))
  784. #define MCU_MISCCFG_MP1_STALL_DCM_REG0_OFF ((0x0 << 15))
  785. bool dcm_mcu_misccfg_mp1_stall_dcm_is_on(int on)
  786. {
  787. bool ret = false;
  788. ret &= !!(reg_read(SYNC_DCM_CLUSTER_CONFIG) &
  789. ~MCU_MISCCFG_MP1_STALL_DCM_REG0_MASK &
  790. MCU_MISCCFG_MP1_STALL_DCM_REG0_ON);
  791. return ret;
  792. }
  793. void dcm_mcu_misccfg_mp1_stall_dcm(int on)
  794. {
  795. if (on) {
  796. /* TINFO = "Turn ON DCM 'mcu_misccfg_mp1_stall_dcm'" */
  797. reg_write(SYNC_DCM_CLUSTER_CONFIG,
  798. (reg_read(SYNC_DCM_CLUSTER_CONFIG) &
  799. ~MCU_MISCCFG_MP1_STALL_DCM_REG0_MASK) |
  800. MCU_MISCCFG_MP1_STALL_DCM_REG0_ON);
  801. } else {
  802. /* TINFO = "Turn OFF DCM 'mcu_misccfg_mp1_stall_dcm'" */
  803. reg_write(SYNC_DCM_CLUSTER_CONFIG,
  804. (reg_read(SYNC_DCM_CLUSTER_CONFIG) &
  805. ~MCU_MISCCFG_MP1_STALL_DCM_REG0_MASK) |
  806. MCU_MISCCFG_MP1_STALL_DCM_REG0_OFF);
  807. }
  808. }
  809. #define MCU_MISCCFG_MP0_RGU_DCM_REG0_MASK ((0x1 << 0))
  810. #define MCU_MISCCFG_MP0_RGU_DCM_REG0_ON ((0x1 << 0))
  811. #define MCU_MISCCFG_MP0_RGU_DCM_REG0_OFF ((0x0 << 0))
  812. bool dcm_mcu_misccfg_mp0_rgu_dcm_is_on(int on)
  813. {
  814. bool ret = false;
  815. ret &= !!(reg_read(MP0_RGU_DCM_CONFIG) &
  816. ~MCU_MISCCFG_MP0_RGU_DCM_REG0_MASK &
  817. MCU_MISCCFG_MP0_RGU_DCM_REG0_ON);
  818. return ret;
  819. }
  820. void dcm_mcu_misccfg_mp0_rgu_dcm(int on)
  821. {
  822. if (on) {
  823. /* TINFO = "Turn ON MP0 RGU DCM 'rg_cpusys_rgu_dcm_config'" */
  824. reg_write(MP0_RGU_DCM_CONFIG,
  825. (reg_read(MP0_RGU_DCM_CONFIG) &
  826. ~MCU_MISCCFG_MP0_RGU_DCM_REG0_MASK) |
  827. MCU_MISCCFG_MP0_RGU_DCM_REG0_ON);
  828. } else {
  829. /* TINFO = "Turn OFF MP0 RGU DCM 'rg_cpusys_rgu_dcm_config'" */
  830. reg_write(MP0_RGU_DCM_CONFIG,
  831. (reg_read(MP0_RGU_DCM_CONFIG) &
  832. ~MCU_MISCCFG_MP0_RGU_DCM_REG0_MASK) |
  833. MCU_MISCCFG_MP0_RGU_DCM_REG0_OFF);
  834. }
  835. }
  836. #define MCU_MISCCFG_MP1_RGU_DCM_REG0_MASK ((0x1 << 0))
  837. #define MCU_MISCCFG_MP1_RGU_DCM_REG0_ON ((0x1 << 0))
  838. #define MCU_MISCCFG_MP1_RGU_DCM_REG0_OFF ((0x0 << 0))
  839. bool dcm_mcu_misccfg_mp1_rgu_dcm_is_on(int on)
  840. {
  841. bool ret = false;
  842. ret &= !!(reg_read(MP1_RGU_DCM_CONFIG) &
  843. ~MCU_MISCCFG_MP1_RGU_DCM_REG0_MASK &
  844. MCU_MISCCFG_MP1_RGU_DCM_REG0_ON);
  845. return ret;
  846. }
  847. void dcm_mcu_misccfg_mp1_rgu_dcm(int on)
  848. {
  849. if (on) {
  850. /* TINFO = "Turn ON MP1 RGU DCM 'rg_cpusys_rgu_dcm_config'" */
  851. reg_write(MP1_RGU_DCM_CONFIG,
  852. (reg_read(MP1_RGU_DCM_CONFIG) &
  853. ~MCU_MISCCFG_MP1_RGU_DCM_REG0_MASK) |
  854. MCU_MISCCFG_MP1_RGU_DCM_REG0_ON);
  855. } else {
  856. /* TINFO = "Turn OFF MP1 RGU DCM 'rg_cpusys_rgu_dcm_config'" */
  857. reg_write(MP1_RGU_DCM_CONFIG,
  858. (reg_read(MP1_RGU_DCM_CONFIG) &
  859. ~MCU_MISCCFG_MP1_RGU_DCM_REG0_MASK) |
  860. MCU_MISCCFG_MP1_RGU_DCM_REG0_OFF);
  861. }
  862. }
  863. #define MCU_MISCCFG_STALL_DCM_ENHANCE_REG0_MASK ((0x79F << 17))
  864. #define MCU_MISCCFG_STALL_DCM_ENHANCE_REG0_ON ((0x31F << 17))
  865. #define MCU_MISCCFG_STALL_DCM_ENHANCE_REG0_OFF ((0x0 << 17))
  866. bool dcm_mcu_misccfg_stall_dcm_enhance_is_on(int on)
  867. {
  868. bool ret = false;
  869. ret &= !!(reg_read(SYNC_DCM_CLUSTER_CONFIG) &
  870. ~MCU_MISCCFG_STALL_DCM_ENHANCE_REG0_MASK &
  871. MCU_MISCCFG_STALL_DCM_ENHANCE_REG0_ON);
  872. return ret;
  873. }
  874. void dcm_mcu_misccfg_stall_dcm_enhance(int on)
  875. {
  876. if (on) {
  877. /* TINFO = "Turn ON STALL DCM ENHANCE" */
  878. reg_write(SYNC_DCM_CLUSTER_CONFIG,
  879. (reg_read(SYNC_DCM_CLUSTER_CONFIG) &
  880. ~MCU_MISCCFG_STALL_DCM_ENHANCE_REG0_MASK) |
  881. MCU_MISCCFG_STALL_DCM_ENHANCE_REG0_ON);
  882. } else {
  883. /* TINFO = "Turn OFF STALL DCM ENHANCE" */
  884. reg_write(SYNC_DCM_CLUSTER_CONFIG,
  885. (reg_read(SYNC_DCM_CLUSTER_CONFIG) &
  886. ~MCU_MISCCFG_STALL_DCM_ENHANCE_REG0_MASK) |
  887. MCU_MISCCFG_STALL_DCM_ENHANCE_REG0_OFF);
  888. }
  889. }
  890. #define MCU_MISCCFG_GIC_SYNC_DCM_REG0_MASK ((0x3 << 0))
  891. #define MCU_MISCCFG_GIC_SYNC_DCM_REG0_ON ((0x3 << 0))
  892. #define MCU_MISCCFG_GIC_SYNC_DCM_REG0_OFF ((0x0 << 0))
  893. bool dcm_mcu_misccfg_gic_sync_dcm_is_on(int on)
  894. {
  895. bool ret = false;
  896. ret &= !!(reg_read(GIC_SYNC_DCM_CFG) &
  897. ~MCU_MISCCFG_GIC_SYNC_DCM_REG0_MASK &
  898. MCU_MISCCFG_GIC_SYNC_DCM_REG0_ON);
  899. return ret;
  900. }
  901. void dcm_mcu_misccfg_gic_sync_dcm(int on)
  902. {
  903. if (on) {
  904. /* TINFO = "Turn ON GIC SYNC DCM" */
  905. reg_write(GIC_SYNC_DCM_CFG,
  906. (reg_read(GIC_SYNC_DCM_CFG) &
  907. ~MCU_MISCCFG_GIC_SYNC_DCM_REG0_MASK) |
  908. MCU_MISCCFG_GIC_SYNC_DCM_REG0_ON);
  909. } else {
  910. /* TINFO = "Turn OFF GIC SYNC DCM" */
  911. reg_write(GIC_SYNC_DCM_CFG,
  912. (reg_read(GIC_SYNC_DCM_CFG) &
  913. ~MCU_MISCCFG_GIC_SYNC_DCM_REG0_MASK) |
  914. MCU_MISCCFG_GIC_SYNC_DCM_REG0_OFF);
  915. }
  916. }
  917. #define MCU_MISCCFG_DCM_MCU_BUS_REG0_MASK ((0x1 << 0))
  918. #define MCU_MISCCFG_DCM_MCU_BUS_REG1_MASK ((0x1 << 8))
  919. #define MCU_MISCCFG_DCM_MCU_BUS_REG2_MASK ((0x1 << 0) | \
  920. (0x1 << 1) | \
  921. (0x1 << 2) | \
  922. (0x1 << 3) | \
  923. (0x1 << 4) | \
  924. (0x1 << 5) | \
  925. (0x1 << 6) | \
  926. (0x1 << 7) | \
  927. (0x1 << 8) | \
  928. (0x1 << 9) | \
  929. (0x1 << 10) | \
  930. (0x1 << 11) | \
  931. (0x1 << 12) | \
  932. (0x1 << 16) | \
  933. (0x1 << 17) | \
  934. (0x1 << 18) | \
  935. (0x1 << 19) | \
  936. (0x1 << 20) | \
  937. (0x1 << 21) | \
  938. (0x1 << 22) | \
  939. (0x1 << 23))
  940. #define MCU_MISCCFG_DCM_MCU_BUS_REG3_MASK ((0x1 << 0) | \
  941. (0x1 << 1) | \
  942. (0x1 << 2) | \
  943. (0x1 << 3) | \
  944. (0x1 << 4) | \
  945. (0x1 << 5) | \
  946. (0x1 << 6))
  947. #define MCU_MISCCFG_DCM_MCU_BUS_REG4_MASK ((0xf << 0))
  948. #define MCU_MISCCFG_DCM_MCU_BUS_REG0_ON ((0x1 << 0))
  949. #define MCU_MISCCFG_DCM_MCU_BUS_REG1_ON ((0x1 << 8))
  950. #define MCU_MISCCFG_DCM_MCU_BUS_REG2_ON ((0x1 << 0) | \
  951. (0x1 << 1) | \
  952. (0x1 << 2) | \
  953. (0x1 << 3) | \
  954. (0x1 << 4) | \
  955. (0x1 << 5) | \
  956. (0x1 << 6) | \
  957. (0x1 << 7) | \
  958. (0x1 << 8) | \
  959. (0x1 << 9) | \
  960. (0x1 << 10) | \
  961. (0x1 << 11) | \
  962. (0x1 << 12) | \
  963. (0x1 << 16) | \
  964. (0x1 << 17) | \
  965. (0x1 << 18) | \
  966. (0x1 << 19) | \
  967. (0x1 << 20) | \
  968. (0x1 << 21) | \
  969. (0x1 << 22) | \
  970. (0x1 << 23))
  971. #define MCU_MISCCFG_DCM_MCU_BUS_REG3_ON ((0x1 << 0) | \
  972. (0x1 << 1) | \
  973. (0x1 << 2) | \
  974. (0x1 << 3) | \
  975. (0x1 << 4) | \
  976. (0x1 << 5) | \
  977. (0x1 << 6))
  978. #define MCU_MISCCFG_DCM_MCU_BUS_REG4_ON ((0x0 << 0))
  979. #define MCU_MISCCFG_DCM_MCU_BUS_REG0_OFF ((0x0 << 0))
  980. #define MCU_MISCCFG_DCM_MCU_BUS_REG1_OFF ((0x0 << 8))
  981. #define MCU_MISCCFG_DCM_MCU_BUS_REG2_OFF ((0x0 << 0) | \
  982. (0x0 << 1) | \
  983. (0x0 << 2) | \
  984. (0x0 << 3) | \
  985. (0x0 << 4) | \
  986. (0x0 << 5) | \
  987. (0x0 << 6) | \
  988. (0x0 << 7) | \
  989. (0x0 << 8) | \
  990. (0x0 << 9) | \
  991. (0x0 << 10) | \
  992. (0x0 << 11) | \
  993. (0x0 << 12) | \
  994. (0x0 << 16) | \
  995. (0x0 << 17) | \
  996. (0x0 << 18) | \
  997. (0x0 << 19) | \
  998. (0x0 << 20) | \
  999. (0x0 << 21) | \
  1000. (0x0 << 22) | \
  1001. (0x0 << 23))
  1002. #define MCU_MISCCFG_DCM_MCU_BUS_REG3_OFF ((0x0 << 0) | \
  1003. (0x0 << 1) | \
  1004. (0x0 << 2) | \
  1005. (0x0 << 3) | \
  1006. (0x0 << 4) | \
  1007. (0x0 << 5) | \
  1008. (0x0 << 6))
  1009. #define MCU_MISCCFG_DCM_MCU_BUS_REG4_OFF ((0xf << 0))
  1010. bool dcm_mcu_misccfg_dcm_mcu_bus_is_on(int on)
  1011. {
  1012. bool ret = false;
  1013. ret &= !!(reg_read(L2C_SRAM_CTRL) &
  1014. ~MCU_MISCCFG_DCM_MCU_BUS_REG0_MASK &
  1015. MCU_MISCCFG_DCM_MCU_BUS_REG0_ON);
  1016. ret &= !!(reg_read(CCI_CLK_CTRL) &
  1017. ~MCU_MISCCFG_DCM_MCU_BUS_REG1_MASK &
  1018. MCU_MISCCFG_DCM_MCU_BUS_REG1_ON);
  1019. ret &= !!(reg_read(BUS_FABRIC_DCM_CTRL) &
  1020. ~MCU_MISCCFG_DCM_MCU_BUS_REG2_MASK &
  1021. MCU_MISCCFG_DCM_MCU_BUS_REG2_ON);
  1022. ret &= !!(reg_read(CCI_ADB400_DCM_CONFIG) &
  1023. ~MCU_MISCCFG_DCM_MCU_BUS_REG3_MASK &
  1024. MCU_MISCCFG_DCM_MCU_BUS_REG3_ON);
  1025. ret &= !!(reg_read(BIG_DBG_PWR_CTRL) &
  1026. ~MCU_MISCCFG_DCM_MCU_BUS_REG4_MASK &
  1027. MCU_MISCCFG_DCM_MCU_BUS_REG4_ON);
  1028. return ret;
  1029. }
  1030. void dcm_mcu_misccfg_dcm_mcu_bus(int on)
  1031. {
  1032. if (on) {
  1033. /* TINFO = "Turn ON DCM 'mcu_misccfg_dcm_mcu_bus'" */
  1034. reg_write(L2C_SRAM_CTRL,
  1035. (reg_read(L2C_SRAM_CTRL) &
  1036. ~MCU_MISCCFG_DCM_MCU_BUS_REG0_MASK) |
  1037. MCU_MISCCFG_DCM_MCU_BUS_REG0_ON);
  1038. reg_write(CCI_CLK_CTRL,
  1039. (reg_read(CCI_CLK_CTRL) &
  1040. ~MCU_MISCCFG_DCM_MCU_BUS_REG1_MASK) |
  1041. MCU_MISCCFG_DCM_MCU_BUS_REG1_ON);
  1042. reg_write(BUS_FABRIC_DCM_CTRL,
  1043. (reg_read(BUS_FABRIC_DCM_CTRL) &
  1044. ~MCU_MISCCFG_DCM_MCU_BUS_REG2_MASK) |
  1045. MCU_MISCCFG_DCM_MCU_BUS_REG2_ON);
  1046. reg_write(CCI_ADB400_DCM_CONFIG,
  1047. (reg_read(CCI_ADB400_DCM_CONFIG) &
  1048. ~MCU_MISCCFG_DCM_MCU_BUS_REG3_MASK) |
  1049. MCU_MISCCFG_DCM_MCU_BUS_REG3_ON);
  1050. reg_write(BIG_DBG_PWR_CTRL,
  1051. (reg_read(BIG_DBG_PWR_CTRL) &
  1052. ~MCU_MISCCFG_DCM_MCU_BUS_REG4_MASK) |
  1053. MCU_MISCCFG_DCM_MCU_BUS_REG4_ON);
  1054. } else {
  1055. /* TINFO = "Turn OFF DCM 'mcu_misccfg_dcm_mcu_bus'" */
  1056. reg_write(L2C_SRAM_CTRL,
  1057. (reg_read(L2C_SRAM_CTRL) &
  1058. ~MCU_MISCCFG_DCM_MCU_BUS_REG0_MASK) |
  1059. MCU_MISCCFG_DCM_MCU_BUS_REG0_OFF);
  1060. reg_write(CCI_CLK_CTRL,
  1061. (reg_read(CCI_CLK_CTRL) &
  1062. ~MCU_MISCCFG_DCM_MCU_BUS_REG1_MASK) |
  1063. MCU_MISCCFG_DCM_MCU_BUS_REG1_OFF);
  1064. reg_write(BUS_FABRIC_DCM_CTRL,
  1065. (reg_read(BUS_FABRIC_DCM_CTRL) &
  1066. ~MCU_MISCCFG_DCM_MCU_BUS_REG2_MASK) |
  1067. MCU_MISCCFG_DCM_MCU_BUS_REG2_OFF);
  1068. reg_write(CCI_ADB400_DCM_CONFIG,
  1069. (reg_read(CCI_ADB400_DCM_CONFIG) &
  1070. ~MCU_MISCCFG_DCM_MCU_BUS_REG3_MASK) |
  1071. MCU_MISCCFG_DCM_MCU_BUS_REG3_OFF);
  1072. reg_write(BIG_DBG_PWR_CTRL,
  1073. (reg_read(BIG_DBG_PWR_CTRL) &
  1074. ~MCU_MISCCFG_DCM_MCU_BUS_REG4_MASK) |
  1075. MCU_MISCCFG_DCM_MCU_BUS_REG4_OFF);
  1076. }
  1077. }
  1078. #define EMI_DCM_EMI_GROUP_REG0_MASK ((0xff << 24))
  1079. #define EMI_DCM_EMI_GROUP_REG1_MASK ((0xff << 24))
  1080. #define EMI_DCM_EMI_GROUP_REG0_ON ((0x0 << 24))
  1081. #define EMI_DCM_EMI_GROUP_REG1_ON ((0x0 << 24))
  1082. #define EMI_DCM_EMI_GROUP_REG0_OFF ((0xf << 24))
  1083. #define EMI_DCM_EMI_GROUP_REG1_OFF ((0xe << 24))
  1084. bool dcm_emi_dcm_emi_group_is_on(int on)
  1085. {
  1086. bool ret = false;
  1087. ret &= !!(reg_read(EMI_CONM) &
  1088. ~EMI_DCM_EMI_GROUP_REG0_MASK &
  1089. EMI_DCM_EMI_GROUP_REG0_ON);
  1090. ret &= !!(reg_read(EMI_CONN) &
  1091. ~EMI_DCM_EMI_GROUP_REG1_MASK &
  1092. EMI_DCM_EMI_GROUP_REG1_ON);
  1093. return ret;
  1094. }
  1095. void dcm_emi_dcm_emi_group(int on)
  1096. {
  1097. if (on) {
  1098. /* TINFO = "Turn ON DCM 'emi_dcm_emi_group'" */
  1099. reg_write(EMI_CONM,
  1100. (reg_read(EMI_CONM) &
  1101. ~EMI_DCM_EMI_GROUP_REG0_MASK) |
  1102. EMI_DCM_EMI_GROUP_REG0_ON);
  1103. reg_write(EMI_CONN,
  1104. (reg_read(EMI_CONN) &
  1105. ~EMI_DCM_EMI_GROUP_REG1_MASK) |
  1106. EMI_DCM_EMI_GROUP_REG1_ON);
  1107. } else {
  1108. /* TINFO = "Turn OFF DCM 'emi_dcm_emi_group'" */
  1109. reg_write(EMI_CONM,
  1110. (reg_read(EMI_CONM) &
  1111. ~EMI_DCM_EMI_GROUP_REG0_MASK) |
  1112. EMI_DCM_EMI_GROUP_REG0_OFF);
  1113. reg_write(EMI_CONN,
  1114. (reg_read(EMI_CONN) &
  1115. ~EMI_DCM_EMI_GROUP_REG1_MASK) |
  1116. EMI_DCM_EMI_GROUP_REG1_OFF);
  1117. }
  1118. }
  1119. #define DRAMC_CH0_TOP0_DDRPHY_REG0_MASK ((0x1 << 8) | \
  1120. (0x1 << 9) | \
  1121. (0x1 << 10) | \
  1122. (0x1 << 11) | \
  1123. (0x1 << 12) | \
  1124. (0x1 << 13) | \
  1125. (0x1 << 14) | \
  1126. (0x1 << 15) | \
  1127. (0x1 << 16) | \
  1128. (0x1 << 17) | \
  1129. (0x1 << 19))
  1130. #define DRAMC_CH0_TOP0_DDRPHY_REG1_MASK ((0x1 << 6) | \
  1131. (0x1 << 7) | \
  1132. (0x1 << 26))
  1133. #define DRAMC_CH0_TOP0_DDRPHY_REG0_ON ((0x0 << 8) | \
  1134. (0x0 << 9) | \
  1135. (0x0 << 10) | \
  1136. (0x0 << 11) | \
  1137. (0x0 << 12) | \
  1138. (0x0 << 13) | \
  1139. (0x0 << 14) | \
  1140. (0x0 << 15) | \
  1141. (0x0 << 16) | \
  1142. (0x0 << 17) | \
  1143. (0x0 << 19))
  1144. #define DRAMC_CH0_TOP0_DDRPHY_REG1_ON ((0x0 << 6) | \
  1145. (0x0 << 7) | \
  1146. (0x0 << 26))
  1147. #define DRAMC_CH0_TOP0_DDRPHY_REG0_OFF ((0x1 << 8) | \
  1148. (0x1 << 9) | \
  1149. (0x1 << 10) | \
  1150. (0x1 << 11) | \
  1151. (0x1 << 12) | \
  1152. (0x1 << 13) | \
  1153. (0x1 << 14) | \
  1154. (0x1 << 15) | \
  1155. (0x1 << 16) | \
  1156. (0x1 << 17) | \
  1157. (0x1 << 19))
  1158. #define DRAMC_CH0_TOP0_DDRPHY_REG1_OFF ((0x1 << 6) | \
  1159. (0x1 << 7) | \
  1160. (0x0 << 26))
  1161. #if 0
  1162. static unsigned int dramc_ch0_top0_rg_mem_dcm_idle_fsel_get(void)
  1163. {
  1164. return (reg_read(DRAMC_CH0_TOP0_MISC_CG_CTRL2) >> 21) & 0x1f;
  1165. }
  1166. #endif
  1167. static void dramc_ch0_top0_rg_mem_dcm_idle_fsel_set(unsigned int val)
  1168. {
  1169. reg_write(DRAMC_CH0_TOP0_MISC_CG_CTRL2,
  1170. (reg_read(DRAMC_CH0_TOP0_MISC_CG_CTRL2) &
  1171. ~(0x1f << 21)) |
  1172. (val & 0x1f) << 21);
  1173. }
  1174. bool dcm_dramc_ch0_top0_ddrphy_is_on(int on)
  1175. {
  1176. bool ret = false;
  1177. ret &= !!(reg_read(DRAMC_CH0_TOP0_MISC_CG_CTRL0) &
  1178. ~DRAMC_CH0_TOP0_DDRPHY_REG0_MASK &
  1179. DRAMC_CH0_TOP0_DDRPHY_REG0_ON);
  1180. ret &= !!(reg_read(DRAMC_CH0_TOP0_MISC_CG_CTRL2) &
  1181. ~DRAMC_CH0_TOP0_DDRPHY_REG1_MASK &
  1182. DRAMC_CH0_TOP0_DDRPHY_REG1_ON);
  1183. return ret;
  1184. }
  1185. void dcm_dramc_ch0_top0_ddrphy(int on)
  1186. {
  1187. if (on) {
  1188. /* TINFO = "Turn ON DCM 'dramc_ch0_top0_ddrphy'" */
  1189. dramc_ch0_top0_rg_mem_dcm_idle_fsel_set(0x8);
  1190. reg_write(DRAMC_CH0_TOP0_MISC_CG_CTRL0,
  1191. (reg_read(DRAMC_CH0_TOP0_MISC_CG_CTRL0) &
  1192. ~DRAMC_CH0_TOP0_DDRPHY_REG0_MASK) |
  1193. DRAMC_CH0_TOP0_DDRPHY_REG0_ON);
  1194. reg_write(DRAMC_CH0_TOP0_MISC_CG_CTRL2,
  1195. (reg_read(DRAMC_CH0_TOP0_MISC_CG_CTRL2) &
  1196. ~DRAMC_CH0_TOP0_DDRPHY_REG1_MASK) |
  1197. DRAMC_CH0_TOP0_DDRPHY_REG1_ON);
  1198. } else {
  1199. /* TINFO = "Turn OFF DCM 'dramc_ch0_top0_ddrphy'" */
  1200. dramc_ch0_top0_rg_mem_dcm_idle_fsel_set(0x0);
  1201. reg_write(DRAMC_CH0_TOP0_MISC_CG_CTRL0,
  1202. (reg_read(DRAMC_CH0_TOP0_MISC_CG_CTRL0) &
  1203. ~DRAMC_CH0_TOP0_DDRPHY_REG0_MASK) |
  1204. DRAMC_CH0_TOP0_DDRPHY_REG0_OFF);
  1205. reg_write(DRAMC_CH0_TOP0_MISC_CG_CTRL2,
  1206. (reg_read(DRAMC_CH0_TOP0_MISC_CG_CTRL2) &
  1207. ~DRAMC_CH0_TOP0_DDRPHY_REG1_MASK) |
  1208. DRAMC_CH0_TOP0_DDRPHY_REG1_OFF);
  1209. }
  1210. }
  1211. #define DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG0_MASK ((0x1 << 0) | \
  1212. (0x1 << 1) | \
  1213. (0x1 << 2) | \
  1214. (0x1 << 26) | \
  1215. (0x1 << 30) | \
  1216. (0x1 << 31))
  1217. #define DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG1_MASK ((0x1 << 31))
  1218. #define DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG0_ON ((0x1 << 0) | \
  1219. (0x1 << 1) | \
  1220. (0x1 << 2) | \
  1221. (0x0 << 26) | \
  1222. (0x1 << 30) | \
  1223. (0x1 << 31))
  1224. #define DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG1_ON ((0x1 << 31))
  1225. #define DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG0_OFF ((0x0 << 0) | \
  1226. (0x0 << 1) | \
  1227. (0x0 << 2) | \
  1228. (0x1 << 26) | \
  1229. (0x0 << 30) | \
  1230. (0x0 << 31))
  1231. #define DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG1_OFF ((0x0 << 31))
  1232. bool dcm_dramc_ch0_top1_dcm_dramc_ch0_pd_ctrl_is_on(int on)
  1233. {
  1234. bool ret = false;
  1235. ret &= !!(reg_read(DRAMC_CH0_TOP1_DRAMC_PD_CTRL) &
  1236. ~DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG0_MASK &
  1237. DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG0_ON);
  1238. ret &= !!(reg_read(DRAMC_CH0_TOP1_CLKAR) &
  1239. ~DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG1_MASK &
  1240. DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG1_ON);
  1241. return ret;
  1242. }
  1243. void dcm_dramc_ch0_top1_dcm_dramc_ch0_pd_ctrl(int on)
  1244. {
  1245. if (on) {
  1246. /* TINFO = "Turn ON DCM 'dramc_ch0_top1_dcm_dramc_ch0_pd_ctrl'" */
  1247. reg_write(DRAMC_CH0_TOP1_DRAMC_PD_CTRL,
  1248. (reg_read(DRAMC_CH0_TOP1_DRAMC_PD_CTRL) &
  1249. ~DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG0_MASK) |
  1250. DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG0_ON);
  1251. reg_write(DRAMC_CH0_TOP1_CLKAR,
  1252. (reg_read(DRAMC_CH0_TOP1_CLKAR) &
  1253. ~DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG1_MASK) |
  1254. DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG1_ON);
  1255. } else {
  1256. /* TINFO = "Turn OFF DCM 'dramc_ch0_top1_dcm_dramc_ch0_pd_ctrl'" */
  1257. reg_write(DRAMC_CH0_TOP1_DRAMC_PD_CTRL,
  1258. (reg_read(DRAMC_CH0_TOP1_DRAMC_PD_CTRL) &
  1259. ~DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG0_MASK) |
  1260. DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG0_OFF);
  1261. reg_write(DRAMC_CH0_TOP1_CLKAR,
  1262. (reg_read(DRAMC_CH0_TOP1_CLKAR) &
  1263. ~DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG1_MASK) |
  1264. DRAMC_CH0_TOP1_DCM_DRAMC_CH0_PD_CTRL_REG1_OFF);
  1265. }
  1266. }
  1267. #define CHN0_EMI_DCM_EMI_GROUP_REG0_MASK ((0xff << 24))
  1268. #define CHN0_EMI_DCM_EMI_GROUP_REG0_ON ((0x0 << 24))
  1269. #define CHN0_EMI_DCM_EMI_GROUP_REG0_OFF ((0xf << 24))
  1270. bool dcm_chn0_emi_dcm_emi_group_is_on(int on)
  1271. {
  1272. bool ret = false;
  1273. ret &= !!(reg_read(CHN0_EMI_CHN_EMI_CONB) &
  1274. ~CHN0_EMI_DCM_EMI_GROUP_REG0_MASK &
  1275. CHN0_EMI_DCM_EMI_GROUP_REG0_ON);
  1276. return ret;
  1277. }
  1278. void dcm_chn0_emi_dcm_emi_group(int on)
  1279. {
  1280. if (on) {
  1281. /* TINFO = "Turn ON DCM 'chn0_emi_dcm_emi_group'" */
  1282. reg_write(CHN0_EMI_CHN_EMI_CONB,
  1283. (reg_read(CHN0_EMI_CHN_EMI_CONB) &
  1284. ~CHN0_EMI_DCM_EMI_GROUP_REG0_MASK) |
  1285. CHN0_EMI_DCM_EMI_GROUP_REG0_ON);
  1286. } else {
  1287. /* TINFO = "Turn OFF DCM 'chn0_emi_dcm_emi_group'" */
  1288. reg_write(CHN0_EMI_CHN_EMI_CONB,
  1289. (reg_read(CHN0_EMI_CHN_EMI_CONB) &
  1290. ~CHN0_EMI_DCM_EMI_GROUP_REG0_MASK) |
  1291. CHN0_EMI_DCM_EMI_GROUP_REG0_OFF);
  1292. }
  1293. }
  1294. #define DRAMC_CH1_TOP0_DDRPHY_REG0_MASK ((0x1 << 8) | \
  1295. (0x1 << 9) | \
  1296. (0x1 << 10) | \
  1297. (0x1 << 11) | \
  1298. (0x1 << 12) | \
  1299. (0x1 << 13) | \
  1300. (0x1 << 14) | \
  1301. (0x1 << 15) | \
  1302. (0x1 << 16) | \
  1303. (0x1 << 17) | \
  1304. (0x1 << 19))
  1305. #define DRAMC_CH1_TOP0_DDRPHY_REG1_MASK ((0x1 << 6) | \
  1306. (0x1 << 7) | \
  1307. (0x1 << 26))
  1308. #define DRAMC_CH1_TOP0_DDRPHY_REG0_ON ((0x0 << 8) | \
  1309. (0x0 << 9) | \
  1310. (0x0 << 10) | \
  1311. (0x0 << 11) | \
  1312. (0x0 << 12) | \
  1313. (0x0 << 13) | \
  1314. (0x0 << 14) | \
  1315. (0x0 << 15) | \
  1316. (0x0 << 16) | \
  1317. (0x0 << 17) | \
  1318. (0x0 << 19))
  1319. #define DRAMC_CH1_TOP0_DDRPHY_REG1_ON ((0x0 << 6) | \
  1320. (0x0 << 7) | \
  1321. (0x0 << 26))
  1322. #define DRAMC_CH1_TOP0_DDRPHY_REG0_OFF ((0x1 << 8) | \
  1323. (0x1 << 9) | \
  1324. (0x1 << 10) | \
  1325. (0x1 << 11) | \
  1326. (0x1 << 12) | \
  1327. (0x1 << 13) | \
  1328. (0x1 << 14) | \
  1329. (0x1 << 15) | \
  1330. (0x1 << 16) | \
  1331. (0x1 << 17) | \
  1332. (0x1 << 19))
  1333. #define DRAMC_CH1_TOP0_DDRPHY_REG1_OFF ((0x1 << 6) | \
  1334. (0x1 << 7) | \
  1335. (0x0 << 26))
  1336. #if 0
  1337. static unsigned int dramc_ch1_top0_rg_mem_dcm_idle_fsel_get(void)
  1338. {
  1339. return (reg_read(DRAMC_CH1_TOP0_MISC_CG_CTRL2) >> 21) & 0x1f;
  1340. }
  1341. #endif
  1342. static void dramc_ch1_top0_rg_mem_dcm_idle_fsel_set(unsigned int val)
  1343. {
  1344. reg_write(DRAMC_CH1_TOP0_MISC_CG_CTRL2,
  1345. (reg_read(DRAMC_CH1_TOP0_MISC_CG_CTRL2) &
  1346. ~(0x1f << 21)) |
  1347. (val & 0x1f) << 21);
  1348. }
  1349. bool dcm_dramc_ch1_top0_ddrphy_is_on(int on)
  1350. {
  1351. bool ret = false;
  1352. ret &= !!(reg_read(DRAMC_CH1_TOP0_MISC_CG_CTRL0) &
  1353. ~DRAMC_CH1_TOP0_DDRPHY_REG0_MASK &
  1354. DRAMC_CH1_TOP0_DDRPHY_REG0_ON);
  1355. ret &= !!(reg_read(DRAMC_CH1_TOP0_MISC_CG_CTRL2) &
  1356. ~DRAMC_CH1_TOP0_DDRPHY_REG1_MASK &
  1357. DRAMC_CH1_TOP0_DDRPHY_REG1_ON);
  1358. return ret;
  1359. }
  1360. void dcm_dramc_ch1_top0_ddrphy(int on)
  1361. {
  1362. if (on) {
  1363. /* TINFO = "Turn ON DCM 'dramc_ch1_top0_ddrphy'" */
  1364. dramc_ch1_top0_rg_mem_dcm_idle_fsel_set(0x8);
  1365. reg_write(DRAMC_CH1_TOP0_MISC_CG_CTRL0,
  1366. (reg_read(DRAMC_CH1_TOP0_MISC_CG_CTRL0) &
  1367. ~DRAMC_CH1_TOP0_DDRPHY_REG0_MASK) |
  1368. DRAMC_CH1_TOP0_DDRPHY_REG0_ON);
  1369. reg_write(DRAMC_CH1_TOP0_MISC_CG_CTRL2,
  1370. (reg_read(DRAMC_CH1_TOP0_MISC_CG_CTRL2) &
  1371. ~DRAMC_CH1_TOP0_DDRPHY_REG1_MASK) |
  1372. DRAMC_CH1_TOP0_DDRPHY_REG1_ON);
  1373. } else {
  1374. /* TINFO = "Turn OFF DCM 'dramc_ch1_top0_ddrphy'" */
  1375. dramc_ch1_top0_rg_mem_dcm_idle_fsel_set(0x0);
  1376. reg_write(DRAMC_CH1_TOP0_MISC_CG_CTRL0,
  1377. (reg_read(DRAMC_CH1_TOP0_MISC_CG_CTRL0) &
  1378. ~DRAMC_CH1_TOP0_DDRPHY_REG0_MASK) |
  1379. DRAMC_CH1_TOP0_DDRPHY_REG0_OFF);
  1380. reg_write(DRAMC_CH1_TOP0_MISC_CG_CTRL2,
  1381. (reg_read(DRAMC_CH1_TOP0_MISC_CG_CTRL2) &
  1382. ~DRAMC_CH1_TOP0_DDRPHY_REG1_MASK) |
  1383. DRAMC_CH1_TOP0_DDRPHY_REG1_OFF);
  1384. }
  1385. }
  1386. #define DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG0_MASK ((0x1 << 0) | \
  1387. (0x1 << 1) | \
  1388. (0x1 << 2) | \
  1389. (0x1 << 26) | \
  1390. (0x1 << 30) | \
  1391. (0x1 << 31))
  1392. #define DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG1_MASK ((0x1 << 31))
  1393. #define DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG0_ON ((0x1 << 0) | \
  1394. (0x1 << 1) | \
  1395. (0x1 << 2) | \
  1396. (0x0 << 26) | \
  1397. (0x1 << 30) | \
  1398. (0x1 << 31))
  1399. #define DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG1_ON ((0x1 << 31))
  1400. #define DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG0_OFF ((0x0 << 0) | \
  1401. (0x0 << 1) | \
  1402. (0x0 << 2) | \
  1403. (0x1 << 26) | \
  1404. (0x0 << 30) | \
  1405. (0x0 << 31))
  1406. #define DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG1_OFF ((0x0 << 31))
  1407. bool dcm_dramc_ch1_top1_dcm_dramc_ch1_pd_ctrl_is_on(int on)
  1408. {
  1409. bool ret = false;
  1410. ret &= !!(reg_read(DRAMC_CH1_TOP1_DRAMC_PD_CTRL) &
  1411. ~DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG0_MASK &
  1412. DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG0_ON);
  1413. ret &= !!(reg_read(DRAMC_CH1_TOP1_CLKAR) &
  1414. ~DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG1_MASK &
  1415. DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG1_ON);
  1416. return ret;
  1417. }
  1418. void dcm_dramc_ch1_top1_dcm_dramc_ch1_pd_ctrl(int on)
  1419. {
  1420. if (on) {
  1421. /* TINFO = "Turn ON DCM 'dramc_ch1_top1_dcm_dramc_ch1_pd_ctrl'" */
  1422. reg_write(DRAMC_CH1_TOP1_DRAMC_PD_CTRL,
  1423. (reg_read(DRAMC_CH1_TOP1_DRAMC_PD_CTRL) &
  1424. ~DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG0_MASK) |
  1425. DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG0_ON);
  1426. reg_write(DRAMC_CH1_TOP1_CLKAR,
  1427. (reg_read(DRAMC_CH1_TOP1_CLKAR) &
  1428. ~DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG1_MASK) |
  1429. DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG1_ON);
  1430. } else {
  1431. /* TINFO = "Turn OFF DCM 'dramc_ch1_top1_dcm_dramc_ch1_pd_ctrl'" */
  1432. reg_write(DRAMC_CH1_TOP1_DRAMC_PD_CTRL,
  1433. (reg_read(DRAMC_CH1_TOP1_DRAMC_PD_CTRL) &
  1434. ~DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG0_MASK) |
  1435. DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG0_OFF);
  1436. reg_write(DRAMC_CH1_TOP1_CLKAR,
  1437. (reg_read(DRAMC_CH1_TOP1_CLKAR) &
  1438. ~DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG1_MASK) |
  1439. DRAMC_CH1_TOP1_DCM_DRAMC_CH1_PD_CTRL_REG1_OFF);
  1440. }
  1441. }
  1442. #define CHN1_EMI_DCM_EMI_GROUP_REG0_MASK ((0xff << 24))
  1443. #define CHN1_EMI_DCM_EMI_GROUP_REG0_ON ((0x0 << 24))
  1444. #define CHN1_EMI_DCM_EMI_GROUP_REG0_OFF ((0xf << 24))
  1445. bool dcm_chn1_emi_dcm_emi_group_is_on(int on)
  1446. {
  1447. bool ret = false;
  1448. ret &= !!(reg_read(CHN1_EMI_CHN_EMI_CONB) &
  1449. ~CHN1_EMI_DCM_EMI_GROUP_REG0_MASK &
  1450. CHN1_EMI_DCM_EMI_GROUP_REG0_ON);
  1451. return ret;
  1452. }
  1453. void dcm_chn1_emi_dcm_emi_group(int on)
  1454. {
  1455. if (on) {
  1456. /* TINFO = "Turn ON DCM 'chn1_emi_dcm_emi_group'" */
  1457. reg_write(CHN1_EMI_CHN_EMI_CONB,
  1458. (reg_read(CHN1_EMI_CHN_EMI_CONB) &
  1459. ~CHN1_EMI_DCM_EMI_GROUP_REG0_MASK) |
  1460. CHN1_EMI_DCM_EMI_GROUP_REG0_ON);
  1461. } else {
  1462. /* TINFO = "Turn OFF DCM 'chn1_emi_dcm_emi_group'" */
  1463. reg_write(CHN1_EMI_CHN_EMI_CONB,
  1464. (reg_read(CHN1_EMI_CHN_EMI_CONB) &
  1465. ~CHN1_EMI_DCM_EMI_GROUP_REG0_MASK) |
  1466. CHN1_EMI_DCM_EMI_GROUP_REG0_OFF);
  1467. }
  1468. }