pm34xx.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753
  1. /*
  2. * OMAP3 Power Management Routines
  3. *
  4. * Copyright (C) 2006-2008 Nokia Corporation
  5. * Tony Lindgren <tony@atomide.com>
  6. * Jouni Hogander
  7. *
  8. * Copyright (C) 2005 Texas Instruments, Inc.
  9. * Richard Woodruff <r-woodruff2@ti.com>
  10. *
  11. * Based on pm.c for omap1
  12. *
  13. * This program is free software; you can redistribute it and/or modify
  14. * it under the terms of the GNU General Public License version 2 as
  15. * published by the Free Software Foundation.
  16. */
  17. #include <linux/pm.h>
  18. #include <linux/suspend.h>
  19. #include <linux/interrupt.h>
  20. #include <linux/module.h>
  21. #include <linux/list.h>
  22. #include <linux/err.h>
  23. #include <linux/gpio.h>
  24. #include <mach/sram.h>
  25. #include <mach/clockdomain.h>
  26. #include <mach/powerdomain.h>
  27. #include <mach/control.h>
  28. #include <mach/serial.h>
  29. #include "cm.h"
  30. #include "cm-regbits-34xx.h"
  31. #include "prm-regbits-34xx.h"
  32. #include "prm.h"
  33. #include "pm.h"
  34. struct power_state {
  35. struct powerdomain *pwrdm;
  36. u32 next_state;
  37. #ifdef CONFIG_SUSPEND
  38. u32 saved_state;
  39. #endif
  40. struct list_head node;
  41. };
  42. static LIST_HEAD(pwrst_list);
  43. static void (*_omap_sram_idle)(u32 *addr, int save_state);
  44. static struct powerdomain *mpu_pwrdm;
  45. /* PRCM Interrupt Handler for wakeups */
  46. static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id)
  47. {
  48. u32 wkst, irqstatus_mpu;
  49. u32 fclk, iclk;
  50. /* WKUP */
  51. wkst = prm_read_mod_reg(WKUP_MOD, PM_WKST);
  52. if (wkst) {
  53. iclk = cm_read_mod_reg(WKUP_MOD, CM_ICLKEN);
  54. fclk = cm_read_mod_reg(WKUP_MOD, CM_FCLKEN);
  55. cm_set_mod_reg_bits(wkst, WKUP_MOD, CM_ICLKEN);
  56. cm_set_mod_reg_bits(wkst, WKUP_MOD, CM_FCLKEN);
  57. prm_write_mod_reg(wkst, WKUP_MOD, PM_WKST);
  58. while (prm_read_mod_reg(WKUP_MOD, PM_WKST))
  59. cpu_relax();
  60. cm_write_mod_reg(iclk, WKUP_MOD, CM_ICLKEN);
  61. cm_write_mod_reg(fclk, WKUP_MOD, CM_FCLKEN);
  62. }
  63. /* CORE */
  64. wkst = prm_read_mod_reg(CORE_MOD, PM_WKST1);
  65. if (wkst) {
  66. iclk = cm_read_mod_reg(CORE_MOD, CM_ICLKEN1);
  67. fclk = cm_read_mod_reg(CORE_MOD, CM_FCLKEN1);
  68. cm_set_mod_reg_bits(wkst, CORE_MOD, CM_ICLKEN1);
  69. cm_set_mod_reg_bits(wkst, CORE_MOD, CM_FCLKEN1);
  70. prm_write_mod_reg(wkst, CORE_MOD, PM_WKST1);
  71. while (prm_read_mod_reg(CORE_MOD, PM_WKST1))
  72. cpu_relax();
  73. cm_write_mod_reg(iclk, CORE_MOD, CM_ICLKEN1);
  74. cm_write_mod_reg(fclk, CORE_MOD, CM_FCLKEN1);
  75. }
  76. wkst = prm_read_mod_reg(CORE_MOD, OMAP3430ES2_PM_WKST3);
  77. if (wkst) {
  78. iclk = cm_read_mod_reg(CORE_MOD, CM_ICLKEN3);
  79. fclk = cm_read_mod_reg(CORE_MOD, OMAP3430ES2_CM_FCLKEN3);
  80. cm_set_mod_reg_bits(wkst, CORE_MOD, CM_ICLKEN3);
  81. cm_set_mod_reg_bits(wkst, CORE_MOD, OMAP3430ES2_CM_FCLKEN3);
  82. prm_write_mod_reg(wkst, CORE_MOD, OMAP3430ES2_PM_WKST3);
  83. while (prm_read_mod_reg(CORE_MOD, OMAP3430ES2_PM_WKST3))
  84. cpu_relax();
  85. cm_write_mod_reg(iclk, CORE_MOD, CM_ICLKEN3);
  86. cm_write_mod_reg(fclk, CORE_MOD, OMAP3430ES2_CM_FCLKEN3);
  87. }
  88. /* PER */
  89. wkst = prm_read_mod_reg(OMAP3430_PER_MOD, PM_WKST);
  90. if (wkst) {
  91. iclk = cm_read_mod_reg(OMAP3430_PER_MOD, CM_ICLKEN);
  92. fclk = cm_read_mod_reg(OMAP3430_PER_MOD, CM_FCLKEN);
  93. cm_set_mod_reg_bits(wkst, OMAP3430_PER_MOD, CM_ICLKEN);
  94. cm_set_mod_reg_bits(wkst, OMAP3430_PER_MOD, CM_FCLKEN);
  95. prm_write_mod_reg(wkst, OMAP3430_PER_MOD, PM_WKST);
  96. while (prm_read_mod_reg(OMAP3430_PER_MOD, PM_WKST))
  97. cpu_relax();
  98. cm_write_mod_reg(iclk, OMAP3430_PER_MOD, CM_ICLKEN);
  99. cm_write_mod_reg(fclk, OMAP3430_PER_MOD, CM_FCLKEN);
  100. }
  101. if (omap_rev() > OMAP3430_REV_ES1_0) {
  102. /* USBHOST */
  103. wkst = prm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, PM_WKST);
  104. if (wkst) {
  105. iclk = cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD,
  106. CM_ICLKEN);
  107. fclk = cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD,
  108. CM_FCLKEN);
  109. cm_set_mod_reg_bits(wkst, OMAP3430ES2_USBHOST_MOD,
  110. CM_ICLKEN);
  111. cm_set_mod_reg_bits(wkst, OMAP3430ES2_USBHOST_MOD,
  112. CM_FCLKEN);
  113. prm_write_mod_reg(wkst, OMAP3430ES2_USBHOST_MOD,
  114. PM_WKST);
  115. while (prm_read_mod_reg(OMAP3430ES2_USBHOST_MOD,
  116. PM_WKST))
  117. cpu_relax();
  118. cm_write_mod_reg(iclk, OMAP3430ES2_USBHOST_MOD,
  119. CM_ICLKEN);
  120. cm_write_mod_reg(fclk, OMAP3430ES2_USBHOST_MOD,
  121. CM_FCLKEN);
  122. }
  123. }
  124. irqstatus_mpu = prm_read_mod_reg(OCP_MOD,
  125. OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
  126. prm_write_mod_reg(irqstatus_mpu, OCP_MOD,
  127. OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
  128. while (prm_read_mod_reg(OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET))
  129. cpu_relax();
  130. return IRQ_HANDLED;
  131. }
  132. static void omap_sram_idle(void)
  133. {
  134. /* Variable to tell what needs to be saved and restored
  135. * in omap_sram_idle*/
  136. /* save_state = 0 => Nothing to save and restored */
  137. /* save_state = 1 => Only L1 and logic lost */
  138. /* save_state = 2 => Only L2 lost */
  139. /* save_state = 3 => L1, L2 and logic lost */
  140. int save_state = 0, mpu_next_state;
  141. if (!_omap_sram_idle)
  142. return;
  143. mpu_next_state = pwrdm_read_next_pwrst(mpu_pwrdm);
  144. switch (mpu_next_state) {
  145. case PWRDM_POWER_RET:
  146. /* No need to save context */
  147. save_state = 0;
  148. break;
  149. default:
  150. /* Invalid state */
  151. printk(KERN_ERR "Invalid mpu state in sram_idle\n");
  152. return;
  153. }
  154. omap2_gpio_prepare_for_retention();
  155. omap_uart_prepare_idle(0);
  156. omap_uart_prepare_idle(1);
  157. omap_uart_prepare_idle(2);
  158. _omap_sram_idle(NULL, save_state);
  159. cpu_init();
  160. omap_uart_resume_idle(2);
  161. omap_uart_resume_idle(1);
  162. omap_uart_resume_idle(0);
  163. omap2_gpio_resume_after_retention();
  164. }
  165. /*
  166. * Check if functional clocks are enabled before entering
  167. * sleep. This function could be behind CONFIG_PM_DEBUG
  168. * when all drivers are configuring their sysconfig registers
  169. * properly and using their clocks properly.
  170. */
  171. static int omap3_fclks_active(void)
  172. {
  173. u32 fck_core1 = 0, fck_core3 = 0, fck_sgx = 0, fck_dss = 0,
  174. fck_cam = 0, fck_per = 0, fck_usbhost = 0;
  175. fck_core1 = cm_read_mod_reg(CORE_MOD,
  176. CM_FCLKEN1);
  177. if (omap_rev() > OMAP3430_REV_ES1_0) {
  178. fck_core3 = cm_read_mod_reg(CORE_MOD,
  179. OMAP3430ES2_CM_FCLKEN3);
  180. fck_sgx = cm_read_mod_reg(OMAP3430ES2_SGX_MOD,
  181. CM_FCLKEN);
  182. fck_usbhost = cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD,
  183. CM_FCLKEN);
  184. } else
  185. fck_sgx = cm_read_mod_reg(GFX_MOD,
  186. OMAP3430ES2_CM_FCLKEN3);
  187. fck_dss = cm_read_mod_reg(OMAP3430_DSS_MOD,
  188. CM_FCLKEN);
  189. fck_cam = cm_read_mod_reg(OMAP3430_CAM_MOD,
  190. CM_FCLKEN);
  191. fck_per = cm_read_mod_reg(OMAP3430_PER_MOD,
  192. CM_FCLKEN);
  193. /* Ignore UART clocks. These are handled by UART core (serial.c) */
  194. fck_core1 &= ~(OMAP3430_EN_UART1 | OMAP3430_EN_UART2);
  195. fck_per &= ~OMAP3430_EN_UART3;
  196. if (fck_core1 | fck_core3 | fck_sgx | fck_dss |
  197. fck_cam | fck_per | fck_usbhost)
  198. return 1;
  199. return 0;
  200. }
  201. static int omap3_can_sleep(void)
  202. {
  203. if (!omap_uart_can_sleep())
  204. return 0;
  205. if (omap3_fclks_active())
  206. return 0;
  207. return 1;
  208. }
  209. /* This sets pwrdm state (other than mpu & core. Currently only ON &
  210. * RET are supported. Function is assuming that clkdm doesn't have
  211. * hw_sup mode enabled. */
  212. static int set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
  213. {
  214. u32 cur_state;
  215. int sleep_switch = 0;
  216. int ret = 0;
  217. if (pwrdm == NULL || IS_ERR(pwrdm))
  218. return -EINVAL;
  219. while (!(pwrdm->pwrsts & (1 << state))) {
  220. if (state == PWRDM_POWER_OFF)
  221. return ret;
  222. state--;
  223. }
  224. cur_state = pwrdm_read_next_pwrst(pwrdm);
  225. if (cur_state == state)
  226. return ret;
  227. if (pwrdm_read_pwrst(pwrdm) < PWRDM_POWER_ON) {
  228. omap2_clkdm_wakeup(pwrdm->pwrdm_clkdms[0]);
  229. sleep_switch = 1;
  230. pwrdm_wait_transition(pwrdm);
  231. }
  232. ret = pwrdm_set_next_pwrst(pwrdm, state);
  233. if (ret) {
  234. printk(KERN_ERR "Unable to set state of powerdomain: %s\n",
  235. pwrdm->name);
  236. goto err;
  237. }
  238. if (sleep_switch) {
  239. omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]);
  240. pwrdm_wait_transition(pwrdm);
  241. }
  242. err:
  243. return ret;
  244. }
  245. static void omap3_pm_idle(void)
  246. {
  247. local_irq_disable();
  248. local_fiq_disable();
  249. if (!omap3_can_sleep())
  250. goto out;
  251. if (omap_irq_pending())
  252. goto out;
  253. omap_sram_idle();
  254. out:
  255. local_fiq_enable();
  256. local_irq_enable();
  257. }
  258. #ifdef CONFIG_SUSPEND
  259. static suspend_state_t suspend_state;
  260. static int omap3_pm_prepare(void)
  261. {
  262. disable_hlt();
  263. return 0;
  264. }
  265. static int omap3_pm_suspend(void)
  266. {
  267. struct power_state *pwrst;
  268. int state, ret = 0;
  269. /* Read current next_pwrsts */
  270. list_for_each_entry(pwrst, &pwrst_list, node)
  271. pwrst->saved_state = pwrdm_read_next_pwrst(pwrst->pwrdm);
  272. /* Set ones wanted by suspend */
  273. list_for_each_entry(pwrst, &pwrst_list, node) {
  274. if (set_pwrdm_state(pwrst->pwrdm, pwrst->next_state))
  275. goto restore;
  276. if (pwrdm_clear_all_prev_pwrst(pwrst->pwrdm))
  277. goto restore;
  278. }
  279. omap_uart_prepare_suspend();
  280. omap_sram_idle();
  281. restore:
  282. /* Restore next_pwrsts */
  283. list_for_each_entry(pwrst, &pwrst_list, node) {
  284. state = pwrdm_read_prev_pwrst(pwrst->pwrdm);
  285. if (state > pwrst->next_state) {
  286. printk(KERN_INFO "Powerdomain (%s) didn't enter "
  287. "target state %d\n",
  288. pwrst->pwrdm->name, pwrst->next_state);
  289. ret = -1;
  290. }
  291. set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state);
  292. }
  293. if (ret)
  294. printk(KERN_ERR "Could not enter target state in pm_suspend\n");
  295. else
  296. printk(KERN_INFO "Successfully put all powerdomains "
  297. "to target state\n");
  298. return ret;
  299. }
  300. static int omap3_pm_enter(suspend_state_t unused)
  301. {
  302. int ret = 0;
  303. switch (suspend_state) {
  304. case PM_SUSPEND_STANDBY:
  305. case PM_SUSPEND_MEM:
  306. ret = omap3_pm_suspend();
  307. break;
  308. default:
  309. ret = -EINVAL;
  310. }
  311. return ret;
  312. }
  313. static void omap3_pm_finish(void)
  314. {
  315. enable_hlt();
  316. }
  317. /* Hooks to enable / disable UART interrupts during suspend */
  318. static int omap3_pm_begin(suspend_state_t state)
  319. {
  320. suspend_state = state;
  321. omap_uart_enable_irqs(0);
  322. return 0;
  323. }
  324. static void omap3_pm_end(void)
  325. {
  326. suspend_state = PM_SUSPEND_ON;
  327. omap_uart_enable_irqs(1);
  328. return;
  329. }
  330. static struct platform_suspend_ops omap_pm_ops = {
  331. .begin = omap3_pm_begin,
  332. .end = omap3_pm_end,
  333. .prepare = omap3_pm_prepare,
  334. .enter = omap3_pm_enter,
  335. .finish = omap3_pm_finish,
  336. .valid = suspend_valid_only_mem,
  337. };
  338. #endif /* CONFIG_SUSPEND */
  339. /**
  340. * omap3_iva_idle(): ensure IVA is in idle so it can be put into
  341. * retention
  342. *
  343. * In cases where IVA2 is activated by bootcode, it may prevent
  344. * full-chip retention or off-mode because it is not idle. This
  345. * function forces the IVA2 into idle state so it can go
  346. * into retention/off and thus allow full-chip retention/off.
  347. *
  348. **/
  349. static void __init omap3_iva_idle(void)
  350. {
  351. /* ensure IVA2 clock is disabled */
  352. cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN);
  353. /* if no clock activity, nothing else to do */
  354. if (!(cm_read_mod_reg(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSTST) &
  355. OMAP3430_CLKACTIVITY_IVA2_MASK))
  356. return;
  357. /* Reset IVA2 */
  358. prm_write_mod_reg(OMAP3430_RST1_IVA2 |
  359. OMAP3430_RST2_IVA2 |
  360. OMAP3430_RST3_IVA2,
  361. OMAP3430_IVA2_MOD, RM_RSTCTRL);
  362. /* Enable IVA2 clock */
  363. cm_write_mod_reg(OMAP3430_CM_FCLKEN_IVA2_EN_IVA2,
  364. OMAP3430_IVA2_MOD, CM_FCLKEN);
  365. /* Set IVA2 boot mode to 'idle' */
  366. omap_ctrl_writel(OMAP3_IVA2_BOOTMOD_IDLE,
  367. OMAP343X_CONTROL_IVA2_BOOTMOD);
  368. /* Un-reset IVA2 */
  369. prm_write_mod_reg(0, OMAP3430_IVA2_MOD, RM_RSTCTRL);
  370. /* Disable IVA2 clock */
  371. cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN);
  372. /* Reset IVA2 */
  373. prm_write_mod_reg(OMAP3430_RST1_IVA2 |
  374. OMAP3430_RST2_IVA2 |
  375. OMAP3430_RST3_IVA2,
  376. OMAP3430_IVA2_MOD, RM_RSTCTRL);
  377. }
  378. static void __init omap3_d2d_idle(void)
  379. {
  380. u16 mask, padconf;
  381. /* In a stand alone OMAP3430 where there is not a stacked
  382. * modem for the D2D Idle Ack and D2D MStandby must be pulled
  383. * high. S CONTROL_PADCONF_SAD2D_IDLEACK and
  384. * CONTROL_PADCONF_SAD2D_MSTDBY to have a pull up. */
  385. mask = (1 << 4) | (1 << 3); /* pull-up, enabled */
  386. padconf = omap_ctrl_readw(OMAP3_PADCONF_SAD2D_MSTANDBY);
  387. padconf |= mask;
  388. omap_ctrl_writew(padconf, OMAP3_PADCONF_SAD2D_MSTANDBY);
  389. padconf = omap_ctrl_readw(OMAP3_PADCONF_SAD2D_IDLEACK);
  390. padconf |= mask;
  391. omap_ctrl_writew(padconf, OMAP3_PADCONF_SAD2D_IDLEACK);
  392. /* reset modem */
  393. prm_write_mod_reg(OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RSTPWRON |
  394. OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RST,
  395. CORE_MOD, RM_RSTCTRL);
  396. prm_write_mod_reg(0, CORE_MOD, RM_RSTCTRL);
  397. }
  398. static void __init prcm_setup_regs(void)
  399. {
  400. /* XXX Reset all wkdeps. This should be done when initializing
  401. * powerdomains */
  402. prm_write_mod_reg(0, OMAP3430_IVA2_MOD, PM_WKDEP);
  403. prm_write_mod_reg(0, MPU_MOD, PM_WKDEP);
  404. prm_write_mod_reg(0, OMAP3430_DSS_MOD, PM_WKDEP);
  405. prm_write_mod_reg(0, OMAP3430_NEON_MOD, PM_WKDEP);
  406. prm_write_mod_reg(0, OMAP3430_CAM_MOD, PM_WKDEP);
  407. prm_write_mod_reg(0, OMAP3430_PER_MOD, PM_WKDEP);
  408. if (omap_rev() > OMAP3430_REV_ES1_0) {
  409. prm_write_mod_reg(0, OMAP3430ES2_SGX_MOD, PM_WKDEP);
  410. prm_write_mod_reg(0, OMAP3430ES2_USBHOST_MOD, PM_WKDEP);
  411. } else
  412. prm_write_mod_reg(0, GFX_MOD, PM_WKDEP);
  413. /*
  414. * Enable interface clock autoidle for all modules.
  415. * Note that in the long run this should be done by clockfw
  416. */
  417. cm_write_mod_reg(
  418. OMAP3430_AUTO_MODEM |
  419. OMAP3430ES2_AUTO_MMC3 |
  420. OMAP3430ES2_AUTO_ICR |
  421. OMAP3430_AUTO_AES2 |
  422. OMAP3430_AUTO_SHA12 |
  423. OMAP3430_AUTO_DES2 |
  424. OMAP3430_AUTO_MMC2 |
  425. OMAP3430_AUTO_MMC1 |
  426. OMAP3430_AUTO_MSPRO |
  427. OMAP3430_AUTO_HDQ |
  428. OMAP3430_AUTO_MCSPI4 |
  429. OMAP3430_AUTO_MCSPI3 |
  430. OMAP3430_AUTO_MCSPI2 |
  431. OMAP3430_AUTO_MCSPI1 |
  432. OMAP3430_AUTO_I2C3 |
  433. OMAP3430_AUTO_I2C2 |
  434. OMAP3430_AUTO_I2C1 |
  435. OMAP3430_AUTO_UART2 |
  436. OMAP3430_AUTO_UART1 |
  437. OMAP3430_AUTO_GPT11 |
  438. OMAP3430_AUTO_GPT10 |
  439. OMAP3430_AUTO_MCBSP5 |
  440. OMAP3430_AUTO_MCBSP1 |
  441. OMAP3430ES1_AUTO_FAC | /* This is es1 only */
  442. OMAP3430_AUTO_MAILBOXES |
  443. OMAP3430_AUTO_OMAPCTRL |
  444. OMAP3430ES1_AUTO_FSHOSTUSB |
  445. OMAP3430_AUTO_HSOTGUSB |
  446. OMAP3430_AUTO_SAD2D |
  447. OMAP3430_AUTO_SSI,
  448. CORE_MOD, CM_AUTOIDLE1);
  449. cm_write_mod_reg(
  450. OMAP3430_AUTO_PKA |
  451. OMAP3430_AUTO_AES1 |
  452. OMAP3430_AUTO_RNG |
  453. OMAP3430_AUTO_SHA11 |
  454. OMAP3430_AUTO_DES1,
  455. CORE_MOD, CM_AUTOIDLE2);
  456. if (omap_rev() > OMAP3430_REV_ES1_0) {
  457. cm_write_mod_reg(
  458. OMAP3430_AUTO_MAD2D |
  459. OMAP3430ES2_AUTO_USBTLL,
  460. CORE_MOD, CM_AUTOIDLE3);
  461. }
  462. cm_write_mod_reg(
  463. OMAP3430_AUTO_WDT2 |
  464. OMAP3430_AUTO_WDT1 |
  465. OMAP3430_AUTO_GPIO1 |
  466. OMAP3430_AUTO_32KSYNC |
  467. OMAP3430_AUTO_GPT12 |
  468. OMAP3430_AUTO_GPT1 ,
  469. WKUP_MOD, CM_AUTOIDLE);
  470. cm_write_mod_reg(
  471. OMAP3430_AUTO_DSS,
  472. OMAP3430_DSS_MOD,
  473. CM_AUTOIDLE);
  474. cm_write_mod_reg(
  475. OMAP3430_AUTO_CAM,
  476. OMAP3430_CAM_MOD,
  477. CM_AUTOIDLE);
  478. cm_write_mod_reg(
  479. OMAP3430_AUTO_GPIO6 |
  480. OMAP3430_AUTO_GPIO5 |
  481. OMAP3430_AUTO_GPIO4 |
  482. OMAP3430_AUTO_GPIO3 |
  483. OMAP3430_AUTO_GPIO2 |
  484. OMAP3430_AUTO_WDT3 |
  485. OMAP3430_AUTO_UART3 |
  486. OMAP3430_AUTO_GPT9 |
  487. OMAP3430_AUTO_GPT8 |
  488. OMAP3430_AUTO_GPT7 |
  489. OMAP3430_AUTO_GPT6 |
  490. OMAP3430_AUTO_GPT5 |
  491. OMAP3430_AUTO_GPT4 |
  492. OMAP3430_AUTO_GPT3 |
  493. OMAP3430_AUTO_GPT2 |
  494. OMAP3430_AUTO_MCBSP4 |
  495. OMAP3430_AUTO_MCBSP3 |
  496. OMAP3430_AUTO_MCBSP2,
  497. OMAP3430_PER_MOD,
  498. CM_AUTOIDLE);
  499. if (omap_rev() > OMAP3430_REV_ES1_0) {
  500. cm_write_mod_reg(
  501. OMAP3430ES2_AUTO_USBHOST,
  502. OMAP3430ES2_USBHOST_MOD,
  503. CM_AUTOIDLE);
  504. }
  505. /*
  506. * Set all plls to autoidle. This is needed until autoidle is
  507. * enabled by clockfw
  508. */
  509. cm_write_mod_reg(1 << OMAP3430_AUTO_IVA2_DPLL_SHIFT,
  510. OMAP3430_IVA2_MOD, CM_AUTOIDLE2);
  511. cm_write_mod_reg(1 << OMAP3430_AUTO_MPU_DPLL_SHIFT,
  512. MPU_MOD,
  513. CM_AUTOIDLE2);
  514. cm_write_mod_reg((1 << OMAP3430_AUTO_PERIPH_DPLL_SHIFT) |
  515. (1 << OMAP3430_AUTO_CORE_DPLL_SHIFT),
  516. PLL_MOD,
  517. CM_AUTOIDLE);
  518. cm_write_mod_reg(1 << OMAP3430ES2_AUTO_PERIPH2_DPLL_SHIFT,
  519. PLL_MOD,
  520. CM_AUTOIDLE2);
  521. /*
  522. * Enable control of expternal oscillator through
  523. * sys_clkreq. In the long run clock framework should
  524. * take care of this.
  525. */
  526. prm_rmw_mod_reg_bits(OMAP_AUTOEXTCLKMODE_MASK,
  527. 1 << OMAP_AUTOEXTCLKMODE_SHIFT,
  528. OMAP3430_GR_MOD,
  529. OMAP3_PRM_CLKSRC_CTRL_OFFSET);
  530. /* setup wakup source */
  531. prm_write_mod_reg(OMAP3430_EN_IO | OMAP3430_EN_GPIO1 |
  532. OMAP3430_EN_GPT1 | OMAP3430_EN_GPT12,
  533. WKUP_MOD, PM_WKEN);
  534. /* No need to write EN_IO, that is always enabled */
  535. prm_write_mod_reg(OMAP3430_EN_GPIO1 | OMAP3430_EN_GPT1 |
  536. OMAP3430_EN_GPT12,
  537. WKUP_MOD, OMAP3430_PM_MPUGRPSEL);
  538. /* For some reason IO doesn't generate wakeup event even if
  539. * it is selected to mpu wakeup goup */
  540. prm_write_mod_reg(OMAP3430_IO_EN | OMAP3430_WKUP_EN,
  541. OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET);
  542. /* Don't attach IVA interrupts */
  543. prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL);
  544. prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1);
  545. prm_write_mod_reg(0, CORE_MOD, OMAP3430ES2_PM_IVAGRPSEL3);
  546. prm_write_mod_reg(0, OMAP3430_PER_MOD, OMAP3430_PM_IVAGRPSEL);
  547. /* Clear any pending 'reset' flags */
  548. prm_write_mod_reg(0xffffffff, MPU_MOD, RM_RSTST);
  549. prm_write_mod_reg(0xffffffff, CORE_MOD, RM_RSTST);
  550. prm_write_mod_reg(0xffffffff, OMAP3430_PER_MOD, RM_RSTST);
  551. prm_write_mod_reg(0xffffffff, OMAP3430_EMU_MOD, RM_RSTST);
  552. prm_write_mod_reg(0xffffffff, OMAP3430_NEON_MOD, RM_RSTST);
  553. prm_write_mod_reg(0xffffffff, OMAP3430_DSS_MOD, RM_RSTST);
  554. prm_write_mod_reg(0xffffffff, OMAP3430ES2_USBHOST_MOD, RM_RSTST);
  555. /* Clear any pending PRCM interrupts */
  556. prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
  557. /* Don't attach IVA interrupts */
  558. prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL);
  559. prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1);
  560. prm_write_mod_reg(0, CORE_MOD, OMAP3430ES2_PM_IVAGRPSEL3);
  561. prm_write_mod_reg(0, OMAP3430_PER_MOD, OMAP3430_PM_IVAGRPSEL);
  562. /* Clear any pending 'reset' flags */
  563. prm_write_mod_reg(0xffffffff, MPU_MOD, RM_RSTST);
  564. prm_write_mod_reg(0xffffffff, CORE_MOD, RM_RSTST);
  565. prm_write_mod_reg(0xffffffff, OMAP3430_PER_MOD, RM_RSTST);
  566. prm_write_mod_reg(0xffffffff, OMAP3430_EMU_MOD, RM_RSTST);
  567. prm_write_mod_reg(0xffffffff, OMAP3430_NEON_MOD, RM_RSTST);
  568. prm_write_mod_reg(0xffffffff, OMAP3430_DSS_MOD, RM_RSTST);
  569. prm_write_mod_reg(0xffffffff, OMAP3430ES2_USBHOST_MOD, RM_RSTST);
  570. /* Clear any pending PRCM interrupts */
  571. prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
  572. omap3_iva_idle();
  573. omap3_d2d_idle();
  574. }
  575. static int __init pwrdms_setup(struct powerdomain *pwrdm)
  576. {
  577. struct power_state *pwrst;
  578. if (!pwrdm->pwrsts)
  579. return 0;
  580. pwrst = kmalloc(sizeof(struct power_state), GFP_KERNEL);
  581. if (!pwrst)
  582. return -ENOMEM;
  583. pwrst->pwrdm = pwrdm;
  584. pwrst->next_state = PWRDM_POWER_RET;
  585. list_add(&pwrst->node, &pwrst_list);
  586. if (pwrdm_has_hdwr_sar(pwrdm))
  587. pwrdm_enable_hdwr_sar(pwrdm);
  588. return set_pwrdm_state(pwrst->pwrdm, pwrst->next_state);
  589. }
  590. /*
  591. * Enable hw supervised mode for all clockdomains if it's
  592. * supported. Initiate sleep transition for other clockdomains, if
  593. * they are not used
  594. */
  595. static int __init clkdms_setup(struct clockdomain *clkdm)
  596. {
  597. if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO)
  598. omap2_clkdm_allow_idle(clkdm);
  599. else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&
  600. atomic_read(&clkdm->usecount) == 0)
  601. omap2_clkdm_sleep(clkdm);
  602. return 0;
  603. }
  604. static int __init omap3_pm_init(void)
  605. {
  606. struct power_state *pwrst, *tmp;
  607. int ret;
  608. if (!cpu_is_omap34xx())
  609. return -ENODEV;
  610. printk(KERN_ERR "Power Management for TI OMAP3.\n");
  611. /* XXX prcm_setup_regs needs to be before enabling hw
  612. * supervised mode for powerdomains */
  613. prcm_setup_regs();
  614. ret = request_irq(INT_34XX_PRCM_MPU_IRQ,
  615. (irq_handler_t)prcm_interrupt_handler,
  616. IRQF_DISABLED, "prcm", NULL);
  617. if (ret) {
  618. printk(KERN_ERR "request_irq failed to register for 0x%x\n",
  619. INT_34XX_PRCM_MPU_IRQ);
  620. goto err1;
  621. }
  622. ret = pwrdm_for_each(pwrdms_setup);
  623. if (ret) {
  624. printk(KERN_ERR "Failed to setup powerdomains\n");
  625. goto err2;
  626. }
  627. (void) clkdm_for_each(clkdms_setup);
  628. mpu_pwrdm = pwrdm_lookup("mpu_pwrdm");
  629. if (mpu_pwrdm == NULL) {
  630. printk(KERN_ERR "Failed to get mpu_pwrdm\n");
  631. goto err2;
  632. }
  633. _omap_sram_idle = omap_sram_push(omap34xx_cpu_suspend,
  634. omap34xx_cpu_suspend_sz);
  635. #ifdef CONFIG_SUSPEND
  636. suspend_set_ops(&omap_pm_ops);
  637. #endif /* CONFIG_SUSPEND */
  638. pm_idle = omap3_pm_idle;
  639. err1:
  640. return ret;
  641. err2:
  642. free_irq(INT_34XX_PRCM_MPU_IRQ, NULL);
  643. list_for_each_entry_safe(pwrst, tmp, &pwrst_list, node) {
  644. list_del(&pwrst->node);
  645. kfree(pwrst);
  646. }
  647. return ret;
  648. }
  649. late_initcall(omap3_pm_init);