[lkml]   [2009]   [Apr]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    SubjectRe: [PATCH] PNPACPI: Enable PNPACPI _PSx Support, v3
    From 6328a57401dc5f5cf9931738eb7268fcd8058c49 Mon Sep 17 00:00:00 2001
    From: Witold Szczeponik <>
    Date: Mon, 30 Mar 2009 19:31:06 +0200
    Subject: [PATCH] Enable PNPACPI _PSx Support, v3
    X-Patchwork-Hint: ignore

    (This is an update to the patch presented earlier in, with new error handling.)

    This patch sets the power of PnP ACPI devices to D0 when they
    are activated and to D3 when they are disabled. The latter is
    in correspondence with the ACPI 3.0 specification, whereas the
    former is added in order to be able to power up a device after
    it has been previously disabled (or when booting up a system).
    (As a consequence, the patch makes the PnP ACPI code more ACPI

    Section 6.2.2 of the ACPI Specification (at least versions 1.0b
    and 3.0a) states: "Prior to running this control method [_DIS],
    the OS[PM] will have already put the device in the D3 state."
    Unfortunately, there is no clear statement as to when to put
    a device in the D0 state. :-( Therefore, the patch executes the
    method calls as _PS3/_DIS and _SRS/_PS0. What is clear: "If the
    device is disabled, _SRS enables the device at the specified
    resources." (From the ACPI 3.0a Specification.)

    The patch fixes a problem with some IBM ThinkPads (at least the
    600E and the 600X) where the serial ports have a dedicated
    power source that needs to be brought up before the serial port
    can be used. Without this patch, the serial port is enabled
    but has no power. (In the past, the tpctl utility had to be
    utilized to turn on the power, but support for this feature
    stopped with version 5.9 as it did not support the more recent
    kernel versions.)

    The error handlers that handle any errors that can occur during
    the power up/power down phases return the error codes to the
    caller directly. Comments welcome! :-)

    No regressions were observed on hardware that does not require
    this patch.

    The patch is applied against 2.6.27.x.

    Signed-off-by: Witold Szczeponik <>
    Acked-by: Zhao Yakui <>
    Signed-off-by: Len Brown <>

    (not immediately clear what tree the orginal patch
    was based on top of, but here is what I checked-in
    on top of 2.6.29 -Len)

    drivers/pnp/pnpacpi/core.c | 23 ++++++++++++++++-------
    1 files changed, 16 insertions(+), 7 deletions(-)

    diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c
    index 2834846..9a3a682 100644
    --- a/drivers/pnp/pnpacpi/core.c
    +++ b/drivers/pnp/pnpacpi/core.c
    @@ -83,7 +83,6 @@ static int pnpacpi_set_resources(struct pnp_dev *dev)
    acpi_handle handle = dev->data;
    struct acpi_buffer buffer;
    int ret;
    - acpi_status status;

    pnp_dbg(&dev->dev, "set resources\n");
    ret = pnpacpi_build_resource_template(dev, &buffer);
    @@ -94,21 +93,31 @@ static int pnpacpi_set_resources(struct pnp_dev *dev)
    return ret;
    - status = acpi_set_current_resources(handle, &buffer);
    - if (ACPI_FAILURE(status))
    + if (ACPI_FAILURE(acpi_set_current_resources(handle, &buffer)))
    ret = -EINVAL;
    + else if (acpi_bus_power_manageable(handle))
    + ret = acpi_bus_set_power(handle, ACPI_STATE_D0);
    return ret;

    static int pnpacpi_disable_resources(struct pnp_dev *dev)
    - acpi_status status;
    + acpi_handle handle = dev->data;
    + int ret;
    + dev_dbg(&dev->dev, "disable resources\n");

    /* acpi_unregister_gsi(pnp_irq(dev, 0)); */
    - status = acpi_evaluate_object((acpi_handle) dev->data,
    - "_DIS", NULL, NULL);
    - return ACPI_FAILURE(status) ? -ENODEV : 0;
    + ret = 0;
    + if (acpi_bus_power_manageable(handle)) {
    + ret = acpi_bus_set_power(handle, ACPI_STATE_D3);
    + if (ret)
    + return ret;
    + }
    + if (ACPI_FAILURE(acpi_evaluate_object(handle, "_DIS", NULL, NULL)))
    + ret = -ENODEV;
    + return ret;


     \ /
      Last update: 2009-04-04 03:51    [W:0.030 / U:8.476 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site