mtk_dcm_autogen.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738
  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) 2017. 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. #define INFRACFG_AO_DCM_DFS_MEM_CTRL_REG0_MASK ((0x1 << 0) | \
  58. (0x1f << 1) | \
  59. (0x1 << 6) | \
  60. (0x1 << 7) | \
  61. (0x1 << 8) | \
  62. (0x1f << 16) | \
  63. (0x1f << 21) | \
  64. (0x1 << 26))
  65. #define INFRACFG_AO_DCM_DFS_MEM_CTRL_REG0_ON ((0x0 << 0) | \
  66. (0x0 << 1) | \
  67. (0x0 << 6) | \
  68. (0x1 << 7) | \
  69. (0x1 << 8) | \
  70. (0x0 << 16) | \
  71. (0x1f << 21) | \
  72. (0x0 << 26))
  73. #define INFRACFG_AO_DCM_DFS_MEM_CTRL_REG0_OFF ((0x0 << 0) | \
  74. (0x0 << 1) | \
  75. (0x0 << 6) | \
  76. (0x1 << 7) | \
  77. (0x1 << 8) | \
  78. (0x0 << 16) | \
  79. (0x1f << 21) | \
  80. (0x0 << 26))
  81. bool dcm_infracfg_ao_dcm_dfs_mem_ctrl_is_on(void)
  82. {
  83. bool ret = true;
  84. ret &= ((reg_read(DFS_MEM_DCM_CTRL) &
  85. INFRACFG_AO_DCM_DFS_MEM_CTRL_REG0_MASK) ==
  86. (unsigned int) INFRACFG_AO_DCM_DFS_MEM_CTRL_REG0_ON);
  87. return ret;
  88. }
  89. void dcm_infracfg_ao_dcm_dfs_mem_ctrl(int on)
  90. {
  91. if (on) {
  92. /* TINFO = "Turn ON DCM 'infracfg_ao_dcm_dfs_mem_ctrl'" */
  93. reg_write(DFS_MEM_DCM_CTRL,
  94. (reg_read(DFS_MEM_DCM_CTRL) &
  95. ~INFRACFG_AO_DCM_DFS_MEM_CTRL_REG0_MASK) |
  96. INFRACFG_AO_DCM_DFS_MEM_CTRL_REG0_ON);
  97. } else {
  98. /* TINFO = "Turn OFF DCM 'infracfg_ao_dcm_dfs_mem_ctrl'" */
  99. reg_write(DFS_MEM_DCM_CTRL,
  100. (reg_read(DFS_MEM_DCM_CTRL) &
  101. ~INFRACFG_AO_DCM_DFS_MEM_CTRL_REG0_MASK) |
  102. INFRACFG_AO_DCM_DFS_MEM_CTRL_REG0_OFF);
  103. }
  104. }
  105. #define INFRACFG_AO_DCM_INFRA_BUS_REG0_MASK ((0x1 << 0) | \
  106. (0x1 << 1) | \
  107. (0x1 << 2) | \
  108. (0x1 << 3) | \
  109. (0x1 << 4) | \
  110. (0x1f << 5) | \
  111. (0x1f << 10) | \
  112. (0x1 << 20) | \
  113. (0x1 << 21) | \
  114. (0x1 << 22) | \
  115. (0x1 << 23) | \
  116. (0x1 << 30))
  117. #define INFRACFG_AO_DCM_INFRA_BUS_REG0_ON ((0x1 << 0) | \
  118. (0x1 << 1) | \
  119. (0x0 << 2) | \
  120. (0x0 << 3) | \
  121. (0x0 << 4) | \
  122. (0x10 << 5) | \
  123. (0x10 << 10) | \
  124. (0x1 << 20) | \
  125. (0x1 << 21) | \
  126. (0x1 << 22) | \
  127. (0x1 << 23) | \
  128. (0x1 << 30))
  129. #define INFRACFG_AO_DCM_INFRA_BUS_REG0_OFF ((0x0 << 0) | \
  130. (0x0 << 1) | \
  131. (0x0 << 2) | \
  132. (0x0 << 3) | \
  133. (0x0 << 4) | \
  134. (0x10 << 5) | \
  135. (0x10 << 10) | \
  136. (0x0 << 20) | \
  137. (0x1 << 21) | \
  138. (0x1 << 22) | \
  139. (0x0 << 23) | \
  140. (0x0 << 30))
  141. bool dcm_infracfg_ao_dcm_infra_bus_is_on(void)
  142. {
  143. bool ret = true;
  144. ret &= ((reg_read(INFRA_BUS_DCM_CTRL) &
  145. INFRACFG_AO_DCM_INFRA_BUS_REG0_MASK) ==
  146. (unsigned int) INFRACFG_AO_DCM_INFRA_BUS_REG0_ON);
  147. return ret;
  148. }
  149. void dcm_infracfg_ao_dcm_infra_bus(int on)
  150. {
  151. if (on) {
  152. /* TINFO = "Turn ON DCM 'infracfg_ao_dcm_infra_bus'" */
  153. reg_write(INFRA_BUS_DCM_CTRL,
  154. (reg_read(INFRA_BUS_DCM_CTRL) &
  155. ~INFRACFG_AO_DCM_INFRA_BUS_REG0_MASK) |
  156. INFRACFG_AO_DCM_INFRA_BUS_REG0_ON);
  157. } else {
  158. /* TINFO = "Turn OFF DCM 'infracfg_ao_dcm_infra_bus'" */
  159. reg_write(INFRA_BUS_DCM_CTRL,
  160. (reg_read(INFRA_BUS_DCM_CTRL) &
  161. ~INFRACFG_AO_DCM_INFRA_BUS_REG0_MASK) |
  162. INFRACFG_AO_DCM_INFRA_BUS_REG0_OFF);
  163. }
  164. }
  165. #define INFRACFG_AO_DCM_MEM_CTRL_REG0_MASK ((0x1 << 0) | \
  166. (0x1f << 1) | \
  167. (0x1 << 6) | \
  168. (0x1 << 7) | \
  169. (0x1 << 8) | \
  170. (0x7f << 9) | \
  171. (0x1f << 16) | \
  172. (0x1f << 21) | \
  173. (0x1 << 26) | \
  174. (0x1 << 27) | \
  175. (0x1 << 28) | \
  176. (0x1 << 29) | \
  177. (0x1 << 31))
  178. #define INFRACFG_AO_DCM_MEM_CTRL_REG0_ON ((0x0 << 0) | \
  179. (0x0 << 1) | \
  180. (0x0 << 6) | \
  181. (0x1 << 7) | \
  182. (0x1 << 8) | \
  183. (0x0 << 9) | \
  184. (0x0 << 16) | \
  185. (0x1f << 21) | \
  186. (0x0 << 26) | \
  187. (0x1 << 27) | \
  188. (0x0 << 28) | \
  189. (0x0 << 29) | \
  190. (0x0 << 31))
  191. #define INFRACFG_AO_DCM_MEM_CTRL_REG0_OFF ((0x0 << 0) | \
  192. (0x0 << 1) | \
  193. (0x0 << 6) | \
  194. (0x1 << 7) | \
  195. (0x1 << 8) | \
  196. (0x0 << 9) | \
  197. (0x0 << 16) | \
  198. (0x1f << 21) | \
  199. (0x0 << 26) | \
  200. (0x1 << 27) | \
  201. (0x0 << 28) | \
  202. (0x0 << 29) | \
  203. (0x0 << 31))
  204. bool dcm_infracfg_ao_dcm_mem_ctrl_is_on(void)
  205. {
  206. bool ret = true;
  207. ret &= ((reg_read(MEM_DCM_CTRL) &
  208. INFRACFG_AO_DCM_MEM_CTRL_REG0_MASK) ==
  209. (unsigned int) INFRACFG_AO_DCM_MEM_CTRL_REG0_ON);
  210. return ret;
  211. }
  212. void dcm_infracfg_ao_dcm_mem_ctrl(int on)
  213. {
  214. if (on) {
  215. /* TINFO = "Turn ON DCM 'infracfg_ao_dcm_mem_ctrl'" */
  216. reg_write(MEM_DCM_CTRL,
  217. (reg_read(MEM_DCM_CTRL) &
  218. ~INFRACFG_AO_DCM_MEM_CTRL_REG0_MASK) |
  219. INFRACFG_AO_DCM_MEM_CTRL_REG0_ON);
  220. } else {
  221. /* TINFO = "Turn OFF DCM 'infracfg_ao_dcm_mem_ctrl'" */
  222. reg_write(MEM_DCM_CTRL,
  223. (reg_read(MEM_DCM_CTRL) &
  224. ~INFRACFG_AO_DCM_MEM_CTRL_REG0_MASK) |
  225. INFRACFG_AO_DCM_MEM_CTRL_REG0_OFF);
  226. }
  227. }
  228. #define INFRACFG_AO_DCM_PERI_BUS_REG0_MASK ((0x1 << 0) | \
  229. (0x1 << 1) | \
  230. (0x1 << 3) | \
  231. (0x1 << 4) | \
  232. (0x1f << 5) | \
  233. (0x1f << 10) | \
  234. (0x1f << 15) | \
  235. (0x1 << 20) | \
  236. (0x1 << 21) | \
  237. (0x1 << 22) | \
  238. (0x1f << 23) | \
  239. (0x1 << 28) | \
  240. (0x1 << 29) | \
  241. (0x1 << 31))
  242. #define INFRACFG_AO_DCM_PERI_BUS_REG0_ON ((0x1 << 0) | \
  243. (0x1 << 1) | \
  244. (0x0 << 3) | \
  245. (0x0 << 4) | \
  246. (0x1f << 5) | \
  247. (0x0 << 10) | \
  248. (0x1f << 15) | \
  249. (0x1 << 20) | \
  250. (0x1 << 21) | \
  251. (0x1 << 22) | \
  252. (0x0 << 23) | \
  253. (0x1 << 28) | \
  254. (0x1 << 29) | \
  255. (0x1 << 31))
  256. #define INFRACFG_AO_DCM_PERI_BUS_REG0_OFF ((0x0 << 0) | \
  257. (0x0 << 1) | \
  258. (0x0 << 3) | \
  259. (0x0 << 4) | \
  260. (0x1f << 5) | \
  261. (0x1f << 10) | \
  262. (0x0 << 15) | \
  263. (0x0 << 20) | \
  264. (0x0 << 21) | \
  265. (0x0 << 22) | \
  266. (0x0 << 23) | \
  267. (0x0 << 28) | \
  268. (0x0 << 29) | \
  269. (0x0 << 31))
  270. bool dcm_infracfg_ao_dcm_peri_bus_is_on(void)
  271. {
  272. bool ret = true;
  273. ret &= ((reg_read(PERI_BUS_DCM_CTRL) &
  274. INFRACFG_AO_DCM_PERI_BUS_REG0_MASK) ==
  275. (unsigned int) INFRACFG_AO_DCM_PERI_BUS_REG0_ON);
  276. return ret;
  277. }
  278. void dcm_infracfg_ao_dcm_peri_bus(int on)
  279. {
  280. if (on) {
  281. /* TINFO = "Turn ON DCM 'infracfg_ao_dcm_peri_bus'" */
  282. reg_write(PERI_BUS_DCM_CTRL,
  283. (reg_read(PERI_BUS_DCM_CTRL) &
  284. ~INFRACFG_AO_DCM_PERI_BUS_REG0_MASK) |
  285. INFRACFG_AO_DCM_PERI_BUS_REG0_ON);
  286. } else {
  287. /* TINFO = "Turn OFF DCM 'infracfg_ao_dcm_peri_bus'" */
  288. reg_write(PERI_BUS_DCM_CTRL,
  289. (reg_read(PERI_BUS_DCM_CTRL) &
  290. ~INFRACFG_AO_DCM_PERI_BUS_REG0_MASK) |
  291. INFRACFG_AO_DCM_PERI_BUS_REG0_OFF);
  292. }
  293. }
  294. #define INFRACFG_AO_DCM_TOP_P2P_RX_CK_REG0_MASK ((0xf << 0))
  295. #define INFRACFG_AO_DCM_TOP_P2P_RX_CK_REG0_ON ((0x0 << 0))
  296. #define INFRACFG_AO_DCM_TOP_P2P_RX_CK_REG0_OFF ((0xf << 0))
  297. bool dcm_infracfg_ao_dcm_top_p2p_rx_ck_is_on(void)
  298. {
  299. bool ret = true;
  300. ret &= ((reg_read(P2P_RX_CLK_ON) &
  301. INFRACFG_AO_DCM_TOP_P2P_RX_CK_REG0_MASK) ==
  302. (unsigned int) INFRACFG_AO_DCM_TOP_P2P_RX_CK_REG0_ON);
  303. return ret;
  304. }
  305. void dcm_infracfg_ao_dcm_top_p2p_rx_ck(int on)
  306. {
  307. if (on) {
  308. /* TINFO = "Turn ON DCM 'infracfg_ao_dcm_top_p2p_rx_ck'" */
  309. reg_write(P2P_RX_CLK_ON,
  310. (reg_read(P2P_RX_CLK_ON) &
  311. ~INFRACFG_AO_DCM_TOP_P2P_RX_CK_REG0_MASK) |
  312. INFRACFG_AO_DCM_TOP_P2P_RX_CK_REG0_ON);
  313. } else {
  314. /* TINFO = "Turn OFF DCM 'infracfg_ao_dcm_top_p2p_rx_ck'" */
  315. reg_write(P2P_RX_CLK_ON,
  316. (reg_read(P2P_RX_CLK_ON) &
  317. ~INFRACFG_AO_DCM_TOP_P2P_RX_CK_REG0_MASK) |
  318. INFRACFG_AO_DCM_TOP_P2P_RX_CK_REG0_OFF);
  319. }
  320. }
  321. #define TOPCKGEN_AO_MCU_ARMPLL_CA7LL_REG0_MASK ((0x1 << 2))
  322. #define TOPCKGEN_AO_MCU_ARMPLL_CA7LL_REG0_ON ((0x1 << 2))
  323. #define TOPCKGEN_AO_MCU_ARMPLL_CA7LL_REG0_OFF ((0x0 << 2))
  324. bool dcm_topckgen_ao_mcu_armpll_ca7ll_is_on(void)
  325. {
  326. bool ret = true;
  327. ret &= ((reg_read(INFRA_TOPCKGEN_DCMCTL) &
  328. TOPCKGEN_AO_MCU_ARMPLL_CA7LL_REG0_MASK) ==
  329. (unsigned int) TOPCKGEN_AO_MCU_ARMPLL_CA7LL_REG0_ON);
  330. return ret;
  331. }
  332. void dcm_topckgen_ao_mcu_armpll_ca7ll(int on)
  333. {
  334. if (on) {
  335. /* TINFO = "Turn ON DCM 'topckgen_ao_mcu_armpll_ca7ll'" */
  336. reg_write(INFRA_TOPCKGEN_DCMCTL,
  337. (reg_read(INFRA_TOPCKGEN_DCMCTL) &
  338. ~TOPCKGEN_AO_MCU_ARMPLL_CA7LL_REG0_MASK) |
  339. TOPCKGEN_AO_MCU_ARMPLL_CA7LL_REG0_ON);
  340. } else {
  341. /* TINFO = "Turn OFF DCM 'topckgen_ao_mcu_armpll_ca7ll'" */
  342. reg_write(INFRA_TOPCKGEN_DCMCTL,
  343. (reg_read(INFRA_TOPCKGEN_DCMCTL) &
  344. ~TOPCKGEN_AO_MCU_ARMPLL_CA7LL_REG0_MASK) |
  345. TOPCKGEN_AO_MCU_ARMPLL_CA7LL_REG0_OFF);
  346. }
  347. }
  348. #define DRAMC_DRAMC_DCM_REG0_MASK ((0x1 << 25) | \
  349. (0x1 << 26) | \
  350. (0x1 << 30) | \
  351. (0x1 << 31))
  352. #define DRAMC_DRAMC_DCM_REG0_ON ((0x1 << 25) | \
  353. (0x0 << 26) | \
  354. (0x1 << 30) | \
  355. (0x1 << 31))
  356. #define DRAMC_DRAMC_DCM_REG0_OFF ((0x0 << 25) | \
  357. (0x1 << 26) | \
  358. (0x0 << 30) | \
  359. (0x0 << 31))
  360. bool dcm_dramc_dramc_dcm_is_on(void)
  361. {
  362. bool ret = true;
  363. ret &= ((reg_read(DRAMC_DRAMC_PD_CTRL) &
  364. DRAMC_DRAMC_DCM_REG0_MASK) ==
  365. (unsigned int) DRAMC_DRAMC_DCM_REG0_ON);
  366. return ret;
  367. }
  368. void dcm_dramc_dramc_dcm(int on)
  369. {
  370. if (on) {
  371. /* TINFO = "Turn ON DCM 'dramc_dramc_dcm'" */
  372. reg_write(DRAMC_DRAMC_PD_CTRL,
  373. (reg_read(DRAMC_DRAMC_PD_CTRL) &
  374. ~DRAMC_DRAMC_DCM_REG0_MASK) |
  375. DRAMC_DRAMC_DCM_REG0_ON);
  376. } else {
  377. /* TINFO = "Turn OFF DCM 'dramc_dramc_dcm'" */
  378. reg_write(DRAMC_DRAMC_PD_CTRL,
  379. (reg_read(DRAMC_DRAMC_PD_CTRL) &
  380. ~DRAMC_DRAMC_DCM_REG0_MASK) |
  381. DRAMC_DRAMC_DCM_REG0_OFF);
  382. }
  383. }
  384. #define MCUCFG_BUS_CLOCK_DCM_REG0_MASK ((0x1 << 8))
  385. #define MCUCFG_BUS_CLOCK_DCM_REG0_ON ((0x1 << 8))
  386. #define MCUCFG_BUS_CLOCK_DCM_REG0_OFF ((0x0 << 8))
  387. bool dcm_mcucfg_bus_clock_dcm_is_on(void)
  388. {
  389. bool ret = true;
  390. ret &= ((reg_read(CCI_CLK_CTRL) &
  391. MCUCFG_BUS_CLOCK_DCM_REG0_MASK) ==
  392. (unsigned int) MCUCFG_BUS_CLOCK_DCM_REG0_ON);
  393. return ret;
  394. }
  395. void dcm_mcucfg_bus_clock_dcm(int on)
  396. {
  397. if (on) {
  398. /* TINFO = "Turn ON DCM 'mcucfg_bus_clock_dcm'" */
  399. reg_write(CCI_CLK_CTRL,
  400. (reg_read(CCI_CLK_CTRL) &
  401. ~MCUCFG_BUS_CLOCK_DCM_REG0_MASK) |
  402. MCUCFG_BUS_CLOCK_DCM_REG0_ON);
  403. } else {
  404. /* TINFO = "Turn OFF DCM 'mcucfg_bus_clock_dcm'" */
  405. reg_write(CCI_CLK_CTRL,
  406. (reg_read(CCI_CLK_CTRL) &
  407. ~MCUCFG_BUS_CLOCK_DCM_REG0_MASK) |
  408. MCUCFG_BUS_CLOCK_DCM_REG0_OFF);
  409. }
  410. }
  411. #define MCUCFG_BUS_FABRIC_DCM_REG0_MASK ((0x1 << 0) | \
  412. (0x1 << 1) | \
  413. (0x1 << 8) | \
  414. (0x1 << 9) | \
  415. (0x1 << 18))
  416. #define MCUCFG_BUS_FABRIC_DCM_REG0_ON ((0x1 << 0) | \
  417. (0x1 << 1) | \
  418. (0x1 << 8) | \
  419. (0x1 << 9) | \
  420. (0x1 << 18))
  421. #define MCUCFG_BUS_FABRIC_DCM_REG0_OFF ((0x0 << 0) | \
  422. (0x0 << 1) | \
  423. (0x0 << 8) | \
  424. (0x0 << 9) | \
  425. (0x0 << 18))
  426. bool dcm_mcucfg_bus_fabric_dcm_is_on(void)
  427. {
  428. bool ret = true;
  429. ret &= ((reg_read(BUS_FABRIC_DCM_CTRL) &
  430. MCUCFG_BUS_FABRIC_DCM_REG0_MASK) ==
  431. (unsigned int) MCUCFG_BUS_FABRIC_DCM_REG0_ON);
  432. return ret;
  433. }
  434. void dcm_mcucfg_bus_fabric_dcm(int on)
  435. {
  436. if (on) {
  437. /* TINFO = "Turn ON DCM 'mcucfg_bus_fabric_dcm'" */
  438. reg_write(BUS_FABRIC_DCM_CTRL,
  439. (reg_read(BUS_FABRIC_DCM_CTRL) &
  440. ~MCUCFG_BUS_FABRIC_DCM_REG0_MASK) |
  441. MCUCFG_BUS_FABRIC_DCM_REG0_ON);
  442. } else {
  443. /* TINFO = "Turn OFF DCM 'mcucfg_bus_fabric_dcm'" */
  444. reg_write(BUS_FABRIC_DCM_CTRL,
  445. (reg_read(BUS_FABRIC_DCM_CTRL) &
  446. ~MCUCFG_BUS_FABRIC_DCM_REG0_MASK) |
  447. MCUCFG_BUS_FABRIC_DCM_REG0_OFF);
  448. }
  449. }
  450. #define MCUCFG_L2_SHARED_DCM_REG0_MASK ((0x1 << 0))
  451. #define MCUCFG_L2_SHARED_DCM_REG0_ON ((0x1 << 0))
  452. #define MCUCFG_L2_SHARED_DCM_REG0_OFF ((0x0 << 0))
  453. bool dcm_mcucfg_l2_shared_dcm_is_on(void)
  454. {
  455. bool ret = true;
  456. ret &= ((reg_read(L2C_SRAM_CTRL) &
  457. MCUCFG_L2_SHARED_DCM_REG0_MASK) ==
  458. (unsigned int) MCUCFG_L2_SHARED_DCM_REG0_ON);
  459. return ret;
  460. }
  461. void dcm_mcucfg_l2_shared_dcm(int on)
  462. {
  463. if (on) {
  464. /* TINFO = "Turn ON DCM 'mcucfg_l2_shared_dcm'" */
  465. reg_write(L2C_SRAM_CTRL,
  466. (reg_read(L2C_SRAM_CTRL) &
  467. ~MCUCFG_L2_SHARED_DCM_REG0_MASK) |
  468. MCUCFG_L2_SHARED_DCM_REG0_ON);
  469. } else {
  470. /* TINFO = "Turn OFF DCM 'mcucfg_l2_shared_dcm'" */
  471. reg_write(L2C_SRAM_CTRL,
  472. (reg_read(L2C_SRAM_CTRL) &
  473. ~MCUCFG_L2_SHARED_DCM_REG0_MASK) |
  474. MCUCFG_L2_SHARED_DCM_REG0_OFF);
  475. }
  476. }
  477. #define MCUCFG_MCU_MISC_DCM_REG0_MASK ((0x1 << 0))
  478. #define MCUCFG_MCU_MISC_DCM_REG0_ON ((0x1 << 0))
  479. #define MCUCFG_MCU_MISC_DCM_REG0_OFF ((0x0 << 0))
  480. bool dcm_mcucfg_mcu_misc_dcm_is_on(void)
  481. {
  482. bool ret = true;
  483. ret &= ((reg_read(MCU_MISC_DCM_CTRL) &
  484. MCUCFG_MCU_MISC_DCM_REG0_MASK) ==
  485. (unsigned int) MCUCFG_MCU_MISC_DCM_REG0_ON);
  486. return ret;
  487. }
  488. void dcm_mcucfg_mcu_misc_dcm(int on)
  489. {
  490. if (on) {
  491. /* TINFO = "Turn ON DCM 'mcucfg_mcu_misc_dcm'" */
  492. reg_write(MCU_MISC_DCM_CTRL,
  493. (reg_read(MCU_MISC_DCM_CTRL) &
  494. ~MCUCFG_MCU_MISC_DCM_REG0_MASK) |
  495. MCUCFG_MCU_MISC_DCM_REG0_ON);
  496. } else {
  497. /* TINFO = "Turn OFF DCM 'mcucfg_mcu_misc_dcm'" */
  498. reg_write(MCU_MISC_DCM_CTRL,
  499. (reg_read(MCU_MISC_DCM_CTRL) &
  500. ~MCUCFG_MCU_MISC_DCM_REG0_MASK) |
  501. MCUCFG_MCU_MISC_DCM_REG0_OFF);
  502. }
  503. }
  504. #define EMI_DCM_EMI_GROUP_REG0_MASK ((0xff << 24))
  505. #define EMI_DCM_EMI_GROUP_REG1_MASK ((0xff << 24))
  506. #define EMI_DCM_EMI_GROUP_REG0_ON ((0x0 << 24))
  507. #define EMI_DCM_EMI_GROUP_REG1_ON ((0x0 << 24))
  508. #define EMI_DCM_EMI_GROUP_REG0_OFF ((0xff << 24))
  509. #define EMI_DCM_EMI_GROUP_REG1_OFF ((0xff << 24))
  510. bool dcm_emi_dcm_emi_group_is_on(void)
  511. {
  512. bool ret = true;
  513. ret &= ((reg_read(EMI_CONM) &
  514. EMI_DCM_EMI_GROUP_REG0_MASK) ==
  515. (unsigned int) EMI_DCM_EMI_GROUP_REG0_ON);
  516. ret &= ((reg_read(EMI_CONN) &
  517. EMI_DCM_EMI_GROUP_REG1_MASK) ==
  518. (unsigned int) EMI_DCM_EMI_GROUP_REG1_ON);
  519. return ret;
  520. }
  521. void dcm_emi_dcm_emi_group(int on)
  522. {
  523. if (on) {
  524. /* TINFO = "Turn ON DCM 'emi_dcm_emi_group'" */
  525. reg_write(EMI_CONM,
  526. (reg_read(EMI_CONM) &
  527. ~EMI_DCM_EMI_GROUP_REG0_MASK) |
  528. EMI_DCM_EMI_GROUP_REG0_ON);
  529. reg_write(EMI_CONN,
  530. (reg_read(EMI_CONN) &
  531. ~EMI_DCM_EMI_GROUP_REG1_MASK) |
  532. EMI_DCM_EMI_GROUP_REG1_ON);
  533. } else {
  534. /* TINFO = "Turn OFF DCM 'emi_dcm_emi_group'" */
  535. reg_write(EMI_CONM,
  536. (reg_read(EMI_CONM) &
  537. ~EMI_DCM_EMI_GROUP_REG0_MASK) |
  538. EMI_DCM_EMI_GROUP_REG0_OFF);
  539. reg_write(EMI_CONN,
  540. (reg_read(EMI_CONN) &
  541. ~EMI_DCM_EMI_GROUP_REG1_MASK) |
  542. EMI_DCM_EMI_GROUP_REG1_OFF);
  543. }
  544. }
  545. #define CHN0_EMI_DCM_EMI_GROUP_REG0_MASK ((0xff << 24))
  546. #define CHN0_EMI_DCM_EMI_GROUP_REG0_ON ((0x0 << 24))
  547. #define CHN0_EMI_DCM_EMI_GROUP_REG0_OFF ((0xff << 24))
  548. bool dcm_chn0_emi_dcm_emi_group_is_on(void)
  549. {
  550. bool ret = true;
  551. ret &= ((reg_read(CHN0_EMI_CHN_EMI_CONB) &
  552. CHN0_EMI_DCM_EMI_GROUP_REG0_MASK) ==
  553. (unsigned int) CHN0_EMI_DCM_EMI_GROUP_REG0_ON);
  554. return ret;
  555. }
  556. void dcm_chn0_emi_dcm_emi_group(int on)
  557. {
  558. if (on) {
  559. /* TINFO = "Turn ON DCM 'chn0_emi_dcm_emi_group'" */
  560. reg_write(CHN0_EMI_CHN_EMI_CONB,
  561. (reg_read(CHN0_EMI_CHN_EMI_CONB) &
  562. ~CHN0_EMI_DCM_EMI_GROUP_REG0_MASK) |
  563. CHN0_EMI_DCM_EMI_GROUP_REG0_ON);
  564. } else {
  565. /* TINFO = "Turn OFF DCM 'chn0_emi_dcm_emi_group'" */
  566. reg_write(CHN0_EMI_CHN_EMI_CONB,
  567. (reg_read(CHN0_EMI_CHN_EMI_CONB) &
  568. ~CHN0_EMI_DCM_EMI_GROUP_REG0_MASK) |
  569. CHN0_EMI_DCM_EMI_GROUP_REG0_OFF);
  570. }
  571. }
  572. #define EFUSEC_DCM_EFUSE_AF_REG0_MASK ((0x1 << 2))
  573. #define EFUSEC_DCM_EFUSE_AF_REG0_ON ((0x1 << 2))
  574. #define EFUSEC_DCM_EFUSE_AF_REG0_OFF ((0x0 << 2))
  575. bool dcm_efusec_dcm_efuse_af_is_on(void)
  576. {
  577. bool ret = true;
  578. ret &= ((reg_read(EFUSEC_DCM_ON) &
  579. EFUSEC_DCM_EFUSE_AF_REG0_MASK) ==
  580. (unsigned int) EFUSEC_DCM_EFUSE_AF_REG0_ON);
  581. return ret;
  582. }
  583. void dcm_efusec_dcm_efuse_af(int on)
  584. {
  585. if (on) {
  586. /* TINFO = "Turn ON DCM 'efusec_dcm_efuse_af'" */
  587. reg_write(EFUSEC_DCM_ON,
  588. (reg_read(EFUSEC_DCM_ON) &
  589. ~EFUSEC_DCM_EFUSE_AF_REG0_MASK) |
  590. EFUSEC_DCM_EFUSE_AF_REG0_ON);
  591. } else {
  592. /* TINFO = "Turn OFF DCM 'efusec_dcm_efuse_af'" */
  593. reg_write(EFUSEC_DCM_ON,
  594. (reg_read(EFUSEC_DCM_ON) &
  595. ~EFUSEC_DCM_EFUSE_AF_REG0_MASK) |
  596. EFUSEC_DCM_EFUSE_AF_REG0_OFF);
  597. }
  598. }
  599. #define EFUSEC_DCM_EFUSE_BG_REG0_MASK ((0x1 << 1))
  600. #define EFUSEC_DCM_EFUSE_BG_REG0_ON ((0x1 << 1))
  601. #define EFUSEC_DCM_EFUSE_BG_REG0_OFF ((0x0 << 1))
  602. bool dcm_efusec_dcm_efuse_bg_is_on(void)
  603. {
  604. bool ret = true;
  605. ret &= ((reg_read(EFUSEC_DCM_ON) &
  606. EFUSEC_DCM_EFUSE_BG_REG0_MASK) ==
  607. (unsigned int) EFUSEC_DCM_EFUSE_BG_REG0_ON);
  608. return ret;
  609. }
  610. void dcm_efusec_dcm_efuse_bg(int on)
  611. {
  612. if (on) {
  613. /* TINFO = "Turn ON DCM 'efusec_dcm_efuse_bg'" */
  614. reg_write(EFUSEC_DCM_ON,
  615. (reg_read(EFUSEC_DCM_ON) &
  616. ~EFUSEC_DCM_EFUSE_BG_REG0_MASK) |
  617. EFUSEC_DCM_EFUSE_BG_REG0_ON);
  618. } else {
  619. /* TINFO = "Turn OFF DCM 'efusec_dcm_efuse_bg'" */
  620. reg_write(EFUSEC_DCM_ON,
  621. (reg_read(EFUSEC_DCM_ON) &
  622. ~EFUSEC_DCM_EFUSE_BG_REG0_MASK) |
  623. EFUSEC_DCM_EFUSE_BG_REG0_OFF);
  624. }
  625. }
  626. #define EFUSEC_DCM_EFUSE_COMMON_REG0_MASK ((0x1 << 0))
  627. #define EFUSEC_DCM_EFUSE_COMMON_REG0_ON ((0x1 << 0))
  628. #define EFUSEC_DCM_EFUSE_COMMON_REG0_OFF ((0x0 << 0))
  629. bool dcm_efusec_dcm_efuse_common_is_on(void)
  630. {
  631. bool ret = true;
  632. ret &= ((reg_read(EFUSEC_DCM_ON) &
  633. EFUSEC_DCM_EFUSE_COMMON_REG0_MASK) ==
  634. (unsigned int) EFUSEC_DCM_EFUSE_COMMON_REG0_ON);
  635. return ret;
  636. }
  637. void dcm_efusec_dcm_efuse_common(int on)
  638. {
  639. if (on) {
  640. /* TINFO = "Turn ON DCM 'efusec_dcm_efuse_common'" */
  641. reg_write(EFUSEC_DCM_ON,
  642. (reg_read(EFUSEC_DCM_ON) &
  643. ~EFUSEC_DCM_EFUSE_COMMON_REG0_MASK) |
  644. EFUSEC_DCM_EFUSE_COMMON_REG0_ON);
  645. } else {
  646. /* TINFO = "Turn OFF DCM 'efusec_dcm_efuse_common'" */
  647. reg_write(EFUSEC_DCM_ON,
  648. (reg_read(EFUSEC_DCM_ON) &
  649. ~EFUSEC_DCM_EFUSE_COMMON_REG0_MASK) |
  650. EFUSEC_DCM_EFUSE_COMMON_REG0_OFF);
  651. }
  652. }