pm34xx.c 20 KB

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