This patch adds a runtime sysfs knob (/sys/power/enable_off_mode) to enable/disbale CORE OFF support for OMAP3. Signed-off-by: Rajendra Nayak <rnayak@xxxxxx> --- arch/arm/mach-omap2/pm.c | 21 +++++++++++++++++---- arch/arm/mach-omap2/pm.h | 2 ++ arch/arm/mach-omap2/pm34xx.c | 26 ++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 4 deletions(-) Index: linux-omap-2.6/arch/arm/mach-omap2/pm34xx.c =================================================================== --- linux-omap-2.6.orig/arch/arm/mach-omap2/pm34xx.c 2008-09-26 16:39:30.000000000 +0530 +++ linux-omap-2.6/arch/arm/mach-omap2/pm34xx.c 2008-09-26 16:39:34.000000000 +0530 @@ -395,6 +395,32 @@ static int omap3_can_sleep(void) return 1; } +int set_next_pwrst(struct powerdomain *pwrdm) +{ + struct power_state *pwrst; + int ret = 0; + u32 state; + + if (!pwrdm->pwrsts) + return 0; + + if (enable_off_mode) + state = PWRDM_POWER_OFF; + else + state = PWRDM_POWER_RET; + + ret = pwrdm_set_next_pwrst(pwrdm, state); + if (ret) { + printk(KERN_ERR "Unable to set state of powerdomain: %s\n", + pwrdm->name); + goto err; + } + list_for_each_entry(pwrst, &pwrst_list, node) + pwrst->next_state = state; +err: + return ret; +} + /* This sets pwrdm state (other than mpu & core. Currently only ON & * RET are supported. Function is assuming that clkdm doesn't have * hw_sup mode enabled. */ Index: linux-omap-2.6/arch/arm/mach-omap2/pm.c =================================================================== --- linux-omap-2.6.orig/arch/arm/mach-omap2/pm.c 2008-09-26 16:39:30.000000000 +0530 +++ linux-omap-2.6/arch/arm/mach-omap2/pm.c 2008-09-26 16:39:34.000000000 +0530 @@ -35,6 +35,7 @@ unsigned short enable_dyn_sleep; unsigned short clocks_off_while_idle; +unsigned short enable_off_mode; atomic_t sleep_block = ATOMIC_INIT(0); static ssize_t idle_show(struct kobject *, struct kobj_attribute *, char *); @@ -47,6 +48,9 @@ static struct kobj_attribute sleep_while static struct kobj_attribute clocks_off_while_idle_attr = __ATTR(clocks_off_while_idle, 0644, idle_show, idle_store); +static struct kobj_attribute enable_off_mode_attr = + __ATTR(enable_off_mode, 0644, idle_show, idle_store); + static ssize_t idle_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) { @@ -54,6 +58,8 @@ static ssize_t idle_show(struct kobject return sprintf(buf, "%hu\n", enable_dyn_sleep); else if (attr == &clocks_off_while_idle_attr) return sprintf(buf, "%hu\n", clocks_off_while_idle); + else if (attr == &enable_off_mode_attr) + return sprintf(buf, "%hu\n", enable_off_mode); else return -EINVAL; } @@ -69,13 +75,16 @@ static ssize_t idle_store(struct kobject return -EINVAL; } - if (attr == &sleep_while_idle_attr) + if (attr == &sleep_while_idle_attr) { enable_dyn_sleep = value; - else if (attr == &clocks_off_while_idle_attr) + } else if (attr == &clocks_off_while_idle_attr) { clocks_off_while_idle = value; - else + } else if (attr == &enable_off_mode_attr) { + enable_off_mode = value; + pwrdm_for_each(set_next_pwrst); + } else { return -EINVAL; - + } return n; } @@ -114,6 +123,10 @@ static int __init omap_pm_init(void) &clocks_off_while_idle_attr.attr); if (error) printk(KERN_ERR "sysfs_create_file failed: %d\n", error); + error = sysfs_create_file(power_kobj, + &enable_off_mode_attr.attr); + if (error) + printk(KERN_ERR "sysfs_create_file failed: %d\n", error); return error; } Index: linux-omap-2.6/arch/arm/mach-omap2/pm.h =================================================================== --- linux-omap-2.6.orig/arch/arm/mach-omap2/pm.h 2008-09-26 16:39:30.000000000 +0530 +++ linux-omap-2.6/arch/arm/mach-omap2/pm.h 2008-09-26 16:39:34.000000000 +0530 @@ -18,10 +18,12 @@ extern int omap3_pm_init(void); extern unsigned short enable_dyn_sleep; extern unsigned short clocks_off_while_idle; +extern unsigned short enable_off_mode; extern atomic_t sleep_block; extern void omap2_block_sleep(void); extern void omap2_allow_sleep(void); +extern int set_next_pwrst(struct powerdomain *pwrdm); #define OMAP343X_TABLE_ADDRESS_OFFSET 0x31 #define OMAP343X_TABLE_VALUE_OFFSET 0x30 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html