lkml.org 
[lkml]   [2011]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 06/14] eeepc-wmi: add an helper using simple return codes
    Date
    eeepc_wmi_get_devstate returns an acpi_status, so each
    call need extra logic to handle the return code. This
    patch add a simple getter, returning a boolean (or a
    negative error code).

    Signed-off-by: Corentin Chary <corentincj@iksaif.net>
    ---
    drivers/platform/x86/eeepc-wmi.c | 96 +++++++++++++++----------------------
    1 files changed, 39 insertions(+), 57 deletions(-)

    diff --git a/drivers/platform/x86/eeepc-wmi.c b/drivers/platform/x86/eeepc-wmi.c
    index d823458..de501fb 100644
    --- a/drivers/platform/x86/eeepc-wmi.c
    +++ b/drivers/platform/x86/eeepc-wmi.c
    @@ -257,6 +257,29 @@ static acpi_status eeepc_wmi_set_devstate(u32 dev_id, u32 ctrl_param,
    return status;
    }

    +/* Helper for special devices with magic return codes */
    +static int eeepc_wmi_get_devstate_simple(u32 dev_id)
    +{
    + u32 retval = 0;
    + acpi_status status;
    +
    + status = eeepc_wmi_get_devstate(dev_id, &retval);
    +
    + if (ACPI_FAILURE(status))
    + return -EINVAL;
    +
    + /* If the device is present, DSTS will always set some bits
    + * 0x00070000 - 1110000000000000000 - device supported
    + * 0x00060000 - 1100000000000000000 - not supported
    + * 0x00020000 - 0100000000000000000 - device supported
    + * 0x00010000 - 0010000000000000000 - not supported / special mode ?
    + */
    + if (!retval || retval == 0x00060000)
    + return -ENODEV;
    +
    + return retval & 0x1;
    +}
    +
    /*
    * LEDs
    */
    @@ -290,23 +313,7 @@ static void tpd_led_set(struct led_classdev *led_cdev,

    static int read_tpd_state(struct eeepc_wmi *eeepc)
    {
    - u32 retval;
    - acpi_status status;
    -
    - status = eeepc_wmi_get_devstate(EEEPC_WMI_DEVID_TPDLED, &retval);
    -
    - if (ACPI_FAILURE(status))
    - return -1;
    - else if (!retval || retval == 0x00060000)
    - /*
    - * if touchpad led is present, DSTS will set some bits,
    - * usually 0x00020000.
    - * 0x00060000 means that the device is not supported
    - */
    - return -ENODEV;
    - else
    - /* Status is stored in the first bit */
    - return retval & 0x1;
    + return eeepc_wmi_get_devstate_simple(EEEPC_WMI_DEVID_TPDLED);
    }

    static enum led_brightness tpd_led_get(struct led_classdev *led_cdev)
    @@ -358,15 +365,11 @@ static void eeepc_wmi_led_exit(struct eeepc_wmi *eeepc)
    */
    static bool eeepc_wlan_rfkill_blocked(struct eeepc_wmi *eeepc)
    {
    - u32 retval;
    - acpi_status status;
    -
    - status = eeepc_wmi_get_devstate(EEEPC_WMI_DEVID_WLAN, &retval);
    + int result = eeepc_wmi_get_devstate_simple(EEEPC_WMI_DEVID_WLAN);

    - if (ACPI_FAILURE(status))
    + if (result < 0)
    return false;
    -
    - return !(retval & 0x1);
    + return !result;
    }

    static void eeepc_rfkill_hotplug(struct eeepc_wmi *eeepc)
    @@ -494,19 +497,12 @@ static void eeepc_unregister_rfkill_notifier(struct eeepc_wmi *eeepc,
    static int eeepc_get_adapter_status(struct hotplug_slot *hotplug_slot,
    u8 *value)
    {
    - u32 retval;
    - acpi_status status;
    -
    - status = eeepc_wmi_get_devstate(EEEPC_WMI_DEVID_WLAN, &retval);
    -
    - if (ACPI_FAILURE(status))
    - return -EIO;
    + int result = eeepc_wmi_get_devstate_simple(EEEPC_WMI_DEVID_WLAN);

    - if (!retval || retval == 0x00060000)
    - return -ENODEV;
    - else
    - *value = (retval & 0x1);
    + if (result < 0)
    + return result;

    + *value = !!result;
    return 0;
    }

    @@ -601,15 +597,14 @@ static int eeepc_rfkill_set(void *data, bool blocked)
    static void eeepc_rfkill_query(struct rfkill *rfkill, void *data)
    {
    int dev_id = (unsigned long)data;
    - u32 retval;
    - acpi_status status;
    + int result;

    - status = eeepc_wmi_get_devstate(dev_id, &retval);
    + result = eeepc_wmi_get_devstate_simple(dev_id);

    - if (ACPI_FAILURE(status))
    + if (result < 0)
    return ;

    - rfkill_set_sw_state(rfkill, !(retval & 0x1));
    + rfkill_set_sw_state(rfkill, !result);
    }

    static int eeepc_rfkill_wlan_set(void *data, bool blocked)
    @@ -650,23 +645,10 @@ static int eeepc_new_rfkill(struct eeepc_wmi *eeepc,
    const char *name,
    enum rfkill_type type, int dev_id)
    {
    - int result;
    - u32 retval;
    - acpi_status status;
    -
    - status = eeepc_wmi_get_devstate(dev_id, &retval);
    + int result = eeepc_wmi_get_devstate_simple(dev_id);

    - if (ACPI_FAILURE(status))
    - return -1;
    -
    - /* If the device is present, DSTS will always set some bits
    - * 0x00070000 - 1110000000000000000 - device supported
    - * 0x00060000 - 1100000000000000000 - not supported
    - * 0x00020000 - 0100000000000000000 - device supported
    - * 0x00010000 - 0010000000000000000 - not supported / special mode ?
    - */
    - if (!retval || retval == 0x00060000)
    - return -ENODEV;
    + if (result < 0)
    + return result;

    if (dev_id == EEEPC_WMI_DEVID_WLAN && eeepc->hotplug_wireless)
    *rfkill = rfkill_alloc(name, &eeepc->platform_device->dev, type,
    @@ -678,7 +660,7 @@ static int eeepc_new_rfkill(struct eeepc_wmi *eeepc,
    if (!*rfkill)
    return -EINVAL;

    - rfkill_init_sw_state(*rfkill, !(retval & 0x1));
    + rfkill_init_sw_state(*rfkill, !result);
    result = rfkill_register(*rfkill);
    if (result) {
    rfkill_destroy(*rfkill);
    --
    1.7.3.4


    \
     
     \ /
      Last update: 2011-01-24 17:39    [W:0.027 / U:29.596 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site