clockdomains2xxx_3xxx_data.c 23 KB

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