diff mbox

[03/15] ARM: OMAP4+: PM: Consolidate and use OMAP4 PM code for OMAP5

Message ID 1362139864-9233-4-git-send-email-santosh.shilimkar@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Santosh Shilimkar March 1, 2013, 12:10 p.m. UTC
OMAP5 has backward compatible PRCM block and it's programming
model is mostly similar to OMAP4. Same is going to be maintained
for future OMAP4 based SOCs. Hence consolidate the OMAP4 power
management code so that it can be re-used on OMAP5 and later devices.

With consolidated code, let basic power management code build
and initialise on OMAP5 devices.

Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
---
 arch/arm/mach-omap2/Makefile                       |    9 +-
 arch/arm/mach-omap2/{pm44xx.c => pm_omap4plus.c}   |   87 +++++++++++++-------
 .../mach-omap2/{sleep44xx.S => sleep_omap4plus.S}  |    0
 3 files changed, 60 insertions(+), 36 deletions(-)
 rename arch/arm/mach-omap2/{pm44xx.c => pm_omap4plus.c} (74%)
 rename arch/arm/mach-omap2/{sleep44xx.S => sleep_omap4plus.S} (100%)

diff --git a/arch/arm/mach-omap2/sleep44xx.S b/arch/arm/mach-omap2/sleep_omap4plus.S
similarity index 100%
rename from arch/arm/mach-omap2/sleep44xx.S
rename to arch/arm/mach-omap2/sleep_omap4plus.S

Comments

Nishanth Menon March 1, 2013, 5:43 p.m. UTC | #1
On 17:40-20130301, Santosh Shilimkar wrote:
> diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm_omap4plus.c
> similarity index 74%
> rename from arch/arm/mach-omap2/pm44xx.c
> rename to arch/arm/mach-omap2/pm_omap4plus.c
> index 1d03110..95d2712 100644
> --- a/arch/arm/mach-omap2/pm44xx.c
> +++ b/arch/arm/mach-omap2/pm_omap4plus.c
> @@ -1,7 +1,7 @@
>  /*
> - * OMAP4 Power Management Routines
> + * OMAP4PLUS Power Management Routines
>   *
> - * Copyright (C) 2010-2011 Texas Instruments, Inc.
> + * Copyright (C) 2010-2013 Texas Instruments, Inc.
>   * Rajendra Nayak <rnayak@ti.com>
>   * Santosh Shilimkar <santosh.shilimkar@ti.com>
>   *
> @@ -125,55 +125,77 @@ static void omap_default_idle(void)
>  }
>  
>  /**
> - * omap4_pm_init - Init routine for OMAP4 PM
> + * omap4_init_static_deps - Init static clkdm dependencies on OMAP4
>   *
> - * Initializes all powerdomain and clockdomain target states
> - * and all PRCM settings.
> + * The dynamic dependency between MPUSS -> MEMIF and
> + * MPUSS -> L4_PER/L3_* and DUCATI -> L3_* doesn't work as
> + * expected. The hardware recommendation is to enable static
> + * dependencies for these to avoid system lock ups or random crashes.
> + * The L4 wakeup depedency is added to workaround the OCP sync hardware
> + * BUG with 32K synctimer which lead to incorrect timer value read
> + * from the 32K counter. The BUG applies for GPTIMER1 and WDT2 which
> + * are part of L4 wakeup clockdomain.
>   */
> -int __init omap4_pm_init(void)
> +static inline int omap4_init_static_deps(void)
>  {
>  	int ret;
> -	struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm;
> -	struct clockdomain *ducati_clkdm, *l3_2_clkdm;
> +	struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm, *l4wkup;
> +	struct clockdomain *ducati_clkdm, *l3_2_clkdm, *l4_per_clkdm;
>  
> -	if (omap_rev() == OMAP4430_REV_ES1_0) {
> -		WARN(1, "Power Management not supported on OMAP4430 ES1.0\n");
> -		return -ENODEV;
> -	}
> -
> -	pr_err("Power Management for TI OMAP4.\n");
> -
> -	ret = pwrdm_for_each(pwrdms_setup, NULL);
> -	if (ret) {
> -		pr_err("Failed to setup powerdomains\n");
> -		goto err2;
> -	}
> -
> -	/*
> -	 * The dynamic dependency between MPUSS -> MEMIF and
> -	 * MPUSS -> L4_PER/L3_* and DUCATI -> L3_* doesn't work as
> -	 * expected. The hardware recommendation is to enable static
> -	 * dependencies for these to avoid system lock ups or random crashes.
> -	 */
>  	mpuss_clkdm = clkdm_lookup("mpuss_clkdm");
>  	emif_clkdm = clkdm_lookup("l3_emif_clkdm");
>  	l3_1_clkdm = clkdm_lookup("l3_1_clkdm");
>  	l3_2_clkdm = clkdm_lookup("l3_2_clkdm");
> +	l4_per_clkdm = clkdm_lookup("l4_per_clkdm");
> +	l4wkup = clkdm_lookup("l4_wkup_clkdm");
These static dependencies now seems added for OMAP4?
Sounds like a separate patch as it is not exactly what $subject claims.
>  	ducati_clkdm = clkdm_lookup("ducati_clkdm");
> -	if ((!mpuss_clkdm) || (!emif_clkdm) || (!l3_1_clkdm) ||
> -		(!l3_2_clkdm) || (!ducati_clkdm))
> -		goto err2;
> +	if ((!mpuss_clkdm) || (!emif_clkdm) || (!l3_1_clkdm) || (!l4wkup) ||
> +		(!l3_2_clkdm) || (!ducati_clkdm) || (!l4_per_clkdm))
> +		return -EINVAL;
>  
>  	ret = clkdm_add_wkdep(mpuss_clkdm, emif_clkdm);
>  	ret |= clkdm_add_wkdep(mpuss_clkdm, l3_1_clkdm);
>  	ret |= clkdm_add_wkdep(mpuss_clkdm, l3_2_clkdm);
> +	ret |= clkdm_add_wkdep(mpuss_clkdm, l4_per_clkdm);
> +	ret |= clkdm_add_wkdep(mpuss_clkdm, l4wkup);
>  	ret |= clkdm_add_wkdep(ducati_clkdm, l3_1_clkdm);
>  	ret |= clkdm_add_wkdep(ducati_clkdm, l3_2_clkdm);
>  	if (ret) {
>  		pr_err("Failed to add MPUSS -> L3/EMIF/L4PER, DUCATI -> L3 wakeup dependency\n");
> +	}
> +
> +	return ret;
> +}
> +
> +/**
> + * omap4_pm_init - Init routine for OMAP4+ devices
> + *
> + * Initializes all powerdomain and clockdomain target states
> + * and all PRCM settings.
> + */
> +int __init omap4_pm_init(void)
could we rename it as omap4plus_pm_init while we are at it?
This will help differentiate at least functions which are omap4 only and
ones which we reuse for omap4plus?
> +{
> +	int ret;
> +
> +	if (omap_rev() == OMAP4430_REV_ES1_0) {
we have ID detection for OMAP5430_REV_ES1_0 in arch/arm/mach-omap2/id.c
However, we do not support PM, so might as well use it to skip init?
> +		WARN(1, "Power Management not supported on OMAP4430 ES1.0\n");
> +		return -ENODEV;
> +	}
> +
> +	pr_info("Power Management for TI OMAP4PLUS devices.\n");
> +
> +	ret = pwrdm_for_each(pwrdms_setup, NULL);
> +	if (ret) {
> +		pr_err("Failed to setup powerdomains.\n");
>  		goto err2;
>  	}
>  
> +	if (cpu_is_omap44xx()) {
> +		ret = omap4_init_static_deps();
> +		if (ret)
> +			goto err2;
> +	}
> +
>  	ret = omap4_mpuss_init();
>  	if (ret) {
>  		pr_err("Failed to initialise OMAP4 MPUSS\n");
> @@ -186,10 +208,11 @@ int __init omap4_pm_init(void)
>  	omap_pm_suspend = omap4_pm_suspend;
>  #endif
>  
> -	/* Overwrite the default cpu_do_idle() */
> +	/* Overwrite the default arch_idle() */
>  	arm_pm_idle = omap_default_idle;
>  
> -	omap4_idle_init();
> +	if (cpu_is_omap44xx())
> +		omap4_idle_init();
>  
>  err2:
>  	return ret;
> diff --git a/arch/arm/mach-omap2/sleep44xx.S b/arch/arm/mach-omap2/sleep_omap4plus.S
> similarity index 100%
> rename from arch/arm/mach-omap2/sleep44xx.S
> rename to arch/arm/mach-omap2/sleep_omap4plus.S
> -- 
> 1.7.9.5
Santosh Shilimkar March 2, 2013, 5:43 a.m. UTC | #2
On Friday 01 March 2013 11:13 PM, Nishanth Menon wrote:
> On 17:40-20130301, Santosh Shilimkar wrote:
>> diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm_omap4plus.c
>> similarity index 74%
>> rename from arch/arm/mach-omap2/pm44xx.c
>> rename to arch/arm/mach-omap2/pm_omap4plus.c
>> index 1d03110..95d2712 100644
>> --- a/arch/arm/mach-omap2/pm44xx.c
>> +++ b/arch/arm/mach-omap2/pm_omap4plus.c
>> @@ -1,7 +1,7 @@
>>  /*
>> - * OMAP4 Power Management Routines
>> + * OMAP4PLUS Power Management Routines
>>   *
>> - * Copyright (C) 2010-2011 Texas Instruments, Inc.
>> + * Copyright (C) 2010-2013 Texas Instruments, Inc.
>>   * Rajendra Nayak <rnayak@ti.com>
>>   * Santosh Shilimkar <santosh.shilimkar@ti.com>
>>   *
>> @@ -125,55 +125,77 @@ static void omap_default_idle(void)
>>  }
>>  
>>  /**
>> - * omap4_pm_init - Init routine for OMAP4 PM
>> + * omap4_init_static_deps - Init static clkdm dependencies on OMAP4
>>   *
>> - * Initializes all powerdomain and clockdomain target states
>> - * and all PRCM settings.
>> + * The dynamic dependency between MPUSS -> MEMIF and
>> + * MPUSS -> L4_PER/L3_* and DUCATI -> L3_* doesn't work as
>> + * expected. The hardware recommendation is to enable static
>> + * dependencies for these to avoid system lock ups or random crashes.
>> + * The L4 wakeup depedency is added to workaround the OCP sync hardware
>> + * BUG with 32K synctimer which lead to incorrect timer value read
>> + * from the 32K counter. The BUG applies for GPTIMER1 and WDT2 which
>> + * are part of L4 wakeup clockdomain.
>>   */
>> -int __init omap4_pm_init(void)
>> +static inline int omap4_init_static_deps(void)
>>  {
>>  	int ret;
>> -	struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm;
>> -	struct clockdomain *ducati_clkdm, *l3_2_clkdm;
>> +	struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm, *l4wkup;
>> +	struct clockdomain *ducati_clkdm, *l3_2_clkdm, *l4_per_clkdm;
>>  
>> -	if (omap_rev() == OMAP4430_REV_ES1_0) {
>> -		WARN(1, "Power Management not supported on OMAP4430 ES1.0\n");
>> -		return -ENODEV;
>> -	}
>> -
>> -	pr_err("Power Management for TI OMAP4.\n");
>> -
>> -	ret = pwrdm_for_each(pwrdms_setup, NULL);
>> -	if (ret) {
>> -		pr_err("Failed to setup powerdomains\n");
>> -		goto err2;
>> -	}
>> -
>> -	/*
>> -	 * The dynamic dependency between MPUSS -> MEMIF and
>> -	 * MPUSS -> L4_PER/L3_* and DUCATI -> L3_* doesn't work as
>> -	 * expected. The hardware recommendation is to enable static
>> -	 * dependencies for these to avoid system lock ups or random crashes.
>> -	 */
>>  	mpuss_clkdm = clkdm_lookup("mpuss_clkdm");
>>  	emif_clkdm = clkdm_lookup("l3_emif_clkdm");
>>  	l3_1_clkdm = clkdm_lookup("l3_1_clkdm");
>>  	l3_2_clkdm = clkdm_lookup("l3_2_clkdm");
>> +	l4_per_clkdm = clkdm_lookup("l4_per_clkdm");
>> +	l4wkup = clkdm_lookup("l4_wkup_clkdm");
> These static dependencies now seems added for OMAP4?
> Sounds like a separate patch as it is not exactly what $subject claims.
>>  	ducati_clkdm = clkdm_lookup("ducati_clkdm");
These are accidently added. I have removed these two in another series.
Will remove this one from the patch.

>> -	if ((!mpuss_clkdm) || (!emif_clkdm) || (!l3_1_clkdm) ||
>> -		(!l3_2_clkdm) || (!ducati_clkdm))
>> -		goto err2;
>> +	if ((!mpuss_clkdm) || (!emif_clkdm) || (!l3_1_clkdm) || (!l4wkup) ||
>> +		(!l3_2_clkdm) || (!ducati_clkdm) || (!l4_per_clkdm))
>> +		return -EINVAL;
>>  
>>  	ret = clkdm_add_wkdep(mpuss_clkdm, emif_clkdm);
>>  	ret |= clkdm_add_wkdep(mpuss_clkdm, l3_1_clkdm);
>>  	ret |= clkdm_add_wkdep(mpuss_clkdm, l3_2_clkdm);
>> +	ret |= clkdm_add_wkdep(mpuss_clkdm, l4_per_clkdm);
>> +	ret |= clkdm_add_wkdep(mpuss_clkdm, l4wkup);
>>  	ret |= clkdm_add_wkdep(ducati_clkdm, l3_1_clkdm);
>>  	ret |= clkdm_add_wkdep(ducati_clkdm, l3_2_clkdm);
>>  	if (ret) {
>>  		pr_err("Failed to add MPUSS -> L3/EMIF/L4PER, DUCATI -> L3 wakeup dependency\n");
>> +	}
>> +
>> +	return ret;
>> +}
>> +
>> +/**
>> + * omap4_pm_init - Init routine for OMAP4+ devices
>> + *
>> + * Initializes all powerdomain and clockdomain target states
>> + * and all PRCM settings.
>> + */
>> +int __init omap4_pm_init(void)
> could we rename it as omap4plus_pm_init while we are at it?
> This will help differentiate at least functions which are omap4 only and
> ones which we reuse for omap4plus?
Not needed. That way we have to rename all our omap2_* varients to
omap2plus. omap4_* is assumed to be omap4 and onwards just like
omap2_*

>> +{
>> +	int ret;
>> +
>> +	if (omap_rev() == OMAP4430_REV_ES1_0) {
> we have ID detection for OMAP5430_REV_ES1_0 in arch/arm/mach-omap2/id.c
> However, we do not support PM, so might as well use it to skip init?
Well the plan is to remove OMAP5 ES1.0 completely so no need to add
more checks. As already mentioned ES1.0 is not going to be supported
in mainline kernel.

Regerds,
Santosh
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Nishanth Menon March 4, 2013, 6:21 p.m. UTC | #3
On 11:13-20130302, Santosh Shilimkar wrote:
> On Friday 01 March 2013 11:13 PM, Nishanth Menon wrote:
> > On 17:40-20130301, Santosh Shilimkar wrote:
> >> diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm_omap4plus.c
> >> similarity index 74%
[..]
> >>  	mpuss_clkdm = clkdm_lookup("mpuss_clkdm");
> >>  	emif_clkdm = clkdm_lookup("l3_emif_clkdm");
> >>  	l3_1_clkdm = clkdm_lookup("l3_1_clkdm");
> >>  	l3_2_clkdm = clkdm_lookup("l3_2_clkdm");
> >> +	l4_per_clkdm = clkdm_lookup("l4_per_clkdm");
> >> +	l4wkup = clkdm_lookup("l4_wkup_clkdm");
> > These static dependencies now seems added for OMAP4?
> > Sounds like a separate patch as it is not exactly what $subject claims.
> >>  	ducati_clkdm = clkdm_lookup("ducati_clkdm");
> These are accidently added. I have removed these two in another series.
> Will remove this one from the patch.
Thanks.
> 
> >> -	if ((!mpuss_clkdm) || (!emif_clkdm) || (!l3_1_clkdm) ||
> >> -		(!l3_2_clkdm) || (!ducati_clkdm))
> >> -		goto err2;
> >> +	if ((!mpuss_clkdm) || (!emif_clkdm) || (!l3_1_clkdm) || (!l4wkup) ||
> >> +		(!l3_2_clkdm) || (!ducati_clkdm) || (!l4_per_clkdm))
> >> +		return -EINVAL;
> >>  
> >>  	ret = clkdm_add_wkdep(mpuss_clkdm, emif_clkdm);
> >>  	ret |= clkdm_add_wkdep(mpuss_clkdm, l3_1_clkdm);
> >>  	ret |= clkdm_add_wkdep(mpuss_clkdm, l3_2_clkdm);
> >> +	ret |= clkdm_add_wkdep(mpuss_clkdm, l4_per_clkdm);
> >> +	ret |= clkdm_add_wkdep(mpuss_clkdm, l4wkup);
> >>  	ret |= clkdm_add_wkdep(ducati_clkdm, l3_1_clkdm);
> >>  	ret |= clkdm_add_wkdep(ducati_clkdm, l3_2_clkdm);
> >>  	if (ret) {
> >>  		pr_err("Failed to add MPUSS -> L3/EMIF/L4PER, DUCATI -> L3 wakeup dependency\n");
> >> +	}
> >> +
> >> +	return ret;
> >> +}
> >> +
> >> +/**
> >> + * omap4_pm_init - Init routine for OMAP4+ devices
> >> + *
> >> + * Initializes all powerdomain and clockdomain target states
> >> + * and all PRCM settings.
> >> + */
> >> +int __init omap4_pm_init(void)
> > could we rename it as omap4plus_pm_init while we are at it?
> > This will help differentiate at least functions which are omap4 only and
> > ones which we reuse for omap4plus?
> Not needed. That way we have to rename all our omap2_* varients to
> omap2plus. omap4_* is assumed to be omap4 and onwards just like
> omap2_*
hmm true.. :(
> 
> >> +{
> >> +	int ret;
> >> +
> >> +	if (omap_rev() == OMAP4430_REV_ES1_0) {
> > we have ID detection for OMAP5430_REV_ES1_0 in arch/arm/mach-omap2/id.c
> > However, we do not support PM, so might as well use it to skip init?
> Well the plan is to remove OMAP5 ES1.0 completely so no need to add
> more checks. As already mentioned ES1.0 is not going to be supported
> in mainline kernel.
OK.
diff mbox

Patch

diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index 947cafe..7c3c6b6 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -32,14 +32,14 @@  obj-$(CONFIG_SOC_HAS_OMAP2_SDRC)	+= sdrc.o
 obj-$(CONFIG_SMP)			+= omap-smp.o omap-headsmp.o
 obj-$(CONFIG_HOTPLUG_CPU)		+= omap-hotplug.o
 omap-4-5-common				=  omap4-common.o omap-wakeupgen.o \
-					   sleep44xx.o
+					   sleep_omap4plus.o
 obj-$(CONFIG_ARCH_OMAP4)		+= $(omap-4-5-common)
 obj-$(CONFIG_SOC_OMAP5)			+= $(omap-4-5-common)
 
 plus_sec := $(call as-instr,.arch_extension sec,+sec)
 AFLAGS_omap-headsmp.o			:=-Wa,-march=armv7-a$(plus_sec)
 AFLAGS_omap-smc.o			:=-Wa,-march=armv7-a$(plus_sec)
-AFLAGS_sleep44xx.o			:=-Wa,-march=armv7-a$(plus_sec)
+AFLAGS_sleep_omap4plus.o		:=-Wa,-march=armv7-a$(plus_sec)
 
 # Functions loaded to SRAM
 obj-$(CONFIG_SOC_OMAP2420)		+= sram242x.o
@@ -76,11 +76,12 @@  endif
 obj-$(CONFIG_OMAP_PM_NOOP)		+= omap-pm-noop.o
 
 ifeq ($(CONFIG_PM),y)
+omap4plus-common-pm			=  omap-mpuss-lowpower.o pm_omap4plus.o
 obj-$(CONFIG_ARCH_OMAP2)		+= pm24xx.o
 obj-$(CONFIG_ARCH_OMAP2)		+= sleep24xx.o
 obj-$(CONFIG_ARCH_OMAP3)		+= pm34xx.o sleep34xx.o
-obj-$(CONFIG_ARCH_OMAP4)		+= pm44xx.o omap-mpuss-lowpower.o
-obj-$(CONFIG_SOC_OMAP5)			+= omap-mpuss-lowpower.o
+obj-$(CONFIG_ARCH_OMAP4)		+= $(omap4plus-common-pm)
+obj-$(CONFIG_SOC_OMAP5)			+= $(omap4plus-common-pm)
 obj-$(CONFIG_PM_DEBUG)			+= pm-debug.o
 
 obj-$(CONFIG_POWER_AVS_OMAP)		+= sr_device.o
diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm_omap4plus.c
similarity index 74%
rename from arch/arm/mach-omap2/pm44xx.c
rename to arch/arm/mach-omap2/pm_omap4plus.c
index 1d03110..95d2712 100644
--- a/arch/arm/mach-omap2/pm44xx.c
+++ b/arch/arm/mach-omap2/pm_omap4plus.c
@@ -1,7 +1,7 @@ 
 /*
- * OMAP4 Power Management Routines
+ * OMAP4PLUS Power Management Routines
  *
- * Copyright (C) 2010-2011 Texas Instruments, Inc.
+ * Copyright (C) 2010-2013 Texas Instruments, Inc.
  * Rajendra Nayak <rnayak@ti.com>
  * Santosh Shilimkar <santosh.shilimkar@ti.com>
  *
@@ -125,55 +125,77 @@  static void omap_default_idle(void)
 }
 
 /**
- * omap4_pm_init - Init routine for OMAP4 PM
+ * omap4_init_static_deps - Init static clkdm dependencies on OMAP4
  *
- * Initializes all powerdomain and clockdomain target states
- * and all PRCM settings.
+ * The dynamic dependency between MPUSS -> MEMIF and
+ * MPUSS -> L4_PER/L3_* and DUCATI -> L3_* doesn't work as
+ * expected. The hardware recommendation is to enable static
+ * dependencies for these to avoid system lock ups or random crashes.
+ * The L4 wakeup depedency is added to workaround the OCP sync hardware
+ * BUG with 32K synctimer which lead to incorrect timer value read
+ * from the 32K counter. The BUG applies for GPTIMER1 and WDT2 which
+ * are part of L4 wakeup clockdomain.
  */
-int __init omap4_pm_init(void)
+static inline int omap4_init_static_deps(void)
 {
 	int ret;
-	struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm;
-	struct clockdomain *ducati_clkdm, *l3_2_clkdm;
+	struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm, *l4wkup;
+	struct clockdomain *ducati_clkdm, *l3_2_clkdm, *l4_per_clkdm;
 
-	if (omap_rev() == OMAP4430_REV_ES1_0) {
-		WARN(1, "Power Management not supported on OMAP4430 ES1.0\n");
-		return -ENODEV;
-	}
-
-	pr_err("Power Management for TI OMAP4.\n");
-
-	ret = pwrdm_for_each(pwrdms_setup, NULL);
-	if (ret) {
-		pr_err("Failed to setup powerdomains\n");
-		goto err2;
-	}
-
-	/*
-	 * The dynamic dependency between MPUSS -> MEMIF and
-	 * MPUSS -> L4_PER/L3_* and DUCATI -> L3_* doesn't work as
-	 * expected. The hardware recommendation is to enable static
-	 * dependencies for these to avoid system lock ups or random crashes.
-	 */
 	mpuss_clkdm = clkdm_lookup("mpuss_clkdm");
 	emif_clkdm = clkdm_lookup("l3_emif_clkdm");
 	l3_1_clkdm = clkdm_lookup("l3_1_clkdm");
 	l3_2_clkdm = clkdm_lookup("l3_2_clkdm");
+	l4_per_clkdm = clkdm_lookup("l4_per_clkdm");
+	l4wkup = clkdm_lookup("l4_wkup_clkdm");
 	ducati_clkdm = clkdm_lookup("ducati_clkdm");
-	if ((!mpuss_clkdm) || (!emif_clkdm) || (!l3_1_clkdm) ||
-		(!l3_2_clkdm) || (!ducati_clkdm))
-		goto err2;
+	if ((!mpuss_clkdm) || (!emif_clkdm) || (!l3_1_clkdm) || (!l4wkup) ||
+		(!l3_2_clkdm) || (!ducati_clkdm) || (!l4_per_clkdm))
+		return -EINVAL;
 
 	ret = clkdm_add_wkdep(mpuss_clkdm, emif_clkdm);
 	ret |= clkdm_add_wkdep(mpuss_clkdm, l3_1_clkdm);
 	ret |= clkdm_add_wkdep(mpuss_clkdm, l3_2_clkdm);
+	ret |= clkdm_add_wkdep(mpuss_clkdm, l4_per_clkdm);
+	ret |= clkdm_add_wkdep(mpuss_clkdm, l4wkup);
 	ret |= clkdm_add_wkdep(ducati_clkdm, l3_1_clkdm);
 	ret |= clkdm_add_wkdep(ducati_clkdm, l3_2_clkdm);
 	if (ret) {
 		pr_err("Failed to add MPUSS -> L3/EMIF/L4PER, DUCATI -> L3 wakeup dependency\n");
+	}
+
+	return ret;
+}
+
+/**
+ * omap4_pm_init - Init routine for OMAP4+ devices
+ *
+ * Initializes all powerdomain and clockdomain target states
+ * and all PRCM settings.
+ */
+int __init omap4_pm_init(void)
+{
+	int ret;
+
+	if (omap_rev() == OMAP4430_REV_ES1_0) {
+		WARN(1, "Power Management not supported on OMAP4430 ES1.0\n");
+		return -ENODEV;
+	}
+
+	pr_info("Power Management for TI OMAP4PLUS devices.\n");
+
+	ret = pwrdm_for_each(pwrdms_setup, NULL);
+	if (ret) {
+		pr_err("Failed to setup powerdomains.\n");
 		goto err2;
 	}
 
+	if (cpu_is_omap44xx()) {
+		ret = omap4_init_static_deps();
+		if (ret)
+			goto err2;
+	}
+
 	ret = omap4_mpuss_init();
 	if (ret) {
 		pr_err("Failed to initialise OMAP4 MPUSS\n");
@@ -186,10 +208,11 @@  int __init omap4_pm_init(void)
 	omap_pm_suspend = omap4_pm_suspend;
 #endif
 
-	/* Overwrite the default cpu_do_idle() */
+	/* Overwrite the default arch_idle() */
 	arm_pm_idle = omap_default_idle;
 
-	omap4_idle_init();
+	if (cpu_is_omap44xx())
+		omap4_idle_init();
 
 err2:
 	return ret;