Create the following nodes in sysfs /sys/devices/platform/ideapad/brightness /sys/devices/platform/ideapad/touchpad /sys/devices/platform/ideapad/cfg /sys/devices/platform/ideapad/backlight Signed-off-by: Ike Panhc <ike.pan@xxxxxxxxxxxxx> --- .../ABI/testing/sysfs-platform-ideapad-laptop | 30 +++++ drivers/platform/x86/ideapad-laptop.c | 128 +++++++++++++++++--- 2 files changed, 140 insertions(+), 18 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-platform-ideapad-laptop b/Documentation/ABI/testing/sysfs-platform-ideapad-laptop index 807fca2..869f0c4 100644 --- a/Documentation/ABI/testing/sysfs-platform-ideapad-laptop +++ b/Documentation/ABI/testing/sysfs-platform-ideapad-laptop @@ -4,3 +4,33 @@ KernelVersion: 2.6.37 Contact: "Ike Panhc <ike.pan@xxxxxxxxxxxxx>" Description: Control the power of camera module. 1 means on, 0 means off. + +What: /sys/devices/platform/ideapad/brightness +Date: Jun 2011 +KernelVersion: 3.0.1 +Contact: "Ike Panhc <ike.pan@xxxxxxxxxxxxx>" +Description: + Brightness control. When reading, it shows <current>/<max>. + When writing, it accepts new brightness value. + +What: /sys/devices/platform/ideapad/touchpad +Date: Jun 2011 +KernelVersion: 3.0.1 +Contact: "Ike Panhc <ike.pan@xxxxxxxxxxxxx>" +Description: + Control the power of touchpad. 1 means on, 0 means off. + +What: /sys/devices/platform/ideapad/cfg +Date: Jun 2011 +KernelVersion: 3.0.1 +Contact: "Ike Panhc <ike.pan@xxxxxxxxxxxxx>" +Description: + Ideapad capability bits. + +What: /sys/devices/platform/ideapad/backlight +Date: Jun 2011 +KernelVersion: 3.0.1 +Contact: "Ike Panhc <ike.pan@xxxxxxxxxxxxx>" +Description: + Control the power of backlight. 1 means on, 0 means off. + diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c index a5c0efa..9c09891 100644 --- a/drivers/platform/x86/ideapad-laptop.c +++ b/drivers/platform/x86/ideapad-laptop.c @@ -160,22 +160,25 @@ static int write_ec_cmd(acpi_handle handle, int cmd, unsigned long data) } /* - * camera power + * sysfs helper */ -static ssize_t show_ideapad_cam(struct device *dev, - struct device_attribute *attr, - char *buf) +static ssize_t show_ideapad_helper(struct device *dev, + struct device_attribute *attr, + char *buf, + int cmd) { unsigned long result; - if (read_ec_data(ideapad_handle, 0x1D, &result)) + if (read_ec_data(ideapad_handle, cmd, &result)) return sprintf(buf, "-1\n"); return sprintf(buf, "%lu\n", result); } -static ssize_t store_ideapad_cam(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) +static ssize_t store_ideapad_helper(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count, + int cmd) { int ret, state; @@ -183,14 +186,112 @@ static ssize_t store_ideapad_cam(struct device *dev, return 0; if (sscanf(buf, "%i", &state) != 1) return -EINVAL; - ret = write_ec_cmd(ideapad_handle, 0x1E, state); + ret = write_ec_cmd(ideapad_handle, cmd, state); if (ret < 0) return ret; return count; } +/* + * sysfs node + */ +static ssize_t show_ideapad_cam(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + return show_ideapad_helper(dev, attr, buf, 0x1D); +} + +static ssize_t store_ideapad_cam(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + return store_ideapad_helper(dev, attr, buf, count, 0x1E); +} + static DEVICE_ATTR(camera_power, 0644, show_ideapad_cam, store_ideapad_cam); +static ssize_t show_ideapad_touchpad(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + return show_ideapad_helper(dev, attr, buf, 0x1B); +} + +static ssize_t store_ideapad_touchpad(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + return store_ideapad_helper(dev, attr, buf, count, 0x1C); +} + +static DEVICE_ATTR(touchpad, 0644, show_ideapad_touchpad, + store_ideapad_touchpad); + +static ssize_t show_ideapad_brightness(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + unsigned long now, max; + + if (read_ec_data(ideapad_handle, 0x11, &max)) + max = -1; + if (read_ec_data(ideapad_handle, 0x12, &now)) + now = -1; + return sprintf(buf, "%lu/%lu\n", now, max); +} + +static ssize_t store_ideapad_brightness(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + return store_ideapad_helper(dev, attr, buf, count, 0x13); +} + +static DEVICE_ATTR(brightness, 0644, show_ideapad_brightness, + store_ideapad_brightness); + +static ssize_t show_ideapad_cfg(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct ideapad_private *priv = dev_get_drvdata(dev); + + return sprintf(buf, "0x%.8X\n", (unsigned int)(priv->cfg)); +} + +static DEVICE_ATTR(cfg, 0444, show_ideapad_cfg, NULL); + +static ssize_t show_ideapad_backlight(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + return show_ideapad_helper(dev, attr, buf, 0x18); +} + +static ssize_t store_ideapad_backlight(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + return store_ideapad_helper(dev, attr, buf, count, 0x33); +} + +static DEVICE_ATTR(backlight, 0644, show_ideapad_backlight, + store_ideapad_backlight); + +static struct attribute *ideapad_attributes[] = { + &dev_attr_camera_power.attr, + &dev_attr_brightness.attr, + &dev_attr_touchpad.attr, + &dev_attr_cfg.attr, + &dev_attr_backlight.attr, + NULL +}; + +static struct attribute_group ideapad_attribute_group = { + .attrs = ideapad_attributes +}; + /* * Rfkill */ @@ -285,15 +386,6 @@ static void __devexit ideapad_unregister_rfkill(struct acpi_device *adevice, /* * Platform device */ -static struct attribute *ideapad_attributes[] = { - &dev_attr_camera_power.attr, - NULL -}; - -static struct attribute_group ideapad_attribute_group = { - .attrs = ideapad_attributes -}; - static int __devinit ideapad_platform_init(struct ideapad_private *priv) { int result; -- 1.7.4.1 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html