On Mon, Oct 11, 2010 at 3:48 AM,  <ch...@cnpbagwell.com> wrote:
> From: Chris Bagwell <ch...@cnpbagwell.com>
>
> eeepc-laptop provides a sysfs interface to read and control what it
> calls cpufv.  When WMI is enabled, the ACPI interface changes slightly
> and becames a write-only control with only 3 valid values.
>
> Write-only is OK because same DSDT's will ignore duplicate values
> and even invalid values will be treated same as "0" value.
>
> Expose cpufv again to allow for user space utils that can extended battery
> life noticably and come a little closer to parity with eeepc-laptop.
>
> This was tested with EEE PC 1005PE by monitoring powertop output while
> writing values of "0", "1", and "2" and by reviewing the decompiled DSDT of
> an 1201NL and comparing it to 1005PE's DSDT.
>
> Signed-off-by: Chris Bagwell <ch...@cnpbagwell.com>
> ---
>  drivers/platform/x86/eeepc-wmi.c |   51 
> ++++++++++++++++++++++++++++++++++++++
>  1 files changed, 51 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/platform/x86/eeepc-wmi.c 
> b/drivers/platform/x86/eeepc-wmi.c
> index 441b000..988b16c 100644
> --- a/drivers/platform/x86/eeepc-wmi.c
> +++ b/drivers/platform/x86/eeepc-wmi.c
> @@ -57,6 +57,7 @@ MODULE_ALIAS("wmi:"EEEPC_WMI_MGMT_GUID);
>
>  #define EEEPC_WMI_METHODID_DEVS        0x53564544
>  #define EEEPC_WMI_METHODID_DSTS        0x53544344
> +#define EEEPC_WMI_METHODID_CFVS        0x53564643
>
>  #define EEEPC_WMI_DEVID_BACKLIGHT      0x00050012
>
> @@ -307,6 +308,49 @@ static void eeepc_wmi_notify(u32 value, void *context)
>        kfree(obj);
>  }
>
> +static int 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(EEEPC_WMI_MGMT_GUID,
> +                                    1, EEEPC_WMI_METHODID_CFVS, &input, 
> NULL);
> +
> +       if (ACPI_FAILURE(status))
> +               return -EIO;
> +       else
> +               return count;
> +}
> +
> +static DEVICE_ATTR(cpufv, S_IRUGO | S_IWUSR, NULL, store_cpufv);
> +
> +static void eeepc_wmi_sysfs_exit(struct platform_device *device)
> +{
> +       device_remove_file(&device->dev, &dev_attr_cpufv);
> +}
> +
> +static int eeepc_wmi_sysfs_init(struct platform_device *device)
> +{
> +       int retval = -ENOMEM;
> +
> +       retval = device_create_file(&device->dev, &dev_attr_cpufv);
> +       if (retval)
> +               goto error_sysfs;
> +
> +       return 0;
> +
> +error_sysfs:
> +       eeepc_wmi_sysfs_exit(platform_device);
> +       return retval;
> +}
> +
>  static int __devinit eeepc_wmi_platform_probe(struct platform_device *device)
>  {
>        struct eeepc_wmi *eeepc;
> @@ -402,8 +446,14 @@ static int __init eeepc_wmi_init(void)
>                goto del_dev;
>        }
>
> +       err = eeepc_wmi_sysfs_init(platform_device);
> +       if (err)
> +               goto del_sysfs;
> +
>        return 0;
>
> +del_sysfs:
> +       eeepc_wmi_sysfs_exit(platform_device);
>  del_dev:
>        platform_device_del(platform_device);
>  put_dev:
> @@ -418,6 +468,7 @@ static void __exit eeepc_wmi_exit(void)
>  {
>        struct eeepc_wmi *eeepc;
>
> +       eeepc_wmi_sysfs_exit(platform_device);
>        eeepc = platform_get_drvdata(platform_device);
>        platform_driver_unregister(&platform_driver);
>        platform_device_unregister(platform_device);
> --
> 1.7.3.1
>

Seems ok, too bad they don't provide a way to guess the current
configuration and the number of available settings. Especially when
all they do is calling the old device.

-- 
Corentin Chary
http://xf.iksaif.net
--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" 
in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to