diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-01 03:10:33 +0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-01 03:10:33 +0400 |
commit | 91e67a996c60a347ad7b918a74efb0f6b3b274c3 (patch) | |
tree | 05fd872079b1199d112cc7508faf81b8490dd83f /drivers/platform/x86/dell-laptop.c | |
parent | 1eb63378354ac37b7e27d256bbf84684751bac32 (diff) | |
parent | 1d1fc8a75fec3a2b29cc5864d45c5d03048f62e0 (diff) | |
download | linux-91e67a996c60a347ad7b918a74efb0f6b3b274c3.tar.xz |
Merge branch 'for_linus' of git://cavan.codon.org.uk/platform-drivers-x86
* 'for_linus' of git://cavan.codon.org.uk/platform-drivers-x86: (45 commits)
acer-wmi: replaced the hard coded bitmap by the communication devices bitmap from SMBIOS
acer-wmi: check the existence of internal wireless device when set capability
acer-wmi: add ACER_WMID_v2 interface flag to represent new notebooks
sony-laptop:irq: Remove IRQF_DISABLED
asus-laptop: Add rfkill support for Pegatron Lucid tablet
asus-laptop: pega_accel - Report accelerometer orientation change through udev
asus-laptop: fix module description
asus-laptop: hide leds on Pegatron Lucid
asus-laptop: Pegatron Lucid accelerometer
asus-laptop: allow boot time control of Pegatron ALS sensor
Platform: samsung_laptop: add support for X520 machines.
platform: samsung_laptop: add dmi information for Samsung R700 laptops
hp_accel: Add axis-mapping for HP ProBook / EliteBook
hp_accel: Add a new PNP id
WMI: properly cleanup devices to avoid crashes
ideapad: remove sysfs node for cfg
ideapad: add debugfs support
ideapad: add event for Novo key
ideapad: change parameter of ideapad_sync_rfk_state
ideapad: define vpc commands
...
Diffstat (limited to 'drivers/platform/x86/dell-laptop.c')
-rw-r--r-- | drivers/platform/x86/dell-laptop.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/drivers/platform/x86/dell-laptop.c b/drivers/platform/x86/dell-laptop.c index f31fa4efa725..a43cfd906c6d 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,10 @@ static int __init dell_init(void) if (!dmi_check_system(dell_device_table)) return -ENODEV; + quirks = NULL; + /* find if this machine support other functions */ + dmi_check_system(dell_quirks); + dmi_walk(find_tokens, NULL); if (!da_tokens) { @@ -626,6 +705,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 +774,8 @@ fail_platform_driver: static void __exit dell_exit(void) { debugfs_remove_recursive(dell_laptop_dir); + if (quirks && quirks->touchpad_led) + touchpad_led_exit(); i8042_remove_filter(dell_laptop_i8042_filter); cancel_delayed_work_sync(&dell_rfkill_work); backlight_device_unregister(dell_backlight_device); |