UBUNTU: SAUCE: Input: i8042 - add dmi quirk

BugLink: https://bugs.launchpad.net/bugs/1919123

On some platforms, the EC doesn't support the register reading sequence
for sentelic[1], and then make the EC can't respond commands for a while
when probing. It leads to the keyboard non-responsive for around 10
seconds while waking up from s2idle.

[   44.304488] i8042: [9804] d4 -> i8042 (command)
[   44.304634] i8042: [9804] f3 -> i8042 (parameter)
[   44.304787] i8042: [9804] fa <- i8042 (interrupt, 1, 12)
[   44.304855] i8042: [9804] d4 -> i8042 (command)
[   44.304938] i8042: [9804] 66 -> i8042 (parameter)
[   44.337698] i8042: [9813] d4 -> i8042 (command)
[   44.905695] i8042: [9942] 88 -> i8042 (parameter)
[   45.497478] i8042: [10102] d4 -> i8042 (command)
[   46.098041] i8042: [10253] f3 -> i8042 (parameter)
[   46.098070] i8042: [10253] fe <- i8042 (interrupt, 1, 12)
[   46.718154] i8042: [10386] d4 -> i8042 (command)
[   47.309915] i8042: [10386] f4 -> i8042 (parameter)
[   47.918961] i8042: [10556] d4 -> i8042 (command)
[   48.402624] i8042: [10556] f6 -> i8042 (parameter)

A DMI quirk to mark this platform doesn't have aux device could avoid those
commands to be sent. And the system could still using i2c interface to
communicate with the touchpad.

1. https://www.kernel.org/doc/html/v5.11/input/devices/sentelic.html#programming-sequence-for-register-reading-writing

Signed-off-by: Chia-Lin Kao (AceLan) <acelan.kao@canonical.com>
(cherry picked from https://lkml.org/lkml/2021/3/15/126)
Signed-off-by: Chia-Lin Kao (AceLan) <acelan.kao@canonical.com>
Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
This commit is contained in:
Chia-Lin Kao (AceLan)
2021-03-15 16:05:40 +08:00
committed by Paolo Pisati
parent 9f0040bcae
commit a26259c791
+21
View File
@@ -22,6 +22,7 @@
#include <linux/slab.h>
#include <linux/suspend.h>
#include <linux/property.h>
#include <linux/dmi.h>
#include <asm/io.h>
@@ -178,6 +179,24 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id);
static bool (*i8042_platform_filter)(unsigned char data, unsigned char str,
struct serio *serio);
static int __init i8042_set_noaux(const struct dmi_system_id *dmi)
{
i8042_noaux = true;
return 1;
}
static const struct dmi_system_id i8042_quirks[] __initconst = {
{
.callback = i8042_set_noaux,
.ident = "Dell laptop",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "Precision 5550"),
},
},
{},
};
void i8042_lock_chip(void)
{
mutex_lock(&i8042_mutex);
@@ -1561,6 +1580,8 @@ static int i8042_probe(struct platform_device *dev)
i8042_dritek_enable();
#endif
dmi_check_system(i8042_quirks);
if (!i8042_noaux) {
error = i8042_setup_aux();
if (error && error != -ENODEV && error != -EBUSY)