On 7 January 2015 at 19:23, Srihari Vijayaraghavan <linux.bug.reporting@xxxxxxxxx> wrote: > On 7 January 2015 at 18:44, Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx> wrote: >> Hi Srihari, > > Hello Dimitry, > > Thanks for your feedback. Much appreciated. > >> On Mon, Jan 05, 2015 at 07:45:39PM +1100, Srihari Vijayaraghavan wrote: >>> Hello Folks & Dmitry, >>> >>> Further to the previous patch, here is the current version (against >>> mainline) updated with the DMI info of another laptop model where this >>> fix had helped a user. >>> >>> Can you please review it & give some feedback? If it looks good as it >>> is, then on behalf of all affected users (including yours truly), may >>> I request for it to be merged upstream (and possibly stable too)? >>> >>> (If the patch gets spoiled by gmail, please ref to this bugzilla URL, >>> where this patch is there as a file attachment: >>> https://bugzilla.kernel.org/show_bug.cgi?id=81331) >> >> I am not terribly happy with having fiddling with keyboard from i8042 >> core, but I guess that's what we have to do unless someone has better >> idea... > > Agreed 100%. Regrettably, seeing how psmouse_do_detect() doesn't even > get invoked, this heavy handed approach had to be taken at i8042 core. > However, as you've pointed out, if there is any better idea, we're all > ears. > >> I'll drop mention of Elantech from the option though as it may well be >> needed for other devices in the future. > > A version of the patch (against mainline) incorporating your ideas > (i.e., without too much Elantech bashing) is attached to this email > for your review. > >> Thanks! [Sorry to respond to my own email.] Here's a better version, removing Elantech ref from the table name. Thanks
commit 2b5d814d08d4dde95c5e82b1f37bc871801038da Author: Srihari Vijayaraghavan <linux.bug.reporting@xxxxxxxxx> Date: Wed Jan 7 20:00:51 2015 +1100 As reported in kernel bugzilla 81331, on some laptops, keyboard needs to be reset for the detection of touchpad (e.g., some Gigabyte laptop models containing Elantech). Based on the original patch by Mateusz Jończyk this version has been expanded to include DMI based detection & application of the fix automatically on the affected models of laptops. This has been confirmed to fix problem by three users already on three different models of laptops. Signed-off-by: Srihari Vijayaraghavan <linux.bug.reporting@xxxxxxxxx> Acked-by: Mateusz Jończyk <mat.jonczyk@xxxxx> Tested-by: Srihari Vijayaraghavan <linux.bug.reporting@xxxxxxxxx> Tested by: Zakariya Dehlawi <zdehlawi@xxxxxxxxx> Tested-by: Guillaum Bouchard <guillaum.bouchard@xxxxxxxxx> diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 4df73da..603fa10 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -1277,6 +1277,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted. i8042.notimeout [HW] Ignore timeout condition signalled by controller i8042.reset [HW] Reset the controller during init and cleanup i8042.unlock [HW] Unlock (ignore) the keylock + i8042.kbdreset [HW] Reset keyboard to detect touchpad on some laptops i810= [HW,DRM] diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index c66d1b5..3becf89 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h @@ -745,6 +745,36 @@ static const struct dmi_system_id __initconst i8042_dmi_dritek_table[] = { { } }; +/* + * Some laptops need keyboard reset before probing for the trackpad to get it + * detected, initialised & finally work (e.g., some Gigabyte laptop models containing + * Elantech touchpad). + */ +static const struct dmi_system_id __initconst i8042_dmi_touchpad_kbdreset_table[] = { + { + /* Gigabyte P35 v2 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), + DMI_MATCH(DMI_PRODUCT_NAME, "P35V2"), + }, + }, + { + /* Aorus branded Gigabyte X3 Plus */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), + DMI_MATCH(DMI_PRODUCT_NAME, "X3"), + }, + }, + { + /* Gigabyte P34 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), + DMI_MATCH(DMI_PRODUCT_NAME, "P34"), + }, + }, + { } +}; + #endif /* CONFIG_X86 */ #ifdef CONFIG_PNP @@ -1040,6 +1070,9 @@ static int __init i8042_platform_init(void) if (dmi_check_system(i8042_dmi_dritek_table)) i8042_dritek = true; + if (dmi_check_system(i8042_dmi_touchpad_kbdreset_table)) + i8042_kbdreset = true; + /* * A20 was already enabled during early kernel init. But some buggy * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index 924e4bf..1a6ff74 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c @@ -67,6 +67,10 @@ static bool i8042_notimeout; module_param_named(notimeout, i8042_notimeout, bool, 0); MODULE_PARM_DESC(notimeout, "Ignore timeouts signalled by i8042"); +static bool i8042_kbdreset; +module_param_named(kbdreset, i8042_kbdreset, bool, 0); +MODULE_PARM_DESC(kbdreset, "Reset keyboard to detect touchpad on some laptops"); + #ifdef CONFIG_X86 static bool i8042_dritek; module_param_named(dritek, i8042_dritek, bool, 0); @@ -790,6 +794,15 @@ static int __init i8042_check_aux(void) return -1; /* + * Reset keyboard to detect touchpad on some laptops + * (e.g., some Gigabyte laptop models containing Elantech touchpad) + */ + if (i8042_kbdreset) { + pr_warn("Resetting keyboard to detect touchpad on some laptops\n"); + i8042_kbd_write(NULL, (unsigned char) 0xff); + } + +/* * Test AUX IRQ delivery to make sure BIOS did not grab the IRQ and * used it for a PCI card or somethig else. */