clockdomains.h 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937
  1. /*
  2. * OMAP2/3 clockdomains
  3. *
  4. * Copyright (C) 2008-2009 Texas Instruments, Inc.
  5. * Copyright (C) 2008-2010 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. * These can share data since they will never be present simultaneously
  50. * on the same device.
  51. */
  52. static struct clkdm_dep gfx_sgx_wkdeps[] = {
  53. {
  54. .clkdm_name = "core_l3_clkdm",
  55. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  56. },
  57. {
  58. .clkdm_name = "core_l4_clkdm",
  59. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  60. },
  61. {
  62. .clkdm_name = "iva2_clkdm",
  63. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  64. },
  65. {
  66. .clkdm_name = "mpu_clkdm",
  67. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX |
  68. CHIP_IS_OMAP3430)
  69. },
  70. {
  71. .clkdm_name = "wkup_clkdm",
  72. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX |
  73. CHIP_IS_OMAP3430)
  74. },
  75. { NULL },
  76. };
  77. /* 24XX-specific possible dependencies */
  78. #ifdef CONFIG_ARCH_OMAP2
  79. /* Wakeup dependency source arrays */
  80. /* 2420/2430 PM_WKDEP_DSP: CORE, MPU, WKUP */
  81. static struct clkdm_dep dsp_24xx_wkdeps[] = {
  82. {
  83. .clkdm_name = "core_l3_clkdm",
  84. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  85. },
  86. {
  87. .clkdm_name = "core_l4_clkdm",
  88. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  89. },
  90. {
  91. .clkdm_name = "mpu_clkdm",
  92. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  93. },
  94. {
  95. .clkdm_name = "wkup_clkdm",
  96. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  97. },
  98. { NULL },
  99. };
  100. /*
  101. * 2420 PM_WKDEP_MPU: CORE, DSP, WKUP
  102. * 2430 adds MDM
  103. */
  104. static struct clkdm_dep mpu_24xx_wkdeps[] = {
  105. {
  106. .clkdm_name = "core_l3_clkdm",
  107. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  108. },
  109. {
  110. .clkdm_name = "core_l4_clkdm",
  111. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  112. },
  113. {
  114. .clkdm_name = "dsp_clkdm",
  115. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  116. },
  117. {
  118. .clkdm_name = "wkup_clkdm",
  119. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  120. },
  121. {
  122. .clkdm_name = "mdm_clkdm",
  123. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
  124. },
  125. { NULL },
  126. };
  127. /*
  128. * 2420 PM_WKDEP_CORE: DSP, GFX, MPU, WKUP
  129. * 2430 adds MDM
  130. */
  131. static struct clkdm_dep core_24xx_wkdeps[] = {
  132. {
  133. .clkdm_name = "dsp_clkdm",
  134. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  135. },
  136. {
  137. .clkdm_name = "gfx_clkdm",
  138. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  139. },
  140. {
  141. .clkdm_name = "mpu_clkdm",
  142. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  143. },
  144. {
  145. .clkdm_name = "wkup_clkdm",
  146. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  147. },
  148. {
  149. .clkdm_name = "mdm_clkdm",
  150. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
  151. },
  152. { NULL },
  153. };
  154. #endif
  155. /* 2430-specific possible wakeup dependencies */
  156. #ifdef CONFIG_ARCH_OMAP2430
  157. /* 2430 PM_WKDEP_MDM: CORE, MPU, WKUP */
  158. static struct clkdm_dep mdm_2430_wkdeps[] = {
  159. {
  160. .clkdm_name = "core_l3_clkdm",
  161. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  162. },
  163. {
  164. .clkdm_name = "core_l4_clkdm",
  165. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  166. },
  167. {
  168. .clkdm_name = "mpu_clkdm",
  169. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  170. },
  171. {
  172. .clkdm_name = "wkup_clkdm",
  173. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
  174. },
  175. { NULL },
  176. };
  177. #endif /* CONFIG_ARCH_OMAP2430 */
  178. /* OMAP3-specific possible dependencies */
  179. #ifdef CONFIG_ARCH_OMAP3
  180. /* 3430: PM_WKDEP_PER: CORE, IVA2, MPU, WKUP */
  181. static struct clkdm_dep per_wkdeps[] = {
  182. {
  183. .clkdm_name = "core_l3_clkdm",
  184. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  185. },
  186. {
  187. .clkdm_name = "core_l4_clkdm",
  188. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  189. },
  190. {
  191. .clkdm_name = "iva2_clkdm",
  192. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  193. },
  194. {
  195. .clkdm_name = "mpu_clkdm",
  196. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  197. },
  198. {
  199. .clkdm_name = "wkup_clkdm",
  200. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  201. },
  202. { NULL },
  203. };
  204. /* 3430ES2: PM_WKDEP_USBHOST: CORE, IVA2, MPU, WKUP */
  205. static struct clkdm_dep usbhost_wkdeps[] = {
  206. {
  207. .clkdm_name = "core_l3_clkdm",
  208. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  209. },
  210. {
  211. .clkdm_name = "core_l4_clkdm",
  212. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  213. },
  214. {
  215. .clkdm_name = "iva2_clkdm",
  216. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  217. },
  218. {
  219. .clkdm_name = "mpu_clkdm",
  220. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  221. },
  222. {
  223. .clkdm_name = "wkup_clkdm",
  224. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  225. },
  226. { NULL },
  227. };
  228. /* 3430 PM_WKDEP_MPU: CORE, IVA2, DSS, PER */
  229. static struct clkdm_dep mpu_3xxx_wkdeps[] = {
  230. {
  231. .clkdm_name = "core_l3_clkdm",
  232. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  233. },
  234. {
  235. .clkdm_name = "core_l4_clkdm",
  236. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  237. },
  238. {
  239. .clkdm_name = "iva2_clkdm",
  240. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  241. },
  242. {
  243. .clkdm_name = "dss_clkdm",
  244. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  245. },
  246. {
  247. .clkdm_name = "per_clkdm",
  248. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  249. },
  250. { NULL },
  251. };
  252. /* 3430 PM_WKDEP_IVA2: CORE, MPU, WKUP, DSS, PER */
  253. static struct clkdm_dep iva2_wkdeps[] = {
  254. {
  255. .clkdm_name = "core_l3_clkdm",
  256. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  257. },
  258. {
  259. .clkdm_name = "core_l4_clkdm",
  260. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  261. },
  262. {
  263. .clkdm_name = "mpu_clkdm",
  264. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  265. },
  266. {
  267. .clkdm_name = "wkup_clkdm",
  268. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  269. },
  270. {
  271. .clkdm_name = "dss_clkdm",
  272. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  273. },
  274. {
  275. .clkdm_name = "per_clkdm",
  276. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  277. },
  278. { NULL },
  279. };
  280. /* 3430 PM_WKDEP_CAM: IVA2, MPU, WKUP */
  281. static struct clkdm_dep cam_wkdeps[] = {
  282. {
  283. .clkdm_name = "iva2_clkdm",
  284. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  285. },
  286. {
  287. .clkdm_name = "mpu_clkdm",
  288. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  289. },
  290. {
  291. .clkdm_name = "wkup_clkdm",
  292. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  293. },
  294. { NULL },
  295. };
  296. /* 3430 PM_WKDEP_DSS: IVA2, MPU, WKUP */
  297. static struct clkdm_dep dss_wkdeps[] = {
  298. {
  299. .clkdm_name = "iva2_clkdm",
  300. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  301. },
  302. {
  303. .clkdm_name = "mpu_clkdm",
  304. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  305. },
  306. {
  307. .clkdm_name = "wkup_clkdm",
  308. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  309. },
  310. { NULL },
  311. };
  312. /* 3430: PM_WKDEP_NEON: MPU */
  313. static struct clkdm_dep neon_wkdeps[] = {
  314. {
  315. .clkdm_name = "mpu_clkdm",
  316. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  317. },
  318. { NULL },
  319. };
  320. /* Sleep dependency source arrays for OMAP3-specific clkdms */
  321. /* 3430: CM_SLEEPDEP_DSS: MPU, IVA */
  322. static struct clkdm_dep dss_sleepdeps[] = {
  323. {
  324. .clkdm_name = "mpu_clkdm",
  325. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  326. },
  327. {
  328. .clkdm_name = "iva2_clkdm",
  329. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  330. },
  331. { NULL },
  332. };
  333. /* 3430: CM_SLEEPDEP_PER: MPU, IVA */
  334. static struct clkdm_dep per_sleepdeps[] = {
  335. {
  336. .clkdm_name = "mpu_clkdm",
  337. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  338. },
  339. {
  340. .clkdm_name = "iva2_clkdm",
  341. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  342. },
  343. { NULL },
  344. };
  345. /* 3430ES2: CM_SLEEPDEP_USBHOST: MPU, IVA */
  346. static struct clkdm_dep usbhost_sleepdeps[] = {
  347. {
  348. .clkdm_name = "mpu_clkdm",
  349. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  350. },
  351. {
  352. .clkdm_name = "iva2_clkdm",
  353. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  354. },
  355. { NULL },
  356. };
  357. /* 3430: CM_SLEEPDEP_CAM: MPU */
  358. static struct clkdm_dep cam_sleepdeps[] = {
  359. {
  360. .clkdm_name = "mpu_clkdm",
  361. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  362. },
  363. { NULL },
  364. };
  365. /*
  366. * 3430ES1: CM_SLEEPDEP_GFX: MPU
  367. * 3430ES2: CM_SLEEPDEP_SGX: MPU
  368. * These can share data since they will never be present simultaneously
  369. * on the same device.
  370. */
  371. static struct clkdm_dep gfx_sgx_sleepdeps[] = {
  372. {
  373. .clkdm_name = "mpu_clkdm",
  374. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  375. },
  376. { NULL },
  377. };
  378. #endif /* CONFIG_ARCH_OMAP3 */
  379. /*
  380. * OMAP2/3-common clockdomains
  381. *
  382. * Even though the 2420 has a single PRCM module from the
  383. * interconnect's perspective, internally it does appear to have
  384. * separate PRM and CM clockdomains. The usual test case is
  385. * sys_clkout/sys_clkout2.
  386. */
  387. #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
  388. /* This is an implicit clockdomain - it is never defined as such in TRM */
  389. static struct clockdomain wkup_clkdm = {
  390. .name = "wkup_clkdm",
  391. .pwrdm = { .name = "wkup_pwrdm" },
  392. .dep_bit = OMAP_EN_WKUP_SHIFT,
  393. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
  394. };
  395. static struct clockdomain prm_clkdm = {
  396. .name = "prm_clkdm",
  397. .pwrdm = { .name = "wkup_pwrdm" },
  398. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
  399. };
  400. static struct clockdomain cm_clkdm = {
  401. .name = "cm_clkdm",
  402. .pwrdm = { .name = "core_pwrdm" },
  403. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
  404. };
  405. #endif
  406. /*
  407. * 2420-only clockdomains
  408. */
  409. #if defined(CONFIG_ARCH_OMAP2420)
  410. static struct clockdomain mpu_2420_clkdm = {
  411. .name = "mpu_clkdm",
  412. .pwrdm = { .name = "mpu_pwrdm" },
  413. .flags = CLKDM_CAN_HWSUP,
  414. .clkstctrl_reg = OMAP2420_CM_REGADDR(MPU_MOD, OMAP2_CM_CLKSTCTRL),
  415. .wkdep_srcs = mpu_24xx_wkdeps,
  416. .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK,
  417. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  418. };
  419. static struct clockdomain iva1_2420_clkdm = {
  420. .name = "iva1_clkdm",
  421. .pwrdm = { .name = "dsp_pwrdm" },
  422. .flags = CLKDM_CAN_HWSUP_SWSUP,
  423. .clkstctrl_reg = OMAP2420_CM_REGADDR(OMAP24XX_DSP_MOD,
  424. OMAP2_CM_CLKSTCTRL),
  425. .dep_bit = OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT,
  426. .wkdep_srcs = dsp_24xx_wkdeps,
  427. .clktrctrl_mask = OMAP2420_AUTOSTATE_IVA_MASK,
  428. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  429. };
  430. static struct clockdomain dsp_2420_clkdm = {
  431. .name = "dsp_clkdm",
  432. .pwrdm = { .name = "dsp_pwrdm" },
  433. .flags = CLKDM_CAN_HWSUP_SWSUP,
  434. .clkstctrl_reg = OMAP2420_CM_REGADDR(OMAP24XX_DSP_MOD,
  435. OMAP2_CM_CLKSTCTRL),
  436. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK,
  437. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  438. };
  439. static struct clockdomain gfx_2420_clkdm = {
  440. .name = "gfx_clkdm",
  441. .pwrdm = { .name = "gfx_pwrdm" },
  442. .flags = CLKDM_CAN_HWSUP_SWSUP,
  443. .clkstctrl_reg = OMAP2420_CM_REGADDR(GFX_MOD, OMAP2_CM_CLKSTCTRL),
  444. .wkdep_srcs = gfx_sgx_wkdeps,
  445. .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK,
  446. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  447. };
  448. static struct clockdomain core_l3_2420_clkdm = {
  449. .name = "core_l3_clkdm",
  450. .pwrdm = { .name = "core_pwrdm" },
  451. .flags = CLKDM_CAN_HWSUP,
  452. .clkstctrl_reg = OMAP2420_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  453. .wkdep_srcs = core_24xx_wkdeps,
  454. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK,
  455. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  456. };
  457. static struct clockdomain core_l4_2420_clkdm = {
  458. .name = "core_l4_clkdm",
  459. .pwrdm = { .name = "core_pwrdm" },
  460. .flags = CLKDM_CAN_HWSUP,
  461. .clkstctrl_reg = OMAP2420_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  462. .wkdep_srcs = core_24xx_wkdeps,
  463. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK,
  464. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  465. };
  466. static struct clockdomain dss_2420_clkdm = {
  467. .name = "dss_clkdm",
  468. .pwrdm = { .name = "core_pwrdm" },
  469. .flags = CLKDM_CAN_HWSUP,
  470. .clkstctrl_reg = OMAP2420_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  471. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK,
  472. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  473. };
  474. #endif /* CONFIG_ARCH_OMAP2420 */
  475. /*
  476. * 2430-only clockdomains
  477. */
  478. #if defined(CONFIG_ARCH_OMAP2430)
  479. static struct clockdomain mpu_2430_clkdm = {
  480. .name = "mpu_clkdm",
  481. .pwrdm = { .name = "mpu_pwrdm" },
  482. .flags = CLKDM_CAN_HWSUP_SWSUP,
  483. .clkstctrl_reg = OMAP2430_CM_REGADDR(MPU_MOD,
  484. OMAP2_CM_CLKSTCTRL),
  485. .wkdep_srcs = mpu_24xx_wkdeps,
  486. .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK,
  487. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  488. };
  489. /* Another case of bit name collisions between several registers: EN_MDM */
  490. static struct clockdomain mdm_clkdm = {
  491. .name = "mdm_clkdm",
  492. .pwrdm = { .name = "mdm_pwrdm" },
  493. .flags = CLKDM_CAN_HWSUP_SWSUP,
  494. .clkstctrl_reg = OMAP2430_CM_REGADDR(OMAP2430_MDM_MOD,
  495. OMAP2_CM_CLKSTCTRL),
  496. .dep_bit = OMAP2430_PM_WKDEP_MPU_EN_MDM_SHIFT,
  497. .wkdep_srcs = mdm_2430_wkdeps,
  498. .clktrctrl_mask = OMAP2430_AUTOSTATE_MDM_MASK,
  499. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  500. };
  501. static struct clockdomain dsp_2430_clkdm = {
  502. .name = "dsp_clkdm",
  503. .pwrdm = { .name = "dsp_pwrdm" },
  504. .flags = CLKDM_CAN_HWSUP_SWSUP,
  505. .clkstctrl_reg = OMAP2430_CM_REGADDR(OMAP24XX_DSP_MOD,
  506. OMAP2_CM_CLKSTCTRL),
  507. .dep_bit = OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT,
  508. .wkdep_srcs = dsp_24xx_wkdeps,
  509. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK,
  510. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  511. };
  512. static struct clockdomain gfx_2430_clkdm = {
  513. .name = "gfx_clkdm",
  514. .pwrdm = { .name = "gfx_pwrdm" },
  515. .flags = CLKDM_CAN_HWSUP_SWSUP,
  516. .clkstctrl_reg = OMAP2430_CM_REGADDR(GFX_MOD, OMAP2_CM_CLKSTCTRL),
  517. .wkdep_srcs = gfx_sgx_wkdeps,
  518. .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK,
  519. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  520. };
  521. /*
  522. * XXX add usecounting for clkdm dependencies, otherwise the presence
  523. * of a single dep bit for core_l3_24xx_clkdm and core_l4_24xx_clkdm
  524. * could cause trouble
  525. */
  526. static struct clockdomain core_l3_2430_clkdm = {
  527. .name = "core_l3_clkdm",
  528. .pwrdm = { .name = "core_pwrdm" },
  529. .flags = CLKDM_CAN_HWSUP,
  530. .clkstctrl_reg = OMAP2430_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  531. .dep_bit = OMAP24XX_EN_CORE_SHIFT,
  532. .wkdep_srcs = core_24xx_wkdeps,
  533. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK,
  534. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  535. };
  536. /*
  537. * XXX add usecounting for clkdm dependencies, otherwise the presence
  538. * of a single dep bit for core_l3_24xx_clkdm and core_l4_24xx_clkdm
  539. * could cause trouble
  540. */
  541. static struct clockdomain core_l4_2430_clkdm = {
  542. .name = "core_l4_clkdm",
  543. .pwrdm = { .name = "core_pwrdm" },
  544. .flags = CLKDM_CAN_HWSUP,
  545. .clkstctrl_reg = OMAP2430_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  546. .dep_bit = OMAP24XX_EN_CORE_SHIFT,
  547. .wkdep_srcs = core_24xx_wkdeps,
  548. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK,
  549. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  550. };
  551. static struct clockdomain dss_2430_clkdm = {
  552. .name = "dss_clkdm",
  553. .pwrdm = { .name = "core_pwrdm" },
  554. .flags = CLKDM_CAN_HWSUP,
  555. .clkstctrl_reg = OMAP2430_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  556. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK,
  557. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  558. };
  559. #endif /* CONFIG_ARCH_OMAP2430 */
  560. /*
  561. * OMAP3 clockdomains
  562. */
  563. #if defined(CONFIG_ARCH_OMAP3)
  564. static struct clockdomain mpu_3xxx_clkdm = {
  565. .name = "mpu_clkdm",
  566. .pwrdm = { .name = "mpu_pwrdm" },
  567. .flags = CLKDM_CAN_HWSUP | CLKDM_CAN_FORCE_WAKEUP,
  568. .clkstctrl_reg = OMAP34XX_CM_REGADDR(MPU_MOD, OMAP2_CM_CLKSTCTRL),
  569. .dep_bit = OMAP3430_EN_MPU_SHIFT,
  570. .wkdep_srcs = mpu_3xxx_wkdeps,
  571. .clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK,
  572. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  573. };
  574. static struct clockdomain neon_clkdm = {
  575. .name = "neon_clkdm",
  576. .pwrdm = { .name = "neon_pwrdm" },
  577. .flags = CLKDM_CAN_HWSUP_SWSUP,
  578. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_NEON_MOD,
  579. OMAP2_CM_CLKSTCTRL),
  580. .wkdep_srcs = neon_wkdeps,
  581. .clktrctrl_mask = OMAP3430_CLKTRCTRL_NEON_MASK,
  582. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  583. };
  584. static struct clockdomain iva2_clkdm = {
  585. .name = "iva2_clkdm",
  586. .pwrdm = { .name = "iva2_pwrdm" },
  587. .flags = CLKDM_CAN_HWSUP_SWSUP,
  588. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_IVA2_MOD,
  589. OMAP2_CM_CLKSTCTRL),
  590. .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_IVA2_SHIFT,
  591. .wkdep_srcs = iva2_wkdeps,
  592. .clktrctrl_mask = OMAP3430_CLKTRCTRL_IVA2_MASK,
  593. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  594. };
  595. static struct clockdomain gfx_3430es1_clkdm = {
  596. .name = "gfx_clkdm",
  597. .pwrdm = { .name = "gfx_pwrdm" },
  598. .flags = CLKDM_CAN_HWSUP_SWSUP,
  599. .clkstctrl_reg = OMAP34XX_CM_REGADDR(GFX_MOD, OMAP2_CM_CLKSTCTRL),
  600. .wkdep_srcs = gfx_sgx_wkdeps,
  601. .sleepdep_srcs = gfx_sgx_sleepdeps,
  602. .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_GFX_MASK,
  603. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES1),
  604. };
  605. static struct clockdomain sgx_clkdm = {
  606. .name = "sgx_clkdm",
  607. .pwrdm = { .name = "sgx_pwrdm" },
  608. .flags = CLKDM_CAN_HWSUP_SWSUP,
  609. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430ES2_SGX_MOD,
  610. OMAP2_CM_CLKSTCTRL),
  611. .wkdep_srcs = gfx_sgx_wkdeps,
  612. .sleepdep_srcs = gfx_sgx_sleepdeps,
  613. .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK,
  614. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  615. };
  616. /*
  617. * The die-to-die clockdomain was documented in the 34xx ES1 TRM, but
  618. * then that information was removed from the 34xx ES2+ TRM. It is
  619. * unclear whether the core is still there, but the clockdomain logic
  620. * is there, and must be programmed to an appropriate state if the
  621. * CORE clockdomain is to become inactive.
  622. */
  623. static struct clockdomain d2d_clkdm = {
  624. .name = "d2d_clkdm",
  625. .pwrdm = { .name = "core_pwrdm" },
  626. .flags = CLKDM_CAN_HWSUP_SWSUP,
  627. .clkstctrl_reg = OMAP34XX_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  628. .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_D2D_MASK,
  629. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  630. };
  631. /*
  632. * XXX add usecounting for clkdm dependencies, otherwise the presence
  633. * of a single dep bit for core_l3_3xxx_clkdm and core_l4_3xxx_clkdm
  634. * could cause trouble
  635. */
  636. static struct clockdomain core_l3_3xxx_clkdm = {
  637. .name = "core_l3_clkdm",
  638. .pwrdm = { .name = "core_pwrdm" },
  639. .flags = CLKDM_CAN_HWSUP,
  640. .clkstctrl_reg = OMAP34XX_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  641. .dep_bit = OMAP3430_EN_CORE_SHIFT,
  642. .clktrctrl_mask = OMAP3430_CLKTRCTRL_L3_MASK,
  643. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  644. };
  645. /*
  646. * XXX add usecounting for clkdm dependencies, otherwise the presence
  647. * of a single dep bit for core_l3_3xxx_clkdm and core_l4_3xxx_clkdm
  648. * could cause trouble
  649. */
  650. static struct clockdomain core_l4_3xxx_clkdm = {
  651. .name = "core_l4_clkdm",
  652. .pwrdm = { .name = "core_pwrdm" },
  653. .flags = CLKDM_CAN_HWSUP,
  654. .clkstctrl_reg = OMAP34XX_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
  655. .dep_bit = OMAP3430_EN_CORE_SHIFT,
  656. .clktrctrl_mask = OMAP3430_CLKTRCTRL_L4_MASK,
  657. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  658. };
  659. /* Another case of bit name collisions between several registers: EN_DSS */
  660. static struct clockdomain dss_3xxx_clkdm = {
  661. .name = "dss_clkdm",
  662. .pwrdm = { .name = "dss_pwrdm" },
  663. .flags = CLKDM_CAN_HWSUP_SWSUP,
  664. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_DSS_MOD,
  665. OMAP2_CM_CLKSTCTRL),
  666. .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT,
  667. .wkdep_srcs = dss_wkdeps,
  668. .sleepdep_srcs = dss_sleepdeps,
  669. .clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK,
  670. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  671. };
  672. static struct clockdomain cam_clkdm = {
  673. .name = "cam_clkdm",
  674. .pwrdm = { .name = "cam_pwrdm" },
  675. .flags = CLKDM_CAN_HWSUP_SWSUP,
  676. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_CAM_MOD,
  677. OMAP2_CM_CLKSTCTRL),
  678. .wkdep_srcs = cam_wkdeps,
  679. .sleepdep_srcs = cam_sleepdeps,
  680. .clktrctrl_mask = OMAP3430_CLKTRCTRL_CAM_MASK,
  681. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  682. };
  683. static struct clockdomain usbhost_clkdm = {
  684. .name = "usbhost_clkdm",
  685. .pwrdm = { .name = "usbhost_pwrdm" },
  686. .flags = CLKDM_CAN_HWSUP_SWSUP,
  687. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430ES2_USBHOST_MOD,
  688. OMAP2_CM_CLKSTCTRL),
  689. .wkdep_srcs = usbhost_wkdeps,
  690. .sleepdep_srcs = usbhost_sleepdeps,
  691. .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK,
  692. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  693. };
  694. static struct clockdomain per_clkdm = {
  695. .name = "per_clkdm",
  696. .pwrdm = { .name = "per_pwrdm" },
  697. .flags = CLKDM_CAN_HWSUP_SWSUP,
  698. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_PER_MOD,
  699. OMAP2_CM_CLKSTCTRL),
  700. .dep_bit = OMAP3430_EN_PER_SHIFT,
  701. .wkdep_srcs = per_wkdeps,
  702. .sleepdep_srcs = per_sleepdeps,
  703. .clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK,
  704. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  705. };
  706. /*
  707. * Disable hw supervised mode for emu_clkdm, because emu_pwrdm is
  708. * switched of even if sdti is in use
  709. */
  710. static struct clockdomain emu_clkdm = {
  711. .name = "emu_clkdm",
  712. .pwrdm = { .name = "emu_pwrdm" },
  713. .flags = /* CLKDM_CAN_ENABLE_AUTO | */CLKDM_CAN_SWSUP,
  714. .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_EMU_MOD,
  715. OMAP2_CM_CLKSTCTRL),
  716. .clktrctrl_mask = OMAP3430_CLKTRCTRL_EMU_MASK,
  717. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  718. };
  719. static struct clockdomain dpll1_clkdm = {
  720. .name = "dpll1_clkdm",
  721. .pwrdm = { .name = "dpll1_pwrdm" },
  722. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  723. };
  724. static struct clockdomain dpll2_clkdm = {
  725. .name = "dpll2_clkdm",
  726. .pwrdm = { .name = "dpll2_pwrdm" },
  727. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  728. };
  729. static struct clockdomain dpll3_clkdm = {
  730. .name = "dpll3_clkdm",
  731. .pwrdm = { .name = "dpll3_pwrdm" },
  732. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  733. };
  734. static struct clockdomain dpll4_clkdm = {
  735. .name = "dpll4_clkdm",
  736. .pwrdm = { .name = "dpll4_pwrdm" },
  737. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  738. };
  739. static struct clockdomain dpll5_clkdm = {
  740. .name = "dpll5_clkdm",
  741. .pwrdm = { .name = "dpll5_pwrdm" },
  742. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  743. };
  744. #endif /* CONFIG_ARCH_OMAP3 */
  745. #include "clockdomains44xx.h"
  746. /*
  747. * Clockdomain hwsup dependencies (OMAP3 only)
  748. */
  749. static struct clkdm_autodep clkdm_autodeps[] = {
  750. {
  751. .clkdm = { .name = "mpu_clkdm" },
  752. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  753. },
  754. {
  755. .clkdm = { .name = "iva2_clkdm" },
  756. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  757. },
  758. {
  759. .clkdm = { .name = NULL },
  760. }
  761. };
  762. /*
  763. * List of clockdomain pointers per platform
  764. */
  765. static struct clockdomain *clockdomains_omap[] = {
  766. #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
  767. &wkup_clkdm,
  768. &cm_clkdm,
  769. &prm_clkdm,
  770. #endif
  771. #ifdef CONFIG_ARCH_OMAP2420
  772. &mpu_2420_clkdm,
  773. &iva1_2420_clkdm,
  774. &dsp_2420_clkdm,
  775. &gfx_2420_clkdm,
  776. &core_l3_2420_clkdm,
  777. &core_l4_2420_clkdm,
  778. &dss_2420_clkdm,
  779. #endif
  780. #ifdef CONFIG_ARCH_OMAP2430
  781. &mpu_2430_clkdm,
  782. &mdm_clkdm,
  783. &dsp_2430_clkdm,
  784. &gfx_2430_clkdm,
  785. &core_l3_2430_clkdm,
  786. &core_l4_2430_clkdm,
  787. &dss_2430_clkdm,
  788. #endif
  789. #ifdef CONFIG_ARCH_OMAP3
  790. &mpu_3xxx_clkdm,
  791. &neon_clkdm,
  792. &iva2_clkdm,
  793. &gfx_3430es1_clkdm,
  794. &sgx_clkdm,
  795. &d2d_clkdm,
  796. &core_l3_3xxx_clkdm,
  797. &core_l4_3xxx_clkdm,
  798. &dss_3xxx_clkdm,
  799. &cam_clkdm,
  800. &usbhost_clkdm,
  801. &per_clkdm,
  802. &emu_clkdm,
  803. &dpll1_clkdm,
  804. &dpll2_clkdm,
  805. &dpll3_clkdm,
  806. &dpll4_clkdm,
  807. &dpll5_clkdm,
  808. #endif
  809. #ifdef CONFIG_ARCH_OMAP4
  810. &l4_cefuse_44xx_clkdm,
  811. &l4_cfg_44xx_clkdm,
  812. &tesla_44xx_clkdm,
  813. &l3_gfx_44xx_clkdm,
  814. &ivahd_44xx_clkdm,
  815. &l4_secure_44xx_clkdm,
  816. &l4_per_44xx_clkdm,
  817. &abe_44xx_clkdm,
  818. &l3_instr_44xx_clkdm,
  819. &l3_init_44xx_clkdm,
  820. &mpuss_44xx_clkdm,
  821. &mpu0_44xx_clkdm,
  822. &mpu1_44xx_clkdm,
  823. &l3_emif_44xx_clkdm,
  824. &l4_ao_44xx_clkdm,
  825. &ducati_44xx_clkdm,
  826. &l3_2_44xx_clkdm,
  827. &l3_1_44xx_clkdm,
  828. &l3_d2d_44xx_clkdm,
  829. &iss_44xx_clkdm,
  830. &l3_dss_44xx_clkdm,
  831. &l4_wkup_44xx_clkdm,
  832. &emu_sys_44xx_clkdm,
  833. &l3_dma_44xx_clkdm,
  834. #endif
  835. NULL,
  836. };
  837. #endif