From: John Rose Added rtas_set_power_level() --- 25-akpm/arch/ppc64/kernel/rtas.c | 28 ++++++++++++++++++++++++++++ 25-akpm/include/asm-ppc64/rtas.h | 1 + 2 files changed, 29 insertions(+) diff -puN arch/ppc64/kernel/rtas.c~ppc64-rtas_set_power_level arch/ppc64/kernel/rtas.c --- 25/arch/ppc64/kernel/rtas.c~ppc64-rtas_set_power_level 2004-03-14 15:35:12.925973536 -0800 +++ 25-akpm/arch/ppc64/kernel/rtas.c 2004-03-14 15:35:12.928973080 -0800 @@ -259,6 +259,33 @@ rtas_get_power_level(int powerdomain, in } int +rtas_set_power_level(int powerdomain, int level, int *setlevel) +{ + int token = rtas_token("set-power-level"); + unsigned int wait_time; + long returned_level; + int rc; + + if (token == RTAS_UNKNOWN_SERVICE) + return RTAS_UNKNOWN_OP; + + while (1) { + rc = (int) rtas_call(token, 2, 2, &returned_level, powerdomain, + level); + if (rc == RTAS_BUSY) + udelay(1); + else if (rtas_is_extended_busy(rc)) { + wait_time = rtas_extended_busy_delay_time(rc); + udelay(wait_time * 1000); + } + else + break; + } + *setlevel = (int) returned_level; + return rc; +} + +int rtas_get_sensor(int sensor, int index, int *state) { int token = rtas_token("get-sensor-state"); @@ -472,4 +499,5 @@ EXPORT_SYMBOL(rtas_data_buf_lock); EXPORT_SYMBOL(rtas_extended_busy_delay_time); EXPORT_SYMBOL(rtas_get_sensor); EXPORT_SYMBOL(rtas_get_power_level); +EXPORT_SYMBOL(rtas_set_power_level); EXPORT_SYMBOL(rtas_set_indicator); diff -puN include/asm-ppc64/rtas.h~ppc64-rtas_set_power_level include/asm-ppc64/rtas.h --- 25/include/asm-ppc64/rtas.h~ppc64-rtas_set_power_level 2004-03-14 15:35:12.926973384 -0800 +++ 25-akpm/include/asm-ppc64/rtas.h 2004-03-14 15:35:12.929972928 -0800 @@ -177,6 +177,7 @@ extern void rtas_power_off(void); extern void rtas_halt(void); extern int rtas_get_sensor(int sensor, int index, int *state); extern int rtas_get_power_level(int powerdomain, int *level); +extern int rtas_set_power_level(int powerdomain, int level, int *setlevel); extern int rtas_set_indicator(int indicator, int index, int new_value); /* Given an RTAS status code of 9900..9905 compute the hinted delay */ _