pm34xx.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  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 int omap3_pm_prepare(void)
  260. {
  261. disable_hlt();
  262. return 0;
  263. }
  264. static int omap3_pm_suspend(void)
  265. {
  266. struct power_state *pwrst;
  267. int state, ret = 0;
  268. /* Read current next_pwrsts */
  269. list_for_each_entry(pwrst, &pwrst_list, node)
  270. pwrst->saved_state = pwrdm_read_next_pwrst(pwrst->pwrdm);
  271. /* Set ones wanted by suspend */
  272. list_for_each_entry(pwrst, &pwrst_list, node) {
  273. if (set_pwrdm_state(pwrst->pwrdm, pwrst->next_state))
  274. goto restore;
  275. if (pwrdm_clear_all_prev_pwrst(pwrst->pwrdm))
  276. goto restore;
  277. }
  278. omap_uart_prepare_suspend();
  279. omap_sram_idle();
  280. restore:
  281. /* Restore next_pwrsts */
  282. list_for_each_entry(pwrst, &pwrst_list, node) {
  283. set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state);
  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. }
  292. if (ret)
  293. printk(KERN_ERR "Could not enter target state in pm_suspend\n");
  294. else
  295. printk(KERN_INFO "Successfully put all powerdomains "
  296. "to target state\n");
  297. return ret;
  298. }
  299. static int omap3_pm_enter(suspend_state_t state)
  300. {
  301. int ret = 0;
  302. switch (state) {
  303. case PM_SUSPEND_STANDBY:
  304. case PM_SUSPEND_MEM:
  305. ret = omap3_pm_suspend();
  306. break;
  307. default:
  308. ret = -EINVAL;
  309. }
  310. return ret;
  311. }
  312. static void omap3_pm_finish(void)
  313. {
  314. enable_hlt();
  315. }
  316. static struct platform_suspend_ops omap_pm_ops = {
  317. .prepare = omap3_pm_prepare,
  318. .enter = omap3_pm_enter,
  319. .finish = omap3_pm_finish,
  320. .valid = suspend_valid_only_mem,
  321. };
  322. #endif /* CONFIG_SUSPEND */
  323. /**
  324. * omap3_iva_idle(): ensure IVA is in idle so it can be put into
  325. * retention
  326. *
  327. * In cases where IVA2 is activated by bootcode, it may prevent
  328. * full-chip retention or off-mode because it is not idle. This
  329. * function forces the IVA2 into idle state so it can go
  330. * into retention/off and thus allow full-chip retention/off.
  331. *
  332. **/
  333. static void __init omap3_iva_idle(void)
  334. {
  335. /* ensure IVA2 clock is disabled */
  336. cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN);
  337. /* if no clock activity, nothing else to do */
  338. if (!(cm_read_mod_reg(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSTST) &
  339. OMAP3430_CLKACTIVITY_IVA2_MASK))
  340. return;
  341. /* Reset IVA2 */
  342. prm_write_mod_reg(OMAP3430_RST1_IVA2 |
  343. OMAP3430_RST2_IVA2 |
  344. OMAP3430_RST3_IVA2,
  345. OMAP3430_IVA2_MOD, RM_RSTCTRL);
  346. /* Enable IVA2 clock */
  347. cm_write_mod_reg(OMAP3430_CM_FCLKEN_IVA2_EN_IVA2,
  348. OMAP3430_IVA2_MOD, CM_FCLKEN);
  349. /* Set IVA2 boot mode to 'idle' */
  350. omap_ctrl_writel(OMAP3_IVA2_BOOTMOD_IDLE,
  351. OMAP343X_CONTROL_IVA2_BOOTMOD);
  352. /* Un-reset IVA2 */
  353. prm_write_mod_reg(0, OMAP3430_IVA2_MOD, RM_RSTCTRL);
  354. /* Disable IVA2 clock */
  355. cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN);
  356. /* Reset IVA2 */
  357. prm_write_mod_reg(OMAP3430_RST1_IVA2 |
  358. OMAP3430_RST2_IVA2 |
  359. OMAP3430_RST3_IVA2,
  360. OMAP3430_IVA2_MOD, RM_RSTCTRL);
  361. }
  362. static void __init omap3_d2d_idle(void)
  363. {
  364. u16 mask, padconf;
  365. /* In a stand alone OMAP3430 where there is not a stacked
  366. * modem for the D2D Idle Ack and D2D MStandby must be pulled
  367. * high. S CONTROL_PADCONF_SAD2D_IDLEACK and
  368. * CONTROL_PADCONF_SAD2D_MSTDBY to have a pull up. */
  369. mask = (1 << 4) | (1 << 3); /* pull-up, enabled */
  370. padconf = omap_ctrl_readw(OMAP3_PADCONF_SAD2D_MSTANDBY);
  371. padconf |= mask;
  372. omap_ctrl_writew(padconf, OMAP3_PADCONF_SAD2D_MSTANDBY);
  373. padconf = omap_ctrl_readw(OMAP3_PADCONF_SAD2D_IDLEACK);
  374. padconf |= mask;
  375. omap_ctrl_writew(padconf, OMAP3_PADCONF_SAD2D_IDLEACK);
  376. /* reset modem */
  377. prm_write_mod_reg(OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RSTPWRON |
  378. OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RST,
  379. CORE_MOD, RM_RSTCTRL);
  380. prm_write_mod_reg(0, CORE_MOD, RM_RSTCTRL);
  381. }
  382. static void __init prcm_setup_regs(void)
  383. {
  384. /* XXX Reset all wkdeps. This should be done when initializing
  385. * powerdomains */
  386. prm_write_mod_reg(0, OMAP3430_IVA2_MOD, PM_WKDEP);
  387. prm_write_mod_reg(0, MPU_MOD, PM_WKDEP);
  388. prm_write_mod_reg(0, OMAP3430_DSS_MOD, PM_WKDEP);
  389. prm_write_mod_reg(0, OMAP3430_NEON_MOD, PM_WKDEP);
  390. prm_write_mod_reg(0, OMAP3430_CAM_MOD, PM_WKDEP);
  391. prm_write_mod_reg(0, OMAP3430_PER_MOD, PM_WKDEP);
  392. if (omap_rev() > OMAP3430_REV_ES1_0) {
  393. prm_write_mod_reg(0, OMAP3430ES2_SGX_MOD, PM_WKDEP);
  394. prm_write_mod_reg(0, OMAP3430ES2_USBHOST_MOD, PM_WKDEP);
  395. } else
  396. prm_write_mod_reg(0, GFX_MOD, PM_WKDEP);
  397. /*
  398. * Enable interface clock autoidle for all modules.
  399. * Note that in the long run this should be done by clockfw
  400. */
  401. cm_write_mod_reg(
  402. OMAP3430_AUTO_MODEM |
  403. OMAP3430ES2_AUTO_MMC3 |
  404. OMAP3430ES2_AUTO_ICR |
  405. OMAP3430_AUTO_AES2 |
  406. OMAP3430_AUTO_SHA12 |
  407. OMAP3430_AUTO_DES2 |
  408. OMAP3430_AUTO_MMC2 |
  409. OMAP3430_AUTO_MMC1 |
  410. OMAP3430_AUTO_MSPRO |
  411. OMAP3430_AUTO_HDQ |
  412. OMAP3430_AUTO_MCSPI4 |
  413. OMAP3430_AUTO_MCSPI3 |
  414. OMAP3430_AUTO_MCSPI2 |
  415. OMAP3430_AUTO_MCSPI1 |
  416. OMAP3430_AUTO_I2C3 |
  417. OMAP3430_AUTO_I2C2 |
  418. OMAP3430_AUTO_I2C1 |
  419. OMAP3430_AUTO_UART2 |
  420. OMAP3430_AUTO_UART1 |
  421. OMAP3430_AUTO_GPT11 |
  422. OMAP3430_AUTO_GPT10 |
  423. OMAP3430_AUTO_MCBSP5 |
  424. OMAP3430_AUTO_MCBSP1 |
  425. OMAP3430ES1_AUTO_FAC | /* This is es1 only */
  426. OMAP3430_AUTO_MAILBOXES |
  427. OMAP3430_AUTO_OMAPCTRL |
  428. OMAP3430ES1_AUTO_FSHOSTUSB |
  429. OMAP3430_AUTO_HSOTGUSB |
  430. OMAP3430_AUTO_SAD2D |
  431. OMAP3430_AUTO_SSI,
  432. CORE_MOD, CM_AUTOIDLE1);
  433. cm_write_mod_reg(
  434. OMAP3430_AUTO_PKA |
  435. OMAP3430_AUTO_AES1 |
  436. OMAP3430_AUTO_RNG |
  437. OMAP3430_AUTO_SHA11 |
  438. OMAP3430_AUTO_DES1,
  439. CORE_MOD, CM_AUTOIDLE2);
  440. if (omap_rev() > OMAP3430_REV_ES1_0) {
  441. cm_write_mod_reg(
  442. OMAP3430_AUTO_MAD2D |
  443. OMAP3430ES2_AUTO_USBTLL,
  444. CORE_MOD, CM_AUTOIDLE3);
  445. }
  446. cm_write_mod_reg(
  447. OMAP3430_AUTO_WDT2 |
  448. OMAP3430_AUTO_WDT1 |
  449. OMAP3430_AUTO_GPIO1 |
  450. OMAP3430_AUTO_32KSYNC |
  451. OMAP3430_AUTO_GPT12 |
  452. OMAP3430_AUTO_GPT1 ,
  453. WKUP_MOD, CM_AUTOIDLE);
  454. cm_write_mod_reg(
  455. OMAP3430_AUTO_DSS,
  456. OMAP3430_DSS_MOD,
  457. CM_AUTOIDLE);
  458. cm_write_mod_reg(
  459. OMAP3430_AUTO_CAM,
  460. OMAP3430_CAM_MOD,
  461. CM_AUTOIDLE);
  462. cm_write_mod_reg(
  463. OMAP3430_AUTO_GPIO6 |
  464. OMAP3430_AUTO_GPIO5 |
  465. OMAP3430_AUTO_GPIO4 |
  466. OMAP3430_AUTO_GPIO3 |
  467. OMAP3430_AUTO_GPIO2 |
  468. OMAP3430_AUTO_WDT3 |
  469. OMAP3430_AUTO_UART3 |
  470. OMAP3430_AUTO_GPT9 |
  471. OMAP3430_AUTO_GPT8 |
  472. OMAP3430_AUTO_GPT7 |
  473. OMAP3430_AUTO_GPT6 |
  474. OMAP3430_AUTO_GPT5 |
  475. OMAP3430_AUTO_GPT4 |
  476. OMAP3430_AUTO_GPT3 |
  477. OMAP3430_AUTO_GPT2 |
  478. OMAP3430_AUTO_MCBSP4 |
  479. OMAP3430_AUTO_MCBSP3 |
  480. OMAP3430_AUTO_MCBSP2,
  481. OMAP3430_PER_MOD,
  482. CM_AUTOIDLE);
  483. if (omap_rev() > OMAP3430_REV_ES1_0) {
  484. cm_write_mod_reg(
  485. OMAP3430ES2_AUTO_USBHOST,
  486. OMAP3430ES2_USBHOST_MOD,
  487. CM_AUTOIDLE);
  488. }
  489. /*
  490. * Set all plls to autoidle. This is needed until autoidle is
  491. * enabled by clockfw
  492. */
  493. cm_write_mod_reg(1 << OMAP3430_AUTO_IVA2_DPLL_SHIFT,
  494. OMAP3430_IVA2_MOD, CM_AUTOIDLE2);
  495. cm_write_mod_reg(1 << OMAP3430_AUTO_MPU_DPLL_SHIFT,
  496. MPU_MOD,
  497. CM_AUTOIDLE2);
  498. cm_write_mod_reg((1 << OMAP3430_AUTO_PERIPH_DPLL_SHIFT) |
  499. (1 << OMAP3430_AUTO_CORE_DPLL_SHIFT),
  500. PLL_MOD,
  501. CM_AUTOIDLE);
  502. cm_write_mod_reg(1 << OMAP3430ES2_AUTO_PERIPH2_DPLL_SHIFT,
  503. PLL_MOD,
  504. CM_AUTOIDLE2);
  505. /*
  506. * Enable control of expternal oscillator through
  507. * sys_clkreq. In the long run clock framework should
  508. * take care of this.
  509. */
  510. prm_rmw_mod_reg_bits(OMAP_AUTOEXTCLKMODE_MASK,
  511. 1 << OMAP_AUTOEXTCLKMODE_SHIFT,
  512. OMAP3430_GR_MOD,
  513. OMAP3_PRM_CLKSRC_CTRL_OFFSET);
  514. /* setup wakup source */
  515. prm_write_mod_reg(OMAP3430_EN_IO | OMAP3430_EN_GPIO1 |
  516. OMAP3430_EN_GPT1 | OMAP3430_EN_GPT12,
  517. WKUP_MOD, PM_WKEN);
  518. /* No need to write EN_IO, that is always enabled */
  519. prm_write_mod_reg(OMAP3430_EN_GPIO1 | OMAP3430_EN_GPT1 |
  520. OMAP3430_EN_GPT12,
  521. WKUP_MOD, OMAP3430_PM_MPUGRPSEL);
  522. /* For some reason IO doesn't generate wakeup event even if
  523. * it is selected to mpu wakeup goup */
  524. prm_write_mod_reg(OMAP3430_IO_EN | OMAP3430_WKUP_EN,
  525. OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET);
  526. /* Don't attach IVA interrupts */
  527. prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL);
  528. prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1);
  529. prm_write_mod_reg(0, CORE_MOD, OMAP3430ES2_PM_IVAGRPSEL3);
  530. prm_write_mod_reg(0, OMAP3430_PER_MOD, OMAP3430_PM_IVAGRPSEL);
  531. /* Clear any pending 'reset' flags */
  532. prm_write_mod_reg(0xffffffff, MPU_MOD, RM_RSTST);
  533. prm_write_mod_reg(0xffffffff, CORE_MOD, RM_RSTST);
  534. prm_write_mod_reg(0xffffffff, OMAP3430_PER_MOD, RM_RSTST);
  535. prm_write_mod_reg(0xffffffff, OMAP3430_EMU_MOD, RM_RSTST);
  536. prm_write_mod_reg(0xffffffff, OMAP3430_NEON_MOD, RM_RSTST);
  537. prm_write_mod_reg(0xffffffff, OMAP3430_DSS_MOD, RM_RSTST);
  538. prm_write_mod_reg(0xffffffff, OMAP3430ES2_USBHOST_MOD, RM_RSTST);
  539. /* Clear any pending PRCM interrupts */
  540. prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
  541. /* Don't attach IVA interrupts */
  542. prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL);
  543. prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1);
  544. prm_write_mod_reg(0, CORE_MOD, OMAP3430ES2_PM_IVAGRPSEL3);
  545. prm_write_mod_reg(0, OMAP3430_PER_MOD, OMAP3430_PM_IVAGRPSEL);
  546. /* Clear any pending 'reset' flags */
  547. prm_write_mod_reg(0xffffffff, MPU_MOD, RM_RSTST);
  548. prm_write_mod_reg(0xffffffff, CORE_MOD, RM_RSTST);
  549. prm_write_mod_reg(0xffffffff, OMAP3430_PER_MOD, RM_RSTST);
  550. prm_write_mod_reg(0xffffffff, OMAP3430_EMU_MOD, RM_RSTST);
  551. prm_write_mod_reg(0xffffffff, OMAP3430_NEON_MOD, RM_RSTST);
  552. prm_write_mod_reg(0xffffffff, OMAP3430_DSS_MOD, RM_RSTST);
  553. prm_write_mod_reg(0xffffffff, OMAP3430ES2_USBHOST_MOD, RM_RSTST);
  554. /* Clear any pending PRCM interrupts */
  555. prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
  556. omap3_iva_idle();
  557. omap3_d2d_idle();
  558. }
  559. static int __init pwrdms_setup(struct powerdomain *pwrdm)
  560. {
  561. struct power_state *pwrst;
  562. if (!pwrdm->pwrsts)
  563. return 0;
  564. pwrst = kmalloc(sizeof(struct power_state), GFP_KERNEL);
  565. if (!pwrst)
  566. return -ENOMEM;
  567. pwrst->pwrdm = pwrdm;
  568. pwrst->next_state = PWRDM_POWER_RET;
  569. list_add(&pwrst->node, &pwrst_list);
  570. if (pwrdm_has_hdwr_sar(pwrdm))
  571. pwrdm_enable_hdwr_sar(pwrdm);
  572. return set_pwrdm_state(pwrst->pwrdm, pwrst->next_state);
  573. }
  574. /*
  575. * Enable hw supervised mode for all clockdomains if it's
  576. * supported. Initiate sleep transition for other clockdomains, if
  577. * they are not used
  578. */
  579. static int __init clkdms_setup(struct clockdomain *clkdm)
  580. {
  581. if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO)
  582. omap2_clkdm_allow_idle(clkdm);
  583. else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&
  584. atomic_read(&clkdm->usecount) == 0)
  585. omap2_clkdm_sleep(clkdm);
  586. return 0;
  587. }
  588. static int __init omap3_pm_init(void)
  589. {
  590. struct power_state *pwrst, *tmp;
  591. int ret;
  592. if (!cpu_is_omap34xx())
  593. return -ENODEV;
  594. printk(KERN_ERR "Power Management for TI OMAP3.\n");
  595. /* XXX prcm_setup_regs needs to be before enabling hw
  596. * supervised mode for powerdomains */
  597. prcm_setup_regs();
  598. ret = request_irq(INT_34XX_PRCM_MPU_IRQ,
  599. (irq_handler_t)prcm_interrupt_handler,
  600. IRQF_DISABLED, "prcm", NULL);
  601. if (ret) {
  602. printk(KERN_ERR "request_irq failed to register for 0x%x\n",
  603. INT_34XX_PRCM_MPU_IRQ);
  604. goto err1;
  605. }
  606. ret = pwrdm_for_each(pwrdms_setup);
  607. if (ret) {
  608. printk(KERN_ERR "Failed to setup powerdomains\n");
  609. goto err2;
  610. }
  611. (void) clkdm_for_each(clkdms_setup);
  612. mpu_pwrdm = pwrdm_lookup("mpu_pwrdm");
  613. if (mpu_pwrdm == NULL) {
  614. printk(KERN_ERR "Failed to get mpu_pwrdm\n");
  615. goto err2;
  616. }
  617. _omap_sram_idle = omap_sram_push(omap34xx_cpu_suspend,
  618. omap34xx_cpu_suspend_sz);
  619. #ifdef CONFIG_SUSPEND
  620. suspend_set_ops(&omap_pm_ops);
  621. #endif /* CONFIG_SUSPEND */
  622. pm_idle = omap3_pm_idle;
  623. err1:
  624. return ret;
  625. err2:
  626. free_irq(INT_34XX_PRCM_MPU_IRQ, NULL);
  627. list_for_each_entry_safe(pwrst, tmp, &pwrst_list, node) {
  628. list_del(&pwrst->node);
  629. kfree(pwrst);
  630. }
  631. return ret;
  632. }
  633. late_initcall(omap3_pm_init);