clockdomains.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  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 <plat/clockdomain.h>
  12. #include "cm.h"
  13. #include "prm44xx.h"
  14. /*
  15. * OMAP2/3-common clockdomains
  16. *
  17. * Even though the 2420 has a single PRCM module from the
  18. * interconnect's perspective, internally it does appear to have
  19. * separate PRM and CM clockdomains. The usual test case is
  20. * sys_clkout/sys_clkout2.
  21. */
  22. /* This is an implicit clockdomain - it is never defined as such in TRM */
  23. static struct clockdomain wkup_clkdm = {
  24. .name = "wkup_clkdm",
  25. .pwrdm = { .name = "wkup_pwrdm" },
  26. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
  27. };
  28. static struct clockdomain prm_clkdm = {
  29. .name = "prm_clkdm",
  30. .pwrdm = { .name = "wkup_pwrdm" },
  31. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
  32. };
  33. static struct clockdomain cm_clkdm = {
  34. .name = "cm_clkdm",
  35. .pwrdm = { .name = "core_pwrdm" },
  36. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
  37. };
  38. /*
  39. * 2420-only clockdomains
  40. */
  41. #if defined(CONFIG_ARCH_OMAP2420)
  42. static struct clockdomain mpu_2420_clkdm = {
  43. .name = "mpu_clkdm",
  44. .pwrdm = { .name = "mpu_pwrdm" },
  45. .flags = CLKDM_CAN_HWSUP,
  46. .clkstctrl_reg = OMAP2420_CM_REGADDR(MPU_MOD, OMAP2_CM_CLKSTCTRL),
  47. .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK,
  48. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  49. };
  50. static struct clockdomain iva1_2420_clkdm = {
  51. .name = "iva1_clkdm",
  52. .pwrdm = { .name = "dsp_pwrdm" },
  53. .flags = CLKDM_CAN_HWSUP_SWSUP,
  54. .clkstctrl_reg = OMAP2420_CM_REGADDR(OMAP24XX_DSP_MOD,
  55. OMAP2_CM_CLKSTCTRL),
  56. .clktrctrl_mask = OMAP2420_AUTOSTATE_IVA_MASK,
  57. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  58. };
  59. static struct clockdomain dsp_2420_clkdm = {
  60. .name = "dsp_clkdm",
  61. .pwrdm = { .name = "dsp_pwrdm" },
  62. .flags = CLKDM_CAN_HWSUP_SWSUP,
  63. .clkstctrl_reg = OMAP2420_CM_REGADDR(OMAP24XX_DSP_MOD,
  64. OMAP2_CM_CLKSTCTRL),
  65. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK,
  66. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  67. };
  68. static struct clockdomain gfx_2420_clkdm = {
  69. .name = "gfx_clkdm",
  70. .pwrdm = { .name = "gfx_pwrdm" },
  71. .flags = CLKDM_CAN_HWSUP_SWSUP,
  72. .clkstctrl_reg = OMAP2420_CM_REGADDR(GFX_MOD, OMAP2_CM_CLKSTCTRL),
  73. .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK,
  74. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  75. };
  76. static struct clockdomain core_l3_2420_clkdm = {
  77. .name = "core_l3_clkdm",
  78. .pwrdm = { .name = "core_pwrdm" },
  79. .flags = CLKDM_CAN_HWSUP,
  80. .clkstctrl_reg = OMAP2420_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  81. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK,
  82. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  83. };
  84. static struct clockdomain core_l4_2420_clkdm = {
  85. .name = "core_l4_clkdm",
  86. .pwrdm = { .name = "core_pwrdm" },
  87. .flags = CLKDM_CAN_HWSUP,
  88. .clkstctrl_reg = OMAP2420_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  89. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK,
  90. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  91. };
  92. static struct clockdomain dss_2420_clkdm = {
  93. .name = "dss_clkdm",
  94. .pwrdm = { .name = "core_pwrdm" },
  95. .flags = CLKDM_CAN_HWSUP,
  96. .clkstctrl_reg = OMAP2420_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  97. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK,
  98. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  99. };
  100. #endif /* CONFIG_ARCH_OMAP2420 */
  101. /*
  102. * 2430-only clockdomains
  103. */
  104. #if defined(CONFIG_ARCH_OMAP2430)
  105. static struct clockdomain mpu_2430_clkdm = {
  106. .name = "mpu_clkdm",
  107. .pwrdm = { .name = "mpu_pwrdm" },
  108. .flags = CLKDM_CAN_HWSUP_SWSUP,
  109. .clkstctrl_reg = OMAP2430_CM_REGADDR(MPU_MOD,
  110. OMAP2_CM_CLKSTCTRL),
  111. .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK,
  112. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  113. };
  114. static struct clockdomain mdm_clkdm = {
  115. .name = "mdm_clkdm",
  116. .pwrdm = { .name = "mdm_pwrdm" },
  117. .flags = CLKDM_CAN_HWSUP_SWSUP,
  118. .clkstctrl_reg = OMAP2430_CM_REGADDR(OMAP2430_MDM_MOD,
  119. OMAP2_CM_CLKSTCTRL),
  120. .clktrctrl_mask = OMAP2430_AUTOSTATE_MDM_MASK,
  121. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  122. };
  123. static struct clockdomain dsp_2430_clkdm = {
  124. .name = "dsp_clkdm",
  125. .pwrdm = { .name = "dsp_pwrdm" },
  126. .flags = CLKDM_CAN_HWSUP_SWSUP,
  127. .clkstctrl_reg = OMAP2430_CM_REGADDR(OMAP24XX_DSP_MOD,
  128. OMAP2_CM_CLKSTCTRL),
  129. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK,
  130. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  131. };
  132. static struct clockdomain gfx_2430_clkdm = {
  133. .name = "gfx_clkdm",
  134. .pwrdm = { .name = "gfx_pwrdm" },
  135. .flags = CLKDM_CAN_HWSUP_SWSUP,
  136. .clkstctrl_reg = OMAP2430_CM_REGADDR(GFX_MOD, OMAP2_CM_CLKSTCTRL),
  137. .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK,
  138. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  139. };
  140. static struct clockdomain core_l3_2430_clkdm = {
  141. .name = "core_l3_clkdm",
  142. .pwrdm = { .name = "core_pwrdm" },
  143. .flags = CLKDM_CAN_HWSUP,
  144. .clkstctrl_reg = OMAP2430_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  145. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK,
  146. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  147. };
  148. static struct clockdomain core_l4_2430_clkdm = {
  149. .name = "core_l4_clkdm",
  150. .pwrdm = { .name = "core_pwrdm" },
  151. .flags = CLKDM_CAN_HWSUP,
  152. .clkstctrl_reg = OMAP2430_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  153. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK,
  154. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  155. };
  156. static struct clockdomain dss_2430_clkdm = {
  157. .name = "dss_clkdm",
  158. .pwrdm = { .name = "core_pwrdm" },
  159. .flags = CLKDM_CAN_HWSUP,
  160. .clkstctrl_reg = OMAP2430_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  161. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK,
  162. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  163. };
  164. #endif /* CONFIG_ARCH_OMAP2430 */
  165. /*
  166. * 34xx clockdomains
  167. */
  168. #if defined(CONFIG_ARCH_OMAP34XX)
  169. static struct clockdomain mpu_34xx_clkdm = {
  170. .name = "mpu_clkdm",
  171. .pwrdm = { .name = "mpu_pwrdm" },
  172. .flags = CLKDM_CAN_HWSUP | CLKDM_CAN_FORCE_WAKEUP,
  173. .clkstctrl_reg = OMAP34XX_CM_REGADDR(MPU_MOD, OMAP2_CM_CLKSTCTRL),
  174. .clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK,
  175. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  176. };
  177. static struct clockdomain neon_clkdm = {
  178. .name = "neon_clkdm",
  179. .pwrdm = { .name = "neon_pwrdm" },
  180. .flags = CLKDM_CAN_HWSUP_SWSUP,
  181. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_NEON_MOD,
  182. OMAP2_CM_CLKSTCTRL),
  183. .clktrctrl_mask = OMAP3430_CLKTRCTRL_NEON_MASK,
  184. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  185. };
  186. static struct clockdomain iva2_clkdm = {
  187. .name = "iva2_clkdm",
  188. .pwrdm = { .name = "iva2_pwrdm" },
  189. .flags = CLKDM_CAN_HWSUP_SWSUP,
  190. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_IVA2_MOD,
  191. OMAP2_CM_CLKSTCTRL),
  192. .clktrctrl_mask = OMAP3430_CLKTRCTRL_IVA2_MASK,
  193. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  194. };
  195. static struct clockdomain gfx_3430es1_clkdm = {
  196. .name = "gfx_clkdm",
  197. .pwrdm = { .name = "gfx_pwrdm" },
  198. .flags = CLKDM_CAN_HWSUP_SWSUP,
  199. .clkstctrl_reg = OMAP34XX_CM_REGADDR(GFX_MOD, OMAP2_CM_CLKSTCTRL),
  200. .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_GFX_MASK,
  201. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES1),
  202. };
  203. static struct clockdomain sgx_clkdm = {
  204. .name = "sgx_clkdm",
  205. .pwrdm = { .name = "sgx_pwrdm" },
  206. .flags = CLKDM_CAN_HWSUP_SWSUP,
  207. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430ES2_SGX_MOD,
  208. OMAP2_CM_CLKSTCTRL),
  209. .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK,
  210. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  211. };
  212. /*
  213. * The die-to-die clockdomain was documented in the 34xx ES1 TRM, but
  214. * then that information was removed from the 34xx ES2+ TRM. It is
  215. * unclear whether the core is still there, but the clockdomain logic
  216. * is there, and must be programmed to an appropriate state if the
  217. * CORE clockdomain is to become inactive.
  218. */
  219. static struct clockdomain d2d_clkdm = {
  220. .name = "d2d_clkdm",
  221. .pwrdm = { .name = "core_pwrdm" },
  222. .flags = CLKDM_CAN_HWSUP_SWSUP,
  223. .clkstctrl_reg = OMAP34XX_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  224. .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_D2D_MASK,
  225. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  226. };
  227. static struct clockdomain core_l3_34xx_clkdm = {
  228. .name = "core_l3_clkdm",
  229. .pwrdm = { .name = "core_pwrdm" },
  230. .flags = CLKDM_CAN_HWSUP,
  231. .clkstctrl_reg = OMAP34XX_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  232. .clktrctrl_mask = OMAP3430_CLKTRCTRL_L3_MASK,
  233. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  234. };
  235. static struct clockdomain core_l4_34xx_clkdm = {
  236. .name = "core_l4_clkdm",
  237. .pwrdm = { .name = "core_pwrdm" },
  238. .flags = CLKDM_CAN_HWSUP,
  239. .clkstctrl_reg = OMAP34XX_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  240. .clktrctrl_mask = OMAP3430_CLKTRCTRL_L4_MASK,
  241. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  242. };
  243. static struct clockdomain dss_34xx_clkdm = {
  244. .name = "dss_clkdm",
  245. .pwrdm = { .name = "dss_pwrdm" },
  246. .flags = CLKDM_CAN_HWSUP_SWSUP,
  247. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_DSS_MOD,
  248. OMAP2_CM_CLKSTCTRL),
  249. .clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK,
  250. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  251. };
  252. static struct clockdomain cam_clkdm = {
  253. .name = "cam_clkdm",
  254. .pwrdm = { .name = "cam_pwrdm" },
  255. .flags = CLKDM_CAN_HWSUP_SWSUP,
  256. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_CAM_MOD,
  257. OMAP2_CM_CLKSTCTRL),
  258. .clktrctrl_mask = OMAP3430_CLKTRCTRL_CAM_MASK,
  259. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  260. };
  261. static struct clockdomain usbhost_clkdm = {
  262. .name = "usbhost_clkdm",
  263. .pwrdm = { .name = "usbhost_pwrdm" },
  264. .flags = CLKDM_CAN_HWSUP_SWSUP,
  265. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430ES2_USBHOST_MOD,
  266. OMAP2_CM_CLKSTCTRL),
  267. .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK,
  268. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  269. };
  270. static struct clockdomain per_clkdm = {
  271. .name = "per_clkdm",
  272. .pwrdm = { .name = "per_pwrdm" },
  273. .flags = CLKDM_CAN_HWSUP_SWSUP,
  274. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_PER_MOD,
  275. OMAP2_CM_CLKSTCTRL),
  276. .clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK,
  277. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  278. };
  279. /*
  280. * Disable hw supervised mode for emu_clkdm, because emu_pwrdm is
  281. * switched of even if sdti is in use
  282. */
  283. static struct clockdomain emu_clkdm = {
  284. .name = "emu_clkdm",
  285. .pwrdm = { .name = "emu_pwrdm" },
  286. .flags = /* CLKDM_CAN_ENABLE_AUTO | */CLKDM_CAN_SWSUP,
  287. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_EMU_MOD,
  288. OMAP2_CM_CLKSTCTRL),
  289. .clktrctrl_mask = OMAP3430_CLKTRCTRL_EMU_MASK,
  290. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  291. };
  292. static struct clockdomain dpll1_clkdm = {
  293. .name = "dpll1_clkdm",
  294. .pwrdm = { .name = "dpll1_pwrdm" },
  295. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  296. };
  297. static struct clockdomain dpll2_clkdm = {
  298. .name = "dpll2_clkdm",
  299. .pwrdm = { .name = "dpll2_pwrdm" },
  300. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  301. };
  302. static struct clockdomain dpll3_clkdm = {
  303. .name = "dpll3_clkdm",
  304. .pwrdm = { .name = "dpll3_pwrdm" },
  305. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  306. };
  307. static struct clockdomain dpll4_clkdm = {
  308. .name = "dpll4_clkdm",
  309. .pwrdm = { .name = "dpll4_pwrdm" },
  310. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  311. };
  312. static struct clockdomain dpll5_clkdm = {
  313. .name = "dpll5_clkdm",
  314. .pwrdm = { .name = "dpll5_pwrdm" },
  315. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  316. };
  317. #endif /* CONFIG_ARCH_OMAP34XX */
  318. /*
  319. * Clockdomain-powerdomain hwsup dependencies (34XX only)
  320. */
  321. static struct clkdm_pwrdm_autodep clkdm_pwrdm_autodeps[] = {
  322. {
  323. .pwrdm = { .name = "mpu_pwrdm" },
  324. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  325. },
  326. {
  327. .pwrdm = { .name = "iva2_pwrdm" },
  328. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  329. },
  330. {
  331. .pwrdm = { .name = NULL },
  332. }
  333. };
  334. /*
  335. *
  336. */
  337. static struct clockdomain *clockdomains_omap[] = {
  338. &wkup_clkdm,
  339. &cm_clkdm,
  340. &prm_clkdm,
  341. #ifdef CONFIG_ARCH_OMAP2420
  342. &mpu_2420_clkdm,
  343. &iva1_2420_clkdm,
  344. &dsp_2420_clkdm,
  345. &gfx_2420_clkdm,
  346. &core_l3_2420_clkdm,
  347. &core_l4_2420_clkdm,
  348. &dss_2420_clkdm,
  349. #endif
  350. #ifdef CONFIG_ARCH_OMAP2430
  351. &mpu_2430_clkdm,
  352. &mdm_clkdm,
  353. &dsp_2430_clkdm,
  354. &gfx_2430_clkdm,
  355. &core_l3_2430_clkdm,
  356. &core_l4_2430_clkdm,
  357. &dss_2430_clkdm,
  358. #endif
  359. #ifdef CONFIG_ARCH_OMAP34XX
  360. &mpu_34xx_clkdm,
  361. &neon_clkdm,
  362. &iva2_clkdm,
  363. &gfx_3430es1_clkdm,
  364. &sgx_clkdm,
  365. &d2d_clkdm,
  366. &core_l3_34xx_clkdm,
  367. &core_l4_34xx_clkdm,
  368. &dss_34xx_clkdm,
  369. &cam_clkdm,
  370. &usbhost_clkdm,
  371. &per_clkdm,
  372. &emu_clkdm,
  373. &dpll1_clkdm,
  374. &dpll2_clkdm,
  375. &dpll3_clkdm,
  376. &dpll4_clkdm,
  377. &dpll5_clkdm,
  378. #endif
  379. NULL,
  380. };
  381. #endif