
From: John Rose <johnrose@austin.ibm.com>

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 */

_
