clockdomains2xxx_3xxx_data.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860
  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 "clockdomain.h"
  36. #include "prm2xxx_3xxx.h"
  37. #include "cm2xxx_3xxx.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. .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. .dep_bit = OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT,
  424. .wkdep_srcs = dsp_24xx_wkdeps,
  425. .clktrctrl_mask = OMAP2420_AUTOSTATE_IVA_MASK,
  426. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  427. };
  428. static struct clockdomain dsp_2420_clkdm = {
  429. .name = "dsp_clkdm",
  430. .pwrdm = { .name = "dsp_pwrdm" },
  431. .flags = CLKDM_CAN_HWSUP_SWSUP,
  432. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK,
  433. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  434. };
  435. static struct clockdomain gfx_2420_clkdm = {
  436. .name = "gfx_clkdm",
  437. .pwrdm = { .name = "gfx_pwrdm" },
  438. .flags = CLKDM_CAN_HWSUP_SWSUP,
  439. .wkdep_srcs = gfx_sgx_wkdeps,
  440. .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK,
  441. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  442. };
  443. static struct clockdomain core_l3_2420_clkdm = {
  444. .name = "core_l3_clkdm",
  445. .pwrdm = { .name = "core_pwrdm" },
  446. .flags = CLKDM_CAN_HWSUP,
  447. .wkdep_srcs = core_24xx_wkdeps,
  448. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK,
  449. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  450. };
  451. static struct clockdomain core_l4_2420_clkdm = {
  452. .name = "core_l4_clkdm",
  453. .pwrdm = { .name = "core_pwrdm" },
  454. .flags = CLKDM_CAN_HWSUP,
  455. .wkdep_srcs = core_24xx_wkdeps,
  456. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK,
  457. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  458. };
  459. static struct clockdomain dss_2420_clkdm = {
  460. .name = "dss_clkdm",
  461. .pwrdm = { .name = "core_pwrdm" },
  462. .flags = CLKDM_CAN_HWSUP,
  463. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK,
  464. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
  465. };
  466. #endif /* CONFIG_ARCH_OMAP2420 */
  467. /*
  468. * 2430-only clockdomains
  469. */
  470. #if defined(CONFIG_ARCH_OMAP2430)
  471. static struct clockdomain mpu_2430_clkdm = {
  472. .name = "mpu_clkdm",
  473. .pwrdm = { .name = "mpu_pwrdm" },
  474. .flags = CLKDM_CAN_HWSUP_SWSUP,
  475. .wkdep_srcs = mpu_24xx_wkdeps,
  476. .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK,
  477. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  478. };
  479. /* Another case of bit name collisions between several registers: EN_MDM */
  480. static struct clockdomain mdm_clkdm = {
  481. .name = "mdm_clkdm",
  482. .pwrdm = { .name = "mdm_pwrdm" },
  483. .flags = CLKDM_CAN_HWSUP_SWSUP,
  484. .dep_bit = OMAP2430_PM_WKDEP_MPU_EN_MDM_SHIFT,
  485. .wkdep_srcs = mdm_2430_wkdeps,
  486. .clktrctrl_mask = OMAP2430_AUTOSTATE_MDM_MASK,
  487. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  488. };
  489. static struct clockdomain dsp_2430_clkdm = {
  490. .name = "dsp_clkdm",
  491. .pwrdm = { .name = "dsp_pwrdm" },
  492. .flags = CLKDM_CAN_HWSUP_SWSUP,
  493. .dep_bit = OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT,
  494. .wkdep_srcs = dsp_24xx_wkdeps,
  495. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK,
  496. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  497. };
  498. static struct clockdomain gfx_2430_clkdm = {
  499. .name = "gfx_clkdm",
  500. .pwrdm = { .name = "gfx_pwrdm" },
  501. .flags = CLKDM_CAN_HWSUP_SWSUP,
  502. .wkdep_srcs = gfx_sgx_wkdeps,
  503. .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK,
  504. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  505. };
  506. /*
  507. * XXX add usecounting for clkdm dependencies, otherwise the presence
  508. * of a single dep bit for core_l3_24xx_clkdm and core_l4_24xx_clkdm
  509. * could cause trouble
  510. */
  511. static struct clockdomain core_l3_2430_clkdm = {
  512. .name = "core_l3_clkdm",
  513. .pwrdm = { .name = "core_pwrdm" },
  514. .flags = CLKDM_CAN_HWSUP,
  515. .dep_bit = OMAP24XX_EN_CORE_SHIFT,
  516. .wkdep_srcs = core_24xx_wkdeps,
  517. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK,
  518. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  519. };
  520. /*
  521. * XXX add usecounting for clkdm dependencies, otherwise the presence
  522. * of a single dep bit for core_l3_24xx_clkdm and core_l4_24xx_clkdm
  523. * could cause trouble
  524. */
  525. static struct clockdomain core_l4_2430_clkdm = {
  526. .name = "core_l4_clkdm",
  527. .pwrdm = { .name = "core_pwrdm" },
  528. .flags = CLKDM_CAN_HWSUP,
  529. .dep_bit = OMAP24XX_EN_CORE_SHIFT,
  530. .wkdep_srcs = core_24xx_wkdeps,
  531. .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK,
  532. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  533. };
  534. static struct clockdomain dss_2430_clkdm = {
  535. .name = "dss_clkdm",
  536. .pwrdm = { .name = "core_pwrdm" },
  537. .flags = CLKDM_CAN_HWSUP,
  538. .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK,
  539. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
  540. };
  541. #endif /* CONFIG_ARCH_OMAP2430 */
  542. /*
  543. * OMAP3 clockdomains
  544. */
  545. #if defined(CONFIG_ARCH_OMAP3)
  546. static struct clockdomain mpu_3xxx_clkdm = {
  547. .name = "mpu_clkdm",
  548. .pwrdm = { .name = "mpu_pwrdm" },
  549. .flags = CLKDM_CAN_HWSUP | CLKDM_CAN_FORCE_WAKEUP,
  550. .dep_bit = OMAP3430_EN_MPU_SHIFT,
  551. .wkdep_srcs = mpu_3xxx_wkdeps,
  552. .clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK,
  553. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  554. };
  555. static struct clockdomain neon_clkdm = {
  556. .name = "neon_clkdm",
  557. .pwrdm = { .name = "neon_pwrdm" },
  558. .flags = CLKDM_CAN_HWSUP_SWSUP,
  559. .wkdep_srcs = neon_wkdeps,
  560. .clktrctrl_mask = OMAP3430_CLKTRCTRL_NEON_MASK,
  561. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  562. };
  563. static struct clockdomain iva2_clkdm = {
  564. .name = "iva2_clkdm",
  565. .pwrdm = { .name = "iva2_pwrdm" },
  566. .flags = CLKDM_CAN_HWSUP_SWSUP,
  567. .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_IVA2_SHIFT,
  568. .wkdep_srcs = iva2_wkdeps,
  569. .clktrctrl_mask = OMAP3430_CLKTRCTRL_IVA2_MASK,
  570. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  571. };
  572. static struct clockdomain gfx_3430es1_clkdm = {
  573. .name = "gfx_clkdm",
  574. .pwrdm = { .name = "gfx_pwrdm" },
  575. .flags = CLKDM_CAN_HWSUP_SWSUP,
  576. .wkdep_srcs = gfx_sgx_wkdeps,
  577. .sleepdep_srcs = gfx_sgx_sleepdeps,
  578. .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_GFX_MASK,
  579. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES1),
  580. };
  581. static struct clockdomain sgx_clkdm = {
  582. .name = "sgx_clkdm",
  583. .pwrdm = { .name = "sgx_pwrdm" },
  584. .flags = CLKDM_CAN_HWSUP_SWSUP,
  585. .wkdep_srcs = gfx_sgx_wkdeps,
  586. .sleepdep_srcs = gfx_sgx_sleepdeps,
  587. .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK,
  588. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  589. };
  590. /*
  591. * The die-to-die clockdomain was documented in the 34xx ES1 TRM, but
  592. * then that information was removed from the 34xx ES2+ TRM. It is
  593. * unclear whether the core is still there, but the clockdomain logic
  594. * is there, and must be programmed to an appropriate state if the
  595. * CORE clockdomain is to become inactive.
  596. */
  597. static struct clockdomain d2d_clkdm = {
  598. .name = "d2d_clkdm",
  599. .pwrdm = { .name = "core_pwrdm" },
  600. .flags = CLKDM_CAN_HWSUP_SWSUP,
  601. .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_D2D_MASK,
  602. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  603. };
  604. /*
  605. * XXX add usecounting for clkdm dependencies, otherwise the presence
  606. * of a single dep bit for core_l3_3xxx_clkdm and core_l4_3xxx_clkdm
  607. * could cause trouble
  608. */
  609. static struct clockdomain core_l3_3xxx_clkdm = {
  610. .name = "core_l3_clkdm",
  611. .pwrdm = { .name = "core_pwrdm" },
  612. .flags = CLKDM_CAN_HWSUP,
  613. .dep_bit = OMAP3430_EN_CORE_SHIFT,
  614. .clktrctrl_mask = OMAP3430_CLKTRCTRL_L3_MASK,
  615. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  616. };
  617. /*
  618. * XXX add usecounting for clkdm dependencies, otherwise the presence
  619. * of a single dep bit for core_l3_3xxx_clkdm and core_l4_3xxx_clkdm
  620. * could cause trouble
  621. */
  622. static struct clockdomain core_l4_3xxx_clkdm = {
  623. .name = "core_l4_clkdm",
  624. .pwrdm = { .name = "core_pwrdm" },
  625. .flags = CLKDM_CAN_HWSUP,
  626. .dep_bit = OMAP3430_EN_CORE_SHIFT,
  627. .clktrctrl_mask = OMAP3430_CLKTRCTRL_L4_MASK,
  628. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  629. };
  630. /* Another case of bit name collisions between several registers: EN_DSS */
  631. static struct clockdomain dss_3xxx_clkdm = {
  632. .name = "dss_clkdm",
  633. .pwrdm = { .name = "dss_pwrdm" },
  634. .flags = CLKDM_CAN_HWSUP_SWSUP,
  635. .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT,
  636. .wkdep_srcs = dss_wkdeps,
  637. .sleepdep_srcs = dss_sleepdeps,
  638. .clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK,
  639. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  640. };
  641. static struct clockdomain cam_clkdm = {
  642. .name = "cam_clkdm",
  643. .pwrdm = { .name = "cam_pwrdm" },
  644. .flags = CLKDM_CAN_HWSUP_SWSUP,
  645. .wkdep_srcs = cam_wkdeps,
  646. .sleepdep_srcs = cam_sleepdeps,
  647. .clktrctrl_mask = OMAP3430_CLKTRCTRL_CAM_MASK,
  648. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  649. };
  650. static struct clockdomain usbhost_clkdm = {
  651. .name = "usbhost_clkdm",
  652. .pwrdm = { .name = "usbhost_pwrdm" },
  653. .flags = CLKDM_CAN_HWSUP_SWSUP,
  654. .wkdep_srcs = usbhost_wkdeps,
  655. .sleepdep_srcs = usbhost_sleepdeps,
  656. .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK,
  657. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  658. };
  659. static struct clockdomain per_clkdm = {
  660. .name = "per_clkdm",
  661. .pwrdm = { .name = "per_pwrdm" },
  662. .flags = CLKDM_CAN_HWSUP_SWSUP,
  663. .dep_bit = OMAP3430_EN_PER_SHIFT,
  664. .wkdep_srcs = per_wkdeps,
  665. .sleepdep_srcs = per_sleepdeps,
  666. .clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK,
  667. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  668. };
  669. /*
  670. * Disable hw supervised mode for emu_clkdm, because emu_pwrdm is
  671. * switched of even if sdti is in use
  672. */
  673. static struct clockdomain emu_clkdm = {
  674. .name = "emu_clkdm",
  675. .pwrdm = { .name = "emu_pwrdm" },
  676. .flags = /* CLKDM_CAN_ENABLE_AUTO | */CLKDM_CAN_SWSUP,
  677. .clktrctrl_mask = OMAP3430_CLKTRCTRL_EMU_MASK,
  678. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  679. };
  680. static struct clockdomain dpll1_clkdm = {
  681. .name = "dpll1_clkdm",
  682. .pwrdm = { .name = "dpll1_pwrdm" },
  683. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  684. };
  685. static struct clockdomain dpll2_clkdm = {
  686. .name = "dpll2_clkdm",
  687. .pwrdm = { .name = "dpll2_pwrdm" },
  688. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  689. };
  690. static struct clockdomain dpll3_clkdm = {
  691. .name = "dpll3_clkdm",
  692. .pwrdm = { .name = "dpll3_pwrdm" },
  693. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  694. };
  695. static struct clockdomain dpll4_clkdm = {
  696. .name = "dpll4_clkdm",
  697. .pwrdm = { .name = "dpll4_pwrdm" },
  698. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
  699. };
  700. static struct clockdomain dpll5_clkdm = {
  701. .name = "dpll5_clkdm",
  702. .pwrdm = { .name = "dpll5_pwrdm" },
  703. .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
  704. };
  705. #endif /* CONFIG_ARCH_OMAP3 */
  706. /*
  707. * Clockdomain hwsup dependencies (OMAP3 only)
  708. */
  709. static struct clkdm_autodep clkdm_autodeps[] = {
  710. {
  711. .clkdm = { .name = "mpu_clkdm" },
  712. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  713. },
  714. {
  715. .clkdm = { .name = "iva2_clkdm" },
  716. .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
  717. },
  718. {
  719. .clkdm = { .name = NULL },
  720. }
  721. };
  722. static struct clockdomain *clockdomains_omap2[] __initdata = {
  723. &wkup_clkdm,
  724. &cm_clkdm,
  725. &prm_clkdm,
  726. #ifdef CONFIG_ARCH_OMAP2420
  727. &mpu_2420_clkdm,
  728. &iva1_2420_clkdm,
  729. &dsp_2420_clkdm,
  730. &gfx_2420_clkdm,
  731. &core_l3_2420_clkdm,
  732. &core_l4_2420_clkdm,
  733. &dss_2420_clkdm,
  734. #endif
  735. #ifdef CONFIG_ARCH_OMAP2430
  736. &mpu_2430_clkdm,
  737. &mdm_clkdm,
  738. &dsp_2430_clkdm,
  739. &gfx_2430_clkdm,
  740. &core_l3_2430_clkdm,
  741. &core_l4_2430_clkdm,
  742. &dss_2430_clkdm,
  743. #endif
  744. #ifdef CONFIG_ARCH_OMAP3
  745. &mpu_3xxx_clkdm,
  746. &neon_clkdm,
  747. &iva2_clkdm,
  748. &gfx_3430es1_clkdm,
  749. &sgx_clkdm,
  750. &d2d_clkdm,
  751. &core_l3_3xxx_clkdm,
  752. &core_l4_3xxx_clkdm,
  753. &dss_3xxx_clkdm,
  754. &cam_clkdm,
  755. &usbhost_clkdm,
  756. &per_clkdm,
  757. &emu_clkdm,
  758. &dpll1_clkdm,
  759. &dpll2_clkdm,
  760. &dpll3_clkdm,
  761. &dpll4_clkdm,
  762. &dpll5_clkdm,
  763. #endif
  764. NULL,
  765. };
  766. void __init omap2_clockdomains_init(void)
  767. {
  768. clkdm_init(clockdomains_omap2, clkdm_autodeps);
  769. }