powerdomains34xx.h 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. /*
  2. * OMAP34XX powerdomain definitions
  3. *
  4. * Copyright (C) 2007-2008 Texas Instruments, Inc.
  5. * Copyright (C) 2007-2008 Nokia Corporation
  6. *
  7. * Written by Paul Walmsley
  8. * Debugging and integration fixes by Jouni Högander
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License version 2 as
  12. * published by the Free Software Foundation.
  13. */
  14. #ifndef ARCH_ARM_MACH_OMAP2_POWERDOMAINS34XX
  15. #define ARCH_ARM_MACH_OMAP2_POWERDOMAINS34XX
  16. /*
  17. * N.B. If powerdomains are added or removed from this file, update
  18. * the array in mach-omap2/powerdomains.h.
  19. */
  20. #include <mach/powerdomain.h>
  21. #include "prcm-common.h"
  22. #include "prm.h"
  23. #include "prm-regbits-34xx.h"
  24. #include "cm.h"
  25. #include "cm-regbits-34xx.h"
  26. /*
  27. * 34XX-specific powerdomains, dependencies
  28. */
  29. #ifdef CONFIG_ARCH_OMAP34XX
  30. /*
  31. * 3430: PM_WKDEP_{PER,USBHOST}: CORE, IVA2, MPU, WKUP
  32. * (USBHOST is ES2 only)
  33. */
  34. static struct pwrdm_dep per_usbhost_wkdeps[] = {
  35. {
  36. .pwrdm_name = "core_pwrdm",
  37. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  38. },
  39. {
  40. .pwrdm_name = "iva2_pwrdm",
  41. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  42. },
  43. {
  44. .pwrdm_name = "mpu_pwrdm",
  45. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  46. },
  47. {
  48. .pwrdm_name = "wkup_pwrdm",
  49. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  50. },
  51. { NULL },
  52. };
  53. /*
  54. * 3430 PM_WKDEP_MPU: CORE, IVA2, DSS, PER
  55. */
  56. static struct pwrdm_dep mpu_34xx_wkdeps[] = {
  57. {
  58. .pwrdm_name = "core_pwrdm",
  59. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  60. },
  61. {
  62. .pwrdm_name = "iva2_pwrdm",
  63. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  64. },
  65. {
  66. .pwrdm_name = "dss_pwrdm",
  67. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  68. },
  69. {
  70. .pwrdm_name = "per_pwrdm",
  71. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  72. },
  73. { NULL },
  74. };
  75. /*
  76. * 3430 PM_WKDEP_IVA2: CORE, MPU, WKUP, DSS, PER
  77. */
  78. static struct pwrdm_dep iva2_wkdeps[] = {
  79. {
  80. .pwrdm_name = "core_pwrdm",
  81. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  82. },
  83. {
  84. .pwrdm_name = "mpu_pwrdm",
  85. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  86. },
  87. {
  88. .pwrdm_name = "wkup_pwrdm",
  89. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  90. },
  91. {
  92. .pwrdm_name = "dss_pwrdm",
  93. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  94. },
  95. {
  96. .pwrdm_name = "per_pwrdm",
  97. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  98. },
  99. { NULL },
  100. };
  101. /* 3430 PM_WKDEP_{CAM,DSS}: IVA2, MPU, WKUP */
  102. static struct pwrdm_dep cam_dss_wkdeps[] = {
  103. {
  104. .pwrdm_name = "iva2_pwrdm",
  105. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  106. },
  107. {
  108. .pwrdm_name = "mpu_pwrdm",
  109. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  110. },
  111. {
  112. .pwrdm_name = "wkup_pwrdm",
  113. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  114. },
  115. { NULL },
  116. };
  117. /* 3430: PM_WKDEP_NEON: MPU */
  118. static struct pwrdm_dep neon_wkdeps[] = {
  119. {
  120. .pwrdm_name = "mpu_pwrdm",
  121. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  122. },
  123. { NULL },
  124. };
  125. /* Sleep dependency source arrays for 34xx-specific pwrdms - 34XX only */
  126. /*
  127. * 3430: CM_SLEEPDEP_{DSS,PER}: MPU, IVA
  128. * 3430ES2: CM_SLEEPDEP_USBHOST: MPU, IVA
  129. */
  130. static struct pwrdm_dep dss_per_usbhost_sleepdeps[] = {
  131. {
  132. .pwrdm_name = "mpu_pwrdm",
  133. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  134. },
  135. {
  136. .pwrdm_name = "iva2_pwrdm",
  137. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  138. },
  139. { NULL },
  140. };
  141. /*
  142. * Powerdomains
  143. */
  144. static struct powerdomain iva2_pwrdm = {
  145. .name = "iva2_pwrdm",
  146. .prcm_offs = OMAP3430_IVA2_MOD,
  147. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  148. .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_IVA2_SHIFT,
  149. .wkdep_srcs = iva2_wkdeps,
  150. .pwrsts = PWRSTS_OFF_RET_ON,
  151. .pwrsts_logic_ret = PWRSTS_OFF_RET,
  152. .banks = 4,
  153. .pwrsts_mem_ret = {
  154. [0] = PWRSTS_OFF_RET,
  155. [1] = PWRSTS_OFF_RET,
  156. [2] = PWRSTS_OFF_RET,
  157. [3] = PWRSTS_OFF_RET,
  158. },
  159. .pwrsts_mem_on = {
  160. [0] = PWRDM_POWER_ON,
  161. [1] = PWRDM_POWER_ON,
  162. [2] = PWRSTS_OFF_ON,
  163. [3] = PWRDM_POWER_ON,
  164. },
  165. };
  166. static struct powerdomain mpu_34xx_pwrdm = {
  167. .name = "mpu_pwrdm",
  168. .prcm_offs = MPU_MOD,
  169. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  170. .dep_bit = OMAP3430_EN_MPU_SHIFT,
  171. .wkdep_srcs = mpu_34xx_wkdeps,
  172. .pwrsts = PWRSTS_OFF_RET_ON,
  173. .pwrsts_logic_ret = PWRSTS_OFF_RET,
  174. .banks = 1,
  175. .pwrsts_mem_ret = {
  176. [0] = PWRSTS_OFF_RET,
  177. },
  178. .pwrsts_mem_on = {
  179. [0] = PWRSTS_OFF_ON,
  180. },
  181. };
  182. /* No wkdeps or sleepdeps for 34xx core apparently */
  183. static struct powerdomain core_34xx_pwrdm = {
  184. .name = "core_pwrdm",
  185. .prcm_offs = CORE_MOD,
  186. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  187. .pwrsts = PWRSTS_OFF_RET_ON,
  188. .dep_bit = OMAP3430_EN_CORE_SHIFT,
  189. .banks = 2,
  190. .pwrsts_mem_ret = {
  191. [0] = PWRSTS_OFF_RET, /* MEM1RETSTATE */
  192. [1] = PWRSTS_OFF_RET, /* MEM2RETSTATE */
  193. },
  194. .pwrsts_mem_on = {
  195. [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */
  196. [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */
  197. },
  198. };
  199. /* Another case of bit name collisions between several registers: EN_DSS */
  200. static struct powerdomain dss_pwrdm = {
  201. .name = "dss_pwrdm",
  202. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  203. .prcm_offs = OMAP3430_DSS_MOD,
  204. .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT,
  205. .wkdep_srcs = cam_dss_wkdeps,
  206. .sleepdep_srcs = dss_per_usbhost_sleepdeps,
  207. .pwrsts = PWRSTS_OFF_RET_ON,
  208. .pwrsts_logic_ret = PWRDM_POWER_RET,
  209. .banks = 1,
  210. .pwrsts_mem_ret = {
  211. [0] = PWRDM_POWER_RET, /* MEMRETSTATE */
  212. },
  213. .pwrsts_mem_on = {
  214. [0] = PWRDM_POWER_ON, /* MEMONSTATE */
  215. },
  216. };
  217. static struct powerdomain sgx_pwrdm = {
  218. .name = "sgx_pwrdm",
  219. .prcm_offs = OMAP3430ES2_SGX_MOD,
  220. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES2),
  221. .wkdep_srcs = gfx_sgx_wkdeps,
  222. .sleepdep_srcs = cam_gfx_sleepdeps,
  223. /* XXX This is accurate for 3430 SGX, but what about GFX? */
  224. .pwrsts = PWRSTS_OFF_RET_ON,
  225. .pwrsts_logic_ret = PWRDM_POWER_RET,
  226. .banks = 1,
  227. .pwrsts_mem_ret = {
  228. [0] = PWRDM_POWER_RET, /* MEMRETSTATE */
  229. },
  230. .pwrsts_mem_on = {
  231. [0] = PWRDM_POWER_ON, /* MEMONSTATE */
  232. },
  233. };
  234. static struct powerdomain cam_pwrdm = {
  235. .name = "cam_pwrdm",
  236. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  237. .prcm_offs = OMAP3430_CAM_MOD,
  238. .wkdep_srcs = cam_dss_wkdeps,
  239. .sleepdep_srcs = cam_gfx_sleepdeps,
  240. .pwrsts = PWRSTS_OFF_RET_ON,
  241. .pwrsts_logic_ret = PWRDM_POWER_RET,
  242. .banks = 1,
  243. .pwrsts_mem_ret = {
  244. [0] = PWRDM_POWER_RET, /* MEMRETSTATE */
  245. },
  246. .pwrsts_mem_on = {
  247. [0] = PWRDM_POWER_ON, /* MEMONSTATE */
  248. },
  249. };
  250. static struct powerdomain per_pwrdm = {
  251. .name = "per_pwrdm",
  252. .prcm_offs = OMAP3430_PER_MOD,
  253. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  254. .dep_bit = OMAP3430_EN_PER_SHIFT,
  255. .wkdep_srcs = per_usbhost_wkdeps,
  256. .sleepdep_srcs = dss_per_usbhost_sleepdeps,
  257. .pwrsts = PWRSTS_OFF_RET_ON,
  258. .pwrsts_logic_ret = PWRSTS_OFF_RET,
  259. .banks = 1,
  260. .pwrsts_mem_ret = {
  261. [0] = PWRDM_POWER_RET, /* MEMRETSTATE */
  262. },
  263. .pwrsts_mem_on = {
  264. [0] = PWRDM_POWER_ON, /* MEMONSTATE */
  265. },
  266. };
  267. static struct powerdomain emu_pwrdm = {
  268. .name = "emu_pwrdm",
  269. .prcm_offs = OMAP3430_EMU_MOD,
  270. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  271. };
  272. static struct powerdomain neon_pwrdm = {
  273. .name = "neon_pwrdm",
  274. .prcm_offs = OMAP3430_NEON_MOD,
  275. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  276. .wkdep_srcs = neon_wkdeps,
  277. .pwrsts = PWRSTS_OFF_RET_ON,
  278. .pwrsts_logic_ret = PWRDM_POWER_RET,
  279. };
  280. static struct powerdomain usbhost_pwrdm = {
  281. .name = "usbhost_pwrdm",
  282. .prcm_offs = OMAP3430ES2_USBHOST_MOD,
  283. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES2),
  284. .wkdep_srcs = per_usbhost_wkdeps,
  285. .sleepdep_srcs = dss_per_usbhost_sleepdeps,
  286. .pwrsts = PWRSTS_OFF_RET_ON,
  287. .pwrsts_logic_ret = PWRDM_POWER_RET,
  288. .banks = 1,
  289. .pwrsts_mem_ret = {
  290. [0] = PWRDM_POWER_RET, /* MEMRETSTATE */
  291. },
  292. .pwrsts_mem_on = {
  293. [0] = PWRDM_POWER_ON, /* MEMONSTATE */
  294. },
  295. };
  296. #endif /* CONFIG_ARCH_OMAP34XX */
  297. #endif