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: Sheng-Liang Song <ssl@chromium.org> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
27a38856a9
commit
3d725caa9d
|
@ -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,7 +774,8 @@ 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.
|
||||||
*/
|
*/
|
||||||
atkbd_deactivate(atkbd);
|
if (!atkbd_skip_deactivate)
|
||||||
|
atkbd_deactivate(atkbd);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -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 = {
|
||||||
.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,
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue