Re: [PATCH] dell-laptop: support Synaptics/Alps touchpad led

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dear Matthew,

Could you give me some recommends?
Thanks.

Best regards,
AceLan Kao.

2011/10/4 AceLan Kao <acelan.kao@xxxxxxxxxxxxx>:
> Sorry, I forgot to checkout the format.
> Please review the new one in this email.
> Thanks.
>
> 2011/10/4 AceLan Kao <acelan.kao@xxxxxxxxxxxxx>:
>> This patch supports Dell laptop with Synaptics and Alps touchpad chip
>> that with LED to indicate the functionality of touchpad is disabled or
>> enabled.
>>
>> The command for touchpad LED is 0x97, and the data 1 means turn on the
>> touchpad LED, 2 means turn it off.
>>
>> BTW, I add dell_quirks to white list those machines that supports this
>> behavior, so that the code won't affect those who don't have a touchpad LED
>> machine.
>>
>> We can easily to turn it on/off by
>>   echo 1 > /sys/class/leds/dell-laptop::touchpad/brightness
>>   echo 0 > /sys/class/leds/dell-laptop::touchpad/brightness
>>
>> Signed-off-by: AceLan Kao <acelan.kao@xxxxxxxxxxxxx>
>> ---
>>  drivers/platform/x86/dell-laptop.c |   82 ++++++++++++++++++++++++++++++++++++
>>  1 files changed, 82 insertions(+), 0 deletions(-)
>>
>> diff --git a/drivers/platform/x86/dell-laptop.c b/drivers/platform/x86/dell-laptop.c
>> index f31fa4e..e40da74 100644
>> --- a/drivers/platform/x86/dell-laptop.c
>> +++ b/drivers/platform/x86/dell-laptop.c
>> @@ -60,6 +60,22 @@ struct calling_interface_structure {
>>        struct calling_interface_token tokens[];
>>  } __packed;
>>
>> +struct quirk_entry {
>> +       u8 touchpad_led;
>> +};
>> +
>> +static struct quirk_entry *quirks;
>> +
>> +static struct quirk_entry quirk_dell_vostro_v130= {
>> +       .touchpad_led= 1,
>> +};
>> +
>> +static int dmi_matched(const struct dmi_system_id *dmi)
>> +{
>> +       quirks = dmi->driver_data;
>> +       return 1;
>> +}
>> +
>>  static int da_command_address;
>>  static int da_command_code;
>>  static int da_num_tokens;
>> @@ -149,6 +165,27 @@ static struct dmi_system_id __devinitdata dell_blacklist[] = {
>>        {}
>>  };
>>
>> +static struct dmi_system_id __devinitdata dell_quirks[] = {
>> +       {
>> +               .callback = dmi_matched,
>> +               .ident = "Dell Vostro V130",
>> +               .matches = {
>> +                       DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
>> +                       DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V130"),
>> +               },
>> +               .driver_data = &quirk_dell_vostro_v130,
>> +       },
>> +       {
>> +               .callback = dmi_matched,
>> +               .ident = "Dell Vostro V131",
>> +               .matches = {
>> +                       DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
>> +                       DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V131"),
>> +               },
>> +               .driver_data = &quirk_dell_vostro_v130,
>> +       },
>> +};
>> +
>>  static struct calling_interface_buffer *buffer;
>>  static struct page *bufferpage;
>>  static DEFINE_MUTEX(buffer_mutex);
>> @@ -552,6 +589,44 @@ static const struct backlight_ops dell_ops = {
>>        .update_status  = dell_send_intensity,
>>  };
>>
>> +static void touchpad_led_on()
>> +{
>> +       int command= 0x97;
>> +       char data= 1;
>> +       i8042_command ( &data, command | 1 << 12);
>> +}
>> +
>> +static void touchpad_led_off()
>> +{
>> +       int command= 0x97;
>> +       char data= 2;
>> +       i8042_command ( &data, command | 1 << 12);
>> +}
>> +
>> +static void touchpad_led_set(struct led_classdev *led_cdev,
>> +       enum led_brightness value)
>> +{
>> +       if (value > 0)
>> +               touchpad_led_on();
>> +       else
>> +               touchpad_led_off();
>> +}
>> +
>> +static struct led_classdev touchpad_led = {
>> +       .name = "dell-laptop::touchpad",
>> +       .brightness_set = touchpad_led_set,
>> +};
>> +
>> +static int __devinit touchpad_led_init(struct device *dev)
>> +{
>> +       return led_classdev_register(dev, &touchpad_led);
>> +}
>> +
>> +static void touchpad_led_exit(void)
>> +{
>> +       led_classdev_unregister(&touchpad_led);
>> +}
>> +
>>  static bool dell_laptop_i8042_filter(unsigned char data, unsigned char str,
>>                              struct serio *port)
>>  {
>> @@ -584,6 +659,9 @@ static int __init dell_init(void)
>>        if (!dmi_check_system(dell_device_table))
>>                return -ENODEV;
>>
>> +       quirks = NULL;
>> +       dmi_check_system(dell_quirks); /* find if this machine support other functions */
>> +
>>        dmi_walk(find_tokens, NULL);
>>
>>        if (!da_tokens)  {
>> @@ -626,6 +704,9 @@ static int __init dell_init(void)
>>                goto fail_filter;
>>        }
>>
>> +       if(quirks && quirks->touchpad_led)
>> +               touchpad_led_init(&platform_device->dev);
>> +
>>        dell_laptop_dir = debugfs_create_dir("dell_laptop", NULL);
>>        if (dell_laptop_dir != NULL)
>>                debugfs_create_file("rfkill", 0444, dell_laptop_dir, NULL,
>> @@ -692,6 +773,7 @@ fail_platform_driver:
>>  static void __exit dell_exit(void)
>>  {
>>        debugfs_remove_recursive(dell_laptop_dir);
>> +       touchpad_led_exit();
>>        i8042_remove_filter(dell_laptop_i8042_filter);
>>        cancel_delayed_work_sync(&dell_rfkill_work);
>>        backlight_device_unregister(dell_backlight_device);
>> --
>> 1.7.5.4
>>
>>
>
>
>
> --
> Chia-Lin Kao(AceLan)
> http://blog.acelan.idv.tw/
> E-Mail: acelan.kaoATcanonical.com (s/AT/@/)
>



-- 
Chia-Lin Kao(AceLan)
http://blog.acelan.idv.tw/
E-Mail: acelan.kaoATcanonical.com (s/AT/@/)
--
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


[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux