From: Rafael J. Wysocki Date: Wed, 24 Nov 2010 23:02:36 +0000 (+0100) Subject: ACPI / PM: Check device state before refcounting power resources X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=212967c69afd348342548272aedbe4d46a9325d6;p=linux-beck.git 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 Reported-and-tested-by: Maciej Rutecki Signed-off-by: Len Brown --- 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) struct acpi_handle_list *tl = NULL; /* Target Resources */ int i = 0; - if (!device || (state < ACPI_STATE_D0) || (state > ACPI_STATE_D3)) return -EINVAL; + if (device->power.state == state) + return 0; + if ((device->power.state < ACPI_STATE_D0) || (device->power.state > ACPI_STATE_D3)) return -ENODEV; @@ -488,10 +490,6 @@ int acpi_power_transition(struct acpi_device *device, int state) goto end; } - if (device->power.state == state) { - goto end; - } - /* * Then we dereference all power resources used in the current list. */