diff options
Diffstat (limited to 'drivers/input/keyboard/atkbd.c')
-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 | ||