diff options
Diffstat (limited to 'drivers/acpi/power.c')
-rw-r--r-- | drivers/acpi/power.c | 42 |
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." | ||
62 | int acpi_power_nocheck; | ||
63 | module_param_named(power_nocheck, acpi_power_nocheck, bool, 000); | ||
64 | |||
57 | static int acpi_power_add(struct acpi_device *device); | 65 | static int acpi_power_add(struct acpi_device *device); |
58 | static int acpi_power_remove(struct acpi_device *device, int type); | 66 | static int acpi_power_remove(struct acpi_device *device, int type); |
59 | static int acpi_power_resume(struct acpi_device *device); | 67 | static 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; |