powerdomains34xx.h 9.4 KB

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