aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/keyboard/atkbd.c
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2009-10-13 01:47:25 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2009-10-13 14:07:32 -0400
commitfc0eb28c0031ec2da872dd296b551453eb1963c9 (patch)
treebbb3a8bfc30f4e4dc9caf15280bbf6f11ad56d69 /drivers/input/keyboard/atkbd.c
parent7dcc9c230fcef0067efee17c1f8c3c84494a7ec8 (diff)
Input: atkbd - restore resetting LED state at startup
Fix breakage caused by commit 9605fb48e1998935a5ee70c965f90ad1ac023add While the input core indeed takes care of restoring led state and typematic settings upon resume the driver still need to initialize them properly when registering a new device Reported-and-tested-by: Marin Mitov <mitov@issp.bas.bg> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'drivers/input/keyboard/atkbd.c')
-rw-r--r--drivers/input/keyboard/atkbd.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
index 904d4c9fbf22..73b530424729 100644
--- a/drivers/input/keyboard/atkbd.c
+++ b/drivers/input/keyboard/atkbd.c
@@ -770,6 +770,30 @@ static int atkbd_select_set(struct atkbd *atkbd, int target_set, int allow_extra
770 return 3; 770 return 3;
771} 771}
772 772
773static int atkbd_reset_state(struct atkbd *atkbd)
774{
775 struct ps2dev *ps2dev = &atkbd->ps2dev;
776 unsigned char param[1];
777
778/*
779 * Set the LEDs to a predefined state (all off).
780 */
781
782 param[0] = 0;
783 if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS))
784 return -1;
785
786/*
787 * Set autorepeat to fastest possible.
788 */
789
790 param[0] = 0;
791 if (ps2_command(ps2dev, param, ATKBD_CMD_SETREP))
792 return -1;
793
794 return 0;
795}
796
773static int atkbd_activate(struct atkbd *atkbd) 797static int atkbd_activate(struct atkbd *atkbd)
774{ 798{
775 struct ps2dev *ps2dev = &atkbd->ps2dev; 799 struct ps2dev *ps2dev = &atkbd->ps2dev;
@@ -1087,6 +1111,7 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv)
1087 } 1111 }
1088 1112
1089 atkbd->set = atkbd_select_set(atkbd, atkbd_set, atkbd_extra); 1113 atkbd->set = atkbd_select_set(atkbd, atkbd_set, atkbd_extra);
1114 atkbd_reset_state(atkbd);
1090 atkbd_activate(atkbd); 1115 atkbd_activate(atkbd);
1091 1116
1092 } else { 1117 } else {
@@ -1267,6 +1292,7 @@ static ssize_t atkbd_set_extra(struct atkbd *atkbd, const char *buf, size_t coun
1267 1292
1268 atkbd->dev = new_dev; 1293 atkbd->dev = new_dev;
1269 atkbd->set = atkbd_select_set(atkbd, atkbd->set, value); 1294 atkbd->set = atkbd_select_set(atkbd, atkbd->set, value);
1295 atkbd_reset_state(atkbd);
1270 atkbd_activate(atkbd); 1296 atkbd_activate(atkbd);
1271 atkbd_set_keycode_table(atkbd); 1297 atkbd_set_keycode_table(atkbd);
1272 atkbd_set_device_attrs(atkbd); 1298 atkbd_set_device_attrs(atkbd);