On Thu, Jun 2, 2011 at 11:24 AM, Ike Panhc <ike.pan@xxxxxxxxxxxxx> wrote: > 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 platform-driver-x86" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at Âhttp://vger.kernel.org/majordomo-info.html > Hi Ike, Why do you want to addÂ/sys/devices/platform/ideapad/brightness and  Â/sys/devices/platform/ideapad/backlight ? Both of these files should be handled by the generic backlight class (using brightness and bl_power). Also, could you describe what are these "capabilities" in the sysfs doc file ? Thanks -- Corentin Chary http://xf.iksaif.net -- 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