clockdomains.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841
  1. /*
  2. * OMAP2/3 clockdomains
  3. *
  4. * Copyright (C) 2008 Texas Instruments, Inc.
  5. * Copyright (C) 2008-2009 Nokia Corporation
  6. *
  7. * Written by Paul Walmsley and Jouni Högander
  8. *
  9. * This file contains clockdomains and clockdomain wakeup/sleep
  10. * dependencies for the OMAP2/3 chips. Some notes:
  11. *
  12. * A useful validation rule for struct clockdomain: Any clockdomain
  13. * referenced by a wkdep_srcs or sleepdep_srcs array must have a
  14. * dep_bit assigned. So wkdep_srcs/sleepdep_srcs are really just
  15. * software-controllable dependencies. Non-software-controllable
  16. * dependencies do exist, but they are not encoded below (yet).
  17. *
  18. * 24xx does not support programmable sleep dependencies (SLEEPDEP)
  19. *
  20. * The overly-specific dep_bit names are due to a bit name collision
  21. * with CM_FCLKEN_{DSP,IVA2}. The DSP/IVA2 PM_WKDEP and CM_SLEEPDEP shift
  22. * value are the same for all powerdomains: 2
  23. *
  24. * XXX should dep_bit be a mask, so we can test to see if it is 0 as a
  25. * sanity check?
  26. * XXX encode hardware fixed wakeup dependencies -- esp. for 3430 CORE
  27. */
  28. /*
  29. * To-Do List
  30. * -> Port the Sleep/Wakeup dependencies for the domains
  31. * from the Power domain framework
  32. */
  33. #ifndef __ARCH_ARM_MACH_OMAP2_CLOCKDOMAINS_H
  34. #define __ARCH_ARM_MACH_OMAP2_CLOCKDOMAINS_H
  35. #include <plat/clockdomain.h>
  36. #include "cm.h"
  37. #include "prm.h"
  38. /*
  39. * Clockdomain dependencies for wkdeps/sleepdeps
  40. *
  41. * XXX Hardware dependencies (e.g., dependencies that cannot be
  42. * changed in software) are not included here yet, but should be.
  43. */
  44. /* OMAP2/3-common wakeup dependencies */
  45. /*
  46. * 2420/2430 PM_WKDEP_GFX: CORE, MPU, WKUP
  47. * 3430ES1 PM_WKDEP_GFX: adds IVA2, removes CORE
  48. * 3430ES2 PM_WKDEP_SGX: adds IVA2, removes CORE
  49. */
  50. static struct clkdm_dep gfx_sgx_wkdeps[] = {
  51. {
  52. .clkdm_name = "core_l3_clkdm",
  53. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  54. },
  55. {
  56. .clkdm_name = "core_l4_clkdm",
  57. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  58. },
  59. {
  60. .clkdm_name = "iva2_clkdm",
  61. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  62. },
  63. {
  64. .clkdm_name = "mpu_clkdm",
  65. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX |
  66. CHIP_IS_OMAP3430)
  67. },
  68. {
  69. .clkdm_name = "wkup_clkdm",
  70. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX |
  71. CHIP_IS_OMAP3430)
  72. },
  73. { NULL },
  74. };
  75. /* 24XX-specific possible dependencies */
  76. #ifdef CONFIG_ARCH_OMAP24XX
  77. /* Wakeup dependency source arrays */
  78. /*
  79. * 2420/2430 PM_WKDEP_DSP: CORE, MPU, WKUP
  80. * 2420/2430 PM_WKDEP_MDM: same as DSP
  81. */
  82. static struct clkdm_dep dsp_mdm_24xx_wkdeps[] = {
  83. {
  84. .clkdm_name = "core_l3_clkdm",
  85. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  86. },
  87. {
  88. .clkdm_name = "core_l4_clkdm",
  89. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  90. },
  91. {
  92. .clkdm_name = "mpu_clkdm",
  93. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  94. },
  95. {
  96. .clkdm_name = "wkup_clkdm",
  97. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  98. },
  99. { NULL },
  100. };
  101. /*
  102. * 2420 PM_WKDEP_MPU: CORE, DSP, WKUP
  103. * 2430 adds MDM
  104. */
  105. static struct clkdm_dep mpu_24xx_wkdeps[] = {
  106. {
  107. .clkdm_name = "core_l3_clkdm",
  108. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  109. },
  110. {
  111. .clkdm_name = "core_l4_clkdm",
  112. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  113. },
  114. {
  115. .clkdm_name = "dsp_clkdm",
  116. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  117. },
  118. {
  119. .clkdm_name = "wkup_clkdm",
  120. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  121. },
  122. {
  123. .clkdm_name = "mdm_clkdm",
  124. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
  125. },
  126. { NULL },
  127. };
  128. /*
  129. * 2420 PM_WKDEP_CORE: DSP, GFX, MPU, WKUP
  130. * 2430 adds MDM
  131. */
  132. static struct clkdm_dep core_24xx_wkdeps[] = {
  133. {
  134. .clkdm_name = "dsp_clkdm",
  135. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  136. },
  137. {
  138. .clkdm_name = "gfx_clkdm",
  139. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  140. },
  141. {
  142. .clkdm_name = "mpu_clkdm",
  143. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  144. },
  145. {
  146. .clkdm_name = "wkup_clkdm",
  147. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  148. },
  149. {
  150. .clkdm_name = "mdm_clkdm",
  151. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
  152. },
  153. { NULL },
  154. };
  155. #endif
  156. /* 34XX-specific possible dependencies */
  157. #ifdef CONFIG_ARCH_OMAP34XX
  158. /*
  159. * 3430: PM_WKDEP_{PER,USBHOST}: CORE, IVA2, MPU, WKUP
  160. * (USBHOST is ES2 only)
  161. */
  162. static struct clkdm_dep per_usbhost_wkdeps[] = {
  163. {
  164. .clkdm_name = "core_l3_clkdm",
  165. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  166. },
  167. {
  168. .clkdm_name = "core_l4_clkdm",
  169. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  170. },
  171. {
  172. .clkdm_name = "iva2_clkdm",
  173. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  174. },
  175. {
  176. .clkdm_name = "mpu_clkdm",
  177. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  178. },
  179. {
  180. .clkdm_name = "wkup_clkdm",
  181. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  182. },
  183. { NULL },
  184. };
  185. /*
  186. * 3430 PM_WKDEP_MPU: CORE, IVA2, DSS, PER
  187. */
  188. static struct clkdm_dep mpu_34xx_wkdeps[] = {
  189. {
  190. .clkdm_name = "core_l3_clkdm",
  191. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  192. },
  193. {
  194. .clkdm_name = "core_l4_clkdm",
  195. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  196. },
  197. {
  198. .clkdm_name = "iva2_clkdm",
  199. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  200. },
  201. {
  202. .clkdm_name = "dss_clkdm",
  203. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  204. },
  205. {
  206. .clkdm_name = "per_clkdm",
  207. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  208. },
  209. { NULL },
  210. };
  211. /*
  212. * 3430 PM_WKDEP_IVA2: CORE, MPU, WKUP, DSS, PER
  213. */
  214. static struct clkdm_dep iva2_wkdeps[] = {
  215. {
  216. .clkdm_name = "core_l3_clkdm",
  217. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  218. },
  219. {
  220. .clkdm_name = "core_l4_clkdm",
  221. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  222. },
  223. {
  224. .clkdm_name = "mpu_clkdm",
  225. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  226. },
  227. {
  228. .clkdm_name = "wkup_clkdm",
  229. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  230. },
  231. {
  232. .clkdm_name = "dss_clkdm",
  233. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  234. },
  235. {
  236. .clkdm_name = "per_clkdm",
  237. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  238. },
  239. { NULL },
  240. };
  241. /* 3430 PM_WKDEP_{CAM,DSS}: IVA2, MPU, WKUP */
  242. static struct clkdm_dep cam_dss_wkdeps[] = {
  243. {
  244. .clkdm_name = "iva2_clkdm",
  245. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  246. },
  247. {
  248. .clkdm_name = "mpu_clkdm",
  249. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  250. },
  251. {
  252. .clkdm_name = "wkup_clkdm",
  253. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  254. },
  255. { NULL },
  256. };
  257. /* 3430: PM_WKDEP_NEON: MPU */
  258. static struct clkdm_dep neon_wkdeps[] = {
  259. {
  260. .clkdm_name = "mpu_clkdm",
  261. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  262. },
  263. { NULL },
  264. };
  265. /* Sleep dependency source arrays for 34xx-specific clkdms - 34XX only */
  266. /*
  267. * 3430: CM_SLEEPDEP_{DSS,PER}: MPU, IVA
  268. * 3430ES2: CM_SLEEPDEP_USBHOST: MPU, IVA
  269. */
  270. static struct clkdm_dep dss_per_usbhost_sleepdeps[] = {
  271. {
  272. .clkdm_name = "mpu_clkdm",
  273. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  274. },
  275. {
  276. .clkdm_name = "iva2_clkdm",
  277. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  278. },
  279. { NULL },
  280. };
  281. /*
  282. * 3430: CM_SLEEPDEP_CAM: MPU
  283. * 3430ES1: CM_SLEEPDEP_GFX: MPU
  284. * 3430ES2: CM_SLEEPDEP_SGX: MPU
  285. */
  286. static struct clkdm_dep cam_gfx_sleepdeps[] = {
  287. {
  288. .clkdm_name = "mpu_clkdm",
  289. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  290. },
  291. { NULL },
  292. };
  293. #endif /* CONFIG_ARCH_OMAP34XX */
  294. /*
  295. * OMAP2/3-common clockdomains
  296. *
  297. * Even though the 2420 has a single PRCM module from the
  298. * interconnect's perspective, internally it does appear to have
  299. * separate PRM and CM clockdomains. The usual test case is
  300. * sys_clkout/sys_clkout2.
  301. */
  302. #if defined(CONFIG_ARCH_OMAP24XX) | defined(CONFIG_ARCH_OMAP34XX)
  303. /* This is an implicit clockdomain - it is never defined as such in TRM */
  304. static struct clockdomain wkup_clkdm = {
  305. .name = "wkup_clkdm",
  306. .pwrdm = { .name = "wkup_pwrdm" },
  307. .dep_bit = OMAP_EN_WKUP_SHIFT,
  308. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
  309. };
  310. static struct clockdomain prm_clkdm = {
  311. .name = "prm_clkdm",
  312. .pwrdm = { .name = "wkup_pwrdm" },
  313. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
  314. };
  315. static struct clockdomain cm_clkdm = {
  316. .name = "cm_clkdm",
  317. .pwrdm = { .name = "core_pwrdm" },
  318. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
  319. };
  320. #endif
  321. /*
  322. * 2420-only clockdomains
  323. */
  324. #if defined(CONFIG_ARCH_OMAP2420)
  325. static struct clockdomain mpu_2420_clkdm = {
  326. .name = "mpu_clkdm",
  327. .pwrdm = { .name = "mpu_pwrdm" },
  328. .flags = CLKDM_CAN_HWSUP,
  329. .clkstctrl_reg = OMAP2420_CM_REGADDR(MPU_MOD, OMAP2_CM_CLKSTCTRL),
  330. .wkdep_srcs = mpu_24xx_wkdeps,
  331. .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK,
  332. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  333. };
  334. static struct clockdomain iva1_2420_clkdm = {
  335. .name = "iva1_clkdm",
  336. .pwrdm = { .name = "dsp_pwrdm" },
  337. .flags = CLKDM_CAN_HWSUP_SWSUP,
  338. .clkstctrl_reg = OMAP2420_CM_REGADDR(OMAP24XX_DSP_MOD,
  339. OMAP2_CM_CLKSTCTRL),
  340. .dep_bit = OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT,
  341. .wkdep_srcs = dsp_mdm_24xx_wkdeps,
  342. .clktrctrl_mask = OMAP2420_AUTOSTATE_IVA_MASK,
  343. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  344. };
  345. static struct clockdomain dsp_2420_clkdm = {
  346. .name = "dsp_clkdm",
  347. .pwrdm = { .name = "dsp_pwrdm" },
  348. .flags = CLKDM_CAN_HWSUP_SWSUP,
  349. .clkstctrl_reg = OMAP2420_CM_REGADDR(OMAP24XX_DSP_MOD,
  350. OMAP2_CM_CLKSTCTRL),
  351. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK,
  352. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  353. };
  354. static struct clockdomain gfx_2420_clkdm = {
  355. .name = "gfx_clkdm",
  356. .pwrdm = { .name = "gfx_pwrdm" },
  357. .flags = CLKDM_CAN_HWSUP_SWSUP,
  358. .clkstctrl_reg = OMAP2420_CM_REGADDR(GFX_MOD, OMAP2_CM_CLKSTCTRL),
  359. .wkdep_srcs = gfx_sgx_wkdeps,
  360. .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK,
  361. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  362. };
  363. static struct clockdomain core_l3_2420_clkdm = {
  364. .name = "core_l3_clkdm",
  365. .pwrdm = { .name = "core_pwrdm" },
  366. .flags = CLKDM_CAN_HWSUP,
  367. .clkstctrl_reg = OMAP2420_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  368. .wkdep_srcs = core_24xx_wkdeps,
  369. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK,
  370. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  371. };
  372. static struct clockdomain core_l4_2420_clkdm = {
  373. .name = "core_l4_clkdm",
  374. .pwrdm = { .name = "core_pwrdm" },
  375. .flags = CLKDM_CAN_HWSUP,
  376. .clkstctrl_reg = OMAP2420_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  377. .wkdep_srcs = core_24xx_wkdeps,
  378. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK,
  379. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  380. };
  381. static struct clockdomain dss_2420_clkdm = {
  382. .name = "dss_clkdm",
  383. .pwrdm = { .name = "core_pwrdm" },
  384. .flags = CLKDM_CAN_HWSUP,
  385. .clkstctrl_reg = OMAP2420_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  386. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK,
  387. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  388. };
  389. #endif /* CONFIG_ARCH_OMAP2420 */
  390. /*
  391. * 2430-only clockdomains
  392. */
  393. #if defined(CONFIG_ARCH_OMAP2430)
  394. static struct clockdomain mpu_2430_clkdm = {
  395. .name = "mpu_clkdm",
  396. .pwrdm = { .name = "mpu_pwrdm" },
  397. .flags = CLKDM_CAN_HWSUP_SWSUP,
  398. .clkstctrl_reg = OMAP2430_CM_REGADDR(MPU_MOD,
  399. OMAP2_CM_CLKSTCTRL),
  400. .wkdep_srcs = mpu_24xx_wkdeps,
  401. .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK,
  402. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  403. };
  404. /* Another case of bit name collisions between several registers: EN_MDM */
  405. static struct clockdomain mdm_clkdm = {
  406. .name = "mdm_clkdm",
  407. .pwrdm = { .name = "mdm_pwrdm" },
  408. .flags = CLKDM_CAN_HWSUP_SWSUP,
  409. .clkstctrl_reg = OMAP2430_CM_REGADDR(OMAP2430_MDM_MOD,
  410. OMAP2_CM_CLKSTCTRL),
  411. .dep_bit = OMAP2430_PM_WKDEP_MPU_EN_MDM_SHIFT,
  412. .wkdep_srcs = dsp_mdm_24xx_wkdeps,
  413. .clktrctrl_mask = OMAP2430_AUTOSTATE_MDM_MASK,
  414. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  415. };
  416. static struct clockdomain dsp_2430_clkdm = {
  417. .name = "dsp_clkdm",
  418. .pwrdm = { .name = "dsp_pwrdm" },
  419. .flags = CLKDM_CAN_HWSUP_SWSUP,
  420. .clkstctrl_reg = OMAP2430_CM_REGADDR(OMAP24XX_DSP_MOD,
  421. OMAP2_CM_CLKSTCTRL),
  422. .dep_bit = OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT,
  423. .wkdep_srcs = dsp_mdm_24xx_wkdeps,
  424. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK,
  425. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  426. };
  427. static struct clockdomain gfx_2430_clkdm = {
  428. .name = "gfx_clkdm",
  429. .pwrdm = { .name = "gfx_pwrdm" },
  430. .flags = CLKDM_CAN_HWSUP_SWSUP,
  431. .clkstctrl_reg = OMAP2430_CM_REGADDR(GFX_MOD, OMAP2_CM_CLKSTCTRL),
  432. .wkdep_srcs = gfx_sgx_wkdeps,
  433. .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK,
  434. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  435. };
  436. /*
  437. * XXX add usecounting for clkdm dependencies, otherwise the presence
  438. * of a single dep bit for core_l3_24xx_clkdm and core_l4_24xx_clkdm
  439. * could cause trouble
  440. */
  441. static struct clockdomain core_l3_2430_clkdm = {
  442. .name = "core_l3_clkdm",
  443. .pwrdm = { .name = "core_pwrdm" },
  444. .flags = CLKDM_CAN_HWSUP,
  445. .clkstctrl_reg = OMAP2430_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  446. .dep_bit = OMAP24XX_EN_CORE_SHIFT,
  447. .wkdep_srcs = core_24xx_wkdeps,
  448. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK,
  449. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  450. };
  451. /*
  452. * XXX add usecounting for clkdm dependencies, otherwise the presence
  453. * of a single dep bit for core_l3_24xx_clkdm and core_l4_24xx_clkdm
  454. * could cause trouble
  455. */
  456. static struct clockdomain core_l4_2430_clkdm = {
  457. .name = "core_l4_clkdm",
  458. .pwrdm = { .name = "core_pwrdm" },
  459. .flags = CLKDM_CAN_HWSUP,
  460. .clkstctrl_reg = OMAP2430_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  461. .dep_bit = OMAP24XX_EN_CORE_SHIFT,
  462. .wkdep_srcs = core_24xx_wkdeps,
  463. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK,
  464. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  465. };
  466. static struct clockdomain dss_2430_clkdm = {
  467. .name = "dss_clkdm",
  468. .pwrdm = { .name = "core_pwrdm" },
  469. .flags = CLKDM_CAN_HWSUP,
  470. .clkstctrl_reg = OMAP2430_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  471. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK,
  472. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  473. };
  474. #endif /* CONFIG_ARCH_OMAP2430 */
  475. /*
  476. * 34xx clockdomains
  477. */
  478. #if defined(CONFIG_ARCH_OMAP34XX)
  479. static struct clockdomain mpu_34xx_clkdm = {
  480. .name = "mpu_clkdm",
  481. .pwrdm = { .name = "mpu_pwrdm" },
  482. .flags = CLKDM_CAN_HWSUP | CLKDM_CAN_FORCE_WAKEUP,
  483. .clkstctrl_reg = OMAP34XX_CM_REGADDR(MPU_MOD, OMAP2_CM_CLKSTCTRL),
  484. .dep_bit = OMAP3430_EN_MPU_SHIFT,
  485. .wkdep_srcs = mpu_34xx_wkdeps,
  486. .clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK,
  487. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  488. };
  489. static struct clockdomain neon_clkdm = {
  490. .name = "neon_clkdm",
  491. .pwrdm = { .name = "neon_pwrdm" },
  492. .flags = CLKDM_CAN_HWSUP_SWSUP,
  493. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_NEON_MOD,
  494. OMAP2_CM_CLKSTCTRL),
  495. .wkdep_srcs = neon_wkdeps,
  496. .clktrctrl_mask = OMAP3430_CLKTRCTRL_NEON_MASK,
  497. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  498. };
  499. static struct clockdomain iva2_clkdm = {
  500. .name = "iva2_clkdm",
  501. .pwrdm = { .name = "iva2_pwrdm" },
  502. .flags = CLKDM_CAN_HWSUP_SWSUP,
  503. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_IVA2_MOD,
  504. OMAP2_CM_CLKSTCTRL),
  505. .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_IVA2_SHIFT,
  506. .wkdep_srcs = iva2_wkdeps,
  507. .clktrctrl_mask = OMAP3430_CLKTRCTRL_IVA2_MASK,
  508. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  509. };
  510. static struct clockdomain gfx_3430es1_clkdm = {
  511. .name = "gfx_clkdm",
  512. .pwrdm = { .name = "gfx_pwrdm" },
  513. .flags = CLKDM_CAN_HWSUP_SWSUP,
  514. .clkstctrl_reg = OMAP34XX_CM_REGADDR(GFX_MOD, OMAP2_CM_CLKSTCTRL),
  515. .wkdep_srcs = gfx_sgx_wkdeps,
  516. .sleepdep_srcs = cam_gfx_sleepdeps,
  517. .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_GFX_MASK,
  518. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES1),
  519. };
  520. static struct clockdomain sgx_clkdm = {
  521. .name = "sgx_clkdm",
  522. .pwrdm = { .name = "sgx_pwrdm" },
  523. .flags = CLKDM_CAN_HWSUP_SWSUP,
  524. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430ES2_SGX_MOD,
  525. OMAP2_CM_CLKSTCTRL),
  526. .wkdep_srcs = gfx_sgx_wkdeps,
  527. .sleepdep_srcs = cam_gfx_sleepdeps,
  528. .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK,
  529. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  530. };
  531. /*
  532. * The die-to-die clockdomain was documented in the 34xx ES1 TRM, but
  533. * then that information was removed from the 34xx ES2+ TRM. It is
  534. * unclear whether the core is still there, but the clockdomain logic
  535. * is there, and must be programmed to an appropriate state if the
  536. * CORE clockdomain is to become inactive.
  537. */
  538. static struct clockdomain d2d_clkdm = {
  539. .name = "d2d_clkdm",
  540. .pwrdm = { .name = "core_pwrdm" },
  541. .flags = CLKDM_CAN_HWSUP_SWSUP,
  542. .clkstctrl_reg = OMAP34XX_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  543. .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_D2D_MASK,
  544. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  545. };
  546. /*
  547. * XXX add usecounting for clkdm dependencies, otherwise the presence
  548. * of a single dep bit for core_l3_34xx_clkdm and core_l4_34xx_clkdm
  549. * could cause trouble
  550. */
  551. static struct clockdomain core_l3_34xx_clkdm = {
  552. .name = "core_l3_clkdm",
  553. .pwrdm = { .name = "core_pwrdm" },
  554. .flags = CLKDM_CAN_HWSUP,
  555. .clkstctrl_reg = OMAP34XX_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  556. .dep_bit = OMAP3430_EN_CORE_SHIFT,
  557. .clktrctrl_mask = OMAP3430_CLKTRCTRL_L3_MASK,
  558. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  559. };
  560. /*
  561. * XXX add usecounting for clkdm dependencies, otherwise the presence
  562. * of a single dep bit for core_l3_34xx_clkdm and core_l4_34xx_clkdm
  563. * could cause trouble
  564. */
  565. static struct clockdomain core_l4_34xx_clkdm = {
  566. .name = "core_l4_clkdm",
  567. .pwrdm = { .name = "core_pwrdm" },
  568. .flags = CLKDM_CAN_HWSUP,
  569. .clkstctrl_reg = OMAP34XX_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  570. .dep_bit = OMAP3430_EN_CORE_SHIFT,
  571. .clktrctrl_mask = OMAP3430_CLKTRCTRL_L4_MASK,
  572. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  573. };
  574. /* Another case of bit name collisions between several registers: EN_DSS */
  575. static struct clockdomain dss_34xx_clkdm = {
  576. .name = "dss_clkdm",
  577. .pwrdm = { .name = "dss_pwrdm" },
  578. .flags = CLKDM_CAN_HWSUP_SWSUP,
  579. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_DSS_MOD,
  580. OMAP2_CM_CLKSTCTRL),
  581. .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT,
  582. .wkdep_srcs = cam_dss_wkdeps,
  583. .sleepdep_srcs = dss_per_usbhost_sleepdeps,
  584. .clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK,
  585. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  586. };
  587. static struct clockdomain cam_clkdm = {
  588. .name = "cam_clkdm",
  589. .pwrdm = { .name = "cam_pwrdm" },
  590. .flags = CLKDM_CAN_HWSUP_SWSUP,
  591. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_CAM_MOD,
  592. OMAP2_CM_CLKSTCTRL),
  593. .wkdep_srcs = cam_dss_wkdeps,
  594. .sleepdep_srcs = cam_gfx_sleepdeps,
  595. .clktrctrl_mask = OMAP3430_CLKTRCTRL_CAM_MASK,
  596. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  597. };
  598. static struct clockdomain usbhost_clkdm = {
  599. .name = "usbhost_clkdm",
  600. .pwrdm = { .name = "usbhost_pwrdm" },
  601. .flags = CLKDM_CAN_HWSUP_SWSUP,
  602. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430ES2_USBHOST_MOD,
  603. OMAP2_CM_CLKSTCTRL),
  604. .wkdep_srcs = per_usbhost_wkdeps,
  605. .sleepdep_srcs = dss_per_usbhost_sleepdeps,
  606. .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK,
  607. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  608. };
  609. static struct clockdomain per_clkdm = {
  610. .name = "per_clkdm",
  611. .pwrdm = { .name = "per_pwrdm" },
  612. .flags = CLKDM_CAN_HWSUP_SWSUP,
  613. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_PER_MOD,
  614. OMAP2_CM_CLKSTCTRL),
  615. .dep_bit = OMAP3430_EN_PER_SHIFT,
  616. .wkdep_srcs = per_usbhost_wkdeps,
  617. .sleepdep_srcs = dss_per_usbhost_sleepdeps,
  618. .clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK,
  619. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  620. };
  621. /*
  622. * Disable hw supervised mode for emu_clkdm, because emu_pwrdm is
  623. * switched of even if sdti is in use
  624. */
  625. static struct clockdomain emu_clkdm = {
  626. .name = "emu_clkdm",
  627. .pwrdm = { .name = "emu_pwrdm" },
  628. .flags = /* CLKDM_CAN_ENABLE_AUTO | */CLKDM_CAN_SWSUP,
  629. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_EMU_MOD,
  630. OMAP2_CM_CLKSTCTRL),
  631. .clktrctrl_mask = OMAP3430_CLKTRCTRL_EMU_MASK,
  632. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  633. };
  634. static struct clockdomain dpll1_clkdm = {
  635. .name = "dpll1_clkdm",
  636. .pwrdm = { .name = "dpll1_pwrdm" },
  637. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  638. };
  639. static struct clockdomain dpll2_clkdm = {
  640. .name = "dpll2_clkdm",
  641. .pwrdm = { .name = "dpll2_pwrdm" },
  642. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  643. };
  644. static struct clockdomain dpll3_clkdm = {
  645. .name = "dpll3_clkdm",
  646. .pwrdm = { .name = "dpll3_pwrdm" },
  647. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  648. };
  649. static struct clockdomain dpll4_clkdm = {
  650. .name = "dpll4_clkdm",
  651. .pwrdm = { .name = "dpll4_pwrdm" },
  652. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  653. };
  654. static struct clockdomain dpll5_clkdm = {
  655. .name = "dpll5_clkdm",
  656. .pwrdm = { .name = "dpll5_pwrdm" },
  657. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  658. };
  659. #endif /* CONFIG_ARCH_OMAP34XX */
  660. #include "clockdomains44xx.h"
  661. /*
  662. * Clockdomain hwsup dependencies (34XX only)
  663. */
  664. static struct clkdm_autodep clkdm_autodeps[] = {
  665. {
  666. .clkdm = { .name = "mpu_clkdm" },
  667. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  668. },
  669. {
  670. .clkdm = { .name = "iva2_clkdm" },
  671. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  672. },
  673. {
  674. .clkdm = { .name = NULL },
  675. }
  676. };
  677. /*
  678. * List of clockdomain pointers per platform
  679. */
  680. static struct clockdomain *clockdomains_omap[] = {
  681. #if defined(CONFIG_ARCH_OMAP24XX) | defined(CONFIG_ARCH_OMAP34XX)
  682. &wkup_clkdm,
  683. &cm_clkdm,
  684. &prm_clkdm,
  685. #endif
  686. #ifdef CONFIG_ARCH_OMAP2420
  687. &mpu_2420_clkdm,
  688. &iva1_2420_clkdm,
  689. &dsp_2420_clkdm,
  690. &gfx_2420_clkdm,
  691. &core_l3_2420_clkdm,
  692. &core_l4_2420_clkdm,
  693. &dss_2420_clkdm,
  694. #endif
  695. #ifdef CONFIG_ARCH_OMAP2430
  696. &mpu_2430_clkdm,
  697. &mdm_clkdm,
  698. &dsp_2430_clkdm,
  699. &gfx_2430_clkdm,
  700. &core_l3_2430_clkdm,
  701. &core_l4_2430_clkdm,
  702. &dss_2430_clkdm,
  703. #endif
  704. #ifdef CONFIG_ARCH_OMAP34XX
  705. &mpu_34xx_clkdm,
  706. &neon_clkdm,
  707. &iva2_clkdm,
  708. &gfx_3430es1_clkdm,
  709. &sgx_clkdm,
  710. &d2d_clkdm,
  711. &core_l3_34xx_clkdm,
  712. &core_l4_34xx_clkdm,
  713. &dss_34xx_clkdm,
  714. &cam_clkdm,
  715. &usbhost_clkdm,
  716. &per_clkdm,
  717. &emu_clkdm,
  718. &dpll1_clkdm,
  719. &dpll2_clkdm,
  720. &dpll3_clkdm,
  721. &dpll4_clkdm,
  722. &dpll5_clkdm,
  723. #endif
  724. #ifdef CONFIG_ARCH_OMAP4
  725. &l4_cefuse_44xx_clkdm,
  726. &l4_cfg_44xx_clkdm,
  727. &tesla_44xx_clkdm,
  728. &l3_gfx_44xx_clkdm,
  729. &ivahd_44xx_clkdm,
  730. &l4_secure_44xx_clkdm,
  731. &l4_per_44xx_clkdm,
  732. &abe_44xx_clkdm,
  733. &l3_instr_44xx_clkdm,
  734. &l3_init_44xx_clkdm,
  735. &mpuss_44xx_clkdm,
  736. &mpu0_44xx_clkdm,
  737. &mpu1_44xx_clkdm,
  738. &l3_emif_44xx_clkdm,
  739. &l4_ao_44xx_clkdm,
  740. &ducati_44xx_clkdm,
  741. &l3_2_44xx_clkdm,
  742. &l3_1_44xx_clkdm,
  743. &l3_d2d_44xx_clkdm,
  744. &iss_44xx_clkdm,
  745. &l3_dss_44xx_clkdm,
  746. &l4_wkup_44xx_clkdm,
  747. &emu_sys_44xx_clkdm,
  748. &l3_dma_44xx_clkdm,
  749. #endif
  750. NULL,
  751. };
  752. #endif