Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 243105
b: refs/heads/master
c: d33da3b
h: refs/heads/master
i:
  243103: df5dfdf
v: v3
  • Loading branch information
Corentin Chary authored and Matthew Garrett committed Mar 28, 2011
1 parent 651a362 commit 50431ac
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 98 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a75fe0d78ec00d3d5b2c42b1ee76b22e99f213d1
refs/heads/master: d33da3b6866975b17fbec67540f6153f5dcdcec7
162 changes: 65 additions & 97 deletions trunk/drivers/platform/x86/asus-wmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ MODULE_LICENSE("GPL");
#define ASUS_WMI_METHODID_DEVS 0x53564544
#define ASUS_WMI_METHODID_CFVS 0x53564643

#define ASUS_WMI_UNSUPPORTED_METHOD 0xFFFFFFFE

/* Wireless */
#define ASUS_WMI_DEVID_WLAN 0x00010011
#define ASUS_WMI_DEVID_BLUETOOTH 0x00010013
Expand Down Expand Up @@ -98,9 +100,9 @@ MODULE_LICENSE("GPL");
#define ASUS_WMI_DSTS_MAX_BRIGTH_MASK 0x0000FF00

struct bios_args {
u32 dev_id;
u32 ctrl_param;
};
u32 arg0;
u32 arg1;
} __packed;

/*
* <platform>/ - debugfs root directory
Expand Down Expand Up @@ -187,20 +189,24 @@ static void asus_wmi_input_exit(struct asus_wmi *asus)
asus->inputdev = NULL;
}

static acpi_status asus_wmi_get_devstate(u32 dev_id, u32 *retval)
static int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1,
u32 *retval)
{
struct acpi_buffer input = { (acpi_size) sizeof(u32), &dev_id };
struct bios_args args = {
.arg0 = arg0,
.arg1 = arg1,
};
struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
union acpi_object *obj;
acpi_status status;
union acpi_object *obj;
u32 tmp;

status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID,
1, ASUS_WMI_METHODID_DSTS,
status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 1, method_id,
&input, &output);

if (ACPI_FAILURE(status))
return status;
goto exit;

obj = (union acpi_object *)output.pointer;
if (obj && obj->type == ACPI_TYPE_INTEGER)
Expand All @@ -213,60 +219,39 @@ static acpi_status asus_wmi_get_devstate(u32 dev_id, u32 *retval)

kfree(obj);

return status;
exit:
if (ACPI_FAILURE(status))
return -EIO;

if (tmp == ASUS_WMI_UNSUPPORTED_METHOD)
return -ENODEV;

return 0;
}

static acpi_status asus_wmi_set_devstate(u32 dev_id, u32 ctrl_param,
u32 *retval)
static int asus_wmi_get_devstate(u32 dev_id, u32 *retval)
{
struct bios_args args = {
.dev_id = dev_id,
.ctrl_param = ctrl_param,
};
struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
acpi_status status;

if (!retval) {
status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 1,
ASUS_WMI_METHODID_DEVS,
&input, NULL);
} else {
struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
union acpi_object *obj;
u32 tmp;

status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 1,
ASUS_WMI_METHODID_DEVS,
&input, &output);

if (ACPI_FAILURE(status))
return status;

obj = (union acpi_object *)output.pointer;
if (obj && obj->type == ACPI_TYPE_INTEGER)
tmp = (u32) obj->integer.value;
else
tmp = 0;

*retval = tmp;

kfree(obj);
}
return asus_wmi_evaluate_method(ASUS_WMI_METHODID_DSTS, dev_id,
0, retval);
}

return status;
static int asus_wmi_set_devstate(u32 dev_id, u32 ctrl_param,
u32 *retval)
{
return asus_wmi_evaluate_method(ASUS_WMI_METHODID_DEVS, dev_id,
ctrl_param, retval);
}

/* Helper for special devices with magic return codes */
static int asus_wmi_get_devstate_bits(u32 dev_id, u32 mask)
{
u32 retval = 0;
acpi_status status;
int err;

status = asus_wmi_get_devstate(dev_id, &retval);
err = asus_wmi_get_devstate(dev_id, &retval);

if (ACPI_FAILURE(status))
return -EINVAL;
if (err < 0)
return err;

if (!(retval & ASUS_WMI_DSTS_PRESENCE_BIT))
return -ENODEV;
Expand Down Expand Up @@ -584,14 +569,8 @@ static int asus_rfkill_set(void *data, bool blocked)
{
struct asus_rfkill *priv = data;
u32 ctrl_param = !blocked;
acpi_status status;

status = asus_wmi_set_devstate(priv->dev_id, ctrl_param, NULL);

if (ACPI_FAILURE(status))
return -EIO;

return 0;
return asus_wmi_set_devstate(priv->dev_id, ctrl_param, NULL);
}

static void asus_rfkill_query(struct rfkill *rfkill, void *data)
Expand Down Expand Up @@ -784,38 +763,34 @@ static int read_backlight_power(void)
static int read_brightness(struct backlight_device *bd)
{
u32 retval;
acpi_status status;
int err;

status = asus_wmi_get_devstate(ASUS_WMI_DEVID_BRIGHTNESS, &retval);
err = asus_wmi_get_devstate(ASUS_WMI_DEVID_BRIGHTNESS, &retval);

if (ACPI_FAILURE(status))
return -EIO;
else
return retval & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
if (err < 0)
return err;

return retval & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
}

static int update_bl_status(struct backlight_device *bd)
{
u32 ctrl_param;
acpi_status status;
int power;
int power, err;

ctrl_param = bd->props.brightness;

status = asus_wmi_set_devstate(ASUS_WMI_DEVID_BRIGHTNESS,
ctrl_param, NULL);
err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BRIGHTNESS,
ctrl_param, NULL);

if (ACPI_FAILURE(status))
return -EIO;
if (err < 0)
return err;

power = read_backlight_power();
if (power != -ENODEV && bd->props.power != power) {
ctrl_param = !!(bd->props.power == FB_BLANK_UNBLANK);
status = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT,
ctrl_param, NULL);

if (ACPI_FAILURE(status))
return -EIO;
err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT,
ctrl_param, NULL);
}
return 0;
}
Expand Down Expand Up @@ -948,19 +923,19 @@ static int parse_arg(const char *buf, unsigned long count, int *val)

static ssize_t store_sys_wmi(int devid, const char *buf, size_t count)
{
acpi_status status;
u32 retval;
int rv, value;
int rv, err, value;

value = asus_wmi_get_devstate_simple(devid);
if (value == -ENODEV) /* Check device presence */
return value;

rv = parse_arg(buf, count, &value);
status = asus_wmi_set_devstate(devid, value, &retval);
err = asus_wmi_set_devstate(devid, value, &retval);

if (err < 0)
return err;

if (ACPI_FAILURE(status))
return -EIO;
return rv;
}

Expand Down Expand Up @@ -1003,21 +978,13 @@ static ssize_t store_cpufv(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{
int value;
struct acpi_buffer input = { (acpi_size) sizeof(value), &value };
acpi_status status;

if (!count || sscanf(buf, "%i", &value) != 1)
return -EINVAL;
if (value < 0 || value > 2)
return -EINVAL;

status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID,
1, ASUS_WMI_METHODID_CFVS, &input, NULL);

if (ACPI_FAILURE(status))
return -EIO;
else
return count;
return asus_wmi_evaluate_method(ASUS_WMI_METHODID_CFVS, value, 0, NULL);
}

static DEVICE_ATTR(cpufv, S_IRUGO | S_IWUSR, NULL, store_cpufv);
Expand Down Expand Up @@ -1089,13 +1056,13 @@ struct asus_wmi_debugfs_node {
static int show_dsts(struct seq_file *m, void *data)
{
struct asus_wmi *asus = m->private;
acpi_status status;
int err;
u32 retval = -1;

status = asus_wmi_get_devstate(asus->debug.dev_id, &retval);
err = asus_wmi_get_devstate(asus->debug.dev_id, &retval);

if (ACPI_FAILURE(status))
return -EIO;
if (err < 0)
return err;

seq_printf(m, "DSTS(%x) = %x\n", asus->debug.dev_id, retval);

Expand All @@ -1105,13 +1072,14 @@ static int show_dsts(struct seq_file *m, void *data)
static int show_devs(struct seq_file *m, void *data)
{
struct asus_wmi *asus = m->private;
acpi_status status;
int err;
u32 retval = -1;

status = asus_wmi_set_devstate(asus->debug.dev_id,
asus->debug.ctrl_param, &retval);
if (ACPI_FAILURE(status))
return -EIO;
err = asus_wmi_set_devstate(asus->debug.dev_id, asus->debug.ctrl_param,
&retval);

if (err < 0)
return err;

seq_printf(m, "DEVS(%x, %x) = %x\n", asus->debug.dev_id,
asus->debug.ctrl_param, retval);
Expand Down

0 comments on commit 50431ac

Please sign in to comment.