Make the current "state" in struct acpi_processor_power a pointer. If it
doesn't exist, simply use C1 type sleep...

Signed-off-by: Dominik Brodowski
---

 drivers/acpi/processor_idle.c |   50 ++++++++++++++++++++++++++----------------
 include/acpi/processor.h      |    2 -
 2 files changed, 33 insertions(+), 19 deletions(-)

Index: linux-2.6.10-rc3+bk-acpi/drivers/acpi/processor_idle.c
===================================================================
--- linux-2.6.10-rc3+bk-acpi.orig/drivers/acpi/processor_idle.c	2004-12-14 10:04:19.000000000 +0100
+++ linux-2.6.10-rc3+bk-acpi/drivers/acpi/processor_idle.c	2004-12-14 13:09:31.715371472 +0100
@@ -104,19 +104,22 @@
 	if (!pr)
 		return;
 
-	old = &pr->power.states[pr->power.state];
+	old = pr->power.state;
 	new = &pr->power.states[state];
 
- 	old->promotion.count = 0;
+	if (old)
+		old->promotion.count = 0;
  	new->demotion.count = 0;
 
 	/* Cleanup from old state. */
-	switch (old->type) {
-	case ACPI_STATE_C3:
-		/* Disable bus master reload */
-		if (new->type != ACPI_STATE_C3)
-			acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0, ACPI_MTX_DO_NOT_LOCK);
-		break;
+	if (old) {
+		switch (old->type) {
+		case ACPI_STATE_C3:
+			/* Disable bus master reload */
+			if (new->type != ACPI_STATE_C3)
+				acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0, ACPI_MTX_DO_NOT_LOCK);
+			break;
+		}
 	}
 
 	/* Prepare to use new state. */
@@ -128,7 +131,7 @@
 		break;
 	}
 
-	pr->power.state = state;
+	pr->power.state = new;
 
 	return;
 }
@@ -161,7 +164,9 @@
 		return;
 	}
 
-	cx = &(pr->power.states[pr->power.state]);
+	cx = pr->power.state;
+	if (!cx)
+		goto easy_out;
 
 	/*
 	 * Check BM Activity
@@ -276,7 +281,7 @@
 		return;
 	}
 
-	next_state = pr->power.state;
+	next_state = pr->power.state - pr->power.states;
 
 	/*
 	 * Promotion?
@@ -326,8 +331,9 @@
 	/*
 	 * Demote if current state exceeds max_cstate
 	 */
-	if (pr->power.state > max_cstate) {
-		next_state = max_cstate;
+	if (pr->power.state->type > max_cstate) {
+		if (cx->demotion.state)
+			next_state = cx->demotion.state;
 	}
 
 	/*
@@ -336,10 +342,18 @@
 	 * If we're going to start using a new Cx state we must clean up
 	 * from the previous and prepare to use the new.
 	 */
-	if (next_state != pr->power.state)
+	if (&pr->power.states[next_state] != pr->power.state)
 		acpi_processor_power_activate(pr, next_state);
 
 	return;
+
+ easy_out:
+	/* do C1 instead of busy loop */
+	if (pm_idle_save)
+		pm_idle_save();
+	else
+		safe_halt();
+	return;
 }
 
 
@@ -365,7 +379,7 @@
 	 * C0/C1
 	 * -----
 	 */
-	pr->power.state = ACPI_STATE_C1;
+	pr->power.state = &pr->power.states[ACPI_STATE_C1];
 
 	/*
 	 * C1/C2
@@ -636,9 +650,9 @@
 		goto end;
 
 	seq_printf(seq, "active state:            %d\n"
-			"max_cstate:              %d\n"
+			"max_cstate:              C%d\n"
 			"bus master activity:     %08x\n",
-			pr->power.state,
+			pr->power.state ? pr->power.state - pr->power.states : 0,
 			max_cstate,
 			pr->power.bm_activity);
 
@@ -646,7 +660,7 @@
 
 	for (i = 1; i < ACPI_C_STATE_COUNT; i++) {
 		seq_printf(seq, "   %c%d:                  ",
-			(i == pr->power.state?'*':' '), i);
+			(&pr->power.states[i] == pr->power.state?'*':' '), i);
 
 		if (!pr->power.states[i].valid) {
 			seq_puts(seq, "<not supported>\n");
Index: linux-2.6.10-rc3+bk-acpi/include/acpi/processor.h
===================================================================
--- linux-2.6.10-rc3+bk-acpi.orig/include/acpi/processor.h	2004-12-14 10:02:15.000000000 +0100
+++ linux-2.6.10-rc3+bk-acpi/include/acpi/processor.h	2004-12-14 13:08:31.085203092 +0100
@@ -40,7 +40,7 @@
 };
 
 struct acpi_processor_power {
-	u32			state;
+	struct acpi_processor_cx *state;
 	u32			default_state;
 	u32			bm_activity;
 	struct acpi_processor_cx states[ACPI_PROCESSOR_MAX_POWER];