scan.c (4e9816d012dbc28dc89559261c6ffbf8ffc440dd) | scan.c (bd9b2f9aff26c185c1f8e0cd08a850ee4ace391a) |
---|---|
1/* 2 * scan.c - support for transforming the ACPI namespace into individual objects 3 */ 4 5#include <linux/module.h> 6#include <linux/init.h> 7#include <linux/slab.h> 8#include <linux/kernel.h> --- 1407 unchanged lines hidden (view full) --- 1416 } 1417 if (sleep_state < wakeup->sleep_state) { 1418 acpi_handle_warn(handle, "Overriding _PRW sleep state " 1419 "(S%d) by S%d from power resources\n", 1420 (int)wakeup->sleep_state, sleep_state); 1421 wakeup->sleep_state = sleep_state; 1422 } 1423 } | 1/* 2 * scan.c - support for transforming the ACPI namespace into individual objects 3 */ 4 5#include <linux/module.h> 6#include <linux/init.h> 7#include <linux/slab.h> 8#include <linux/kernel.h> --- 1407 unchanged lines hidden (view full) --- 1416 } 1417 if (sleep_state < wakeup->sleep_state) { 1418 acpi_handle_warn(handle, "Overriding _PRW sleep state " 1419 "(S%d) by S%d from power resources\n", 1420 (int)wakeup->sleep_state, sleep_state); 1421 wakeup->sleep_state = sleep_state; 1422 } 1423 } |
1424 acpi_setup_gpe_for_wake(handle, wakeup->gpe_device, wakeup->gpe_number); | |
1425 1426 out: 1427 kfree(buffer.pointer); 1428 return err; 1429} 1430 | 1424 1425 out: 1426 kfree(buffer.pointer); 1427 return err; 1428} 1429 |
1431static void acpi_bus_set_run_wake_flags(struct acpi_device *device) | 1430static void acpi_wakeup_gpe_init(struct acpi_device *device) |
1432{ 1433 struct acpi_device_id button_device_ids[] = { 1434 {"PNP0C0C", 0}, 1435 {"PNP0C0D", 0}, 1436 {"PNP0C0E", 0}, 1437 {"", 0}, 1438 }; | 1431{ 1432 struct acpi_device_id button_device_ids[] = { 1433 {"PNP0C0C", 0}, 1434 {"PNP0C0D", 0}, 1435 {"PNP0C0E", 0}, 1436 {"", 0}, 1437 }; |
1438 struct acpi_device_wakeup *wakeup = &device->wakeup; |
|
1439 acpi_status status; 1440 acpi_event_status event_status; 1441 | 1439 acpi_status status; 1440 acpi_event_status event_status; 1441 |
1442 device->wakeup.flags.notifier_present = 0; | 1442 wakeup->flags.notifier_present = 0; |
1443 1444 /* Power button, Lid switch always enable wakeup */ 1445 if (!acpi_match_device_ids(device, button_device_ids)) { | 1443 1444 /* Power button, Lid switch always enable wakeup */ 1445 if (!acpi_match_device_ids(device, button_device_ids)) { |
1446 device->wakeup.flags.run_wake = 1; | 1446 wakeup->flags.run_wake = 1; |
1447 if (!acpi_match_device_ids(device, &button_device_ids[1])) { 1448 /* Do not use Lid/sleep button for S5 wakeup */ | 1447 if (!acpi_match_device_ids(device, &button_device_ids[1])) { 1448 /* Do not use Lid/sleep button for S5 wakeup */ |
1449 if (device->wakeup.sleep_state == ACPI_STATE_S5) 1450 device->wakeup.sleep_state = ACPI_STATE_S4; | 1449 if (wakeup->sleep_state == ACPI_STATE_S5) 1450 wakeup->sleep_state = ACPI_STATE_S4; |
1451 } | 1451 } |
1452 acpi_mark_gpe_for_wake(wakeup->gpe_device, wakeup->gpe_number); |
|
1452 device_set_wakeup_capable(&device->dev, true); 1453 return; 1454 } 1455 | 1453 device_set_wakeup_capable(&device->dev, true); 1454 return; 1455 } 1456 |
1456 status = acpi_get_gpe_status(device->wakeup.gpe_device, 1457 device->wakeup.gpe_number, 1458 &event_status); 1459 if (status == AE_OK) 1460 device->wakeup.flags.run_wake = 1461 !!(event_status & ACPI_EVENT_FLAG_HANDLE); | 1457 acpi_setup_gpe_for_wake(device->handle, wakeup->gpe_device, 1458 wakeup->gpe_number); 1459 status = acpi_get_gpe_status(wakeup->gpe_device, wakeup->gpe_number, 1460 &event_status); 1461 if (ACPI_FAILURE(status)) 1462 return; 1463 1464 wakeup->flags.run_wake = !!(event_status & ACPI_EVENT_FLAG_HANDLE); |
1462} 1463 1464static void acpi_bus_get_wakeup_device_flags(struct acpi_device *device) 1465{ 1466 int err; 1467 1468 /* Presence of _PRW indicates wake capable */ 1469 if (!acpi_has_method(device->handle, "_PRW")) 1470 return; 1471 1472 err = acpi_bus_extract_wakeup_device_power_package(device->handle, 1473 &device->wakeup); 1474 if (err) { 1475 dev_err(&device->dev, "_PRW evaluation error: %d\n", err); 1476 return; 1477 } 1478 1479 device->wakeup.flags.valid = 1; 1480 device->wakeup.prepare_count = 0; | 1465} 1466 1467static void acpi_bus_get_wakeup_device_flags(struct acpi_device *device) 1468{ 1469 int err; 1470 1471 /* Presence of _PRW indicates wake capable */ 1472 if (!acpi_has_method(device->handle, "_PRW")) 1473 return; 1474 1475 err = acpi_bus_extract_wakeup_device_power_package(device->handle, 1476 &device->wakeup); 1477 if (err) { 1478 dev_err(&device->dev, "_PRW evaluation error: %d\n", err); 1479 return; 1480 } 1481 1482 device->wakeup.flags.valid = 1; 1483 device->wakeup.prepare_count = 0; |
1481 acpi_bus_set_run_wake_flags(device); | 1484 acpi_wakeup_gpe_init(device); |
1482 /* Call _PSW/_DSW object to disable its ability to wake the sleeping 1483 * system for the ACPI device with the _PRW object. 1484 * The _PSW object is depreciated in ACPI 3.0 and is replaced by _DSW. 1485 * So it is necessary to call _DSW object first. Only when it is not 1486 * present will the _PSW object used. 1487 */ 1488 err = acpi_device_sleep_wake(device, 0, 0, 0); 1489 if (err) --- 844 unchanged lines hidden --- | 1485 /* Call _PSW/_DSW object to disable its ability to wake the sleeping 1486 * system for the ACPI device with the _PRW object. 1487 * The _PSW object is depreciated in ACPI 3.0 and is replaced by _DSW. 1488 * So it is necessary to call _DSW object first. Only when it is not 1489 * present will the _PSW object used. 1490 */ 1491 err = acpi_device_sleep_wake(device, 0, 0, 0); 1492 if (err) --- 844 unchanged lines hidden --- |