Commit 3d725caa authored by Sheng-Liang Song's avatar Sheng-Liang Song Committed by Dmitry Torokhov

Input: atkbd - fix keyboard not working on some LG laptops

After issuing ATKBD_CMD_RESET_DIS, keyboard on some LG laptops stops
working. The workaround is to stop issuing ATKBD_CMD_RESET_DIS commands.

In order to keep changes in atkbd driver to the minimum we check DMI
signature and only skip ATKBD_CMD_RESET_DIS if we are running on LG
LW25-B7HV or P1-J273B.

Cc: stable@vger.kernel.org
Signed-off-by: default avatarSheng-Liang Song <ssl@chromium.org>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent 27a38856
...@@ -243,6 +243,12 @@ static void (*atkbd_platform_fixup)(struct atkbd *, const void *data); ...@@ -243,6 +243,12 @@ static void (*atkbd_platform_fixup)(struct atkbd *, const void *data);
static void *atkbd_platform_fixup_data; static void *atkbd_platform_fixup_data;
static unsigned int (*atkbd_platform_scancode_fixup)(struct atkbd *, unsigned int); static unsigned int (*atkbd_platform_scancode_fixup)(struct atkbd *, unsigned int);
/*
* Certain keyboards to not like ATKBD_CMD_RESET_DIS and stop responding
* to many commands until full reset (ATKBD_CMD_RESET_BAT) is performed.
*/
static bool atkbd_skip_deactivate;
static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf, static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf,
ssize_t (*handler)(struct atkbd *, char *)); ssize_t (*handler)(struct atkbd *, char *));
static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count, static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count,
...@@ -768,6 +774,7 @@ static int atkbd_probe(struct atkbd *atkbd) ...@@ -768,6 +774,7 @@ static int atkbd_probe(struct atkbd *atkbd)
* Make sure nothing is coming from the keyboard and disturbs our * Make sure nothing is coming from the keyboard and disturbs our
* internal state. * internal state.
*/ */
if (!atkbd_skip_deactivate)
atkbd_deactivate(atkbd); atkbd_deactivate(atkbd);
return 0; return 0;
...@@ -1638,6 +1645,12 @@ static int __init atkbd_setup_scancode_fixup(const struct dmi_system_id *id) ...@@ -1638,6 +1645,12 @@ static int __init atkbd_setup_scancode_fixup(const struct dmi_system_id *id)
return 1; return 1;
} }
static int __init atkbd_deactivate_fixup(const struct dmi_system_id *id)
{
atkbd_skip_deactivate = true;
return 1;
}
static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = { static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = {
{ {
.matches = { .matches = {
...@@ -1775,6 +1788,20 @@ static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = { ...@@ -1775,6 +1788,20 @@ static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = {
.callback = atkbd_setup_scancode_fixup, .callback = atkbd_setup_scancode_fixup,
.driver_data = atkbd_oqo_01plus_scancode_fixup, .driver_data = atkbd_oqo_01plus_scancode_fixup,
}, },
{
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),
DMI_MATCH(DMI_PRODUCT_NAME, "LW25-B7HV"),
},
.callback = atkbd_deactivate_fixup,
},
{
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),
DMI_MATCH(DMI_PRODUCT_NAME, "P1-J273B"),
},
.callback = atkbd_deactivate_fixup,
},
{ } { }
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment