eeepc-wmi: add an helper using simple return codes
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> Signed-off-by: Matthew Garrett <mjg@redhat.com>
This commit is contained in:
parent
7898cf1a36
commit
5c95638d11
@ -257,6 +257,29 @@ static acpi_status eeepc_wmi_set_devstate(u32 dev_id, u32 ctrl_param,
|
|||||||
return status;
|
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
|
* LEDs
|
||||||
*/
|
*/
|
||||||
@ -290,23 +313,7 @@ static void tpd_led_set(struct led_classdev *led_cdev,
|
|||||||
|
|
||||||
static int read_tpd_state(struct eeepc_wmi *eeepc)
|
static int read_tpd_state(struct eeepc_wmi *eeepc)
|
||||||
{
|
{
|
||||||
u32 retval;
|
return eeepc_wmi_get_devstate_simple(EEEPC_WMI_DEVID_TPDLED);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum led_brightness tpd_led_get(struct led_classdev *led_cdev)
|
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)
|
static bool eeepc_wlan_rfkill_blocked(struct eeepc_wmi *eeepc)
|
||||||
{
|
{
|
||||||
u32 retval;
|
int result = eeepc_wmi_get_devstate_simple(EEEPC_WMI_DEVID_WLAN);
|
||||||
acpi_status status;
|
|
||||||
|
|
||||||
status = eeepc_wmi_get_devstate(EEEPC_WMI_DEVID_WLAN, &retval);
|
if (result < 0)
|
||||||
|
|
||||||
if (ACPI_FAILURE(status))
|
|
||||||
return false;
|
return false;
|
||||||
|
return !result;
|
||||||
return !(retval & 0x1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void eeepc_rfkill_hotplug(struct eeepc_wmi *eeepc)
|
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,
|
static int eeepc_get_adapter_status(struct hotplug_slot *hotplug_slot,
|
||||||
u8 *value)
|
u8 *value)
|
||||||
{
|
{
|
||||||
u32 retval;
|
int result = eeepc_wmi_get_devstate_simple(EEEPC_WMI_DEVID_WLAN);
|
||||||
acpi_status status;
|
|
||||||
|
|
||||||
status = eeepc_wmi_get_devstate(EEEPC_WMI_DEVID_WLAN, &retval);
|
if (result < 0)
|
||||||
|
return result;
|
||||||
if (ACPI_FAILURE(status))
|
|
||||||
return -EIO;
|
|
||||||
|
|
||||||
if (!retval || retval == 0x00060000)
|
|
||||||
return -ENODEV;
|
|
||||||
else
|
|
||||||
*value = (retval & 0x1);
|
|
||||||
|
|
||||||
|
*value = !!result;
|
||||||
return 0;
|
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)
|
static void eeepc_rfkill_query(struct rfkill *rfkill, void *data)
|
||||||
{
|
{
|
||||||
int dev_id = (unsigned long)data;
|
int dev_id = (unsigned long)data;
|
||||||
u32 retval;
|
int result;
|
||||||
acpi_status status;
|
|
||||||
|
|
||||||
status = eeepc_wmi_get_devstate(dev_id, &retval);
|
result = eeepc_wmi_get_devstate_simple(dev_id);
|
||||||
|
|
||||||
if (ACPI_FAILURE(status))
|
if (result < 0)
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
rfkill_set_sw_state(rfkill, !(retval & 0x1));
|
rfkill_set_sw_state(rfkill, !result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int eeepc_rfkill_wlan_set(void *data, bool blocked)
|
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,
|
const char *name,
|
||||||
enum rfkill_type type, int dev_id)
|
enum rfkill_type type, int dev_id)
|
||||||
{
|
{
|
||||||
int result;
|
int result = eeepc_wmi_get_devstate_simple(dev_id);
|
||||||
u32 retval;
|
|
||||||
acpi_status status;
|
|
||||||
|
|
||||||
status = eeepc_wmi_get_devstate(dev_id, &retval);
|
if (result < 0)
|
||||||
|
return result;
|
||||||
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 (dev_id == EEEPC_WMI_DEVID_WLAN && eeepc->hotplug_wireless)
|
if (dev_id == EEEPC_WMI_DEVID_WLAN && eeepc->hotplug_wireless)
|
||||||
*rfkill = rfkill_alloc(name, &eeepc->platform_device->dev, type,
|
*rfkill = rfkill_alloc(name, &eeepc->platform_device->dev, type,
|
||||||
@ -678,7 +660,7 @@ static int eeepc_new_rfkill(struct eeepc_wmi *eeepc,
|
|||||||
if (!*rfkill)
|
if (!*rfkill)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
rfkill_init_sw_state(*rfkill, !(retval & 0x1));
|
rfkill_init_sw_state(*rfkill, !result);
|
||||||
result = rfkill_register(*rfkill);
|
result = rfkill_register(*rfkill);
|
||||||
if (result) {
|
if (result) {
|
||||||
rfkill_destroy(*rfkill);
|
rfkill_destroy(*rfkill);
|
||||||
|
Loading…
Reference in New Issue
Block a user