powerdomains34xx.h 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  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_pre_es3_1_pwrdm = {
  184. .name = "core_pwrdm",
  185. .prcm_offs = CORE_MOD,
  186. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES1 |
  187. CHIP_IS_OMAP3430ES2 |
  188. CHIP_IS_OMAP3430ES3_0),
  189. .pwrsts = PWRSTS_OFF_RET_ON,
  190. .dep_bit = OMAP3430_EN_CORE_SHIFT,
  191. .banks = 2,
  192. .pwrsts_mem_ret = {
  193. [0] = PWRSTS_OFF_RET, /* MEM1RETSTATE */
  194. [1] = PWRSTS_OFF_RET, /* MEM2RETSTATE */
  195. },
  196. .pwrsts_mem_on = {
  197. [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */
  198. [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */
  199. },
  200. };
  201. /* No wkdeps or sleepdeps for 34xx core apparently */
  202. static struct powerdomain core_34xx_es3_1_pwrdm = {
  203. .name = "core_pwrdm",
  204. .prcm_offs = CORE_MOD,
  205. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES3_1),
  206. .pwrsts = PWRSTS_OFF_RET_ON,
  207. .dep_bit = OMAP3430_EN_CORE_SHIFT,
  208. .flags = PWRDM_HAS_HDWR_SAR, /* for USBTLL only */
  209. .banks = 2,
  210. .pwrsts_mem_ret = {
  211. [0] = PWRSTS_OFF_RET, /* MEM1RETSTATE */
  212. [1] = PWRSTS_OFF_RET, /* MEM2RETSTATE */
  213. },
  214. .pwrsts_mem_on = {
  215. [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */
  216. [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */
  217. },
  218. };
  219. /* Another case of bit name collisions between several registers: EN_DSS */
  220. static struct powerdomain dss_pwrdm = {
  221. .name = "dss_pwrdm",
  222. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  223. .prcm_offs = OMAP3430_DSS_MOD,
  224. .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT,
  225. .wkdep_srcs = cam_dss_wkdeps,
  226. .sleepdep_srcs = dss_per_usbhost_sleepdeps,
  227. .pwrsts = PWRSTS_OFF_RET_ON,
  228. .pwrsts_logic_ret = PWRDM_POWER_RET,
  229. .banks = 1,
  230. .pwrsts_mem_ret = {
  231. [0] = PWRDM_POWER_RET, /* MEMRETSTATE */
  232. },
  233. .pwrsts_mem_on = {
  234. [0] = PWRDM_POWER_ON, /* MEMONSTATE */
  235. },
  236. };
  237. /*
  238. * Although the 34XX TRM Rev K Table 4-371 notes that retention is a
  239. * possible SGX powerstate, the SGX device itself does not support
  240. * retention.
  241. */
  242. static struct powerdomain sgx_pwrdm = {
  243. .name = "sgx_pwrdm",
  244. .prcm_offs = OMAP3430ES2_SGX_MOD,
  245. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  246. .wkdep_srcs = gfx_sgx_wkdeps,
  247. .sleepdep_srcs = cam_gfx_sleepdeps,
  248. /* XXX This is accurate for 3430 SGX, but what about GFX? */
  249. .pwrsts = PWRSTS_OFF_ON,
  250. .pwrsts_logic_ret = PWRDM_POWER_RET,
  251. .banks = 1,
  252. .pwrsts_mem_ret = {
  253. [0] = PWRDM_POWER_RET, /* MEMRETSTATE */
  254. },
  255. .pwrsts_mem_on = {
  256. [0] = PWRDM_POWER_ON, /* MEMONSTATE */
  257. },
  258. };
  259. static struct powerdomain cam_pwrdm = {
  260. .name = "cam_pwrdm",
  261. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  262. .prcm_offs = OMAP3430_CAM_MOD,
  263. .wkdep_srcs = cam_dss_wkdeps,
  264. .sleepdep_srcs = cam_gfx_sleepdeps,
  265. .pwrsts = PWRSTS_OFF_RET_ON,
  266. .pwrsts_logic_ret = PWRDM_POWER_RET,
  267. .banks = 1,
  268. .pwrsts_mem_ret = {
  269. [0] = PWRDM_POWER_RET, /* MEMRETSTATE */
  270. },
  271. .pwrsts_mem_on = {
  272. [0] = PWRDM_POWER_ON, /* MEMONSTATE */
  273. },
  274. };
  275. static struct powerdomain per_pwrdm = {
  276. .name = "per_pwrdm",
  277. .prcm_offs = OMAP3430_PER_MOD,
  278. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  279. .dep_bit = OMAP3430_EN_PER_SHIFT,
  280. .wkdep_srcs = per_usbhost_wkdeps,
  281. .sleepdep_srcs = dss_per_usbhost_sleepdeps,
  282. .pwrsts = PWRSTS_OFF_RET_ON,
  283. .pwrsts_logic_ret = PWRSTS_OFF_RET,
  284. .banks = 1,
  285. .pwrsts_mem_ret = {
  286. [0] = PWRDM_POWER_RET, /* MEMRETSTATE */
  287. },
  288. .pwrsts_mem_on = {
  289. [0] = PWRDM_POWER_ON, /* MEMONSTATE */
  290. },
  291. };
  292. static struct powerdomain emu_pwrdm = {
  293. .name = "emu_pwrdm",
  294. .prcm_offs = OMAP3430_EMU_MOD,
  295. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  296. };
  297. static struct powerdomain neon_pwrdm = {
  298. .name = "neon_pwrdm",
  299. .prcm_offs = OMAP3430_NEON_MOD,
  300. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  301. .wkdep_srcs = neon_wkdeps,
  302. .pwrsts = PWRSTS_OFF_RET_ON,
  303. .pwrsts_logic_ret = PWRDM_POWER_RET,
  304. };
  305. static struct powerdomain usbhost_pwrdm = {
  306. .name = "usbhost_pwrdm",
  307. .prcm_offs = OMAP3430ES2_USBHOST_MOD,
  308. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  309. .wkdep_srcs = per_usbhost_wkdeps,
  310. .sleepdep_srcs = dss_per_usbhost_sleepdeps,
  311. .pwrsts = PWRSTS_OFF_RET_ON,
  312. .pwrsts_logic_ret = PWRDM_POWER_RET,
  313. .flags = PWRDM_HAS_HDWR_SAR, /* for USBHOST ctrlr only */
  314. .banks = 1,
  315. .pwrsts_mem_ret = {
  316. [0] = PWRDM_POWER_RET, /* MEMRETSTATE */
  317. },
  318. .pwrsts_mem_on = {
  319. [0] = PWRDM_POWER_ON, /* MEMONSTATE */
  320. },
  321. };
  322. static struct powerdomain dpll1_pwrdm = {
  323. .name = "dpll1_pwrdm",
  324. .prcm_offs = MPU_MOD,
  325. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  326. };
  327. static struct powerdomain dpll2_pwrdm = {
  328. .name = "dpll2_pwrdm",
  329. .prcm_offs = OMAP3430_IVA2_MOD,
  330. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  331. };
  332. static struct powerdomain dpll3_pwrdm = {
  333. .name = "dpll3_pwrdm",
  334. .prcm_offs = PLL_MOD,
  335. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  336. };
  337. static struct powerdomain dpll4_pwrdm = {
  338. .name = "dpll4_pwrdm",
  339. .prcm_offs = PLL_MOD,
  340. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  341. };
  342. static struct powerdomain dpll5_pwrdm = {
  343. .name = "dpll5_pwrdm",
  344. .prcm_offs = PLL_MOD,
  345. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  346. };
  347. #endif /* CONFIG_ARCH_OMAP34XX */
  348. #endif