pm34xx.c 21 KB

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