diff options
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/mouse/synaptics.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index 53c65a634b26..a977ef4c6625 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c | |||
@@ -744,15 +744,45 @@ static const struct dmi_system_id __initconst toshiba_dmi_table[] = { | |||
744 | #endif | 744 | #endif |
745 | }; | 745 | }; |
746 | 746 | ||
747 | static bool broken_olpc_ec; | ||
748 | |||
749 | static const struct dmi_system_id __initconst olpc_dmi_table[] = { | ||
750 | #if defined(CONFIG_DMI) && defined(CONFIG_OLPC) | ||
751 | { | ||
752 | /* OLPC XO-1 or XO-1.5 */ | ||
753 | .matches = { | ||
754 | DMI_MATCH(DMI_SYS_VENDOR, "OLPC"), | ||
755 | DMI_MATCH(DMI_PRODUCT_NAME, "XO"), | ||
756 | }, | ||
757 | }, | ||
758 | { } | ||
759 | #endif | ||
760 | }; | ||
761 | |||
747 | void __init synaptics_module_init(void) | 762 | void __init synaptics_module_init(void) |
748 | { | 763 | { |
749 | impaired_toshiba_kbc = dmi_check_system(toshiba_dmi_table); | 764 | impaired_toshiba_kbc = dmi_check_system(toshiba_dmi_table); |
765 | broken_olpc_ec = dmi_check_system(olpc_dmi_table); | ||
750 | } | 766 | } |
751 | 767 | ||
752 | int synaptics_init(struct psmouse *psmouse) | 768 | int synaptics_init(struct psmouse *psmouse) |
753 | { | 769 | { |
754 | struct synaptics_data *priv; | 770 | struct synaptics_data *priv; |
755 | 771 | ||
772 | /* | ||
773 | * The OLPC XO has issues with Synaptics' absolute mode; similarly to | ||
774 | * the HGPK, it quickly degrades and the hardware becomes jumpy and | ||
775 | * overly sensitive. Not only that, but the constant packet spew | ||
776 | * (even at a lowered 40pps rate) overloads the EC such that key | ||
777 | * presses on the keyboard are missed. Given all of that, don't | ||
778 | * even attempt to use Synaptics mode. Relative mode seems to work | ||
779 | * just fine. | ||
780 | */ | ||
781 | if (broken_olpc_ec) { | ||
782 | printk(KERN_INFO "synaptics: OLPC XO detected, not enabling Synaptics protocol.\n"); | ||
783 | return -ENODEV; | ||
784 | } | ||
785 | |||
756 | psmouse->private = priv = kzalloc(sizeof(struct synaptics_data), GFP_KERNEL); | 786 | psmouse->private = priv = kzalloc(sizeof(struct synaptics_data), GFP_KERNEL); |
757 | if (!priv) | 787 | if (!priv) |
758 | return -ENOMEM; | 788 | return -ENOMEM; |