return result;
 }
 
+static int __acpi_power_off(struct acpi_power_resource *resource)
+{
+       acpi_status status;
+
+       status = acpi_evaluate_object(resource->device.handle, "_OFF",
+                                     NULL, NULL);
+       if (ACPI_FAILURE(status))
+               return -ENODEV;
+
+       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Power resource [%s] turned off\n",
+                         resource->name));
+       return 0;
+}
+
 static int acpi_power_off(struct acpi_power_resource *resource)
 {
-       acpi_status status = AE_OK;
        int result = 0;
 
        mutex_lock(&resource->resource_lock);
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                                  "Power resource [%s] still in use\n",
                                  resource->name));
-               goto unlock;
+       } else {
+               result = __acpi_power_off(resource);
+               if (result)
+                       resource->ref_count++;
        }
 
-       status = acpi_evaluate_object(resource->device.handle, "_OFF", NULL, NULL);
-       if (ACPI_FAILURE(status))
-               result = -ENODEV;
-       else
-               ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-                                 "Power resource [%s] turned off\n",
-                                 resource->name));
-
  unlock:
        mutex_unlock(&resource->resource_lock);
 
                mutex_lock(&resource->resource_lock);
 
                result = acpi_power_get_state(resource->device.handle, &state);
-               if (!result && state == ACPI_POWER_RESOURCE_STATE_OFF
+               if (result)
+                       continue;
+
+               if (state == ACPI_POWER_RESOURCE_STATE_OFF
                    && resource->ref_count) {
                        dev_info(&resource->device.dev, "Turning ON\n");
                        __acpi_power_on(resource);
+               } else if (state == ACPI_POWER_RESOURCE_STATE_ON
+                   && !resource->ref_count) {
+                       dev_info(&resource->device.dev, "Turning OFF\n");
+                       __acpi_power_off(resource);
                }
 
                mutex_unlock(&resource->resource_lock);