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 ---