pm34xx.c 20 KB

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