On Tue, Oct 12, 2010 at 1:47 AM, <[email protected]> wrote: > From: Chris Bagwell <[email protected]> > > 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 3 valid values. > > 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. > > Write-only is OK for most user space apps because read status was > mostly used to prevent unneeded mode changes. Since this same check > to ignore changes to same mode also exists in the DSDT then it was > wasted ACPI call. > > acpi_osi="!Windows 2009" can be used for get back eeepc-laptop's > read support of cpufv for debugging things such as behaviour > during resume. > > This patch 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 <[email protected]> > --- > 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 21df266..462ceab 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 > > @@ -297,6 +298,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; > @@ -392,8 +436,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: > @@ -408,6 +458,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. Matthew, could you add that one for inclusion in 2.6.37 ? Chris, could you document cpufv in Documentation/ABI/testing/sysfs-platform-eeepc-wmi (see eeepc-laptop example) ? I don't think the lacking documentation should delay this patch because: - most of platform-x86 are not documented at all - the merge window is open, and we should'nt miss that. Thanks, -- 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 [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
