aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/pm34xx.c
diff options
context:
space:
mode:
authorTony Lindgren <tony@atomide.com>2012-11-13 16:25:38 -0500
committerTony Lindgren <tony@atomide.com>2012-11-13 16:25:38 -0500
commit89ab216b33ba9405880fd3d89531305a931bc70f (patch)
tree8f6428ce51ecaed6f6e1379c036dbe341eb71e34 /arch/arm/mach-omap2/pm34xx.c
parentc9d501e5cb0238910337213e12a09127221c35d8 (diff)
parent46bf4a562207c5ebd24e1dde5e5ee326cd3d6b91 (diff)
Merge branch 'omap-for-v3.8/pm' into omap-for-v3.8/clock
Diffstat (limited to 'arch/arm/mach-omap2/pm34xx.c')
-rw-r--r--arch/arm/mach-omap2/pm34xx.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index aa701d76efda..a9b8da1629bf 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -651,14 +651,17 @@ static void __init pm_errata_configure(void)
651 /* Enable the l2 cache toggling in sleep logic */ 651 /* Enable the l2 cache toggling in sleep logic */
652 enable_omap3630_toggle_l2_on_restore(); 652 enable_omap3630_toggle_l2_on_restore();
653 if (omap_rev() < OMAP3630_REV_ES1_2) 653 if (omap_rev() < OMAP3630_REV_ES1_2)
654 pm34xx_errata |= PM_SDRC_WAKEUP_ERRATUM_i583; 654 pm34xx_errata |= (PM_SDRC_WAKEUP_ERRATUM_i583 |
655 PM_PER_MEMORIES_ERRATUM_i582);
656 } else if (cpu_is_omap34xx()) {
657 pm34xx_errata |= PM_PER_MEMORIES_ERRATUM_i582;
655 } 658 }
656} 659}
657 660
658int __init omap3_pm_init(void) 661int __init omap3_pm_init(void)
659{ 662{
660 struct power_state *pwrst, *tmp; 663 struct power_state *pwrst, *tmp;
661 struct clockdomain *neon_clkdm, *mpu_clkdm; 664 struct clockdomain *neon_clkdm, *mpu_clkdm, *per_clkdm, *wkup_clkdm;
662 int ret; 665 int ret;
663 666
664 if (!omap3_has_io_chain_ctrl()) 667 if (!omap3_has_io_chain_ctrl())
@@ -710,6 +713,8 @@ int __init omap3_pm_init(void)
710 713
711 neon_clkdm = clkdm_lookup("neon_clkdm"); 714 neon_clkdm = clkdm_lookup("neon_clkdm");
712 mpu_clkdm = clkdm_lookup("mpu_clkdm"); 715 mpu_clkdm = clkdm_lookup("mpu_clkdm");
716 per_clkdm = clkdm_lookup("per_clkdm");
717 wkup_clkdm = clkdm_lookup("wkup_clkdm");
713 718
714#ifdef CONFIG_SUSPEND 719#ifdef CONFIG_SUSPEND
715 omap_pm_suspend = omap3_pm_suspend; 720 omap_pm_suspend = omap3_pm_suspend;
@@ -726,6 +731,27 @@ int __init omap3_pm_init(void)
726 if (IS_PM34XX_ERRATUM(PM_RTA_ERRATUM_i608)) 731 if (IS_PM34XX_ERRATUM(PM_RTA_ERRATUM_i608))
727 omap3630_ctrl_disable_rta(); 732 omap3630_ctrl_disable_rta();
728 733
734 /*
735 * The UART3/4 FIFO and the sidetone memory in McBSP2/3 are
736 * not correctly reset when the PER powerdomain comes back
737 * from OFF or OSWR when the CORE powerdomain is kept active.
738 * See OMAP36xx Erratum i582 "PER Domain reset issue after
739 * Domain-OFF/OSWR Wakeup". This wakeup dependency is not a
740 * complete workaround. The kernel must also prevent the PER
741 * powerdomain from going to OSWR/OFF while the CORE
742 * powerdomain is not going to OSWR/OFF. And if PER last
743 * power state was off while CORE last power state was ON, the
744 * UART3/4 and McBSP2/3 SIDETONE devices need to run a
745 * self-test using their loopback tests; if that fails, those
746 * devices are unusable until the PER/CORE can complete a transition
747 * from ON to OSWR/OFF and then back to ON.
748 *
749 * XXX Technically this workaround is only needed if off-mode
750 * or OSWR is enabled.
751 */
752 if (IS_PM34XX_ERRATUM(PM_PER_MEMORIES_ERRATUM_i582))
753 clkdm_add_wkdep(per_clkdm, wkup_clkdm);
754
729 clkdm_add_wkdep(neon_clkdm, mpu_clkdm); 755 clkdm_add_wkdep(neon_clkdm, mpu_clkdm);
730 if (omap_type() != OMAP2_DEVICE_TYPE_GP) { 756 if (omap_type() != OMAP2_DEVICE_TYPE_GP) {
731 omap3_secure_ram_storage = 757 omap3_secure_ram_storage =