clockdomains.h 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. /*
  2. * OMAP2/3 clockdomains
  3. *
  4. * Copyright (C) 2008 Texas Instruments, Inc.
  5. * Copyright (C) 2008 Nokia Corporation
  6. *
  7. * Written by Paul Walmsley
  8. */
  9. #ifndef __ARCH_ARM_MACH_OMAP2_CLOCKDOMAINS_H
  10. #define __ARCH_ARM_MACH_OMAP2_CLOCKDOMAINS_H
  11. #include <mach/clockdomain.h>
  12. /*
  13. * OMAP2/3-common clockdomains
  14. *
  15. * Even though the 2420 has a single PRCM module from the
  16. * interconnect's perspective, internally it does appear to have
  17. * separate PRM and CM clockdomains. The usual test case is
  18. * sys_clkout/sys_clkout2.
  19. */
  20. /* This is an implicit clockdomain - it is never defined as such in TRM */
  21. static struct clockdomain wkup_clkdm = {
  22. .name = "wkup_clkdm",
  23. .pwrdm = { .name = "wkup_pwrdm" },
  24. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
  25. };
  26. static struct clockdomain prm_clkdm = {
  27. .name = "prm_clkdm",
  28. .pwrdm = { .name = "wkup_pwrdm" },
  29. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
  30. };
  31. static struct clockdomain cm_clkdm = {
  32. .name = "cm_clkdm",
  33. .pwrdm = { .name = "core_pwrdm" },
  34. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
  35. };
  36. /*
  37. * 2420-only clockdomains
  38. */
  39. #if defined(CONFIG_ARCH_OMAP2420)
  40. static struct clockdomain mpu_2420_clkdm = {
  41. .name = "mpu_clkdm",
  42. .pwrdm = { .name = "mpu_pwrdm" },
  43. .flags = CLKDM_CAN_HWSUP,
  44. .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK,
  45. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  46. };
  47. static struct clockdomain iva1_2420_clkdm = {
  48. .name = "iva1_clkdm",
  49. .pwrdm = { .name = "dsp_pwrdm" },
  50. .flags = CLKDM_CAN_HWSUP_SWSUP,
  51. .clktrctrl_mask = OMAP2420_AUTOSTATE_IVA_MASK,
  52. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  53. };
  54. #endif /* CONFIG_ARCH_OMAP2420 */
  55. /*
  56. * 2430-only clockdomains
  57. */
  58. #if defined(CONFIG_ARCH_OMAP2430)
  59. static struct clockdomain mpu_2430_clkdm = {
  60. .name = "mpu_clkdm",
  61. .pwrdm = { .name = "mpu_pwrdm" },
  62. .flags = CLKDM_CAN_HWSUP_SWSUP,
  63. .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK,
  64. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  65. };
  66. static struct clockdomain mdm_clkdm = {
  67. .name = "mdm_clkdm",
  68. .pwrdm = { .name = "mdm_pwrdm" },
  69. .flags = CLKDM_CAN_HWSUP_SWSUP,
  70. .clktrctrl_mask = OMAP2430_AUTOSTATE_MDM_MASK,
  71. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  72. };
  73. #endif /* CONFIG_ARCH_OMAP2430 */
  74. /*
  75. * 24XX-only clockdomains
  76. */
  77. #if defined(CONFIG_ARCH_OMAP24XX)
  78. static struct clockdomain dsp_clkdm = {
  79. .name = "dsp_clkdm",
  80. .pwrdm = { .name = "dsp_pwrdm" },
  81. .flags = CLKDM_CAN_HWSUP_SWSUP,
  82. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK,
  83. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX),
  84. };
  85. static struct clockdomain gfx_24xx_clkdm = {
  86. .name = "gfx_clkdm",
  87. .pwrdm = { .name = "gfx_pwrdm" },
  88. .flags = CLKDM_CAN_HWSUP_SWSUP,
  89. .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK,
  90. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX),
  91. };
  92. static struct clockdomain core_l3_24xx_clkdm = {
  93. .name = "core_l3_clkdm",
  94. .pwrdm = { .name = "core_pwrdm" },
  95. .flags = CLKDM_CAN_HWSUP,
  96. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK,
  97. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX),
  98. };
  99. static struct clockdomain core_l4_24xx_clkdm = {
  100. .name = "core_l4_clkdm",
  101. .pwrdm = { .name = "core_pwrdm" },
  102. .flags = CLKDM_CAN_HWSUP,
  103. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK,
  104. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX),
  105. };
  106. static struct clockdomain dss_24xx_clkdm = {
  107. .name = "dss_clkdm",
  108. .pwrdm = { .name = "core_pwrdm" },
  109. .flags = CLKDM_CAN_HWSUP,
  110. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK,
  111. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX),
  112. };
  113. #endif /* CONFIG_ARCH_OMAP24XX */
  114. /*
  115. * 34xx clockdomains
  116. */
  117. #if defined(CONFIG_ARCH_OMAP34XX)
  118. static struct clockdomain mpu_34xx_clkdm = {
  119. .name = "mpu_clkdm",
  120. .pwrdm = { .name = "mpu_pwrdm" },
  121. .flags = CLKDM_CAN_HWSUP | CLKDM_CAN_FORCE_WAKEUP,
  122. .clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK,
  123. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  124. };
  125. static struct clockdomain neon_clkdm = {
  126. .name = "neon_clkdm",
  127. .pwrdm = { .name = "neon_pwrdm" },
  128. .flags = CLKDM_CAN_HWSUP_SWSUP,
  129. .clktrctrl_mask = OMAP3430_CLKTRCTRL_NEON_MASK,
  130. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  131. };
  132. static struct clockdomain iva2_clkdm = {
  133. .name = "iva2_clkdm",
  134. .pwrdm = { .name = "iva2_pwrdm" },
  135. .flags = CLKDM_CAN_HWSUP_SWSUP,
  136. .clktrctrl_mask = OMAP3430_CLKTRCTRL_IVA2_MASK,
  137. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  138. };
  139. static struct clockdomain gfx_3430es1_clkdm = {
  140. .name = "gfx_clkdm",
  141. .pwrdm = { .name = "gfx_pwrdm" },
  142. .flags = CLKDM_CAN_HWSUP_SWSUP,
  143. .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_GFX_MASK,
  144. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES1),
  145. };
  146. static struct clockdomain sgx_clkdm = {
  147. .name = "sgx_clkdm",
  148. .pwrdm = { .name = "sgx_pwrdm" },
  149. .flags = CLKDM_CAN_HWSUP_SWSUP,
  150. .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK,
  151. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  152. };
  153. /*
  154. * The die-to-die clockdomain was documented in the 34xx ES1 TRM, but
  155. * then that information was removed from the 34xx ES2+ TRM. It is
  156. * unclear whether the core is still there, but the clockdomain logic
  157. * is there, and must be programmed to an appropriate state if the
  158. * CORE clockdomain is to become inactive.
  159. */
  160. static struct clockdomain d2d_clkdm = {
  161. .name = "d2d_clkdm",
  162. .pwrdm = { .name = "core_pwrdm" },
  163. .flags = CLKDM_CAN_HWSUP,
  164. .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_D2D_MASK,
  165. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  166. };
  167. static struct clockdomain core_l3_34xx_clkdm = {
  168. .name = "core_l3_clkdm",
  169. .pwrdm = { .name = "core_pwrdm" },
  170. .flags = CLKDM_CAN_HWSUP,
  171. .clktrctrl_mask = OMAP3430_CLKTRCTRL_L3_MASK,
  172. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  173. };
  174. static struct clockdomain core_l4_34xx_clkdm = {
  175. .name = "core_l4_clkdm",
  176. .pwrdm = { .name = "core_pwrdm" },
  177. .flags = CLKDM_CAN_HWSUP,
  178. .clktrctrl_mask = OMAP3430_CLKTRCTRL_L4_MASK,
  179. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  180. };
  181. static struct clockdomain dss_34xx_clkdm = {
  182. .name = "dss_clkdm",
  183. .pwrdm = { .name = "dss_pwrdm" },
  184. .flags = CLKDM_CAN_HWSUP_SWSUP,
  185. .clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK,
  186. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  187. };
  188. static struct clockdomain cam_clkdm = {
  189. .name = "cam_clkdm",
  190. .pwrdm = { .name = "cam_pwrdm" },
  191. .flags = CLKDM_CAN_HWSUP_SWSUP,
  192. .clktrctrl_mask = OMAP3430_CLKTRCTRL_CAM_MASK,
  193. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  194. };
  195. static struct clockdomain usbhost_clkdm = {
  196. .name = "usbhost_clkdm",
  197. .pwrdm = { .name = "usbhost_pwrdm" },
  198. .flags = CLKDM_CAN_HWSUP_SWSUP,
  199. .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK,
  200. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  201. };
  202. static struct clockdomain per_clkdm = {
  203. .name = "per_clkdm",
  204. .pwrdm = { .name = "per_pwrdm" },
  205. .flags = CLKDM_CAN_HWSUP_SWSUP,
  206. .clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK,
  207. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  208. };
  209. /*
  210. * Disable hw supervised mode for emu_clkdm, because emu_pwrdm is
  211. * switched of even if sdti is in use
  212. */
  213. static struct clockdomain emu_clkdm = {
  214. .name = "emu_clkdm",
  215. .pwrdm = { .name = "emu_pwrdm" },
  216. .flags = /* CLKDM_CAN_ENABLE_AUTO | */CLKDM_CAN_SWSUP,
  217. .clktrctrl_mask = OMAP3430_CLKTRCTRL_EMU_MASK,
  218. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  219. };
  220. static struct clockdomain dpll1_clkdm = {
  221. .name = "dpll1_clkdm",
  222. .pwrdm = { .name = "dpll1_pwrdm" },
  223. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  224. };
  225. static struct clockdomain dpll2_clkdm = {
  226. .name = "dpll2_clkdm",
  227. .pwrdm = { .name = "dpll2_pwrdm" },
  228. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  229. };
  230. static struct clockdomain dpll3_clkdm = {
  231. .name = "dpll3_clkdm",
  232. .pwrdm = { .name = "dpll3_pwrdm" },
  233. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  234. };
  235. static struct clockdomain dpll4_clkdm = {
  236. .name = "dpll4_clkdm",
  237. .pwrdm = { .name = "dpll4_pwrdm" },
  238. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  239. };
  240. static struct clockdomain dpll5_clkdm = {
  241. .name = "dpll5_clkdm",
  242. .pwrdm = { .name = "dpll5_pwrdm" },
  243. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  244. };
  245. #endif /* CONFIG_ARCH_OMAP34XX */
  246. /*
  247. * Clockdomain-powerdomain hwsup dependencies (34XX only)
  248. */
  249. static struct clkdm_pwrdm_autodep clkdm_pwrdm_autodeps[] = {
  250. {
  251. .pwrdm = { .name = "mpu_pwrdm" },
  252. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  253. },
  254. {
  255. .pwrdm = { .name = "iva2_pwrdm" },
  256. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  257. },
  258. {
  259. .pwrdm = { .name = NULL },
  260. }
  261. };
  262. /*
  263. *
  264. */
  265. static struct clockdomain *clockdomains_omap[] = {
  266. &wkup_clkdm,
  267. &cm_clkdm,
  268. &prm_clkdm,
  269. #ifdef CONFIG_ARCH_OMAP2420
  270. &mpu_2420_clkdm,
  271. &iva1_2420_clkdm,
  272. #endif
  273. #ifdef CONFIG_ARCH_OMAP2430
  274. &mpu_2430_clkdm,
  275. &mdm_clkdm,
  276. #endif
  277. #ifdef CONFIG_ARCH_OMAP24XX
  278. &dsp_clkdm,
  279. &gfx_24xx_clkdm,
  280. &core_l3_24xx_clkdm,
  281. &core_l4_24xx_clkdm,
  282. &dss_24xx_clkdm,
  283. #endif
  284. #ifdef CONFIG_ARCH_OMAP34XX
  285. &mpu_34xx_clkdm,
  286. &neon_clkdm,
  287. &iva2_clkdm,
  288. &gfx_3430es1_clkdm,
  289. &sgx_clkdm,
  290. &d2d_clkdm,
  291. &core_l3_34xx_clkdm,
  292. &core_l4_34xx_clkdm,
  293. &dss_34xx_clkdm,
  294. &cam_clkdm,
  295. &usbhost_clkdm,
  296. &per_clkdm,
  297. &emu_clkdm,
  298. &dpll1_clkdm,
  299. &dpll2_clkdm,
  300. &dpll3_clkdm,
  301. &dpll4_clkdm,
  302. &dpll5_clkdm,
  303. #endif
  304. NULL,
  305. };
  306. #endif