diff options
author | Robert Gerlach <khnz@gmx.de> | 2012-04-03 16:34:35 -0400 |
---|---|---|
committer | Matthew Garrett <mjg@redhat.com> | 2012-05-31 14:23:39 -0400 |
commit | 14b234b10544046544a81095c9ab372842f80eea (patch) | |
tree | 7461df34aadf9872158409a020e2786e1ebbb87c /drivers | |
parent | 32be65bee53ce7057b8ab3455af1e9b762bb510f (diff) |
fujitsu-tablet: correct quirks for Lifebook and Stylistic tablets
This patch adds a quirk to fix the dock detection for Fujitsu Stylistic
devices and fixes an bug in which tablet mode state was not correctly
reported in Fujitsu Lifebook and Stylistic models.
Signed-off-by: Robert Gerlach <khnz@gmx.de>
Signed-off-by: Matthew Garrett <mjg@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/platform/x86/fujitsu-tablet.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/drivers/platform/x86/fujitsu-tablet.c b/drivers/platform/x86/fujitsu-tablet.c index 8b74fdfc77cd..da267eae8ba8 100644 --- a/drivers/platform/x86/fujitsu-tablet.c +++ b/drivers/platform/x86/fujitsu-tablet.c | |||
@@ -36,7 +36,8 @@ | |||
36 | #define ACPI_FUJITSU_CLASS "fujitsu" | 36 | #define ACPI_FUJITSU_CLASS "fujitsu" |
37 | 37 | ||
38 | #define INVERT_TABLET_MODE_BIT 0x01 | 38 | #define INVERT_TABLET_MODE_BIT 0x01 |
39 | #define FORCE_TABLET_MODE_IF_UNDOCK 0x02 | 39 | #define INVERT_DOCK_STATE_BIT 0x02 |
40 | #define FORCE_TABLET_MODE_IF_UNDOCK 0x04 | ||
40 | 41 | ||
41 | #define KEYMAP_LEN 16 | 42 | #define KEYMAP_LEN 16 |
42 | 43 | ||
@@ -163,6 +164,8 @@ static void fujitsu_send_state(void) | |||
163 | state = fujitsu_read_register(0xdd); | 164 | state = fujitsu_read_register(0xdd); |
164 | 165 | ||
165 | dock = state & 0x02; | 166 | dock = state & 0x02; |
167 | if (fujitsu.config.quirks & INVERT_DOCK_STATE_BIT) | ||
168 | dock = !dock; | ||
166 | 169 | ||
167 | if ((fujitsu.config.quirks & FORCE_TABLET_MODE_IF_UNDOCK) && (!dock)) { | 170 | if ((fujitsu.config.quirks & FORCE_TABLET_MODE_IF_UNDOCK) && (!dock)) { |
168 | tablet_mode = 1; | 171 | tablet_mode = 1; |
@@ -274,25 +277,31 @@ static irqreturn_t fujitsu_interrupt(int irq, void *dev_id) | |||
274 | return IRQ_HANDLED; | 277 | return IRQ_HANDLED; |
275 | } | 278 | } |
276 | 279 | ||
277 | static int __devinit fujitsu_dmi_default(const struct dmi_system_id *dmi) | 280 | static void __devinit fujitsu_dmi_common(const struct dmi_system_id *dmi) |
278 | { | 281 | { |
279 | pr_info("%s\n", dmi->ident); | 282 | pr_info("%s\n", dmi->ident); |
280 | memcpy(fujitsu.config.keymap, dmi->driver_data, | 283 | memcpy(fujitsu.config.keymap, dmi->driver_data, |
281 | sizeof(fujitsu.config.keymap)); | 284 | sizeof(fujitsu.config.keymap)); |
285 | } | ||
286 | |||
287 | static int __devinit fujitsu_dmi_lifebook(const struct dmi_system_id *dmi) | ||
288 | { | ||
289 | fujitsu_dmi_common(dmi); | ||
290 | fujitsu.config.quirks |= INVERT_TABLET_MODE_BIT; | ||
282 | return 1; | 291 | return 1; |
283 | } | 292 | } |
284 | 293 | ||
285 | static int __devinit fujitsu_dmi_stylistic(const struct dmi_system_id *dmi) | 294 | static int __devinit fujitsu_dmi_stylistic(const struct dmi_system_id *dmi) |
286 | { | 295 | { |
287 | fujitsu_dmi_default(dmi); | 296 | fujitsu_dmi_common(dmi); |
288 | fujitsu.config.quirks |= FORCE_TABLET_MODE_IF_UNDOCK; | 297 | fujitsu.config.quirks |= FORCE_TABLET_MODE_IF_UNDOCK; |
289 | fujitsu.config.quirks |= INVERT_TABLET_MODE_BIT; | 298 | fujitsu.config.quirks |= INVERT_DOCK_STATE_BIT; |
290 | return 1; | 299 | return 1; |
291 | } | 300 | } |
292 | 301 | ||
293 | static struct dmi_system_id dmi_ids[] __initconst = { | 302 | static struct dmi_system_id dmi_ids[] __initconst = { |
294 | { | 303 | { |
295 | .callback = fujitsu_dmi_default, | 304 | .callback = fujitsu_dmi_lifebook, |
296 | .ident = "Fujitsu Siemens P/T Series", | 305 | .ident = "Fujitsu Siemens P/T Series", |
297 | .matches = { | 306 | .matches = { |
298 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | 307 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), |
@@ -301,7 +310,7 @@ static struct dmi_system_id dmi_ids[] __initconst = { | |||
301 | .driver_data = keymap_Lifebook_Tseries | 310 | .driver_data = keymap_Lifebook_Tseries |
302 | }, | 311 | }, |
303 | { | 312 | { |
304 | .callback = fujitsu_dmi_default, | 313 | .callback = fujitsu_dmi_lifebook, |
305 | .ident = "Fujitsu Lifebook T Series", | 314 | .ident = "Fujitsu Lifebook T Series", |
306 | .matches = { | 315 | .matches = { |
307 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | 316 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), |
@@ -319,7 +328,7 @@ static struct dmi_system_id dmi_ids[] __initconst = { | |||
319 | .driver_data = keymap_Stylistic_Tseries | 328 | .driver_data = keymap_Stylistic_Tseries |
320 | }, | 329 | }, |
321 | { | 330 | { |
322 | .callback = fujitsu_dmi_default, | 331 | .callback = fujitsu_dmi_lifebook, |
323 | .ident = "Fujitsu LifeBook U810", | 332 | .ident = "Fujitsu LifeBook U810", |
324 | .matches = { | 333 | .matches = { |
325 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | 334 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), |
@@ -346,7 +355,7 @@ static struct dmi_system_id dmi_ids[] __initconst = { | |||
346 | .driver_data = keymap_Stylistic_ST5xxx | 355 | .driver_data = keymap_Stylistic_ST5xxx |
347 | }, | 356 | }, |
348 | { | 357 | { |
349 | .callback = fujitsu_dmi_default, | 358 | .callback = fujitsu_dmi_lifebook, |
350 | .ident = "Unknown (using defaults)", | 359 | .ident = "Unknown (using defaults)", |
351 | .matches = { | 360 | .matches = { |
352 | DMI_MATCH(DMI_SYS_VENDOR, ""), | 361 | DMI_MATCH(DMI_SYS_VENDOR, ""), |
@@ -472,6 +481,6 @@ module_exit(fujitsu_module_exit); | |||
472 | MODULE_AUTHOR("Robert Gerlach <khnz@gmx.de>"); | 481 | MODULE_AUTHOR("Robert Gerlach <khnz@gmx.de>"); |
473 | MODULE_DESCRIPTION("Fujitsu tablet pc extras driver"); | 482 | MODULE_DESCRIPTION("Fujitsu tablet pc extras driver"); |
474 | MODULE_LICENSE("GPL"); | 483 | MODULE_LICENSE("GPL"); |
475 | MODULE_VERSION("2.4"); | 484 | MODULE_VERSION("2.5"); |
476 | 485 | ||
477 | MODULE_DEVICE_TABLE(acpi, fujitsu_ids); | 486 | MODULE_DEVICE_TABLE(acpi, fujitsu_ids); |