clockdomains2xxx_3xxx_data.c 21 KB

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