diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-08-20 16:12:41 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-08-20 16:12:41 -0400 |
| commit | b0fbfb0cec85563b4d4487bf273815cbdbbea3a5 (patch) | |
| tree | 2e45618d32746dd7f6a66d46d41a4bf00760a663 | |
| parent | 807b5169e230b264b7db099f5c694e7df2ff3790 (diff) | |
| parent | 0c7bbeb9f1373cea9e8efb43221118be2102a01c (diff) | |
Merge branch 'for_linus' of git://cavan.codon.org.uk/platform-drivers-x86
Pull x86 platform driver update from Matthew Garrett:
"Some small updates for a few drivers, and some hardware enablement for
new Ideapads and the gmux hardware in the latest Macs.
This code won't run on older devices and has been well tested on new
ones, so low risk of regressions."
* 'for_linus' of git://cavan.codon.org.uk/platform-drivers-x86:
ideapad: add Lenovo IdeaPad Z570 support (part 3)
ideapad: add Lenovo IdeaPad Z570 support (part 2)
ideapad: add Lenovo IdeaPad Z570 support (part 1)
classmate-laptop: always call input_sync() after input_report_switch()
thinkpad-acpi: recognize latest V-Series using DMI_BIOS_VENDOR
dell-laptop: Fixed typo in touchpad LED quirk
vga_switcheroo: Don't require handler init callback
vga_switcheroo: Remove assumptions about registration/unregistration ordering
apple-gmux: Add display mux support
apple-gmux: Fix kconfig dependencies
asus-wmi: record wlan status while controlled by userapp
apple_gmux: Fix ACPI video unregister
apple_gmux: Add support for newer hardware
gmux: Add generic write32 function
| -rw-r--r-- | Documentation/ABI/testing/sysfs-platform-ideapad-laptop | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_acpi.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/vga/vga_switcheroo.c | 61 | ||||
| -rw-r--r-- | drivers/platform/x86/Kconfig | 6 | ||||
| -rw-r--r-- | drivers/platform/x86/apple-gmux.c | 426 | ||||
| -rw-r--r-- | drivers/platform/x86/asus-wmi.c | 21 | ||||
| -rw-r--r-- | drivers/platform/x86/asus-wmi.h | 1 | ||||
| -rw-r--r-- | drivers/platform/x86/classmate-laptop.c | 12 | ||||
| -rw-r--r-- | drivers/platform/x86/dell-laptop.c | 12 | ||||
| -rw-r--r-- | drivers/platform/x86/ideapad-laptop.c | 110 | ||||
| -rw-r--r-- | drivers/platform/x86/thinkpad_acpi.c | 7 |
11 files changed, 606 insertions, 67 deletions
diff --git a/Documentation/ABI/testing/sysfs-platform-ideapad-laptop b/Documentation/ABI/testing/sysfs-platform-ideapad-laptop index 814b01354c41..b31e782bd985 100644 --- a/Documentation/ABI/testing/sysfs-platform-ideapad-laptop +++ b/Documentation/ABI/testing/sysfs-platform-ideapad-laptop | |||
| @@ -5,4 +5,15 @@ Contact: "Ike Panhc <ike.pan@canonical.com>" | |||
| 5 | Description: | 5 | Description: |
| 6 | Control the power of camera module. 1 means on, 0 means off. | 6 | Control the power of camera module. 1 means on, 0 means off. |
| 7 | 7 | ||
| 8 | What: /sys/devices/platform/ideapad/fan_mode | ||
| 9 | Date: June 2012 | ||
| 10 | KernelVersion: 3.6 | ||
| 11 | Contact: "Maxim Mikityanskiy <maxtram95@gmail.com>" | ||
| 12 | Description: | ||
| 13 | Change fan mode | ||
| 14 | There are four available modes: | ||
| 15 | * 0 -> Super Silent Mode | ||
| 16 | * 1 -> Standard Mode | ||
| 17 | * 2 -> Dust Cleaning | ||
| 18 | * 4 -> Efficient Thermal Dissipation Mode | ||
| 8 | 19 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c index fc841e87b343..26ebffebe710 100644 --- a/drivers/gpu/drm/nouveau/nouveau_acpi.c +++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c | |||
| @@ -211,11 +211,6 @@ static int nouveau_dsm_power_state(enum vga_switcheroo_client_id id, | |||
| 211 | return nouveau_dsm_set_discrete_state(nouveau_dsm_priv.dhandle, state); | 211 | return nouveau_dsm_set_discrete_state(nouveau_dsm_priv.dhandle, state); |
| 212 | } | 212 | } |
| 213 | 213 | ||
| 214 | static int nouveau_dsm_init(void) | ||
| 215 | { | ||
| 216 | return 0; | ||
| 217 | } | ||
| 218 | |||
| 219 | static int nouveau_dsm_get_client_id(struct pci_dev *pdev) | 214 | static int nouveau_dsm_get_client_id(struct pci_dev *pdev) |
| 220 | { | 215 | { |
| 221 | /* easy option one - intel vendor ID means Integrated */ | 216 | /* easy option one - intel vendor ID means Integrated */ |
| @@ -232,7 +227,6 @@ static int nouveau_dsm_get_client_id(struct pci_dev *pdev) | |||
| 232 | static struct vga_switcheroo_handler nouveau_dsm_handler = { | 227 | static struct vga_switcheroo_handler nouveau_dsm_handler = { |
| 233 | .switchto = nouveau_dsm_switchto, | 228 | .switchto = nouveau_dsm_switchto, |
| 234 | .power_state = nouveau_dsm_power_state, | 229 | .power_state = nouveau_dsm_power_state, |
| 235 | .init = nouveau_dsm_init, | ||
| 236 | .get_client_id = nouveau_dsm_get_client_id, | 230 | .get_client_id = nouveau_dsm_get_client_id, |
| 237 | }; | 231 | }; |
| 238 | 232 | ||
diff --git a/drivers/gpu/vga/vga_switcheroo.c b/drivers/gpu/vga/vga_switcheroo.c index 5b3c7d135dc9..e25cf31faab2 100644 --- a/drivers/gpu/vga/vga_switcheroo.c +++ b/drivers/gpu/vga/vga_switcheroo.c | |||
| @@ -70,27 +70,12 @@ static struct vgasr_priv vgasr_priv = { | |||
| 70 | .clients = LIST_HEAD_INIT(vgasr_priv.clients), | 70 | .clients = LIST_HEAD_INIT(vgasr_priv.clients), |
| 71 | }; | 71 | }; |
| 72 | 72 | ||
| 73 | int vga_switcheroo_register_handler(struct vga_switcheroo_handler *handler) | 73 | static bool vga_switcheroo_ready(void) |
| 74 | { | ||
| 75 | mutex_lock(&vgasr_mutex); | ||
| 76 | if (vgasr_priv.handler) { | ||
| 77 | mutex_unlock(&vgasr_mutex); | ||
| 78 | return -EINVAL; | ||
| 79 | } | ||
| 80 | |||
| 81 | vgasr_priv.handler = handler; | ||
| 82 | mutex_unlock(&vgasr_mutex); | ||
| 83 | return 0; | ||
| 84 | } | ||
| 85 | EXPORT_SYMBOL(vga_switcheroo_register_handler); | ||
| 86 | |||
| 87 | void vga_switcheroo_unregister_handler(void) | ||
| 88 | { | 74 | { |
| 89 | mutex_lock(&vgasr_mutex); | 75 | /* we're ready if we get two clients + handler */ |
| 90 | vgasr_priv.handler = NULL; | 76 | return !vgasr_priv.active && |
| 91 | mutex_unlock(&vgasr_mutex); | 77 | vgasr_priv.registered_clients == 2 && vgasr_priv.handler; |
| 92 | } | 78 | } |
| 93 | EXPORT_SYMBOL(vga_switcheroo_unregister_handler); | ||
| 94 | 79 | ||
| 95 | static void vga_switcheroo_enable(void) | 80 | static void vga_switcheroo_enable(void) |
| 96 | { | 81 | { |
| @@ -98,7 +83,8 @@ static void vga_switcheroo_enable(void) | |||
| 98 | struct vga_switcheroo_client *client; | 83 | struct vga_switcheroo_client *client; |
| 99 | 84 | ||
| 100 | /* call the handler to init */ | 85 | /* call the handler to init */ |
| 101 | vgasr_priv.handler->init(); | 86 | if (vgasr_priv.handler->init) |
| 87 | vgasr_priv.handler->init(); | ||
| 102 | 88 | ||
| 103 | list_for_each_entry(client, &vgasr_priv.clients, list) { | 89 | list_for_each_entry(client, &vgasr_priv.clients, list) { |
| 104 | if (client->id != -1) | 90 | if (client->id != -1) |
| @@ -113,6 +99,37 @@ static void vga_switcheroo_enable(void) | |||
| 113 | vgasr_priv.active = true; | 99 | vgasr_priv.active = true; |
| 114 | } | 100 | } |
| 115 | 101 | ||
| 102 | int vga_switcheroo_register_handler(struct vga_switcheroo_handler *handler) | ||
| 103 | { | ||
| 104 | mutex_lock(&vgasr_mutex); | ||
| 105 | if (vgasr_priv.handler) { | ||
| 106 | mutex_unlock(&vgasr_mutex); | ||
| 107 | return -EINVAL; | ||
| 108 | } | ||
| 109 | |||
| 110 | vgasr_priv.handler = handler; | ||
| 111 | if (vga_switcheroo_ready()) { | ||
| 112 | printk(KERN_INFO "vga_switcheroo: enabled\n"); | ||
| 113 | vga_switcheroo_enable(); | ||
| 114 | } | ||
| 115 | mutex_unlock(&vgasr_mutex); | ||
| 116 | return 0; | ||
| 117 | } | ||
| 118 | EXPORT_SYMBOL(vga_switcheroo_register_handler); | ||
| 119 | |||
| 120 | void vga_switcheroo_unregister_handler(void) | ||
| 121 | { | ||
| 122 | mutex_lock(&vgasr_mutex); | ||
| 123 | vgasr_priv.handler = NULL; | ||
| 124 | if (vgasr_priv.active) { | ||
| 125 | pr_info("vga_switcheroo: disabled\n"); | ||
| 126 | vga_switcheroo_debugfs_fini(&vgasr_priv); | ||
| 127 | vgasr_priv.active = false; | ||
| 128 | } | ||
| 129 | mutex_unlock(&vgasr_mutex); | ||
| 130 | } | ||
| 131 | EXPORT_SYMBOL(vga_switcheroo_unregister_handler); | ||
| 132 | |||
| 116 | static int register_client(struct pci_dev *pdev, | 133 | static int register_client(struct pci_dev *pdev, |
| 117 | const struct vga_switcheroo_client_ops *ops, | 134 | const struct vga_switcheroo_client_ops *ops, |
| 118 | int id, bool active) | 135 | int id, bool active) |
| @@ -134,9 +151,7 @@ static int register_client(struct pci_dev *pdev, | |||
| 134 | if (client_is_vga(client)) | 151 | if (client_is_vga(client)) |
| 135 | vgasr_priv.registered_clients++; | 152 | vgasr_priv.registered_clients++; |
| 136 | 153 | ||
| 137 | /* if we get two clients + handler */ | 154 | if (vga_switcheroo_ready()) { |
| 138 | if (!vgasr_priv.active && | ||
| 139 | vgasr_priv.registered_clients == 2 && vgasr_priv.handler) { | ||
| 140 | printk(KERN_INFO "vga_switcheroo: enabled\n"); | 155 | printk(KERN_INFO "vga_switcheroo: enabled\n"); |
| 141 | vga_switcheroo_enable(); | 156 | vga_switcheroo_enable(); |
| 142 | } | 157 | } |
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig index 2a262f5c5c0c..c86bae828c28 100644 --- a/drivers/platform/x86/Kconfig +++ b/drivers/platform/x86/Kconfig | |||
| @@ -289,6 +289,7 @@ config IDEAPAD_LAPTOP | |||
| 289 | tristate "Lenovo IdeaPad Laptop Extras" | 289 | tristate "Lenovo IdeaPad Laptop Extras" |
| 290 | depends on ACPI | 290 | depends on ACPI |
| 291 | depends on RFKILL && INPUT | 291 | depends on RFKILL && INPUT |
| 292 | depends on SERIO_I8042 | ||
| 292 | select INPUT_SPARSEKMAP | 293 | select INPUT_SPARSEKMAP |
| 293 | help | 294 | help |
| 294 | This is a driver for the rfkill switches on Lenovo IdeaPad netbooks. | 295 | This is a driver for the rfkill switches on Lenovo IdeaPad netbooks. |
| @@ -758,8 +759,11 @@ config SAMSUNG_Q10 | |||
| 758 | 759 | ||
| 759 | config APPLE_GMUX | 760 | config APPLE_GMUX |
| 760 | tristate "Apple Gmux Driver" | 761 | tristate "Apple Gmux |
