diff options
| author | Rajendra Nayak <rnayak@ti.com> | 2011-02-25 16:06:47 -0700 | 
|---|---|---|
| committer | Paul Walmsley <paul@pwsan.com> | 2011-02-25 16:06:47 -0700 | 
| commit | 68b921ad7f35e0323ce0d9fe94e5701a112f257c (patch) | |
| tree | ec9af432b9a366604ce43370dfccc779ae2bc5f9 | |
| parent | 4aef7a2a5aad52b60ac1a2f3cee055b8271b70d5 (diff) | |
OMAP: clockdomain: Arch specific funcs for sleep/wakeup of clkdm
Define the following architecture specific funtions for omap2/3/4
.clkdm_sleep
.clkdm_wakeup
Convert the platform-independent framework to call these functions.
Also rename the api's by removing the omap2_ preamble.
Hence call omap2_clkdm_wakeup as clkdm_wakeup and
omap2_clkdm_sleep as clkdm_sleep.
Signed-off-by: Rajendra Nayak <rnayak@ti.com>
[paul@pwsan.com: fixed omap3_clkdm_clear_all_sleepdeps() and
 omap2_clkdm_clear_all_wkdeps() to test against the correct
 loop termination condition; thanks to Kevin Hilman for finding and
 helping fix]
Cc: Kevin Hilman <khilman@ti.com>
Signed-off-by: Paul Walmsley <paul@pwsan.com>
| -rw-r--r-- | arch/arm/mach-omap2/Makefile | 1 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/clockdomain.c | 64 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/clockdomain.h | 5 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/clockdomain2xxx_3xxx.c | 35 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/clockdomain44xx.c | 35 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/clockdomains44xx_data.c | 2 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/pm.c | 4 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/pm24xx.c | 6 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/pm34xx.c | 2 | 
9 files changed, 96 insertions, 58 deletions
| diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index 759d9ebd79c6..10c3c8f16eaa 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -108,6 +108,7 @@ obj-$(CONFIG_ARCH_OMAP3)		+= clockdomain.o \  					   clockdomain2xxx_3xxx.o \  					   clockdomains2xxx_3xxx_data.o  obj-$(CONFIG_ARCH_OMAP4)		+= clockdomain.o \ +					   clockdomain44xx.o \  					   clockdomains44xx_data.o  # Clock framework  obj-$(CONFIG_ARCH_OMAP2)		+= $(clock-common) clock2xxx.o \ diff --git a/arch/arm/mach-omap2/clockdomain.c b/arch/arm/mach-omap2/clockdomain.c index 895c153c18e0..3035eb9eec36 100644 --- a/arch/arm/mach-omap2/clockdomain.c +++ b/arch/arm/mach-omap2/clockdomain.c @@ -355,7 +355,7 @@ void clkdm_init(struct clockdomain **clkdms,  	 */  	list_for_each_entry(clkdm, &clkdm_list, node) {  		if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP) -			omap2_clkdm_wakeup(clkdm); +			clkdm_wakeup(clkdm);  		else if (clkdm->flags & CLKDM_CAN_DISABLE_AUTO)  			omap2_clkdm_deny_idle(clkdm); @@ -765,7 +765,7 @@ int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm)  }  /** - * omap2_clkdm_sleep - force clockdomain sleep transition + * clkdm_sleep - force clockdomain sleep transition   * @clkdm: struct clockdomain *   *   * Instruct the CM to force a sleep transition on the specified @@ -773,7 +773,7 @@ int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm)   * clockdomain does not support software-initiated sleep; 0 upon   * success.   */ -int omap2_clkdm_sleep(struct clockdomain *clkdm) +int clkdm_sleep(struct clockdomain *clkdm)  {  	if (!clkdm)  		return -EINVAL; @@ -784,33 +784,16 @@ int omap2_clkdm_sleep(struct clockdomain *clkdm)  		return -EINVAL;  	} -	pr_debug("clockdomain: forcing sleep on %s\n", clkdm->name); - -	if (cpu_is_omap24xx()) { - -		omap2_cm_set_mod_reg_bits(OMAP24XX_FORCESTATE_MASK, -			    clkdm->pwrdm.ptr->prcm_offs, OMAP2_PM_PWSTCTRL); - -	} else if (cpu_is_omap34xx()) { - -		omap3xxx_cm_clkdm_force_sleep(clkdm->pwrdm.ptr->prcm_offs, -					      clkdm->clktrctrl_mask); - -	} else if (cpu_is_omap44xx()) { - -		omap4_cminst_clkdm_force_sleep(clkdm->prcm_partition, -					       clkdm->cm_inst, -					       clkdm->clkdm_offs); +	if (!arch_clkdm || !arch_clkdm->clkdm_sleep) +		return -EINVAL; -	} else { -		BUG(); -	}; +	pr_debug("clockdomain: forcing sleep on %s\n", clkdm->name); -	return 0; +	return arch_clkdm->clkdm_sleep(clkdm);  }  /** - * omap2_clkdm_wakeup - force clockdomain wakeup transition + * clkdm_wakeup - force clockdomain wakeup transition   * @clkdm: struct clockdomain *   *   * Instruct the CM to force a wakeup transition on the specified @@ -818,7 +801,7 @@ int omap2_clkdm_sleep(struct clockdomain *clkdm)   * clockdomain does not support software-controlled wakeup; 0 upon   * success.   */ -int omap2_clkdm_wakeup(struct clockdomain *clkdm) +int clkdm_wakeup(struct clockdomain *clkdm)  {  	if (!clkdm)  		return -EINVAL; @@ -829,29 +812,12 @@ int omap2_clkdm_wakeup(struct clockdomain *clkdm)  		return -EINVAL;  	} -	pr_debug("clockdomain: forcing wakeup on %s\n", clkdm->name); - -	if (cpu_is_omap24xx()) { - -		omap2_cm_clear_mod_reg_bits(OMAP24XX_FORCESTATE_MASK, -			      clkdm->pwrdm.ptr->prcm_offs, OMAP2_PM_PWSTCTRL); - -	} else if (cpu_is_omap34xx()) { - -		omap3xxx_cm_clkdm_force_wakeup(clkdm->pwrdm.ptr->prcm_offs, -					       clkdm->clktrctrl_mask); - -	} else if (cpu_is_omap44xx()) { - -		omap4_cminst_clkdm_force_wakeup(clkdm->prcm_partition, -						clkdm->cm_inst, -						clkdm->clkdm_offs); +	if (!arch_clkdm || !arch_clkdm->clkdm_wakeup) +		return -EINVAL; -	} else { -		BUG(); -	}; +	pr_debug("clockdomain: forcing wakeup on %s\n", clkdm->name); -	return 0; +	return arch_clkdm->clkdm_wakeup(clkdm);  }  /** @@ -990,7 +956,7 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk)  		_clkdm_add_autodeps(clkdm);  		_enable_hwsup(clkdm);  	} else { -		omap2_clkdm_wakeup(clkdm); +		clkdm_wakeup(clkdm);  	}  	pwrdm_wait_transition(clkdm->pwrdm.ptr); @@ -1062,7 +1028,7 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk)  		_clkdm_del_autodeps(clkdm);  		_enable_hwsup(clkdm);  	} else { -		omap2_clkdm_sleep(clkdm); +		clkdm_sleep(clkdm);  	}  	pwrdm_clkdm_state_switch(clkdm); diff --git a/arch/arm/mach-omap2/clockdomain.h b/arch/arm/mach-omap2/clockdomain.h index 90b6d6a50862..7a5cb5cf9949 100644 --- a/arch/arm/mach-omap2/clockdomain.h +++ b/arch/arm/mach-omap2/clockdomain.h @@ -170,8 +170,8 @@ int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm);  void omap2_clkdm_allow_idle(struct clockdomain *clkdm);  void omap2_clkdm_deny_idle(struct clockdomain *clkdm); -int omap2_clkdm_wakeup(struct clockdomain *clkdm); -int omap2_clkdm_sleep(struct clockdomain *clkdm); +int clkdm_wakeup(struct clockdomain *clkdm); +int clkdm_sleep(struct clockdomain *clkdm);  int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk);  int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk); @@ -182,5 +182,6 @@ extern void __init omap44xx_clockdomains_init(void);  extern struct clkdm_ops omap2_clkdm_operations;  extern struct clkdm_ops omap3_clkdm_operations; +extern struct clkdm_ops omap4_clkdm_operations;  #endif diff --git a/arch/arm/mach-omap2/clockdomain2xxx_3xxx.c b/arch/arm/mach-omap2/clockdomain2xxx_3xxx.c index a1fd6fd5a466..08c87fe3da12 100644 --- a/arch/arm/mach-omap2/clockdomain2xxx_3xxx.c +++ b/arch/arm/mach-omap2/clockdomain2xxx_3xxx.c @@ -20,6 +20,7 @@  #include "cm2xxx_3xxx.h"  #include "cm-regbits-24xx.h"  #include "cm-regbits-34xx.h" +#include "prm-regbits-24xx.h"  #include "clockdomain.h"  static int omap2_clkdm_add_wkdep(struct clockdomain *clkdm1, @@ -111,11 +112,43 @@ static int omap3_clkdm_clear_all_sleepdeps(struct clockdomain *clkdm)  	return 0;  } +static int omap2_clkdm_sleep(struct clockdomain *clkdm) +{ +	omap2_cm_set_mod_reg_bits(OMAP24XX_FORCESTATE_MASK, +				clkdm->pwrdm.ptr->prcm_offs, +				OMAP2_PM_PWSTCTRL); +	return 0; +} + +static int omap2_clkdm_wakeup(struct clockdomain *clkdm) +{ +	omap2_cm_clear_mod_reg_bits(OMAP24XX_FORCESTATE_MASK, +				clkdm->pwrdm.ptr->prcm_offs, +				OMAP2_PM_PWSTCTRL); +	return 0; +} + +static int omap3_clkdm_sleep(struct clockdomain *clkdm) +{ +	omap3xxx_cm_clkdm_force_sleep(clkdm->pwrdm.ptr->prcm_offs, +				clkdm->clktrctrl_mask); +	return 0; +} + +static int omap3_clkdm_wakeup(struct clockdomain *clkdm) +{ +	omap3xxx_cm_clkdm_force_wakeup(clkdm->pwrdm.ptr->prcm_offs, +				clkdm->clktrctrl_mask); +	return 0; +} +  struct clkdm_ops omap2_clkdm_operations = {  	.clkdm_add_wkdep	= omap2_clkdm_add_wkdep,  	.clkdm_del_wkdep	= omap2_clkdm_del_wkdep,  	.clkdm_read_wkdep	= omap2_clkdm_read_wkdep,  	.clkdm_clear_all_wkdeps	= omap2_clkdm_clear_all_wkdeps, +	.clkdm_sleep		= omap2_clkdm_sleep, +	.clkdm_wakeup		= omap2_clkdm_wakeup,  };  struct clkdm_ops omap3_clkdm_operations = { @@ -127,4 +160,6 @@ struct clkdm_ops omap3_clkdm_operations = {  	.clkdm_del_sleepdep	= omap3_clkdm_del_sleepdep,  	.clkdm_read_sleepdep	= omap3_clkdm_read_sleepdep,  	.clkdm_clear_all_sleepdeps	= omap3_clkdm_clear_all_sleepdeps, +	.clkdm_sleep		= omap3_clkdm_sleep, +	.clkdm_wakeup		= omap3_clkdm_wakeup,  }; diff --git a/arch/arm/mach-omap2/clockdomain44xx.c b/arch/arm/mach-omap2/clockdomain44xx.c new file mode 100644 index 000000000000..9ccb406cf54f --- /dev/null +++ b/arch/arm/mach-omap2/clockdomain44xx.c @@ -0,0 +1,35 @@ +/* + * OMAP4 clockdomain control + * + * Copyright (C) 2008-2010 Texas Instruments, Inc. + * Copyright (C) 2008-2010 Nokia Corporation + * + * Derived from mach-omap2/clockdomain.c written by Paul Walmsley + * Rajendra Nayak <rnayak@ti.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "clockdomain.h" +#include "cminst44xx.h" + +static int omap4_clkdm_sleep(struct clockdomain *clkdm) +{ +	omap4_cminst_clkdm_force_sleep(clkdm->prcm_partition, +					clkdm->cm_inst, clkdm->clkdm_offs); +	return 0; +} + +static int omap4_clkdm_wakeup(struct clockdomain *clkdm) +{ +	omap4_cminst_clkdm_force_wakeup(clkdm->prcm_partition, +					clkdm->cm_inst, clkdm->clkdm_offs); +	return 0; +} + +struct clkdm_ops omap4_clkdm_operations = { +	.clkdm_sleep		= omap4_clkdm_sleep, +	.clkdm_wakeup		= omap4_clkdm_wakeup, +}; diff --git a/arch/arm/mach-omap2/clockdomains44xx_data.c b/arch/arm/mach-omap2/clockdomains44xx_data.c index a5000d473d45..eea6f8e40289 100644 --- a/arch/arm/mach-omap2/clockdomains44xx_data.c +++ b/arch/arm/mach-omap2/clockdomains44xx_data.c @@ -305,5 +305,5 @@ static struct clockdomain *clockdomains_omap44xx[] __initdata = {  void __init omap44xx_clockdomains_init(void)  { -	clkdm_init(clockdomains_omap44xx, NULL, NULL); +	clkdm_init(clockdomains_omap44xx, NULL, &omap4_clkdm_operations);  } diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index d5a102c71989..74c31008079c 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c @@ -124,7 +124,7 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state)  			(pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE)) {  			sleep_switch = LOWPOWERSTATE_SWITCH;  		} else { -			omap2_clkdm_wakeup(pwrdm->pwrdm_clkdms[0]); +			clkdm_wakeup(pwrdm->pwrdm_clkdms[0]);  			pwrdm_wait_transition(pwrdm);  			sleep_switch = FORCEWAKEUP_SWITCH;  		} @@ -142,7 +142,7 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state)  		if (pwrdm->pwrdm_clkdms[0]->flags & CLKDM_CAN_ENABLE_AUTO)  			omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]);  		else -			omap2_clkdm_sleep(pwrdm->pwrdm_clkdms[0]); +			clkdm_sleep(pwrdm->pwrdm_clkdms[0]);  		break;  	case LOWPOWERSTATE_SWITCH:  		pwrdm_set_lowpwrstchange(pwrdm); diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index 97feb3ab6a69..4125621bf591 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c @@ -370,7 +370,7 @@ static int __init clkdms_setup(struct clockdomain *clkdm, void *unused)  		omap2_clkdm_allow_idle(clkdm);  	else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&  		 atomic_read(&clkdm->usecount) == 0) -		omap2_clkdm_sleep(clkdm); +		clkdm_sleep(clkdm);  	return 0;  } @@ -405,11 +405,11 @@ static void __init prcm_setup_regs(void)  	pwrdm = clkdm_get_pwrdm(dsp_clkdm);  	pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF); -	omap2_clkdm_sleep(dsp_clkdm); +	clkdm_sleep(dsp_clkdm);  	pwrdm = clkdm_get_pwrdm(gfx_clkdm);  	pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF); -	omap2_clkdm_sleep(gfx_clkdm); +	clkdm_sleep(gfx_clkdm);  	/*  	 * Clear clockdomain wakeup dependencies and enable diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 2f864e4b085d..81df2b169a56 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c @@ -993,7 +993,7 @@ static int __init clkdms_setup(struct clockdomain *clkdm, void *unused)  		omap2_clkdm_allow_idle(clkdm);  	else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&  		 atomic_read(&clkdm->usecount) == 0) -		omap2_clkdm_sleep(clkdm); +		clkdm_sleep(clkdm);  	return 0;  } | 
