aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/power.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2010-11-24 18:02:36 -0500
committerLen Brown <len.brown@intel.com>2010-12-01 16:53:16 -0500
commit212967c69afd348342548272aedbe4d46a9325d6 (patch)
tree1b953dd0f8c9424a82aaeb7e383dd971746c0f7d /drivers/acpi/power.c
parente8a7e48bb248a1196484d3f8afa53bded2b24e71 (diff)
ACPI / PM: Check device state before refcounting power resources
Commit 3e384ee6c687cb397581ee8f9440fc8220cfac80 (ACPI / PM: Fix reference counting of power resources) introduced a regression by causing fan power resources to be turned on and reference counted unnecessarily during resume, so on some boxes fans are always on after resume. Fix the problem by checking if the current device state is different from the new state before reference counting and turning on power resources in acpi_power_transition(). Addresses https://bugzilla.kernel.org/show_bug.cgi?id=22932 . Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Reported-and-tested-by: Maciej Rutecki <maciej.rutecki@gmail.com> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/power.c')
-rw-r--r--drivers/acpi/power.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c
index 67dedeed144c..792a8309d074 100644
--- a/drivers/acpi/power.c
+++ b/drivers/acpi/power.c
@@ -465,10 +465,12 @@ int acpi_power_transition(struct acpi_device *device, int state)
465 struct acpi_handle_list *tl = NULL; /* Target Resources */ 465 struct acpi_handle_list *tl = NULL; /* Target Resources */
466 int i = 0; 466 int i = 0;
467 467
468
469 if (!device || (state < ACPI_STATE_D0) || (state > ACPI_STATE_D3)) 468 if (!device || (state < ACPI_STATE_D0) || (state > ACPI_STATE_D3))
470 return -EINVAL; 469 return -EINVAL;
471 470
471 if (device->power.state == state)
472 return 0;
473
472 if ((device->power.state < ACPI_STATE_D0) 474 if ((device->power.state < ACPI_STATE_D0)
473 || (device->power.state > ACPI_STATE_D3)) 475 || (device->power.state > ACPI_STATE_D3))
474 return -ENODEV; 476 return -ENODEV;
@@ -488,10 +490,6 @@ int acpi_power_transition(struct acpi_device *device, int state)
488 goto end; 490 goto end;
489 } 491 }
490 492
491 if (device->power.state == state) {
492 goto end;
493 }
494
495 /* 493 /*
496 * Then we dereference all power resources used in the current list. 494 * Then we dereference all power resources used in the current list.
497 */ 495 */