diff options
| -rw-r--r-- | drivers/input/keyboard/atkbd.c | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index 2626773ff29b..2dd1d0dd4f7d 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c | |||
| @@ -243,6 +243,12 @@ static void (*atkbd_platform_fixup)(struct atkbd *, const void *data); | |||
| 243 | static void *atkbd_platform_fixup_data; | 243 | static void *atkbd_platform_fixup_data; |
| 244 | static unsigned int (*atkbd_platform_scancode_fixup)(struct atkbd *, unsigned int); | 244 | static unsigned int (*atkbd_platform_scancode_fixup)(struct atkbd *, unsigned int); |
| 245 | 245 | ||
| 246 | /* | ||
| 247 | * Certain keyboards to not like ATKBD_CMD_RESET_DIS and stop responding | ||
| 248 | * to many commands until full reset (ATKBD_CMD_RESET_BAT) is performed. | ||
| 249 | */ | ||
| 250 | static bool atkbd_skip_deactivate; | ||
| 251 | |||
| 246 | static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf, | 252 | static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf, |
| 247 | ssize_t (*handler)(struct atkbd *, char *)); | 253 | ssize_t (*handler)(struct atkbd *, char *)); |
| 248 | static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count, | 254 | 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) | |||
| 768 | * Make sure nothing is coming from the keyboard and disturbs our | 774 | * Make sure nothing is coming from the keyboard and disturbs our |
| 769 | * internal state. | 775 | * internal state. |
| 770 | */ | 776 | */ |
| 771 | atkbd_deactivate(atkbd); | 777 | if (!atkbd_skip_deactivate) |
| 778 | atkbd_deactivate(atkbd); | ||
| 772 | 779 | ||
| 773 | return 0; | 780 | return 0; |
| 774 | } | 781 | } |
| @@ -1638,6 +1645,12 @@ static int __init atkbd_setup_scancode_fixup(const struct dmi_system_id *id) | |||
| 1638 | return 1; | 1645 | return 1; |
| 1639 | } | 1646 | } |
| 1640 | 1647 | ||
| 1648 | static int __init atkbd_deactivate_fixup(const struct dmi_system_id *id) | ||
| 1649 | { | ||
| 1650 | atkbd_skip_deactivate = true; | ||
| 1651 | return 1; | ||
| 1652 | } | ||
| 1653 | |||
| 1641 | static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = { | 1654 | static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = { |
| 1642 | { | 1655 | { |
| 1643 | .matches = { | 1656 | .matches = { |
| @@ -1775,6 +1788,20 @@ static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = { | |||
| 1775 | .callback = atkbd_setup_scancode_fixup, | 1788 | .callback = atkbd_setup_scancode_fixup, |
| 1776 | .driver_data = atkbd_oqo_01plus_scancode_fixup, | 1789 | .driver_data = atkbd_oqo_01plus_scancode_fixup, |
| 1777 | }, | 1790 | }, |
| 1791 | { | ||
| 1792 | .matches = { | ||
| 1793 | DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"), | ||
| 1794 | DMI_MATCH(DMI_PRODUCT_NAME, "LW25-B7HV"), | ||
| 1795 | }, | ||
| 1796 | .callback = atkbd_deactivate_fixup, | ||
| 1797 | }, | ||
| 1798 | { | ||
| 1799 | .matches = { | ||
| 1800 | DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"), | ||
| 1801 | DMI_MATCH(DMI_PRODUCT_NAME, "P1-J273B"), | ||
| 1802 | }, | ||
| 1803 | .callback = atkbd_deactivate_fixup, | ||
| 1804 | }, | ||
| 1778 | { } | 1805 | { } |
| 1779 | }; | 1806 | }; |
| 1780 | 1807 | ||
