Merge git://git.kernel.org/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6
[linux-2.6] / drivers / input / keyboard / atkbd.c
1 /*
2  * AT and PS/2 keyboard driver
3  *
4  * Copyright (c) 1999-2002 Vojtech Pavlik
5  */
6
7 /*
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License version 2 as published by
10  * the Free Software Foundation.
11  */
12
13 /*
14  * This driver can handle standard AT keyboards and PS/2 keyboards in
15  * Translated and Raw Set 2 and Set 3, as well as AT keyboards on dumb
16  * input-only controllers and AT keyboards connected over a one way RS232
17  * converter.
18  */
19
20 #include <linux/delay.h>
21 #include <linux/module.h>
22 #include <linux/moduleparam.h>
23 #include <linux/slab.h>
24 #include <linux/interrupt.h>
25 #include <linux/init.h>
26 #include <linux/input.h>
27 #include <linux/serio.h>
28 #include <linux/workqueue.h>
29 #include <linux/libps2.h>
30 #include <linux/mutex.h>
31
32 #define DRIVER_DESC     "AT and PS/2 keyboard driver"
33
34 MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
35 MODULE_DESCRIPTION(DRIVER_DESC);
36 MODULE_LICENSE("GPL");
37
38 static int atkbd_set = 2;
39 module_param_named(set, atkbd_set, int, 0);
40 MODULE_PARM_DESC(set, "Select keyboard code set (2 = default, 3 = PS/2 native)");
41
42 #if defined(__i386__) || defined(__x86_64__) || defined(__hppa__)
43 static int atkbd_reset;
44 #else
45 static int atkbd_reset = 1;
46 #endif
47 module_param_named(reset, atkbd_reset, bool, 0);
48 MODULE_PARM_DESC(reset, "Reset keyboard during initialization");
49
50 static int atkbd_softrepeat;
51 module_param_named(softrepeat, atkbd_softrepeat, bool, 0);
52 MODULE_PARM_DESC(softrepeat, "Use software keyboard repeat");
53
54 static int atkbd_softraw = 1;
55 module_param_named(softraw, atkbd_softraw, bool, 0);
56 MODULE_PARM_DESC(softraw, "Use software generated rawmode");
57
58 static int atkbd_scroll;
59 module_param_named(scroll, atkbd_scroll, bool, 0);
60 MODULE_PARM_DESC(scroll, "Enable scroll-wheel on MS Office and similar keyboards");
61
62 static int atkbd_extra;
63 module_param_named(extra, atkbd_extra, bool, 0);
64 MODULE_PARM_DESC(extra, "Enable extra LEDs and keys on IBM RapidAcces, EzKey and similar keyboards");
65
66 /*
67  * Scancode to keycode tables. These are just the default setting, and
68  * are loadable via an userland utility.
69  */
70
71 static unsigned char atkbd_set2_keycode[512] = {
72
73 #ifdef CONFIG_KEYBOARD_ATKBD_HP_KEYCODES
74
75 /* XXX: need a more general approach */
76
77 #include "hpps2atkbd.h" /* include the keyboard scancodes */
78
79 #else
80           0, 67, 65, 63, 61, 59, 60, 88,  0, 68, 66, 64, 62, 15, 41,117,
81           0, 56, 42, 93, 29, 16,  2,  0,  0,  0, 44, 31, 30, 17,  3,  0,
82           0, 46, 45, 32, 18,  5,  4, 95,  0, 57, 47, 33, 20, 19,  6,183,
83           0, 49, 48, 35, 34, 21,  7,184,  0,  0, 50, 36, 22,  8,  9,185,
84           0, 51, 37, 23, 24, 11, 10,  0,  0, 52, 53, 38, 39, 25, 12,  0,
85           0, 89, 40,  0, 26, 13,  0,  0, 58, 54, 28, 27,  0, 43,  0, 85,
86           0, 86, 91, 90, 92,  0, 14, 94,  0, 79,124, 75, 71,121,  0,  0,
87          82, 83, 80, 76, 77, 72,  1, 69, 87, 78, 81, 74, 55, 73, 70, 99,
88
89           0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
90         217,100,255,  0, 97,165,  0,  0,156,  0,  0,  0,  0,  0,  0,125,
91         173,114,  0,113,  0,  0,  0,126,128,  0,  0,140,  0,  0,  0,127,
92         159,  0,115,  0,164,  0,  0,116,158,  0,150,166,  0,  0,  0,142,
93         157,  0,  0,  0,  0,  0,  0,  0,155,  0, 98,  0,  0,163,  0,  0,
94         226,  0,  0,  0,  0,  0,  0,  0,  0,255, 96,  0,  0,  0,143,  0,
95           0,  0,  0,  0,  0,  0,  0,  0,  0,107,  0,105,102,  0,  0,112,
96         110,111,108,112,106,103,  0,119,  0,118,109,  0, 99,104,119,  0,
97
98           0,  0,  0, 65, 99,
99 #endif
100 };
101
102 static unsigned char atkbd_set3_keycode[512] = {
103
104           0,  0,  0,  0,  0,  0,  0, 59,  1,138,128,129,130, 15, 41, 60,
105         131, 29, 42, 86, 58, 16,  2, 61,133, 56, 44, 31, 30, 17,  3, 62,
106         134, 46, 45, 32, 18,  5,  4, 63,135, 57, 47, 33, 20, 19,  6, 64,
107         136, 49, 48, 35, 34, 21,  7, 65,137,100, 50, 36, 22,  8,  9, 66,
108         125, 51, 37, 23, 24, 11, 10, 67,126, 52, 53, 38, 39, 25, 12, 68,
109         113,114, 40, 43, 26, 13, 87, 99, 97, 54, 28, 27, 43, 43, 88, 70,
110         108,105,119,103,111,107, 14,110,  0, 79,106, 75, 71,109,102,104,
111          82, 83, 80, 76, 77, 72, 69, 98,  0, 96, 81,  0, 78, 73, 55,183,
112
113         184,185,186,187, 74, 94, 92, 93,  0,  0,  0,125,126,127,112,  0,
114           0,139,150,163,165,115,152,150,166,140,160,154,113,114,167,168,
115         148,149,147,140
116 };
117
118 static unsigned char atkbd_unxlate_table[128] = {
119           0,118, 22, 30, 38, 37, 46, 54, 61, 62, 70, 69, 78, 85,102, 13,
120          21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 90, 20, 28, 27,
121          35, 43, 52, 51, 59, 66, 75, 76, 82, 14, 18, 93, 26, 34, 33, 42,
122          50, 49, 58, 65, 73, 74, 89,124, 17, 41, 88,  5,  6,  4, 12,  3,
123          11,  2, 10,  1,  9,119,126,108,117,125,123,107,115,116,121,105,
124         114,122,112,113,127, 96, 97,120,  7, 15, 23, 31, 39, 47, 55, 63,
125          71, 79, 86, 94,  8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 87,111,
126          19, 25, 57, 81, 83, 92, 95, 98, 99,100,101,103,104,106,109,110
127 };
128
129 #define ATKBD_CMD_SETLEDS       0x10ed
130 #define ATKBD_CMD_GSCANSET      0x11f0
131 #define ATKBD_CMD_SSCANSET      0x10f0
132 #define ATKBD_CMD_GETID         0x02f2
133 #define ATKBD_CMD_SETREP        0x10f3
134 #define ATKBD_CMD_ENABLE        0x00f4
135 #define ATKBD_CMD_RESET_DIS     0x00f5
136 #define ATKBD_CMD_SETALL_MBR    0x00fa
137 #define ATKBD_CMD_RESET_BAT     0x02ff
138 #define ATKBD_CMD_RESEND        0x00fe
139 #define ATKBD_CMD_EX_ENABLE     0x10ea
140 #define ATKBD_CMD_EX_SETLEDS    0x20eb
141 #define ATKBD_CMD_OK_GETID      0x02e8
142
143 #define ATKBD_RET_ACK           0xfa
144 #define ATKBD_RET_NAK           0xfe
145 #define ATKBD_RET_BAT           0xaa
146 #define ATKBD_RET_EMUL0         0xe0
147 #define ATKBD_RET_EMUL1         0xe1
148 #define ATKBD_RET_RELEASE       0xf0
149 #define ATKBD_RET_HANJA         0xf1
150 #define ATKBD_RET_HANGEUL       0xf2
151 #define ATKBD_RET_ERR           0xff
152
153 #define ATKBD_KEY_UNKNOWN         0
154 #define ATKBD_KEY_NULL          255
155
156 #define ATKBD_SCR_1             254
157 #define ATKBD_SCR_2             253
158 #define ATKBD_SCR_4             252
159 #define ATKBD_SCR_8             251
160 #define ATKBD_SCR_CLICK         250
161 #define ATKBD_SCR_LEFT          249
162 #define ATKBD_SCR_RIGHT         248
163
164 #define ATKBD_SPECIAL           248
165
166 #define ATKBD_LED_EVENT_BIT     0
167 #define ATKBD_REP_EVENT_BIT     1
168
169 #define ATKBD_XL_ERR            0x01
170 #define ATKBD_XL_BAT            0x02
171 #define ATKBD_XL_ACK            0x04
172 #define ATKBD_XL_NAK            0x08
173 #define ATKBD_XL_HANGEUL        0x10
174 #define ATKBD_XL_HANJA          0x20
175
176 static struct {
177         unsigned char keycode;
178         unsigned char set2;
179 } atkbd_scroll_keys[] = {
180         { ATKBD_SCR_1,     0xc5 },
181         { ATKBD_SCR_2,     0x9d },
182         { ATKBD_SCR_4,     0xa4 },
183         { ATKBD_SCR_8,     0x9b },
184         { ATKBD_SCR_CLICK, 0xe0 },
185         { ATKBD_SCR_LEFT,  0xcb },
186         { ATKBD_SCR_RIGHT, 0xd2 },
187 };
188
189 /*
190  * The atkbd control structure
191  */
192
193 struct atkbd {
194
195         struct ps2dev ps2dev;
196         struct input_dev *dev;
197
198         /* Written only during init */
199         char name[64];
200         char phys[32];
201
202         unsigned short id;
203         unsigned char keycode[512];
204         unsigned char set;
205         unsigned char translated;
206         unsigned char extra;
207         unsigned char write;
208         unsigned char softrepeat;
209         unsigned char softraw;
210         unsigned char scroll;
211         unsigned char enabled;
212
213         /* Accessed only from interrupt */
214         unsigned char emul;
215         unsigned char resend;
216         unsigned char release;
217         unsigned long xl_bit;
218         unsigned int last;
219         unsigned long time;
220         unsigned long err_count;
221
222         struct work_struct event_work;
223         struct mutex event_mutex;
224         unsigned long event_mask;
225 };
226
227 static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf,
228                                 ssize_t (*handler)(struct atkbd *, char *));
229 static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count,
230                                 ssize_t (*handler)(struct atkbd *, const char *, size_t));
231 #define ATKBD_DEFINE_ATTR(_name)                                                \
232 static ssize_t atkbd_show_##_name(struct atkbd *, char *);                      \
233 static ssize_t atkbd_set_##_name(struct atkbd *, const char *, size_t);         \
234 static ssize_t atkbd_do_show_##_name(struct device *d,                          \
235                                 struct device_attribute *attr, char *b)         \
236 {                                                                               \
237         return atkbd_attr_show_helper(d, b, atkbd_show_##_name);                \
238 }                                                                               \
239 static ssize_t atkbd_do_set_##_name(struct device *d,                           \
240                         struct device_attribute *attr, const char *b, size_t s) \
241 {                                                                               \
242         return atkbd_attr_set_helper(d, b, s, atkbd_set_##_name);               \
243 }                                                                               \
244 static struct device_attribute atkbd_attr_##_name =                             \
245         __ATTR(_name, S_IWUSR | S_IRUGO, atkbd_do_show_##_name, atkbd_do_set_##_name);
246
247 ATKBD_DEFINE_ATTR(extra);
248 ATKBD_DEFINE_ATTR(scroll);
249 ATKBD_DEFINE_ATTR(set);
250 ATKBD_DEFINE_ATTR(softrepeat);
251 ATKBD_DEFINE_ATTR(softraw);
252
253 #define ATKBD_DEFINE_RO_ATTR(_name)                                             \
254 static ssize_t atkbd_show_##_name(struct atkbd *, char *);                      \
255 static ssize_t atkbd_do_show_##_name(struct device *d,                          \
256                                 struct device_attribute *attr, char *b)         \
257 {                                                                               \
258         return atkbd_attr_show_helper(d, b, atkbd_show_##_name);                \
259 }                                                                               \
260 static struct device_attribute atkbd_attr_##_name =                             \
261         __ATTR(_name, S_IRUGO, atkbd_do_show_##_name, NULL);
262
263 ATKBD_DEFINE_RO_ATTR(err_count);
264
265 static struct attribute *atkbd_attributes[] = {
266         &atkbd_attr_extra.attr,
267         &atkbd_attr_scroll.attr,
268         &atkbd_attr_set.attr,
269         &atkbd_attr_softrepeat.attr,
270         &atkbd_attr_softraw.attr,
271         &atkbd_attr_err_count.attr,
272         NULL
273 };
274
275 static struct attribute_group atkbd_attribute_group = {
276         .attrs  = atkbd_attributes,
277 };
278
279 static const unsigned int xl_table[] = {
280         ATKBD_RET_BAT, ATKBD_RET_ERR, ATKBD_RET_ACK,
281         ATKBD_RET_NAK, ATKBD_RET_HANJA, ATKBD_RET_HANGEUL,
282 };
283
284 /*
285  * Checks if we should mangle the scancode to extract 'release' bit
286  * in translated mode.
287  */
288 static int atkbd_need_xlate(unsigned long xl_bit, unsigned char code)
289 {
290         int i;
291
292         if (code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1)
293                 return 0;
294
295         for (i = 0; i < ARRAY_SIZE(xl_table); i++)
296                 if (code == xl_table[i])
297                         return test_bit(i, &xl_bit);
298
299         return 1;
300 }
301
302 /*
303  * Calculates new value of xl_bit so the driver can distinguish
304  * between make/break pair of scancodes for select keys and PS/2
305  * protocol responses.
306  */
307 static void atkbd_calculate_xl_bit(struct atkbd *atkbd, unsigned char code)
308 {
309         int i;
310
311         for (i = 0; i < ARRAY_SIZE(xl_table); i++) {
312                 if (!((code ^ xl_table[i]) & 0x7f)) {
313                         if (code & 0x80)
314                                 __clear_bit(i, &atkbd->xl_bit);
315                         else
316                                 __set_bit(i, &atkbd->xl_bit);
317                         break;
318                 }
319         }
320 }
321
322 /*
323  * Encode the scancode, 0xe0 prefix, and high bit into a single integer,
324  * keeping kernel 2.4 compatibility for set 2
325  */
326 static unsigned int atkbd_compat_scancode(struct atkbd *atkbd, unsigned int code)
327 {
328         if (atkbd->set == 3) {
329                 if (atkbd->emul == 1)
330                         code |= 0x100;
331         } else {
332                 code = (code & 0x7f) | ((code & 0x80) << 1);
333                 if (atkbd->emul == 1)
334                         code |= 0x80;
335         }
336
337         return code;
338 }
339
340 /*
341  * atkbd_interrupt(). Here takes place processing of data received from
342  * the keyboard into events.
343  */
344
345 static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
346                         unsigned int flags)
347 {
348         struct atkbd *atkbd = serio_get_drvdata(serio);
349         struct input_dev *dev = atkbd->dev;
350         unsigned int code = data;
351         int scroll = 0, hscroll = 0, click = -1, add_release_event = 0;
352         int value;
353         unsigned char keycode;
354
355 #ifdef ATKBD_DEBUG
356         printk(KERN_DEBUG "atkbd.c: Received %02x flags %02x\n", data, flags);
357 #endif
358
359 #if !defined(__i386__) && !defined (__x86_64__)
360         if ((flags & (SERIO_FRAME | SERIO_PARITY)) && (~flags & SERIO_TIMEOUT) && !atkbd->resend && atkbd->write) {
361                 printk(KERN_WARNING "atkbd.c: frame/parity error: %02x\n", flags);
362                 serio_write(serio, ATKBD_CMD_RESEND);
363                 atkbd->resend = 1;
364                 goto out;
365         }
366
367         if (!flags && data == ATKBD_RET_ACK)
368                 atkbd->resend = 0;
369 #endif
370
371         if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_ACK))
372                 if  (ps2_handle_ack(&atkbd->ps2dev, data))
373                         goto out;
374
375         if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_CMD))
376                 if  (ps2_handle_response(&atkbd->ps2dev, data))
377                         goto out;
378
379         if (!atkbd->enabled)
380                 goto out;
381
382         input_event(dev, EV_MSC, MSC_RAW, code);
383
384         if (atkbd->translated) {
385
386                 if (atkbd->emul || atkbd_need_xlate(atkbd->xl_bit, code)) {
387                         atkbd->release = code >> 7;
388                         code &= 0x7f;
389                 }
390
391                 if (!atkbd->emul)
392                         atkbd_calculate_xl_bit(atkbd, data);
393         }
394
395         switch (code) {
396                 case ATKBD_RET_BAT:
397                         atkbd->enabled = 0;
398                         serio_reconnect(atkbd->ps2dev.serio);
399                         goto out;
400                 case ATKBD_RET_EMUL0:
401                         atkbd->emul = 1;
402                         goto out;
403                 case ATKBD_RET_EMUL1:
404                         atkbd->emul = 2;
405                         goto out;
406                 case ATKBD_RET_RELEASE:
407                         atkbd->release = 1;
408                         goto out;
409                 case ATKBD_RET_ACK:
410                 case ATKBD_RET_NAK:
411                         printk(KERN_WARNING "atkbd.c: Spurious %s on %s. "
412                                "Some program might be trying access hardware directly.\n",
413                                data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys);
414                         goto out;
415                 case ATKBD_RET_HANGEUL:
416                 case ATKBD_RET_HANJA:
417                         /*
418                          * These keys do not report release and thus need to be
419                          * flagged properly
420                          */
421                         add_release_event = 1;
422                         break;
423                 case ATKBD_RET_ERR:
424                         atkbd->err_count++;
425 #ifdef ATKBD_DEBUG
426                         printk(KERN_DEBUG "atkbd.c: Keyboard on %s reports too many keys pressed.\n", serio->phys);
427 #endif
428                         goto out;
429         }
430
431         code = atkbd_compat_scancode(atkbd, code);
432
433         if (atkbd->emul && --atkbd->emul)
434                 goto out;
435
436         keycode = atkbd->keycode[code];
437
438         if (keycode != ATKBD_KEY_NULL)
439                 input_event(dev, EV_MSC, MSC_SCAN, code);
440
441         switch (keycode) {
442                 case ATKBD_KEY_NULL:
443                         break;
444                 case ATKBD_KEY_UNKNOWN:
445                         printk(KERN_WARNING
446                                "atkbd.c: Unknown key %s (%s set %d, code %#x on %s).\n",
447                                atkbd->release ? "released" : "pressed",
448                                atkbd->translated ? "translated" : "raw",
449                                atkbd->set, code, serio->phys);
450                         printk(KERN_WARNING
451                                "atkbd.c: Use 'setkeycodes %s%02x <keycode>' to make it known.\n",
452                                code & 0x80 ? "e0" : "", code & 0x7f);
453                         input_sync(dev);
454                         break;
455                 case ATKBD_SCR_1:
456                         scroll = 1 - atkbd->release * 2;
457                         break;
458                 case ATKBD_SCR_2:
459                         scroll = 2 - atkbd->release * 4;
460                         break;
461                 case ATKBD_SCR_4:
462                         scroll = 4 - atkbd->release * 8;
463                         break;
464                 case ATKBD_SCR_8:
465                         scroll = 8 - atkbd->release * 16;
466                         break;
467                 case ATKBD_SCR_CLICK:
468                         click = !atkbd->release;
469                         break;
470                 case ATKBD_SCR_LEFT:
471                         hscroll = -1;
472                         break;
473                 case ATKBD_SCR_RIGHT:
474                         hscroll = 1;
475                         break;
476                 default:
477                         if (atkbd->release) {
478                                 value = 0;
479                                 atkbd->last = 0;
480                         } else if (!atkbd->softrepeat && test_bit(keycode, dev->key)) {
481                                 /* Workaround Toshiba laptop multiple keypress */
482                                 value = time_before(jiffies, atkbd->time) && atkbd->last == code ? 1 : 2;
483                         } else {
484                                 value = 1;
485                                 atkbd->last = code;
486                                 atkbd->time = jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]) / 2;
487                         }
488
489                         input_event(dev, EV_KEY, keycode, value);
490                         input_sync(dev);
491
492                         if (value && add_release_event) {
493                                 input_report_key(dev, keycode, 0);
494                                 input_sync(dev);
495                         }
496         }
497
498         if (atkbd->scroll) {
499                 if (click != -1)
500                         input_report_key(dev, BTN_MIDDLE, click);
501                 input_report_rel(dev, REL_WHEEL, scroll);
502                 input_report_rel(dev, REL_HWHEEL, hscroll);
503                 input_sync(dev);
504         }
505
506         atkbd->release = 0;
507 out:
508         return IRQ_HANDLED;
509 }
510
511 static int atkbd_set_repeat_rate(struct atkbd *atkbd)
512 {
513         const short period[32] =
514                 { 33,  37,  42,  46,  50,  54,  58,  63,  67,  75,  83,  92, 100, 109, 116, 125,
515                  133, 149, 167, 182, 200, 217, 232, 250, 270, 303, 333, 370, 400, 435, 470, 500 };
516         const short delay[4] =
517                 { 250, 500, 750, 1000 };
518
519         struct input_dev *dev = atkbd->dev;
520         unsigned char param;
521         int i = 0, j = 0;
522
523         while (i < ARRAY_SIZE(period) - 1 && period[i] < dev->rep[REP_PERIOD])
524                 i++;
525         dev->rep[REP_PERIOD] = period[i];
526
527         while (j < ARRAY_SIZE(delay) - 1 && delay[j] < dev->rep[REP_DELAY])
528                 j++;
529         dev->rep[REP_DELAY] = delay[j];
530
531         param = i | (j << 5);
532         return ps2_command(&atkbd->ps2dev, &param, ATKBD_CMD_SETREP);
533 }
534
535 static int atkbd_set_leds(struct atkbd *atkbd)
536 {
537         struct input_dev *dev = atkbd->dev;
538         unsigned char param[2];
539
540         param[0] = (test_bit(LED_SCROLLL, dev->led) ? 1 : 0)
541                  | (test_bit(LED_NUML,    dev->led) ? 2 : 0)
542                  | (test_bit(LED_CAPSL,   dev->led) ? 4 : 0);
543         if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS))
544                 return -1;
545
546         if (atkbd->extra) {
547                 param[0] = 0;
548                 param[1] = (test_bit(LED_COMPOSE, dev->led) ? 0x01 : 0)
549                          | (test_bit(LED_SLEEP,   dev->led) ? 0x02 : 0)
550                          | (test_bit(LED_SUSPEND, dev->led) ? 0x04 : 0)
551                          | (test_bit(LED_MISC,    dev->led) ? 0x10 : 0)
552                          | (test_bit(LED_MUTE,    dev->led) ? 0x20 : 0);
553                 if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_EX_SETLEDS))
554                         return -1;
555         }
556
557         return 0;
558 }
559
560 /*
561  * atkbd_event_work() is used to complete processing of events that
562  * can not be processed by input_event() which is often called from
563  * interrupt context.
564  */
565
566 static void atkbd_event_work(struct work_struct *work)
567 {
568         struct atkbd *atkbd = container_of(work, struct atkbd, event_work);
569
570         mutex_lock(&atkbd->event_mutex);
571
572         if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask))
573                 atkbd_set_leds(atkbd);
574
575         if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask))
576                 atkbd_set_repeat_rate(atkbd);
577
578         mutex_unlock(&atkbd->event_mutex);
579 }
580
581 /*
582  * Event callback from the input module. Events that change the state of
583  * the hardware are processed here. If action can not be performed in
584  * interrupt context it is offloaded to atkbd_event_work.
585  */
586
587 static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
588 {
589         struct atkbd *atkbd = input_get_drvdata(dev);
590
591         if (!atkbd->write)
592                 return -1;
593
594         switch (type) {
595
596                 case EV_LED:
597                         set_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask);
598                         wmb();
599                         schedule_work(&atkbd->event_work);
600                         return 0;
601
602                 case EV_REP:
603
604                         if (!atkbd->softrepeat) {
605                                 set_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask);
606                                 wmb();
607                                 schedule_work(&atkbd->event_work);
608                         }
609
610                         return 0;
611         }
612
613         return -1;
614 }
615
616 /*
617  * atkbd_enable() signals that interrupt handler is allowed to
618  * generate input events.
619  */
620
621 static inline void atkbd_enable(struct atkbd *atkbd)
622 {
623         serio_pause_rx(atkbd->ps2dev.serio);
624         atkbd->enabled = 1;
625         serio_continue_rx(atkbd->ps2dev.serio);
626 }
627
628 /*
629  * atkbd_disable() tells input handler that all incoming data except
630  * for ACKs and command response should be dropped.
631  */
632
633 static inline void atkbd_disable(struct atkbd *atkbd)
634 {
635         serio_pause_rx(atkbd->ps2dev.serio);
636         atkbd->enabled = 0;
637         serio_continue_rx(atkbd->ps2dev.serio);
638 }
639
640 /*
641  * atkbd_probe() probes for an AT keyboard on a serio port.
642  */
643
644 static int atkbd_probe(struct atkbd *atkbd)
645 {
646         struct ps2dev *ps2dev = &atkbd->ps2dev;
647         unsigned char param[2];
648
649 /*
650  * Some systems, where the bit-twiddling when testing the io-lines of the
651  * controller may confuse the keyboard need a full reset of the keyboard. On
652  * these systems the BIOS also usually doesn't do it for us.
653  */
654
655         if (atkbd_reset)
656                 if (ps2_command(ps2dev, NULL, ATKBD_CMD_RESET_BAT))
657                         printk(KERN_WARNING "atkbd.c: keyboard reset failed on %s\n", ps2dev->serio->phys);
658
659 /*
660  * Then we check the keyboard ID. We should get 0xab83 under normal conditions.
661  * Some keyboards report different values, but the first byte is always 0xab or
662  * 0xac. Some old AT keyboards don't report anything. If a mouse is connected, this
663  * should make sure we don't try to set the LEDs on it.
664  */
665
666         param[0] = param[1] = 0xa5;     /* initialize with invalid values */
667         if (ps2_command(ps2dev, param, ATKBD_CMD_GETID)) {
668
669 /*
670  * If the get ID command failed, we check if we can at least set the LEDs on
671  * the keyboard. This should work on every keyboard out there. It also turns
672  * the LEDs off, which we want anyway.
673  */
674                 param[0] = 0;
675                 if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS))
676                         return -1;
677                 atkbd->id = 0xabba;
678                 return 0;
679         }
680
681         if (!ps2_is_keyboard_id(param[0]))
682                 return -1;
683
684         atkbd->id = (param[0] << 8) | param[1];
685
686         if (atkbd->id == 0xaca1 && atkbd->translated) {
687                 printk(KERN_ERR "atkbd.c: NCD terminal keyboards are only supported on non-translating\n");
688                 printk(KERN_ERR "atkbd.c: controllers. Use i8042.direct=1 to disable translation.\n");
689                 return -1;
690         }
691
692         return 0;
693 }
694
695 /*
696  * atkbd_select_set checks if a keyboard has a working Set 3 support, and
697  * sets it into that. Unfortunately there are keyboards that can be switched
698  * to Set 3, but don't work well in that (BTC Multimedia ...)
699  */
700
701 static int atkbd_select_set(struct atkbd *atkbd, int target_set, int allow_extra)
702 {
703         struct ps2dev *ps2dev = &atkbd->ps2dev;
704         unsigned char param[2];
705
706         atkbd->extra = 0;
707 /*
708  * For known special keyboards we can go ahead and set the correct set.
709  * We check for NCD PS/2 Sun, NorthGate OmniKey 101 and
710  * IBM RapidAccess / IBM EzButton / Chicony KBP-8993 keyboards.
711  */
712
713         if (atkbd->translated)
714                 return 2;
715
716         if (atkbd->id == 0xaca1) {
717                 param[0] = 3;
718                 ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET);
719                 return 3;
720         }
721
722         if (allow_extra) {
723                 param[0] = 0x71;
724                 if (!ps2_command(ps2dev, param, ATKBD_CMD_EX_ENABLE)) {
725                         atkbd->extra = 1;
726                         return 2;
727                 }
728         }
729
730         if (target_set != 3)
731                 return 2;
732
733         if (!ps2_command(ps2dev, param, ATKBD_CMD_OK_GETID)) {
734                 atkbd->id = param[0] << 8 | param[1];
735                 return 2;
736         }
737
738         param[0] = 3;
739         if (ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET))
740                 return 2;
741
742         param[0] = 0;
743         if (ps2_command(ps2dev, param, ATKBD_CMD_GSCANSET))
744                 return 2;
745
746         if (param[0] != 3) {
747                 param[0] = 2;
748                 if (ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET))
749                 return 2;
750         }
751
752         ps2_command(ps2dev, param, ATKBD_CMD_SETALL_MBR);
753
754         return 3;
755 }
756
757 static int atkbd_activate(struct atkbd *atkbd)
758 {
759         struct ps2dev *ps2dev = &atkbd->ps2dev;
760         unsigned char param[1];
761
762 /*
763  * Set the LEDs to a defined state.
764  */
765
766         param[0] = 0;
767         if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS))
768                 return -1;
769
770 /*
771  * Set autorepeat to fastest possible.
772  */
773
774         param[0] = 0;
775         if (ps2_command(ps2dev, param, ATKBD_CMD_SETREP))
776                 return -1;
777
778 /*
779  * Enable the keyboard to receive keystrokes.
780  */
781
782         if (ps2_command(ps2dev, NULL, ATKBD_CMD_ENABLE)) {
783                 printk(KERN_ERR "atkbd.c: Failed to enable keyboard on %s\n",
784                         ps2dev->serio->phys);
785                 return -1;
786         }
787
788         return 0;
789 }
790
791 /*
792  * atkbd_cleanup() restores the keyboard state so that BIOS is happy after a
793  * reboot.
794  */
795
796 static void atkbd_cleanup(struct serio *serio)
797 {
798         struct atkbd *atkbd = serio_get_drvdata(serio);
799         ps2_command(&atkbd->ps2dev, NULL, ATKBD_CMD_RESET_BAT);
800 }
801
802
803 /*
804  * atkbd_disconnect() closes and frees.
805  */
806
807 static void atkbd_disconnect(struct serio *serio)
808 {
809         struct atkbd *atkbd = serio_get_drvdata(serio);
810
811         atkbd_disable(atkbd);
812
813         /* make sure we don't have a command in flight */
814         synchronize_sched();  /* Allow atkbd_interrupt()s to complete. */
815         flush_scheduled_work();
816
817         sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group);
818         input_unregister_device(atkbd->dev);
819         serio_close(serio);
820         serio_set_drvdata(serio, NULL);
821         kfree(atkbd);
822 }
823
824
825 /*
826  * atkbd_set_keycode_table() initializes keyboard's keycode table
827  * according to the selected scancode set
828  */
829
830 static void atkbd_set_keycode_table(struct atkbd *atkbd)
831 {
832         int i, j;
833
834         memset(atkbd->keycode, 0, sizeof(atkbd->keycode));
835
836         if (atkbd->translated) {
837                 for (i = 0; i < 128; i++) {
838                         atkbd->keycode[i] = atkbd_set2_keycode[atkbd_unxlate_table[i]];
839                         atkbd->keycode[i | 0x80] = atkbd_set2_keycode[atkbd_unxlate_table[i] | 0x80];
840                         if (atkbd->scroll)
841                                 for (j = 0; j < ARRAY_SIZE(atkbd_scroll_keys); j++)
842                                         if ((atkbd_unxlate_table[i] | 0x80) == atkbd_scroll_keys[j].set2)
843                                                 atkbd->keycode[i | 0x80] = atkbd_scroll_keys[j].keycode;
844                 }
845         } else if (atkbd->set == 3) {
846                 memcpy(atkbd->keycode, atkbd_set3_keycode, sizeof(atkbd->keycode));
847         } else {
848                 memcpy(atkbd->keycode, atkbd_set2_keycode, sizeof(atkbd->keycode));
849
850                 if (atkbd->scroll)
851                         for (i = 0; i < ARRAY_SIZE(atkbd_scroll_keys); i++)
852                                 atkbd->keycode[atkbd_scroll_keys[i].set2] = atkbd_scroll_keys[i].keycode;
853         }
854
855         atkbd->keycode[atkbd_compat_scancode(atkbd, ATKBD_RET_HANGEUL)] = KEY_HANGUEL;
856         atkbd->keycode[atkbd_compat_scancode(atkbd, ATKBD_RET_HANJA)] = KEY_HANJA;
857 }
858
859 /*
860  * atkbd_set_device_attrs() sets up keyboard's input device structure
861  */
862
863 static void atkbd_set_device_attrs(struct atkbd *atkbd)
864 {
865         struct input_dev *input_dev = atkbd->dev;
866         int i;
867
868         if (atkbd->extra)
869                 snprintf(atkbd->name, sizeof(atkbd->name),
870                          "AT Set 2 Extra keyboard");
871         else
872                 snprintf(atkbd->name, sizeof(atkbd->name),
873                          "AT %s Set %d keyboard",
874                          atkbd->translated ? "Translated" : "Raw", atkbd->set);
875
876         snprintf(atkbd->phys, sizeof(atkbd->phys),
877                  "%s/input0", atkbd->ps2dev.serio->phys);
878
879         input_dev->name = atkbd->name;
880         input_dev->phys = atkbd->phys;
881         input_dev->id.bustype = BUS_I8042;
882         input_dev->id.vendor = 0x0001;
883         input_dev->id.product = atkbd->translated ? 1 : atkbd->set;
884         input_dev->id.version = atkbd->id;
885         input_dev->event = atkbd_event;
886         input_dev->dev.parent = &atkbd->ps2dev.serio->dev;
887
888         input_set_drvdata(input_dev, atkbd);
889
890         input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP) | BIT(EV_MSC);
891
892         if (atkbd->write) {
893                 input_dev->evbit[0] |= BIT(EV_LED);
894                 input_dev->ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL);
895         }
896
897         if (atkbd->extra)
898                 input_dev->ledbit[0] |= BIT(LED_COMPOSE) | BIT(LED_SUSPEND) |
899                                         BIT(LED_SLEEP) | BIT(LED_MUTE) | BIT(LED_MISC);
900
901         if (!atkbd->softrepeat) {
902                 input_dev->rep[REP_DELAY] = 250;
903                 input_dev->rep[REP_PERIOD] = 33;
904         }
905
906         input_dev->mscbit[0] = atkbd->softraw ? BIT(MSC_SCAN) : BIT(MSC_RAW) | BIT(MSC_SCAN);
907
908         if (atkbd->scroll) {
909                 input_dev->evbit[0] |= BIT(EV_REL);
910                 input_dev->relbit[0] = BIT(REL_WHEEL) | BIT(REL_HWHEEL);
911                 set_bit(BTN_MIDDLE, input_dev->keybit);
912         }
913
914         input_dev->keycode = atkbd->keycode;
915         input_dev->keycodesize = sizeof(unsigned char);
916         input_dev->keycodemax = ARRAY_SIZE(atkbd_set2_keycode);
917
918         for (i = 0; i < 512; i++)
919                 if (atkbd->keycode[i] && atkbd->keycode[i] < ATKBD_SPECIAL)
920                         set_bit(atkbd->keycode[i], input_dev->keybit);
921 }
922
923 /*
924  * atkbd_connect() is called when the serio module finds an interface
925  * that isn't handled yet by an appropriate device driver. We check if
926  * there is an AT keyboard out there and if yes, we register ourselves
927  * to the input module.
928  */
929
930 static int atkbd_connect(struct serio *serio, struct serio_driver *drv)
931 {
932         struct atkbd *atkbd;
933         struct input_dev *dev;
934         int err = -ENOMEM;
935
936         atkbd = kzalloc(sizeof(struct atkbd), GFP_KERNEL);
937         dev = input_allocate_device();
938         if (!atkbd || !dev)
939                 goto fail1;
940
941         atkbd->dev = dev;
942         ps2_init(&atkbd->ps2dev, serio);
943         INIT_WORK(&atkbd->event_work, atkbd_event_work);
944         mutex_init(&atkbd->event_mutex);
945
946         switch (serio->id.type) {
947
948                 case SERIO_8042_XL:
949                         atkbd->translated = 1;
950                 case SERIO_8042:
951                         if (serio->write)
952                                 atkbd->write = 1;
953                         break;
954         }
955
956         atkbd->softraw = atkbd_softraw;
957         atkbd->softrepeat = atkbd_softrepeat;
958         atkbd->scroll = atkbd_scroll;
959
960         if (atkbd->softrepeat)
961                 atkbd->softraw = 1;
962
963         serio_set_drvdata(serio, atkbd);
964
965         err = serio_open(serio, drv);
966         if (err)
967                 goto fail2;
968
969         if (atkbd->write) {
970
971                 if (atkbd_probe(atkbd)) {
972                         err = -ENODEV;
973                         goto fail3;
974                 }
975
976                 atkbd->set = atkbd_select_set(atkbd, atkbd_set, atkbd_extra);
977                 atkbd_activate(atkbd);
978
979         } else {
980                 atkbd->set = 2;
981                 atkbd->id = 0xab00;
982         }
983
984         atkbd_set_keycode_table(atkbd);
985         atkbd_set_device_attrs(atkbd);
986
987         err = sysfs_create_group(&serio->dev.kobj, &atkbd_attribute_group);
988         if (err)
989                 goto fail3;
990
991         atkbd_enable(atkbd);
992
993         err = input_register_device(atkbd->dev);
994         if (err)
995                 goto fail4;
996
997         return 0;
998
999  fail4: sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group);
1000  fail3: serio_close(serio);
1001  fail2: serio_set_drvdata(serio, NULL);
1002  fail1: input_free_device(dev);
1003         kfree(atkbd);
1004         return err;
1005 }
1006
1007 /*
1008  * atkbd_reconnect() tries to restore keyboard into a sane state and is
1009  * most likely called on resume.
1010  */
1011
1012 static int atkbd_reconnect(struct serio *serio)
1013 {
1014         struct atkbd *atkbd = serio_get_drvdata(serio);
1015         struct serio_driver *drv = serio->drv;
1016
1017         if (!atkbd || !drv) {
1018                 printk(KERN_DEBUG "atkbd: reconnect request, but serio is disconnected, ignoring...\n");
1019                 return -1;
1020         }
1021
1022         atkbd_disable(atkbd);
1023
1024         if (atkbd->write) {
1025                 if (atkbd_probe(atkbd))
1026                         return -1;
1027                 if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra))
1028                         return -1;
1029
1030                 atkbd_activate(atkbd);
1031
1032 /*
1033  * Restore repeat rate and LEDs (that were reset by atkbd_activate)
1034  * to pre-resume state
1035  */
1036                 if (!atkbd->softrepeat)
1037                         atkbd_set_repeat_rate(atkbd);
1038                 atkbd_set_leds(atkbd);
1039         }
1040
1041         atkbd_enable(atkbd);
1042
1043         return 0;
1044 }
1045
1046 static struct serio_device_id atkbd_serio_ids[] = {
1047         {
1048                 .type   = SERIO_8042,
1049                 .proto  = SERIO_ANY,
1050                 .id     = SERIO_ANY,
1051                 .extra  = SERIO_ANY,
1052         },
1053         {
1054                 .type   = SERIO_8042_XL,
1055                 .proto  = SERIO_ANY,
1056                 .id     = SERIO_ANY,
1057                 .extra  = SERIO_ANY,
1058         },
1059         {
1060                 .type   = SERIO_RS232,
1061                 .proto  = SERIO_PS2SER,
1062                 .id     = SERIO_ANY,
1063                 .extra  = SERIO_ANY,
1064         },
1065         { 0 }
1066 };
1067
1068 MODULE_DEVICE_TABLE(serio, atkbd_serio_ids);
1069
1070 static struct serio_driver atkbd_drv = {
1071         .driver         = {
1072                 .name   = "atkbd",
1073         },
1074         .description    = DRIVER_DESC,
1075         .id_table       = atkbd_serio_ids,
1076         .interrupt      = atkbd_interrupt,
1077         .connect        = atkbd_connect,
1078         .reconnect      = atkbd_reconnect,
1079         .disconnect     = atkbd_disconnect,
1080         .cleanup        = atkbd_cleanup,
1081 };
1082
1083 static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf,
1084                                 ssize_t (*handler)(struct atkbd *, char *))
1085 {
1086         struct serio *serio = to_serio_port(dev);
1087         int retval;
1088
1089         retval = serio_pin_driver(serio);
1090         if (retval)
1091                 return retval;
1092
1093         if (serio->drv != &atkbd_drv) {
1094                 retval = -ENODEV;
1095                 goto out;
1096         }
1097
1098         retval = handler((struct atkbd *)serio_get_drvdata(serio), buf);
1099
1100 out:
1101         serio_unpin_driver(serio);
1102         return retval;
1103 }
1104
1105 static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count,
1106                                 ssize_t (*handler)(struct atkbd *, const char *, size_t))
1107 {
1108         struct serio *serio = to_serio_port(dev);
1109         struct atkbd *atkbd;
1110         int retval;
1111
1112         retval = serio_pin_driver(serio);
1113         if (retval)
1114                 return retval;
1115
1116         if (serio->drv != &atkbd_drv) {
1117                 retval = -ENODEV;
1118                 goto out;
1119         }
1120
1121         atkbd = serio_get_drvdata(serio);
1122         atkbd_disable(atkbd);
1123         retval = handler(atkbd, buf, count);
1124         atkbd_enable(atkbd);
1125
1126 out:
1127         serio_unpin_driver(serio);
1128         return retval;
1129 }
1130
1131 static ssize_t atkbd_show_extra(struct atkbd *atkbd, char *buf)
1132 {
1133         return sprintf(buf, "%d\n", atkbd->extra ? 1 : 0);
1134 }
1135
1136 static ssize_t atkbd_set_extra(struct atkbd *atkbd, const char *buf, size_t count)
1137 {
1138         struct input_dev *old_dev, *new_dev;
1139         unsigned long value;
1140         char *rest;
1141         int err;
1142         unsigned char old_extra, old_set;
1143
1144         if (!atkbd->write)
1145                 return -EIO;
1146
1147         value = simple_strtoul(buf, &rest, 10);
1148         if (*rest || value > 1)
1149                 return -EINVAL;
1150
1151         if (atkbd->extra != value) {
1152                 /*
1153                  * Since device's properties will change we need to
1154                  * unregister old device. But allocate and register
1155                  * new one first to make sure we have it.
1156                  */
1157                 old_dev = atkbd->dev;
1158                 old_extra = atkbd->extra;
1159                 old_set = atkbd->set;
1160
1161                 new_dev = input_allocate_device();
1162                 if (!new_dev)
1163                         return -ENOMEM;
1164
1165                 atkbd->dev = new_dev;
1166                 atkbd->set = atkbd_select_set(atkbd, atkbd->set, value);
1167                 atkbd_activate(atkbd);
1168                 atkbd_set_keycode_table(atkbd);
1169                 atkbd_set_device_attrs(atkbd);
1170
1171                 err = input_register_device(atkbd->dev);
1172                 if (err) {
1173                         input_free_device(new_dev);
1174
1175                         atkbd->dev = old_dev;
1176                         atkbd->set = atkbd_select_set(atkbd, old_set, old_extra);
1177                         atkbd_set_keycode_table(atkbd);
1178                         atkbd_set_device_attrs(atkbd);
1179
1180                         return err;
1181                 }
1182                 input_unregister_device(old_dev);
1183
1184         }
1185         return count;
1186 }
1187
1188 static ssize_t atkbd_show_scroll(struct atkbd *atkbd, char *buf)
1189 {
1190         return sprintf(buf, "%d\n", atkbd->scroll ? 1 : 0);
1191 }
1192
1193 static ssize_t atkbd_set_scroll(struct atkbd *atkbd, const char *buf, size_t count)
1194 {
1195         struct input_dev *old_dev, *new_dev;
1196         unsigned long value;
1197         char *rest;
1198         int err;
1199         unsigned char old_scroll;
1200
1201         value = simple_strtoul(buf, &rest, 10);
1202         if (*rest || value > 1)
1203                 return -EINVAL;
1204
1205         if (atkbd->scroll != value) {
1206                 old_dev = atkbd->dev;
1207                 old_scroll = atkbd->scroll;
1208
1209                 new_dev = input_allocate_device();
1210                 if (!new_dev)
1211                         return -ENOMEM;
1212
1213                 atkbd->dev = new_dev;
1214                 atkbd->scroll = value;
1215                 atkbd_set_keycode_table(atkbd);
1216                 atkbd_set_device_attrs(atkbd);
1217
1218                 err = input_register_device(atkbd->dev);
1219                 if (err) {
1220                         input_free_device(new_dev);
1221
1222                         atkbd->scroll = old_scroll;
1223                         atkbd->dev = old_dev;
1224                         atkbd_set_keycode_table(atkbd);
1225                         atkbd_set_device_attrs(atkbd);
1226
1227                         return err;
1228                 }
1229                 input_unregister_device(old_dev);
1230         }
1231         return count;
1232 }
1233
1234 static ssize_t atkbd_show_set(struct atkbd *atkbd, char *buf)
1235 {
1236         return sprintf(buf, "%d\n", atkbd->set);
1237 }
1238
1239 static ssize_t atkbd_set_set(struct atkbd *atkbd, const char *buf, size_t count)
1240 {
1241         struct input_dev *old_dev, *new_dev;
1242         unsigned long value;
1243         char *rest;
1244         int err;
1245         unsigned char old_set, old_extra;
1246
1247         if (!atkbd->write)
1248                 return -EIO;
1249
1250         value = simple_strtoul(buf, &rest, 10);
1251         if (*rest || (value != 2 && value != 3))
1252                 return -EINVAL;
1253
1254         if (atkbd->set != value) {
1255                 old_dev = atkbd->dev;
1256                 old_extra = atkbd->extra;
1257                 old_set = atkbd->set;
1258
1259                 new_dev = input_allocate_device();
1260                 if (!new_dev)
1261                         return -ENOMEM;
1262
1263                 atkbd->dev = new_dev;
1264                 atkbd->set = atkbd_select_set(atkbd, value, atkbd->extra);
1265                 atkbd_activate(atkbd);
1266                 atkbd_set_keycode_table(atkbd);
1267                 atkbd_set_device_attrs(atkbd);
1268
1269                 err = input_register_device(atkbd->dev);
1270                 if (err) {
1271                         input_free_device(new_dev);
1272
1273                         atkbd->dev = old_dev;
1274                         atkbd->set = atkbd_select_set(atkbd, old_set, old_extra);
1275                         atkbd_set_keycode_table(atkbd);
1276                         atkbd_set_device_attrs(atkbd);
1277
1278                         return err;
1279                 }
1280                 input_unregister_device(old_dev);
1281         }
1282         return count;
1283 }
1284
1285 static ssize_t atkbd_show_softrepeat(struct atkbd *atkbd, char *buf)
1286 {
1287         return sprintf(buf, "%d\n", atkbd->softrepeat ? 1 : 0);
1288 }
1289
1290 static ssize_t atkbd_set_softrepeat(struct atkbd *atkbd, const char *buf, size_t count)
1291 {
1292         struct input_dev *old_dev, *new_dev;
1293         unsigned long value;
1294         char *rest;
1295         int err;
1296         unsigned char old_softrepeat, old_softraw;
1297
1298         if (!atkbd->write)
1299                 return -EIO;
1300
1301         value = simple_strtoul(buf, &rest, 10);
1302         if (*rest || value > 1)
1303                 return -EINVAL;
1304
1305         if (atkbd->softrepeat != value) {
1306                 old_dev = atkbd->dev;
1307                 old_softrepeat = atkbd->softrepeat;
1308                 old_softraw = atkbd->softraw;
1309
1310                 new_dev = input_allocate_device();
1311                 if (!new_dev)
1312                         return -ENOMEM;
1313
1314                 atkbd->dev = new_dev;
1315                 atkbd->softrepeat = value;
1316                 if (atkbd->softrepeat)
1317                         atkbd->softraw = 1;
1318                 atkbd_set_device_attrs(atkbd);
1319
1320                 err = input_register_device(atkbd->dev);
1321                 if (err) {
1322                         input_free_device(new_dev);
1323
1324                         atkbd->dev = old_dev;
1325                         atkbd->softrepeat = old_softrepeat;
1326                         atkbd->softraw = old_softraw;
1327                         atkbd_set_device_attrs(atkbd);
1328
1329                         return err;
1330                 }
1331                 input_unregister_device(old_dev);
1332         }
1333         return count;
1334 }
1335
1336
1337 static ssize_t atkbd_show_softraw(struct atkbd *atkbd, char *buf)
1338 {
1339         return sprintf(buf, "%d\n", atkbd->softraw ? 1 : 0);
1340 }
1341
1342 static ssize_t atkbd_set_softraw(struct atkbd *atkbd, const char *buf, size_t count)
1343 {
1344         struct input_dev *old_dev, *new_dev;
1345         unsigned long value;
1346         char *rest;
1347         int err;
1348         unsigned char old_softraw;
1349
1350         value = simple_strtoul(buf, &rest, 10);
1351         if (*rest || value > 1)
1352                 return -EINVAL;
1353
1354         if (atkbd->softraw != value) {
1355                 old_dev = atkbd->dev;
1356                 old_softraw = atkbd->softraw;
1357
1358                 new_dev = input_allocate_device();
1359                 if (!new_dev)
1360                         return -ENOMEM;
1361
1362                 atkbd->dev = new_dev;
1363                 atkbd->softraw = value;
1364                 atkbd_set_device_attrs(atkbd);
1365
1366                 err = input_register_device(atkbd->dev);
1367                 if (err) {
1368                         input_free_device(new_dev);
1369
1370                         atkbd->dev = old_dev;
1371                         atkbd->softraw = old_softraw;
1372                         atkbd_set_device_attrs(atkbd);
1373
1374                         return err;
1375                 }
1376                 input_unregister_device(old_dev);
1377         }
1378         return count;
1379 }
1380
1381 static ssize_t atkbd_show_err_count(struct atkbd *atkbd, char *buf)
1382 {
1383         return sprintf(buf, "%lu\n", atkbd->err_count);
1384 }
1385
1386
1387 static int __init atkbd_init(void)
1388 {
1389         return serio_register_driver(&atkbd_drv);
1390 }
1391
1392 static void __exit atkbd_exit(void)
1393 {
1394         serio_unregister_driver(&atkbd_drv);
1395 }
1396
1397 module_init(atkbd_init);
1398 module_exit(atkbd_exit);