Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/rydberg/input...
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / input / mouse / synaptics.c
index 720729a..da392c2 100644 (file)
@@ -824,15 +824,45 @@ static const struct dmi_system_id __initconst toshiba_dmi_table[] = {
 #endif
 };
 
+static bool broken_olpc_ec;
+
+static const struct dmi_system_id __initconst olpc_dmi_table[] = {
+#if defined(CONFIG_DMI) && defined(CONFIG_OLPC)
+       {
+               /* OLPC XO-1 or XO-1.5 */
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "OLPC"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "XO"),
+               },
+       },
+       { }
+#endif
+};
+
 void __init synaptics_module_init(void)
 {
        impaired_toshiba_kbc = dmi_check_system(toshiba_dmi_table);
+       broken_olpc_ec = dmi_check_system(olpc_dmi_table);
 }
 
 int synaptics_init(struct psmouse *psmouse)
 {
        struct synaptics_data *priv;
 
+       /*
+        * The OLPC XO has issues with Synaptics' absolute mode; similarly to
+        * the HGPK, it quickly degrades and the hardware becomes jumpy and
+        * overly sensitive.  Not only that, but the constant packet spew
+        * (even at a lowered 40pps rate) overloads the EC such that key
+        * presses on the keyboard are missed.  Given all of that, don't
+        * even attempt to use Synaptics mode.  Relative mode seems to work
+        * just fine.
+        */
+       if (broken_olpc_ec) {
+               printk(KERN_INFO "synaptics: OLPC XO detected, not enabling Synaptics protocol.\n");
+               return -ENODEV;
+       }
+
        psmouse->private = priv = kzalloc(sizeof(struct synaptics_data), GFP_KERNEL);
        if (!priv)
                return -ENOMEM;
@@ -887,8 +917,8 @@ int synaptics_init(struct psmouse *psmouse)
 
        /*
         * Toshiba's KBC seems to have trouble handling data from
-        * Synaptics as full rate, switch to lower rate which is roughly
-        * thye same as rate of standard PS/2 mouse.
+        * Synaptics at full rate.  Switch to a lower rate (roughly
+        * the same rate as a standard PS/2 mouse).
         */
        if (psmouse->rate >= 80 && impaired_toshiba_kbc) {
                printk(KERN_INFO "synaptics: Toshiba %s detected, limiting rate to 40pps.\n",