pmu.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. /*
  2. * Copyright (c) 2011-2012 Samsung Electronics Co., Ltd.
  3. * http://www.samsung.com/
  4. *
  5. * EXYNOS - CPU PMU(Power Management Unit) support
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License version 2 as
  9. * published by the Free Software Foundation.
  10. */
  11. #include <linux/io.h>
  12. #include <linux/kernel.h>
  13. #include <linux/bug.h>
  14. #include <mach/regs-clock.h>
  15. #include "common.h"
  16. static struct exynos_pmu_conf *exynos_pmu_config;
  17. static struct exynos_pmu_conf exynos4210_pmu_config[] = {
  18. /* { .reg = address, .val = { AFTR, LPA, SLEEP } */
  19. { S5P_ARM_CORE0_LOWPWR, { 0x0, 0x0, 0x2 } },
  20. { S5P_DIS_IRQ_CORE0, { 0x0, 0x0, 0x0 } },
  21. { S5P_DIS_IRQ_CENTRAL0, { 0x0, 0x0, 0x0 } },
  22. { S5P_ARM_CORE1_LOWPWR, { 0x0, 0x0, 0x2 } },
  23. { S5P_DIS_IRQ_CORE1, { 0x0, 0x0, 0x0 } },
  24. { S5P_DIS_IRQ_CENTRAL1, { 0x0, 0x0, 0x0 } },
  25. { S5P_ARM_COMMON_LOWPWR, { 0x0, 0x0, 0x2 } },
  26. { S5P_L2_0_LOWPWR, { 0x2, 0x2, 0x3 } },
  27. { S5P_L2_1_LOWPWR, { 0x2, 0x2, 0x3 } },
  28. { S5P_CMU_ACLKSTOP_LOWPWR, { 0x1, 0x0, 0x0 } },
  29. { S5P_CMU_SCLKSTOP_LOWPWR, { 0x1, 0x0, 0x0 } },
  30. { S5P_CMU_RESET_LOWPWR, { 0x1, 0x1, 0x0 } },
  31. { S5P_APLL_SYSCLK_LOWPWR, { 0x1, 0x0, 0x0 } },
  32. { S5P_MPLL_SYSCLK_LOWPWR, { 0x1, 0x0, 0x0 } },
  33. { S5P_VPLL_SYSCLK_LOWPWR, { 0x1, 0x0, 0x0 } },
  34. { S5P_EPLL_SYSCLK_LOWPWR, { 0x1, 0x1, 0x0 } },
  35. { S5P_CMU_CLKSTOP_GPS_ALIVE_LOWPWR, { 0x1, 0x1, 0x0 } },
  36. { S5P_CMU_RESET_GPSALIVE_LOWPWR, { 0x1, 0x1, 0x0 } },
  37. { S5P_CMU_CLKSTOP_CAM_LOWPWR, { 0x1, 0x1, 0x0 } },
  38. { S5P_CMU_CLKSTOP_TV_LOWPWR, { 0x1, 0x1, 0x0 } },
  39. { S5P_CMU_CLKSTOP_MFC_LOWPWR, { 0x1, 0x1, 0x0 } },
  40. { S5P_CMU_CLKSTOP_G3D_LOWPWR, { 0x1, 0x1, 0x0 } },
  41. { S5P_CMU_CLKSTOP_LCD0_LOWPWR, { 0x1, 0x1, 0x0 } },
  42. { S5P_CMU_CLKSTOP_LCD1_LOWPWR, { 0x1, 0x1, 0x0 } },
  43. { S5P_CMU_CLKSTOP_MAUDIO_LOWPWR, { 0x1, 0x1, 0x0 } },
  44. { S5P_CMU_CLKSTOP_GPS_LOWPWR, { 0x1, 0x1, 0x0 } },
  45. { S5P_CMU_RESET_CAM_LOWPWR, { 0x1, 0x1, 0x0 } },
  46. { S5P_CMU_RESET_TV_LOWPWR, { 0x1, 0x1, 0x0 } },
  47. { S5P_CMU_RESET_MFC_LOWPWR, { 0x1, 0x1, 0x0 } },
  48. { S5P_CMU_RESET_G3D_LOWPWR, { 0x1, 0x1, 0x0 } },
  49. { S5P_CMU_RESET_LCD0_LOWPWR, { 0x1, 0x1, 0x0 } },
  50. { S5P_CMU_RESET_LCD1_LOWPWR, { 0x1, 0x1, 0x0 } },
  51. { S5P_CMU_RESET_MAUDIO_LOWPWR, { 0x1, 0x1, 0x0 } },
  52. { S5P_CMU_RESET_GPS_LOWPWR, { 0x1, 0x1, 0x0 } },
  53. { S5P_TOP_BUS_LOWPWR, { 0x3, 0x0, 0x0 } },
  54. { S5P_TOP_RETENTION_LOWPWR, { 0x1, 0x0, 0x1 } },
  55. { S5P_TOP_PWR_LOWPWR, { 0x3, 0x0, 0x3 } },
  56. { S5P_LOGIC_RESET_LOWPWR, { 0x1, 0x1, 0x0 } },
  57. { S5P_ONENAND_MEM_LOWPWR, { 0x3, 0x0, 0x0 } },
  58. { S5P_MODIMIF_MEM_LOWPWR, { 0x3, 0x0, 0x0 } },
  59. { S5P_G2D_ACP_MEM_LOWPWR, { 0x3, 0x0, 0x0 } },
  60. { S5P_USBOTG_MEM_LOWPWR, { 0x3, 0x0, 0x0 } },
  61. { S5P_HSMMC_MEM_LOWPWR, { 0x3, 0x0, 0x0 } },
  62. { S5P_CSSYS_MEM_LOWPWR, { 0x3, 0x0, 0x0 } },
  63. { S5P_SECSS_MEM_LOWPWR, { 0x3, 0x0, 0x0 } },
  64. { S5P_PCIE_MEM_LOWPWR, { 0x3, 0x0, 0x0 } },
  65. { S5P_SATA_MEM_LOWPWR, { 0x3, 0x0, 0x0 } },
  66. { S5P_PAD_RETENTION_DRAM_LOWPWR, { 0x1, 0x0, 0x0 } },
  67. { S5P_PAD_RETENTION_MAUDIO_LOWPWR, { 0x1, 0x1, 0x0 } },
  68. { S5P_PAD_RETENTION_GPIO_LOWPWR, { 0x1, 0x0, 0x0 } },
  69. { S5P_PAD_RETENTION_UART_LOWPWR, { 0x1, 0x0, 0x0 } },
  70. { S5P_PAD_RETENTION_MMCA_LOWPWR, { 0x1, 0x0, 0x0 } },
  71. { S5P_PAD_RETENTION_MMCB_LOWPWR, { 0x1, 0x0, 0x0 } },
  72. { S5P_PAD_RETENTION_EBIA_LOWPWR, { 0x1, 0x0, 0x0 } },
  73. { S5P_PAD_RETENTION_EBIB_LOWPWR, { 0x1, 0x0, 0x0 } },
  74. { S5P_PAD_RETENTION_ISOLATION_LOWPWR, { 0x1, 0x0, 0x0 } },
  75. { S5P_PAD_RETENTION_ALV_SEL_LOWPWR, { 0x1, 0x0, 0x0 } },
  76. { S5P_XUSBXTI_LOWPWR, { 0x1, 0x1, 0x0 } },
  77. { S5P_XXTI_LOWPWR, { 0x1, 0x1, 0x0 } },
  78. { S5P_EXT_REGULATOR_LOWPWR, { 0x1, 0x1, 0x0 } },
  79. { S5P_GPIO_MODE_LOWPWR, { 0x1, 0x0, 0x0 } },
  80. { S5P_GPIO_MODE_MAUDIO_LOWPWR, { 0x1, 0x1, 0x0 } },
  81. { S5P_CAM_LOWPWR, { 0x7, 0x0, 0x0 } },
  82. { S5P_TV_LOWPWR, { 0x7, 0x0, 0x0 } },
  83. { S5P_MFC_LOWPWR, { 0x7, 0x0, 0x0 } },
  84. { S5P_G3D_LOWPWR, { 0x7, 0x0, 0x0 } },
  85. { S5P_LCD0_LOWPWR, { 0x7, 0x0, 0x0 } },
  86. { S5P_LCD1_LOWPWR, { 0x7, 0x0, 0x0 } },
  87. { S5P_MAUDIO_LOWPWR, { 0x7, 0x7, 0x0 } },
  88. { S5P_GPS_LOWPWR, { 0x7, 0x0, 0x0 } },
  89. { S5P_GPS_ALIVE_LOWPWR, { 0x7, 0x0, 0x0 } },
  90. { PMU_TABLE_END,},
  91. };
  92. static struct exynos_pmu_conf exynos4x12_pmu_config[] = {
  93. { S5P_ARM_CORE0_LOWPWR, { 0x0, 0x0, 0x2 } },
  94. { S5P_DIS_IRQ_CORE0, { 0x0, 0x0, 0x0 } },
  95. { S5P_DIS_IRQ_CENTRAL0, { 0x0, 0x0, 0x0 } },
  96. { S5P_ARM_CORE1_LOWPWR, { 0x0, 0x0, 0x2 } },
  97. { S5P_DIS_IRQ_CORE1, { 0x0, 0x0, 0x0 } },
  98. { S5P_DIS_IRQ_CENTRAL1, { 0x0, 0x0, 0x0 } },
  99. { S5P_ISP_ARM_LOWPWR, { 0x1, 0x0, 0x0 } },
  100. { S5P_DIS_IRQ_ISP_ARM_LOCAL_LOWPWR, { 0x0, 0x0, 0x0 } },
  101. { S5P_DIS_IRQ_ISP_ARM_CENTRAL_LOWPWR, { 0x0, 0x0, 0x0 } },
  102. { S5P_ARM_COMMON_LOWPWR, { 0x0, 0x0, 0x2 } },
  103. { S5P_L2_0_LOWPWR, { 0x0, 0x0, 0x3 } },
  104. /* XXX_OPTION register should be set other field */
  105. { S5P_ARM_L2_0_OPTION, { 0x10, 0x10, 0x0 } },
  106. { S5P_L2_1_LOWPWR, { 0x0, 0x0, 0x3 } },
  107. { S5P_ARM_L2_1_OPTION, { 0x10, 0x10, 0x0 } },
  108. { S5P_CMU_ACLKSTOP_LOWPWR, { 0x1, 0x0, 0x0 } },
  109. { S5P_CMU_SCLKSTOP_LOWPWR, { 0x1, 0x0, 0x0 } },
  110. { S5P_CMU_RESET_LOWPWR, { 0x1, 0x1, 0x0 } },
  111. { S5P_DRAM_FREQ_DOWN_LOWPWR, { 0x1, 0x1, 0x1 } },
  112. { S5P_DDRPHY_DLLOFF_LOWPWR, { 0x1, 0x1, 0x1 } },
  113. { S5P_LPDDR_PHY_DLL_LOCK_LOWPWR, { 0x1, 0x1, 0x1 } },
  114. { S5P_CMU_ACLKSTOP_COREBLK_LOWPWR, { 0x1, 0x0, 0x0 } },
  115. { S5P_CMU_SCLKSTOP_COREBLK_LOWPWR, { 0x1, 0x0, 0x0 } },
  116. { S5P_CMU_RESET_COREBLK_LOWPWR, { 0x1, 0x1, 0x0 } },
  117. { S5P_APLL_SYSCLK_LOWPWR, { 0x1, 0x0, 0x0 } },
  118. { S5P_MPLL_SYSCLK_LOWPWR, { 0x1, 0x0, 0x0 } },
  119. { S5P_VPLL_SYSCLK_LOWPWR, { 0x1, 0x0, 0x0 } },
  120. { S5P_EPLL_SYSCLK_LOWPWR, { 0x1, 0x1, 0x0 } },
  121. { S5P_MPLLUSER_SYSCLK_LOWPWR, { 0x1, 0x0, 0x0 } },
  122. { S5P_CMU_CLKSTOP_GPS_ALIVE_LOWPWR, { 0x1, 0x0, 0x0 } },
  123. { S5P_CMU_RESET_GPSALIVE_LOWPWR, { 0x1, 0x0, 0x0 } },
  124. { S5P_CMU_CLKSTOP_CAM_LOWPWR, { 0x1, 0x0, 0x0 } },
  125. { S5P_CMU_CLKSTOP_TV_LOWPWR, { 0x1, 0x0, 0x0 } },
  126. { S5P_CMU_CLKSTOP_MFC_LOWPWR, { 0x1, 0x0, 0x0 } },
  127. { S5P_CMU_CLKSTOP_G3D_LOWPWR, { 0x1, 0x0, 0x0 } },
  128. { S5P_CMU_CLKSTOP_LCD0_LOWPWR, { 0x1, 0x0, 0x0 } },
  129. { S5P_CMU_CLKSTOP_ISP_LOWPWR, { 0x1, 0x0, 0x0 } },
  130. { S5P_CMU_CLKSTOP_MAUDIO_LOWPWR, { 0x1, 0x0, 0x0 } },
  131. { S5P_CMU_CLKSTOP_GPS_LOWPWR, { 0x1, 0x0, 0x0 } },
  132. { S5P_CMU_RESET_CAM_LOWPWR, { 0x1, 0x0, 0x0 } },
  133. { S5P_CMU_RESET_TV_LOWPWR, { 0x1, 0x0, 0x0 } },
  134. { S5P_CMU_RESET_MFC_LOWPWR, { 0x1, 0x0, 0x0 } },
  135. { S5P_CMU_RESET_G3D_LOWPWR, { 0x1, 0x0, 0x0 } },
  136. { S5P_CMU_RESET_LCD0_LOWPWR, { 0x1, 0x0, 0x0 } },
  137. { S5P_CMU_RESET_ISP_LOWPWR, { 0x1, 0x0, 0x0 } },
  138. { S5P_CMU_RESET_MAUDIO_LOWPWR, { 0x1, 0x1, 0x0 } },
  139. { S5P_CMU_RESET_GPS_LOWPWR, { 0x1, 0x0, 0x0 } },
  140. { S5P_TOP_BUS_LOWPWR, { 0x3, 0x0, 0x0 } },
  141. { S5P_TOP_RETENTION_LOWPWR, { 0x1, 0x0, 0x1 } },
  142. { S5P_TOP_PWR_LOWPWR, { 0x3, 0x0, 0x3 } },
  143. { S5P_TOP_BUS_COREBLK_LOWPWR, { 0x3, 0x0, 0x0 } },
  144. { S5P_TOP_RETENTION_COREBLK_LOWPWR, { 0x1, 0x0, 0x1 } },
  145. { S5P_TOP_PWR_COREBLK_LOWPWR, { 0x3, 0x0, 0x3 } },
  146. { S5P_LOGIC_RESET_LOWPWR, { 0x1, 0x1, 0x0 } },
  147. { S5P_OSCCLK_GATE_LOWPWR, { 0x1, 0x0, 0x1 } },
  148. { S5P_LOGIC_RESET_COREBLK_LOWPWR, { 0x1, 0x1, 0x0 } },
  149. { S5P_OSCCLK_GATE_COREBLK_LOWPWR, { 0x1, 0x0, 0x1 } },
  150. { S5P_ONENAND_MEM_LOWPWR, { 0x3, 0x0, 0x0 } },
  151. { S5P_ONENAND_MEM_OPTION, { 0x10, 0x10, 0x0 } },
  152. { S5P_HSI_MEM_LOWPWR, { 0x3, 0x0, 0x0 } },
  153. { S5P_HSI_MEM_OPTION, { 0x10, 0x10, 0x0 } },
  154. { S5P_G2D_ACP_MEM_LOWPWR, { 0x3, 0x0, 0x0 } },
  155. { S5P_G2D_ACP_MEM_OPTION, { 0x10, 0x10, 0x0 } },
  156. { S5P_USBOTG_MEM_LOWPWR, { 0x3, 0x0, 0x0 } },
  157. { S5P_USBOTG_MEM_OPTION, { 0x10, 0x10, 0x0 } },
  158. { S5P_HSMMC_MEM_LOWPWR, { 0x3, 0x0, 0x0 } },
  159. { S5P_HSMMC_MEM_OPTION, { 0x10, 0x10, 0x0 } },
  160. { S5P_CSSYS_MEM_LOWPWR, { 0x3, 0x0, 0x0 } },
  161. { S5P_CSSYS_MEM_OPTION, { 0x10, 0x10, 0x0 } },
  162. { S5P_SECSS_MEM_LOWPWR, { 0x3, 0x0, 0x0 } },
  163. { S5P_SECSS_MEM_OPTION, { 0x10, 0x10, 0x0 } },
  164. { S5P_ROTATOR_MEM_LOWPWR, { 0x3, 0x0, 0x0 } },
  165. { S5P_ROTATOR_MEM_OPTION, { 0x10, 0x10, 0x0 } },
  166. { S5P_PAD_RETENTION_DRAM_LOWPWR, { 0x1, 0x0, 0x0 } },
  167. { S5P_PAD_RETENTION_MAUDIO_LOWPWR, { 0x1, 0x1, 0x0 } },
  168. { S5P_PAD_RETENTION_GPIO_LOWPWR, { 0x1, 0x0, 0x0 } },
  169. { S5P_PAD_RETENTION_UART_LOWPWR, { 0x1, 0x0, 0x0 } },
  170. { S5P_PAD_RETENTION_MMCA_LOWPWR, { 0x1, 0x0, 0x0 } },
  171. { S5P_PAD_RETENTION_MMCB_LOWPWR, { 0x1, 0x0, 0x0 } },
  172. { S5P_PAD_RETENTION_EBIA_LOWPWR, { 0x1, 0x0, 0x0 } },
  173. { S5P_PAD_RETENTION_EBIB_LOWPWR, { 0x1, 0x0, 0x0 } },
  174. { S5P_PAD_RETENTION_GPIO_COREBLK_LOWPWR,{ 0x1, 0x0, 0x0 } },
  175. { S5P_PAD_RETENTION_ISOLATION_LOWPWR, { 0x1, 0x0, 0x0 } },
  176. { S5P_PAD_ISOLATION_COREBLK_LOWPWR, { 0x1, 0x0, 0x0 } },
  177. { S5P_PAD_RETENTION_ALV_SEL_LOWPWR, { 0x1, 0x0, 0x0 } },
  178. { S5P_XUSBXTI_LOWPWR, { 0x1, 0x1, 0x0 } },
  179. { S5P_XXTI_LOWPWR, { 0x1, 0x1, 0x0 } },
  180. { S5P_EXT_REGULATOR_LOWPWR, { 0x1, 0x1, 0x0 } },
  181. { S5P_GPIO_MODE_LOWPWR, { 0x1, 0x0, 0x0 } },
  182. { S5P_GPIO_MODE_COREBLK_LOWPWR, { 0x1, 0x0, 0x0 } },
  183. { S5P_GPIO_MODE_MAUDIO_LOWPWR, { 0x1, 0x1, 0x0 } },
  184. { S5P_TOP_ASB_RESET_LOWPWR, { 0x1, 0x1, 0x1 } },
  185. { S5P_TOP_ASB_ISOLATION_LOWPWR, { 0x1, 0x0, 0x1 } },
  186. { S5P_CAM_LOWPWR, { 0x7, 0x0, 0x0 } },
  187. { S5P_TV_LOWPWR, { 0x7, 0x0, 0x0 } },
  188. { S5P_MFC_LOWPWR, { 0x7, 0x0, 0x0 } },
  189. { S5P_G3D_LOWPWR, { 0x7, 0x0, 0x0 } },
  190. { S5P_LCD0_LOWPWR, { 0x7, 0x0, 0x0 } },
  191. { S5P_ISP_LOWPWR, { 0x7, 0x0, 0x0 } },
  192. { S5P_MAUDIO_LOWPWR, { 0x7, 0x7, 0x0 } },
  193. { S5P_GPS_LOWPWR, { 0x7, 0x0, 0x0 } },
  194. { S5P_GPS_ALIVE_LOWPWR, { 0x7, 0x0, 0x0 } },
  195. { S5P_CMU_SYSCLK_ISP_LOWPWR, { 0x1, 0x0, 0x0 } },
  196. { S5P_CMU_SYSCLK_GPS_LOWPWR, { 0x1, 0x0, 0x0 } },
  197. { PMU_TABLE_END,},
  198. };
  199. static struct exynos_pmu_conf exynos4412_pmu_config[] = {
  200. { S5P_ARM_CORE2_LOWPWR, { 0x0, 0x0, 0x2 } },
  201. { S5P_DIS_IRQ_CORE2, { 0x0, 0x0, 0x0 } },
  202. { S5P_DIS_IRQ_CENTRAL2, { 0x0, 0x0, 0x0 } },
  203. { S5P_ARM_CORE3_LOWPWR, { 0x0, 0x0, 0x2 } },
  204. { S5P_DIS_IRQ_CORE3, { 0x0, 0x0, 0x0 } },
  205. { S5P_DIS_IRQ_CENTRAL3, { 0x0, 0x0, 0x0 } },
  206. { PMU_TABLE_END,},
  207. };
  208. static struct exynos_pmu_conf exynos5250_pmu_config[] = {
  209. /* { .reg = address, .val = { AFTR, LPA, SLEEP } */
  210. { EXYNOS5_ARM_CORE0_SYS_PWR_REG, { 0x0, 0x0, 0x2} },
  211. { EXYNOS5_DIS_IRQ_ARM_CORE0_LOCAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
  212. { EXYNOS5_DIS_IRQ_ARM_CORE0_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
  213. { EXYNOS5_ARM_CORE1_SYS_PWR_REG, { 0x0, 0x0, 0x2} },
  214. { EXYNOS5_DIS_IRQ_ARM_CORE1_LOCAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
  215. { EXYNOS5_DIS_IRQ_ARM_CORE1_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
  216. { EXYNOS5_FSYS_ARM_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  217. { EXYNOS5_DIS_IRQ_FSYS_ARM_CENTRAL_SYS_PWR_REG, { 0x1, 0x1, 0x1} },
  218. { EXYNOS5_ISP_ARM_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  219. { EXYNOS5_DIS_IRQ_ISP_ARM_LOCAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
  220. { EXYNOS5_DIS_IRQ_ISP_ARM_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
  221. { EXYNOS5_ARM_COMMON_SYS_PWR_REG, { 0x0, 0x0, 0x2} },
  222. { EXYNOS5_ARM_L2_SYS_PWR_REG, { 0x3, 0x3, 0x3} },
  223. { EXYNOS5_CMU_ACLKSTOP_SYS_PWR_REG, { 0x1, 0x0, 0x1} },
  224. { EXYNOS5_CMU_SCLKSTOP_SYS_PWR_REG, { 0x1, 0x0, 0x1} },
  225. { EXYNOS5_CMU_RESET_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
  226. { EXYNOS5_CMU_ACLKSTOP_SYSMEM_SYS_PWR_REG, { 0x1, 0x0, 0x1} },
  227. { EXYNOS5_CMU_SCLKSTOP_SYSMEM_SYS_PWR_REG, { 0x1, 0x0, 0x1} },
  228. { EXYNOS5_CMU_RESET_SYSMEM_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
  229. { EXYNOS5_DRAM_FREQ_DOWN_SYS_PWR_REG, { 0x1, 0x1, 0x1} },
  230. { EXYNOS5_DDRPHY_DLLOFF_SYS_PWR_REG, { 0x1, 0x1, 0x1} },
  231. { EXYNOS5_DDRPHY_DLLLOCK_SYS_PWR_REG, { 0x1, 0x1, 0x1} },
  232. { EXYNOS5_APLL_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  233. { EXYNOS5_MPLL_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  234. { EXYNOS5_VPLL_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  235. { EXYNOS5_EPLL_SYSCLK_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
  236. { EXYNOS5_BPLL_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  237. { EXYNOS5_CPLL_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  238. { EXYNOS5_MPLLUSER_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  239. { EXYNOS5_BPLLUSER_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  240. { EXYNOS5_TOP_BUS_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
  241. { EXYNOS5_TOP_RETENTION_SYS_PWR_REG, { 0x1, 0x0, 0x1} },
  242. { EXYNOS5_TOP_PWR_SYS_PWR_REG, { 0x3, 0x0, 0x3} },
  243. { EXYNOS5_TOP_BUS_SYSMEM_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
  244. { EXYNOS5_TOP_RETENTION_SYSMEM_SYS_PWR_REG, { 0x1, 0x0, 0x1} },
  245. { EXYNOS5_TOP_PWR_SYSMEM_SYS_PWR_REG, { 0x3, 0x0, 0x3} },
  246. { EXYNOS5_LOGIC_RESET_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
  247. { EXYNOS5_OSCCLK_GATE_SYS_PWR_REG, { 0x1, 0x0, 0x1} },
  248. { EXYNOS5_LOGIC_RESET_SYSMEM_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
  249. { EXYNOS5_OSCCLK_GATE_SYSMEM_SYS_PWR_REG, { 0x1, 0x0, 0x1} },
  250. { EXYNOS5_USBOTG_MEM_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
  251. { EXYNOS5_G2D_MEM_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
  252. { EXYNOS5_USBDRD_MEM_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
  253. { EXYNOS5_SDMMC_MEM_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
  254. { EXYNOS5_CSSYS_MEM_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
  255. { EXYNOS5_SECSS_MEM_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
  256. { EXYNOS5_ROTATOR_MEM_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
  257. { EXYNOS5_INTRAM_MEM_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
  258. { EXYNOS5_INTROM_MEM_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
  259. { EXYNOS5_JPEG_MEM_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
  260. { EXYNOS5_HSI_MEM_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
  261. { EXYNOS5_MCUIOP_MEM_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
  262. { EXYNOS5_SATA_MEM_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
  263. { EXYNOS5_PAD_RETENTION_DRAM_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  264. { EXYNOS5_PAD_RETENTION_MAU_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
  265. { EXYNOS5_PAD_RETENTION_GPIO_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  266. { EXYNOS5_PAD_RETENTION_UART_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  267. { EXYNOS5_PAD_RETENTION_MMCA_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  268. { EXYNOS5_PAD_RETENTION_MMCB_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  269. { EXYNOS5_PAD_RETENTION_EBIA_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  270. { EXYNOS5_PAD_RETENTION_EBIB_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  271. { EXYNOS5_PAD_RETENTION_SPI_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  272. { EXYNOS5_PAD_RETENTION_GPIO_SYSMEM_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  273. { EXYNOS5_PAD_ISOLATION_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  274. { EXYNOS5_PAD_ISOLATION_SYSMEM_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  275. { EXYNOS5_PAD_ALV_SEL_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  276. { EXYNOS5_XUSBXTI_SYS_PWR_REG, { 0x1, 0x1, 0x1} },
  277. { EXYNOS5_XXTI_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
  278. { EXYNOS5_EXT_REGULATOR_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
  279. { EXYNOS5_GPIO_MODE_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  280. { EXYNOS5_GPIO_MODE_SYSMEM_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  281. { EXYNOS5_GPIO_MODE_MAU_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
  282. { EXYNOS5_TOP_ASB_RESET_SYS_PWR_REG, { 0x1, 0x1, 0x1} },
  283. { EXYNOS5_TOP_ASB_ISOLATION_SYS_PWR_REG, { 0x1, 0x0, 0x1} },
  284. { EXYNOS5_GSCL_SYS_PWR_REG, { 0x7, 0x0, 0x0} },
  285. { EXYNOS5_ISP_SYS_PWR_REG, { 0x7, 0x0, 0x0} },
  286. { EXYNOS5_MFC_SYS_PWR_REG, { 0x7, 0x0, 0x0} },
  287. { EXYNOS5_G3D_SYS_PWR_REG, { 0x7, 0x0, 0x0} },
  288. { EXYNOS5_DISP1_SYS_PWR_REG, { 0x7, 0x0, 0x0} },
  289. { EXYNOS5_MAU_SYS_PWR_REG, { 0x7, 0x7, 0x0} },
  290. { EXYNOS5_CMU_CLKSTOP_GSCL_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  291. { EXYNOS5_CMU_CLKSTOP_ISP_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  292. { EXYNOS5_CMU_CLKSTOP_MFC_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  293. { EXYNOS5_CMU_CLKSTOP_G3D_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  294. { EXYNOS5_CMU_CLKSTOP_DISP1_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  295. { EXYNOS5_CMU_CLKSTOP_MAU_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
  296. { EXYNOS5_CMU_SYSCLK_GSCL_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  297. { EXYNOS5_CMU_SYSCLK_ISP_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  298. { EXYNOS5_CMU_SYSCLK_MFC_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  299. { EXYNOS5_CMU_SYSCLK_G3D_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  300. { EXYNOS5_CMU_SYSCLK_DISP1_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  301. { EXYNOS5_CMU_SYSCLK_MAU_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
  302. { EXYNOS5_CMU_RESET_GSCL_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  303. { EXYNOS5_CMU_RESET_ISP_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  304. { EXYNOS5_CMU_RESET_MFC_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  305. { EXYNOS5_CMU_RESET_G3D_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  306. { EXYNOS5_CMU_RESET_DISP1_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
  307. { EXYNOS5_CMU_RESET_MAU_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
  308. { PMU_TABLE_END,},
  309. };
  310. static void __iomem *exynos5_list_both_cnt_feed[] = {
  311. EXYNOS5_ARM_CORE0_OPTION,
  312. EXYNOS5_ARM_CORE1_OPTION,
  313. EXYNOS5_ARM_COMMON_OPTION,
  314. EXYNOS5_GSCL_OPTION,
  315. EXYNOS5_ISP_OPTION,
  316. EXYNOS5_MFC_OPTION,
  317. EXYNOS5_G3D_OPTION,
  318. EXYNOS5_DISP1_OPTION,
  319. EXYNOS5_MAU_OPTION,
  320. EXYNOS5_TOP_PWR_OPTION,
  321. EXYNOS5_TOP_PWR_SYSMEM_OPTION,
  322. };
  323. static void __iomem *exynos5_list_diable_wfi_wfe[] = {
  324. EXYNOS5_ARM_CORE1_OPTION,
  325. EXYNOS5_FSYS_ARM_OPTION,
  326. EXYNOS5_ISP_ARM_OPTION,
  327. };
  328. static void exynos5_init_pmu(void)
  329. {
  330. unsigned int i;
  331. unsigned int tmp;
  332. /*
  333. * Enable both SC_FEEDBACK and SC_COUNTER
  334. */
  335. for (i = 0 ; i < ARRAY_SIZE(exynos5_list_both_cnt_feed) ; i++) {
  336. tmp = __raw_readl(exynos5_list_both_cnt_feed[i]);
  337. tmp |= (EXYNOS5_USE_SC_FEEDBACK |
  338. EXYNOS5_USE_SC_COUNTER);
  339. __raw_writel(tmp, exynos5_list_both_cnt_feed[i]);
  340. }
  341. /*
  342. * SKIP_DEACTIVATE_ACEACP_IN_PWDN_BITFIELD Enable
  343. * MANUAL_L2RSTDISABLE_CONTROL_BITFIELD Enable
  344. */
  345. tmp = __raw_readl(EXYNOS5_ARM_COMMON_OPTION);
  346. tmp |= (EXYNOS5_MANUAL_L2RSTDISABLE_CONTROL |
  347. EXYNOS5_SKIP_DEACTIVATE_ACEACP_IN_PWDN);
  348. __raw_writel(tmp, EXYNOS5_ARM_COMMON_OPTION);
  349. /*
  350. * Disable WFI/WFE on XXX_OPTION
  351. */
  352. for (i = 0 ; i < ARRAY_SIZE(exynos5_list_diable_wfi_wfe) ; i++) {
  353. tmp = __raw_readl(exynos5_list_diable_wfi_wfe[i]);
  354. tmp &= ~(EXYNOS5_OPTION_USE_STANDBYWFE |
  355. EXYNOS5_OPTION_USE_STANDBYWFI);
  356. __raw_writel(tmp, exynos5_list_diable_wfi_wfe[i]);
  357. }
  358. }
  359. void exynos_sys_powerdown_conf(enum sys_powerdown mode)
  360. {
  361. unsigned int i;
  362. if (soc_is_exynos5250())
  363. exynos5_init_pmu();
  364. for (i = 0; (exynos_pmu_config[i].reg != PMU_TABLE_END) ; i++)
  365. __raw_writel(exynos_pmu_config[i].val[mode],
  366. exynos_pmu_config[i].reg);
  367. if (soc_is_exynos4412()) {
  368. for (i = 0; exynos4412_pmu_config[i].reg != PMU_TABLE_END ; i++)
  369. __raw_writel(exynos4412_pmu_config[i].val[mode],
  370. exynos4412_pmu_config[i].reg);
  371. }
  372. }
  373. static int __init exynos_pmu_init(void)
  374. {
  375. unsigned int value;
  376. exynos_pmu_config = exynos4210_pmu_config;
  377. if (soc_is_exynos4210()) {
  378. exynos_pmu_config = exynos4210_pmu_config;
  379. pr_info("EXYNOS4210 PMU Initialize\n");
  380. } else if (soc_is_exynos4212() || soc_is_exynos4412()) {
  381. exynos_pmu_config = exynos4x12_pmu_config;
  382. pr_info("EXYNOS4x12 PMU Initialize\n");
  383. } else if (soc_is_exynos5250()) {
  384. /*
  385. * When SYS_WDTRESET is set, watchdog timer reset request
  386. * is ignored by power management unit.
  387. */
  388. value = __raw_readl(EXYNOS5_AUTO_WDTRESET_DISABLE);
  389. value &= ~EXYNOS5_SYS_WDTRESET;
  390. __raw_writel(value, EXYNOS5_AUTO_WDTRESET_DISABLE);
  391. value = __raw_readl(EXYNOS5_MASK_WDTRESET_REQUEST);
  392. value &= ~EXYNOS5_SYS_WDTRESET;
  393. __raw_writel(value, EXYNOS5_MASK_WDTRESET_REQUEST);
  394. exynos_pmu_config = exynos5250_pmu_config;
  395. pr_info("EXYNOS5250 PMU Initialize\n");
  396. } else {
  397. pr_info("EXYNOS: PMU not supported\n");
  398. }
  399. return 0;
  400. }
  401. arch_initcall(exynos_pmu_init);