aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/pm34xx.c
diff options
context:
space:
mode:
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 4c85762107bd..11f9669eb7ed 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -653,14 +653,17 @@ static void __init pm_errata_configure(void)
653 /* Enable the l2 cache toggling in sleep logic */ 653 /* Enable the l2 cache toggling in sleep logic */
654 enable_omap3630_toggle_l2_on_restore(); 654 enable_omap3630_toggle_l2_on_restore();
655 if (omap_rev() < OMAP3630_REV_ES1_2) 655 if (omap_rev() < OMAP3630_REV_ES1_2)
656 pm34xx_errata |= PM_SDRC_WAKEUP_ERRATUM_i583; 656 pm34xx_errata |= (PM_SDRC_WAKEUP_ERRATUM_i583 |
657 PM_PER_MEMORIES_ERRATUM_i582);
658 } else if (cpu_is_omap34xx()) {
659 pm34xx_errata |= PM_PER_MEMORIES_ERRATUM_i582;
657 } 660 }
658} 661}
659 662
660int __init omap3_pm_init(void) 663int __init omap3_pm_init(void)
661{ 664{
662 struct power_state *pwrst, *tmp; 665 struct power_state *pwrst, *tmp;
663 struct clockdomain *neon_clkdm, *mpu_clkdm; 666 struct clockdomain *neon_clkdm, *mpu_clkdm, *per_clkdm, *wkup_clkdm;
664 int ret; 667 int ret;
665 668
666 if (!omap3_has_io_chain_ctrl()) 669 if (!omap3_has_io_chain_ctrl())
@@ -712,6 +715,8 @@ int __init omap3_pm_init(void)
712 715
713 neon_clkdm = clkdm_lookup("neon_clkdm"); 716 neon_clkdm = clkdm_lookup("neon_clkdm");
714 mpu_clkdm = clkdm_lookup("mpu_clkdm"); 717 mpu_clkdm = clkdm_lookup("mpu_clkdm");
718 per_clkdm = clkdm_lookup("per_clkdm");
719 wkup_clkdm = clkdm_lookup("wkup_clkdm");
715 720
716#ifdef CONFIG_SUSPEND 721#ifdef CONFIG_SUSPEND
717 omap_pm_suspend = omap3_pm_suspend; 722 omap_pm_suspend = omap3_pm_suspend;
@@ -728,6 +733,27 @@ int __init omap3_pm_init(void)
728 if (IS_PM34XX_ERRATUM(PM_RTA_ERRATUM_i608)) 733 if (IS_PM34XX_ERRATUM(PM_RTA_ERRATUM_i608))
729 omap3630_ctrl_disable_rta(); 734 omap3630_ctrl_disable_rta();
730 735
736 /*
737 * The UART3/4 FIFO and the sidetone memory in McBSP2/3 are
738 * not correctly reset when the PER powerdomain comes back
739 * from OFF or OSWR when the CORE powerdomain is kept active.
740 * See OMAP36xx Erratum i582 "PER Domain reset issue after
741 * Domain-OFF/OSWR Wakeup". This wakeup dependency is not a
742 * complete workaround. The kernel must also prevent the PER
743 * powerdomain from going to OSWR/OFF while the CORE
744 * powerdomain is not going to OSWR/OFF. And if PER last
745 * power state was off while CORE last power state was ON, the
746 * UART3/4 and McBSP2/3 SIDETONE devices need to run a
747 * self-test using their loopback tests; if that fails, those
748 * devices are unusable until the PER/CORE can complete a transition
749 * from ON to OSWR/OFF and then back to ON.
750 *
751 * XXX Technically this workaround is only needed if off-mode
752 * or OSWR is enabled.
753 */
754 if (IS_PM34XX_ERRATUM(PM_PER_MEMORIES_ERRATUM_i582))
755 clkdm_add_wkdep(per_clkdm, wkup_clkdm);
756
731 clkdm_add_wkdep(neon_clkdm, mpu_clkdm); 757 clkdm_add_wkdep(neon_clkdm, mpu_clkdm);
732 if (omap_type() != OMAP2_DEVICE_TYPE_GP) { 758 if (omap_type() != OMAP2_DEVICE_TYPE_GP) {
733 omap3_secure_ram_storage = 759 omap3_secure_ram_storage =