aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/power.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/power.c')
-rw-r--r--drivers/acpi/power.c42
1 files changed, 31 insertions, 11 deletions
diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c
index e7bab75075a9..7ff7349c0c52 100644
--- a/drivers/acpi/power.c
+++ b/drivers/acpi/power.c
@@ -54,6 +54,14 @@ ACPI_MODULE_NAME("power");
54#define ACPI_POWER_RESOURCE_STATE_OFF 0x00 54#define ACPI_POWER_RESOURCE_STATE_OFF 0x00
55#define ACPI_POWER_RESOURCE_STATE_ON 0x01 55#define ACPI_POWER_RESOURCE_STATE_ON 0x01
56#define ACPI_POWER_RESOURCE_STATE_UNKNOWN 0xFF 56#define ACPI_POWER_RESOURCE_STATE_UNKNOWN 0xFF
57
58#ifdef MODULE_PARAM_PREFIX
59#undef MODULE_PARAM_PREFIX
60#endif
61#define MODULE_PARAM_PREFIX "acpi."
62int acpi_power_nocheck;
63module_param_named(power_nocheck, acpi_power_nocheck, bool, 000);
64
57static int acpi_power_add(struct acpi_device *device); 65static int acpi_power_add(struct acpi_device *device);
58static int acpi_power_remove(struct acpi_device *device, int type); 66static int acpi_power_remove(struct acpi_device *device, int type);
59static int acpi_power_resume(struct acpi_device *device); 67static int acpi_power_resume(struct acpi_device *device);
@@ -228,12 +236,18 @@ static int acpi_power_on(acpi_handle handle, struct acpi_device *dev)
228 if (ACPI_FAILURE(status)) 236 if (ACPI_FAILURE(status))
229 return -ENODEV; 237 return -ENODEV;
230 238
231 result = acpi_power_get_state(resource->device->handle, &state); 239 if (!acpi_power_nocheck) {
232 if (result) 240 /*
233 return result; 241 * If acpi_power_nocheck is set, it is unnecessary to check
234 if (state != ACPI_POWER_RESOURCE_STATE_ON) 242 * the power state after power transition.
235 return -ENOEXEC; 243 */
236 244 result = acpi_power_get_state(resource->device->handle,
245 &state);
246 if (result)
247 return result;
248 if (state != ACPI_POWER_RESOURCE_STATE_ON)
249 return -ENOEXEC;
250 }
237 /* Update the power resource's _device_ power state */ 251 /* Update the power resource's _device_ power state */
238 resource->device->power.state = ACPI_STATE_D0; 252 resource->device->power.state = ACPI_STATE_D0;
239 253
@@ -279,11 +293,17 @@ static int acpi_power_off_device(acpi_handle handle, struct acpi_device *dev)
279 if (ACPI_FAILURE(status)) 293 if (ACPI_FAILURE(status))
280 return -ENODEV; 294 return -ENODEV;
281 295
282 result = acpi_power_get_state(handle, &state); 296 if (!acpi_power_nocheck) {
283 if (result) 297 /*
284 return result; 298 * If acpi_power_nocheck is set, it is unnecessary to check
285 if (state != ACPI_POWER_RESOURCE_STATE_OFF) 299 * the power state after power transition.
286 return -ENOEXEC; 300 */
301 result = acpi_power_get_state(handle, &state);
302 if (result)
303 return result;
304 if (state != ACPI_POWER_RESOURCE_STATE_OFF)
305 return -ENOEXEC;
306 }
287 307
288 /* Update the power resource's _device_ power state */ 308 /* Update the power resource's _device_ power state */
289 resource->device->power.state = ACPI_STATE_D3; 309 resource->device->power.state = ACPI_STATE_D3;