Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  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 
 31 #define DRIVER_DESC     "AT and PS/2 keyboard driver"
 32 
 33 MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
 34 MODULE_DESCRIPTION(DRIVER_DESC);
 35 MODULE_LICENSE("GPL");
 36 
 37 static int atkbd_set = 2;
 38 module_param_named(set, atkbd_set, int, 0);
 39 MODULE_PARM_DESC(set, "Select keyboard code set (2 = default, 3 = PS/2 native)");
 40 
 41 #if defined(__i386__) || defined(__x86_64__) || defined(__hppa__)
 42 static int atkbd_reset;
 43 #else
 44 static int atkbd_reset = 1;
 45 #endif
 46 module_param_named(reset, atkbd_reset, bool, 0);
 47 MODULE_PARM_DESC(reset, "Reset keyboard during initialization");
 48 
 49 static int atkbd_softrepeat;
 50 module_param_named(softrepeat, atkbd_softrepeat, bool, 0);
 51 MODULE_PARM_DESC(softrepeat, "Use software keyboard repeat");
 52 
 53 static int atkbd_softraw = 1;
 54 module_param_named(softraw, atkbd_softraw, bool, 0);
 55 MODULE_PARM_DESC(softraw, "Use software generated rawmode");
 56 
 57 static int atkbd_scroll;
 58 module_param_named(scroll, atkbd_scroll, bool, 0);
 59 MODULE_PARM_DESC(scroll, "Enable scroll-wheel on MS Office and similar keyboards");
 60 
 61 static int atkbd_extra;
 62 module_param_named(extra, atkbd_extra, bool, 0);
 63 MODULE_PARM_DESC(extra, "Enable extra LEDs and keys on IBM RapidAcces, EzKey and similar keyboards");
 64 
 65 __obsolete_setup("atkbd_set=");
 66 __obsolete_setup("atkbd_reset");
 67 __obsolete_setup("atkbd_softrepeat=");
 68 
 69 /*
 70  * Scancode to keycode tables. These are just the default setting, and
 71  * are loadable via an userland utility.
 72  */
 73 
 74 #if defined(__hppa__)
 75 #include "hpps2atkbd.h"
 76 #else
 77 
 78 static unsigned char atkbd_set2_keycode[512] = {
 79 
 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 };
100 
101 #endif
102 
103 static unsigned char atkbd_set3_keycode[512] = {
104 
105           0,  0,  0,  0,  0,  0,  0, 59,  1,138,128,129,130, 15, 41, 60,
106         131, 29, 42, 86, 58, 16,  2, 61,133, 56, 44, 31, 30, 17,  3, 62,
107         134, 46, 45, 32, 18,  5,  4, 63,135, 57, 47, 33, 20, 19,  6, 64,
108         136, 49, 48, 35, 34, 21,  7, 65,137,100, 50, 36, 22,  8,  9, 66,
109         125, 51, 37, 23, 24, 11, 10, 67,126, 52, 53, 38, 39, 25, 12, 68,
110         113,114, 40, 43, 26, 13, 87, 99, 97, 54, 28, 27, 43, 43, 88, 70,
111         108,105,119,103,111,107, 14,110,  0, 79,106, 75, 71,109,102,104,
112          82, 83, 80, 76, 77, 72, 69, 98,  0, 96, 81,  0, 78, 73, 55,183,
113 
114         184,185,186,187, 74, 94, 92, 93,  0,  0,  0,125,126,127,112,  0,
115           0,139,150,163,165,115,152,150,166,140,160,154,113,114,167,168,
116         148,149,147,140
117 };
118 
119 static unsigned char atkbd_unxlate_table[128] = {
120           0,118, 22, 30, 38, 37, 46, 54, 61, 62, 70, 69, 78, 85,102, 13,
121          21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 90, 20, 28, 27,
122          35, 43, 52, 51, 59, 66, 75, 76, 82, 14, 18, 93, 26, 34, 33, 42,
123          50, 49, 58, 65, 73, 74, 89,124, 17, 41, 88,  5,  6,  4, 12,  3,
124          11,  2, 10,  1,  9,119,126,108,117,125,123,107,115,116,121,105,
125         114,122,112,113,127, 96, 97,120,  7, 15, 23, 31, 39, 47, 55, 63,
126          71, 79, 86, 94,  8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 87,111,
127          19, 25, 57, 81, 83, 92, 95, 98, 99,100,101,103,104,106,109,110
128 };
129 
130 #define ATKBD_CMD_SETLEDS       0x10ed
131 #define ATKBD_CMD_GSCANSET      0x11f0
132 #define ATKBD_CMD_SSCANSET      0x10f0
133 #define ATKBD_CMD_GETID         0x02f2
134 #define ATKBD_CMD_SETREP        0x10f3
135 #define ATKBD_CMD_ENABLE        0x00f4
136 #define ATKBD_CMD_RESET_DIS     0x00f5
137 #define ATKBD_CMD_SETALL_MBR    0x00fa
138 #define ATKBD_CMD_RESET_BAT     0x02ff
139 #define ATKBD_CMD_RESEND        0x00fe
140 #define ATKBD_CMD_EX_ENABLE     0x10ea
141 #define ATKBD_CMD_EX_SETLEDS    0x20eb
142 #define ATKBD_CMD_OK_GETID      0x02e8
143 
144 
145 #define ATKBD_RET_ACK           0xfa
146 #define ATKBD_RET_NAK           0xfe
147 #define ATKBD_RET_BAT           0xaa
148 #define ATKBD_RET_EMUL0         0xe0
149 #define ATKBD_RET_EMUL1         0xe1
150 #define ATKBD_RET_RELEASE       0xf0
151 #define ATKBD_RET_HANGUEL       0xf1
152 #define ATKBD_RET_HANJA         0xf2
153 #define ATKBD_RET_ERR           0xff
154 
155 #define ATKBD_KEY_UNKNOWN         0
156 #define ATKBD_KEY_NULL          255
157 
158 #define ATKBD_SCR_1             254
159 #define ATKBD_SCR_2             253
160 #define ATKBD_SCR_4             252
161 #define ATKBD_SCR_8             251
162 #define ATKBD_SCR_CLICK         250
163 
164 #define ATKBD_SPECIAL           250
165 
166 static unsigned char atkbd_scroll_keys[5][2] = {
167         { ATKBD_SCR_1,     0x45 },
168         { ATKBD_SCR_2,     0x29 },
169         { ATKBD_SCR_4,     0x36 },
170         { ATKBD_SCR_8,     0x27 },
171         { ATKBD_SCR_CLICK, 0x60 },
172 };
173 
174 /*
175  * The atkbd control structure
176  */
177 
178 struct atkbd {
179 
180         struct ps2dev   ps2dev;
181 
182         /* Written only during init */
183         char name[64];
184         char phys[32];
185         struct input_dev dev;
186 
187         unsigned short id;
188         unsigned char keycode[512];
189         unsigned char set;
190         unsigned char translated;
191         unsigned char extra;
192         unsigned char write;
193         unsigned char softrepeat;
194         unsigned char softraw;
195         unsigned char scroll;
196         unsigned char enabled;
197 
198         /* Accessed only from interrupt */
199         unsigned char emul;
200         unsigned char resend;
201         unsigned char release;
202         unsigned char bat_xl;
203         unsigned int last;
204         unsigned long time;
205 };
206 
207 static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf,
208                                 ssize_t (*handler)(struct atkbd *, char *));
209 static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count,
210                                 ssize_t (*handler)(struct atkbd *, const char *, size_t));
211 #define ATKBD_DEFINE_ATTR(_name)                                                \
212 static ssize_t atkbd_show_##_name(struct atkbd *, char *);                      \
213 static ssize_t atkbd_set_##_name(struct atkbd *, const char *, size_t);         \
214 static ssize_t atkbd_do_show_##_name(struct device *d, char *b)                 \
215 {                                                                               \
216         return atkbd_attr_show_helper(d, b, atkbd_show_##_name);                \
217 }                                                                               \
218 static ssize_t atkbd_do_set_##_name(struct device *d, const char *b, size_t s)  \
219 {                                                                               \
220         return atkbd_attr_set_helper(d, b, s, atkbd_set_##_name);               \
221 }                                                                               \
222 static struct device_attribute atkbd_attr_##_name =                             \
223         __ATTR(_name, S_IWUSR | S_IRUGO, atkbd_do_show_##_name, atkbd_do_set_##_name);
224 
225 ATKBD_DEFINE_ATTR(extra);
226 ATKBD_DEFINE_ATTR(scroll);
227 ATKBD_DEFINE_ATTR(set);
228 ATKBD_DEFINE_ATTR(softrepeat);
229 ATKBD_DEFINE_ATTR(softraw);
230 
231 
232 static void atkbd_report_key(struct input_dev *dev, struct pt_regs *regs, int code, int value)
233 {
234         input_regs(dev, regs);
235         if (value == 3) {
236                 input_report_key(dev, code, 1);
237                 input_sync(dev);
238                 input_report_key(dev, code, 0);
239         } else
240                 input_event(dev, EV_KEY, code, value);
241         input_sync(dev);
242 }
243 
244 /*
245  * atkbd_interrupt(). Here takes place processing of data received from
246  * the keyboard into events.
247  */
248 
249 static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
250                         unsigned int flags, struct pt_regs *regs)
251 {
252         struct atkbd *atkbd = serio->private;
253         unsigned int code = data;
254         int scroll = 0, click = -1;
255         int value;
256 
257 #ifdef ATKBD_DEBUG
258         printk(KERN_DEBUG "atkbd.c: Received %02x flags %02x\n", data, flags);
259 #endif
260 
261 #if !defined(__i386__) && !defined (__x86_64__)
262         if ((flags & (SERIO_FRAME | SERIO_PARITY)) && (~flags & SERIO_TIMEOUT) && !atkbd->resend && atkbd->write) {
263                 printk(KERN_WARNING "atkbd.c: frame/parity error: %02x\n", flags);
264                 serio_write(serio, ATKBD_CMD_RESEND);
265                 atkbd->resend = 1;
266                 goto out;
267         }
268 
269         if (!flags && data == ATKBD_RET_ACK)
270                 atkbd->resend = 0;
271 #endif
272 
273         if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_ACK))
274                 if  (ps2_handle_ack(&atkbd->ps2dev, data))
275                         goto out;
276 
277         if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_CMD))
278                 if  (ps2_handle_response(&atkbd->ps2dev, data))
279                         goto out;
280 
281         if (!atkbd->enabled)
282                 goto out;
283 
284         input_event(&atkbd->dev, EV_MSC, MSC_RAW, code);
285 
286         if (atkbd->translated) {
287 
288                 if (atkbd->emul ||
289                     !(code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1 ||
290                       code == ATKBD_RET_HANGUEL || code == ATKBD_RET_HANJA ||
291                       code == ATKBD_RET_ERR ||
292                      (code == ATKBD_RET_BAT && !atkbd->bat_xl))) {
293                         atkbd->release = code >> 7;
294                         code &= 0x7f;
295                 }
296 
297                 if (!atkbd->emul &&
298                      (code & 0x7f) == (ATKBD_RET_BAT & 0x7f))
299                         atkbd->bat_xl = !atkbd->release;
300         }
301 
302         switch (code) {
303                 case ATKBD_RET_BAT:
304                         atkbd->enabled = 0;
305                         serio_rescan(atkbd->ps2dev.serio);
306                         goto out;
307                 case ATKBD_RET_EMUL0:
308                         atkbd->emul = 1;
309                         goto out;
310                 case ATKBD_RET_EMUL1:
311                         atkbd->emul = 2;
312                         goto out;
313                 case ATKBD_RET_RELEASE:
314                         atkbd->release = 1;
315                         goto out;
316                 case ATKBD_RET_HANGUEL:
317                         atkbd_report_key(&atkbd->dev, regs, KEY_HANGUEL, 3);
318                         goto out;
319                 case ATKBD_RET_HANJA:
320                         atkbd_report_key(&atkbd->dev, regs, KEY_HANJA, 3);
321                         goto out;
322                 case ATKBD_RET_ERR:
323                         printk(KERN_DEBUG "atkbd.c: Keyboard on %s reports too many keys pressed.\n", serio->phys);
324                         goto out;
325         }
326 
327         if (atkbd->set != 3)
328                 code = (code & 0x7f) | ((code & 0x80) << 1);
329         if (atkbd->emul) {
330                 if (--atkbd->emul)
331                         goto out;
332                 code |= (atkbd->set != 3) ? 0x80 : 0x100;
333         }
334 
335         if (atkbd->keycode[code] != ATKBD_KEY_NULL)
336                 input_event(&atkbd->dev, EV_MSC, MSC_SCAN, code);
337 
338         switch (atkbd->keycode[code]) {
339                 case ATKBD_KEY_NULL:
340                         break;
341                 case ATKBD_KEY_UNKNOWN:
342                         if (data == ATKBD_RET_ACK || data == ATKBD_RET_NAK) {
343                                 printk(KERN_WARNING "atkbd.c: Spurious %s on %s. Some program, "
344                                        "like XFree86, might be trying access hardware directly.\n",
345                                        data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys);
346                         } else {
347                                 printk(KERN_WARNING "atkbd.c: Unknown key %s "
348                                        "(%s set %d, code %#x on %s).\n",
349                                        atkbd->release ? "released" : "pressed",
350                                        atkbd->translated ? "translated" : "raw",
351                                        atkbd->set, code, serio->phys);
352                                 printk(KERN_WARNING "atkbd.c: Use 'setkeycodes %s%02x <keycode>' "
353                                        "to make it known.\n",
354                                        code & 0x80 ? "e0" : "", code & 0x7f);
355                         }
356                         input_sync(&atkbd->dev);
357                         break;
358                 case ATKBD_SCR_1:
359                         scroll = 1 - atkbd->release * 2;
360                         break;
361                 case ATKBD_SCR_2:
362                         scroll = 2 - atkbd->release * 4;
363                         break;
364                 case ATKBD_SCR_4:
365                         scroll = 4 - atkbd->release * 8;
366                         break;
367                 case ATKBD_SCR_8:
368                         scroll = 8 - atkbd->release * 16;
369                         break;
370                 case ATKBD_SCR_CLICK:
371                         click = !atkbd->release;
372                         break;
373                 default:
374                         value = atkbd->release ? 0 :
375                                 (1 + (!atkbd->softrepeat && test_bit(atkbd->keycode[code], atkbd->dev.key)));
376 
377                         switch (value) {        /* Workaround Toshiba laptop multiple keypress */
378                                 case 0:
379                                         atkbd->last = 0;
380                                         break;
381                                 case 1:
382                                         atkbd->last = code;
383                                         atkbd->time = jiffies + (atkbd->dev.rep[REP_DELAY] * HZ + 500) / 1000 / 2;
384                                         break;
385                                 case 2:
386                                         if (!time_after(jiffies, atkbd->time) && atkbd->last == code)
387                                                 value = 1;
388                                         break;
389                         }
390 
391                         atkbd_report_key(&atkbd->dev, regs, atkbd->keycode[code], value);
392         }
393 
394         if (scroll || click != -1) {
395                 input_regs(&atkbd->dev, regs);
396                 input_report_key(&atkbd->dev, BTN_MIDDLE, click);
397                 input_report_rel(&atkbd->dev, REL_WHEEL, scroll);
398                 input_sync(&atkbd->dev);
399         }
400 
401         atkbd->release = 0;
402 out:
403         return IRQ_HANDLED;
404 }
405 
406 
407 /*
408  * Event callback from the input module. Events that change the state of
409  * the hardware are processed here.
410  */
411 
412 static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
413 {
414         struct atkbd *atkbd = dev->private;
415         const short period[32] =
416                 { 33,  37,  42,  46,  50,  54,  58,  63,  67,  75,  83,  92, 100, 109, 116, 125,
417                  133, 149, 167, 182, 200, 217, 232, 250, 270, 303, 333, 370, 400, 435, 470, 500 };
418         const short delay[4] =
419                 { 250, 500, 750, 1000 };
420         unsigned char param[2];
421         int i, j;
422 
423         if (!atkbd->write)
424                 return -1;
425 
426         switch (type) {
427 
428                 case EV_LED:
429 
430                         param[0] = (test_bit(LED_SCROLLL, dev->led) ? 1 : 0)
431                                  | (test_bit(LED_NUML,    dev->led) ? 2 : 0)
432                                  | (test_bit(LED_CAPSL,   dev->led) ? 4 : 0);
433                         ps2_schedule_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS);
434 
435                         if (atkbd->extra) {
436                                 param[0] = 0;
437                                 param[1] = (test_bit(LED_COMPOSE, dev->led) ? 0x01 : 0)
438                                          | (test_bit(LED_SLEEP,   dev->led) ? 0x02 : 0)
439                                          | (test_bit(LED_SUSPEND, dev->led) ? 0x04 : 0)
440                                          | (test_bit(LED_MISC,    dev->led) ? 0x10 : 0)
441                                          | (test_bit(LED_MUTE,    dev->led) ? 0x20 : 0);
442                                 ps2_schedule_command(&atkbd->ps2dev, param, ATKBD_CMD_EX_SETLEDS);
443                         }
444 
445                         return 0;
446 
447 
448                 case EV_REP:
449 
450                         if (atkbd->softrepeat) return 0;
451 
452                         i = j = 0;
453                         while (i < 32 && period[i] < dev->rep[REP_PERIOD]) i++;
454                         while (j < 4 && delay[j] < dev->rep[REP_DELAY]) j++;
455                         dev->rep[REP_PERIOD] = period[i];
456                         dev->rep[REP_DELAY] = delay[j];
457                         param[0] = i | (j << 5);
458                         ps2_schedule_command(&atkbd->ps2dev, param, ATKBD_CMD_SETREP);
459 
460                         return 0;
461         }
462 
463         return -1;
464 }
465 
466 /*
467  * atkbd_enable() signals that interrupt handler is allowed to
468  * generate input events.
469  */
470 
471 static inline void atkbd_enable(struct atkbd *atkbd)
472 {
473         serio_pause_rx(atkbd->ps2dev.serio);
474         atkbd->enabled = 1;
475         serio_continue_rx(atkbd->ps2dev.serio);
476 }
477 
478 /*
479  * atkbd_disable() tells input handler that all incoming data except
480  * for ACKs and command response should be dropped.
481  */
482 
483 static inline void atkbd_disable(struct atkbd *atkbd)
484 {
485         serio_pause_rx(atkbd->ps2dev.serio);
486         atkbd->enabled = 0;
487         serio_continue_rx(atkbd->ps2dev.serio);
488 }
489 
490 /*
491  * atkbd_probe() probes for an AT keyboard on a serio port.
492  */
493 
494 static int atkbd_probe(struct atkbd *atkbd)
495 {
496         struct ps2dev *ps2dev = &atkbd->ps2dev;
497         unsigned char param[2];
498 
499 /*
500  * Some systems, where the bit-twiddling when testing the io-lines of the
501  * controller may confuse the keyboard need a full reset of the keyboard. On
502  * these systems the BIOS also usually doesn't do it for us.
503  */
504 
505         if (atkbd_reset)
506                 if (ps2_command(ps2dev, NULL, ATKBD_CMD_RESET_BAT))
507                         printk(KERN_WARNING "atkbd.c: keyboard reset failed on %s\n", ps2dev->serio->phys);
508 
509 /*
510  * Then we check the keyboard ID. We should get 0xab83 under normal conditions.
511  * Some keyboards report different values, but the first byte is always 0xab or
512  * 0xac. Some old AT keyboards don't report anything. If a mouse is connected, this
513  * should make sure we don't try to set the LEDs on it.
514  */
515 
516         param[0] = param[1] = 0xa5;     /* initialize with invalid values */
517         if (ps2_command(ps2dev, param, ATKBD_CMD_GETID)) {
518 
519 /*
520  * If the get ID command failed, we check if we can at least set the LEDs on
521  * the keyboard. This should work on every keyboard out there. It also turns
522  * the LEDs off, which we want anyway.
523  */
524                 param[0] = 0;
525                 if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS))
526                         return -1;
527                 atkbd->id = 0xabba;
528                 return 0;
529         }
530 
531         if (param[0] != 0xab && param[0] != 0xac &&     /* Regular and NCD Sun keyboards */
532             param[0] != 0x2b && param[0] != 0x5d &&     /* Trust keyboard, raw and translated */
533             param[0] != 0x60 && param[0] != 0x47)       /* NMB SGI keyboard, raw and translated */
534                 return -1;
535 
536         atkbd->id = (param[0] << 8) | param[1];
537 
538         if (atkbd->id == 0xaca1 && atkbd->translated) {
539                 printk(KERN_ERR "atkbd.c: NCD terminal keyboards are only supported on non-translating\n");
540                 printk(KERN_ERR "atkbd.c: controllers. Use i8042.direct=1 to disable translation.\n");
541                 return -1;
542         }
543 
544         return 0;
545 }
546 
547 /*
548  * atkbd_select_set checks if a keyboard has a working Set 3 support, and
549  * sets it into that. Unfortunately there are keyboards that can be switched
550  * to Set 3, but don't work well in that (BTC Multimedia ...)
551  */
552 
553 static int atkbd_select_set(struct atkbd *atkbd, int target_set, int allow_extra)
554 {
555         struct ps2dev *ps2dev = &atkbd->ps2dev;
556         unsigned char param[2];
557 
558         atkbd->extra = 0;
559 /*
560  * For known special keyboards we can go ahead and set the correct set.
561  * We check for NCD PS/2 Sun, NorthGate OmniKey 101 and
562  * IBM RapidAccess / IBM EzButton / Chicony KBP-8993 keyboards.
563  */
564 
565         if (atkbd->translated)
566                 return 2;
567 
568         if (atkbd->id == 0xaca1) {
569                 param[0] = 3;
570                 ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET);
571                 return 3;
572         }
573 
574         if (allow_extra) {
575                 param[0] = 0x71;
576                 if (!ps2_command(ps2dev, param, ATKBD_CMD_EX_ENABLE)) {
577                         atkbd->extra = 1;
578                         return 2;
579                 }
580         }
581 
582         if (target_set != 3)
583                 return 2;
584 
585         if (!ps2_command(ps2dev, param, ATKBD_CMD_OK_GETID)) {
586                 atkbd->id = param[0] << 8 | param[1];
587                 return 2;
588         }
589 
590         param[0] = 3;
591         if (ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET))
592                 return 2;
593 
594         param[0] = 0;
595         if (ps2_command(ps2dev, param, ATKBD_CMD_GSCANSET))
596                 return 2;
597 
598         if (param[0] != 3) {
599                 param[0] = 2;
600                 if (ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET))
601                 return 2;
602         }
603 
604         ps2_command(ps2dev, param, ATKBD_CMD_SETALL_MBR);
605 
606         return 3;
607 }
608 
609 static int atkbd_activate(struct atkbd *atkbd)
610 {
611         struct ps2dev *ps2dev = &atkbd->ps2dev;
612         unsigned char param[1];
613 
614 /*
615  * Set the LEDs to a defined state.
616  */
617 
618         param[0] = 0;
619         if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS))
620                 return -1;
621 
622 /*
623  * Set autorepeat to fastest possible.
624  */
625 
626         param[0] = 0;
627         if (ps2_command(ps2dev, param, ATKBD_CMD_SETREP))
628                 return -1;
629 
630 /*
631  * Enable the keyboard to receive keystrokes.
632  */
633 
634         if (ps2_command(ps2dev, NULL, ATKBD_CMD_ENABLE)) {
635                 printk(KERN_ERR "atkbd.c: Failed to enable keyboard on %s\n",
636                         ps2dev->serio->phys);
637                 return -1;
638         }
639 
640         return 0;
641 }
642 
643 /*
644  * atkbd_cleanup() restores the keyboard state so that BIOS is happy after a
645  * reboot.
646  */
647 
648 static void atkbd_cleanup(struct serio *serio)
649 {
650         struct atkbd *atkbd = serio->private;
651         ps2_command(&atkbd->ps2dev, NULL, ATKBD_CMD_RESET_BAT);
652 }
653 
654 
655 /*
656  * atkbd_disconnect() closes and frees.
657  */
658 
659 static void atkbd_disconnect(struct serio *serio)
660 {
661         struct atkbd *atkbd = serio->private;
662 
663         atkbd_disable(atkbd);
664 
665         /* make sure we don't have a command in flight */
666         synchronize_kernel();
667         flush_scheduled_work();
668 
669         device_remove_file(&serio->dev, &atkbd_attr_extra);
670         device_remove_file(&serio->dev, &atkbd_attr_scroll);
671         device_remove_file(&serio->dev, &atkbd_attr_set);
672         device_remove_file(&serio->dev, &atkbd_attr_softrepeat);
673         device_remove_file(&serio->dev, &atkbd_attr_softraw);
674 
675         input_unregister_device(&atkbd->dev);
676         serio_close(serio);
677         kfree(atkbd);
678 }
679 
680 
681 /*
682  * atkbd_set_device_attrs() initializes keyboard's keycode table
683  * according to the selected scancode set
684  */
685 
686 static void atkbd_set_keycode_table(struct atkbd *atkbd)
687 {
688         int i, j;
689 
690         memset(atkbd->keycode, 0, sizeof(atkbd->keycode));
691 
692         if (atkbd->translated) {
693                 for (i = 0; i < 128; i++) {
694                         atkbd->keycode[i] = atkbd_set2_keycode[atkbd_unxlate_table[i]];
695                         atkbd->keycode[i | 0x80] = atkbd_set2_keycode[atkbd_unxlate_table[i] | 0x80];
696                         if (atkbd->scroll)
697                                 for (j = 0; i < 5; i++) {
698                                         if (atkbd_unxlate_table[i] == atkbd_scroll_keys[j][1])
699                                                 atkbd->keycode[i] = atkbd_scroll_keys[j][0];
700                                         if ((atkbd_unxlate_table[i] | 0x80) == atkbd_scroll_keys[j][1])
701                                                 atkbd->keycode[i | 0x80] = atkbd_scroll_keys[j][0];
702                                 }
703                 }
704         } else if (atkbd->set == 3) {
705                 memcpy(atkbd->keycode, atkbd_set3_keycode, sizeof(atkbd->keycode));
706         } else {
707                 memcpy(atkbd->keycode, atkbd_set2_keycode, sizeof(atkbd->keycode));
708 
709                 if (atkbd->scroll)
710                         for (i = 0; i < 5; i++)
711                                 atkbd->keycode[atkbd_scroll_keys[i][1]] = atkbd_scroll_keys[i][0];
712         }
713 }
714 
715 /*
716  * atkbd_set_device_attrs() sets up keyboard's input device structure
717  */
718 
719 static void atkbd_set_device_attrs(struct atkbd *atkbd)
720 {
721         int i;
722 
723         memset(&atkbd->dev, 0, sizeof(struct input_dev));
724 
725         init_input_dev(&atkbd->dev);
726 
727         atkbd->dev.name = atkbd->name;
728         atkbd->dev.phys = atkbd->phys;
729         atkbd->dev.id.bustype = BUS_I8042;
730         atkbd->dev.id.vendor = 0x0001;
731         atkbd->dev.id.product = atkbd->translated ? 1 : atkbd->set;
732         atkbd->dev.id.version = atkbd->id;
733         atkbd->dev.event = atkbd_event;
734         atkbd->dev.private = atkbd;
735         atkbd->dev.dev = &atkbd->ps2dev.serio->dev;
736 
737         atkbd->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REP) | BIT(EV_MSC);
738 
739         if (atkbd->write) {
740                 atkbd->dev.evbit[0] |= BIT(EV_LED);
741                 atkbd->dev.ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL);
742         }
743 
744         if (atkbd->extra)
745                 atkbd->dev.ledbit[0] |= BIT(LED_COMPOSE) | BIT(LED_SUSPEND) |
746                                         BIT(LED_SLEEP) | BIT(LED_MUTE) | BIT(LED_MISC);
747 
748         if (!atkbd->softrepeat) {
749                 atkbd->dev.rep[REP_DELAY] = 250;
750                 atkbd->dev.rep[REP_PERIOD] = 33;
751         }
752 
753         atkbd->dev.mscbit[0] = atkbd->softraw ? BIT(MSC_SCAN) : BIT(MSC_RAW) | BIT(MSC_SCAN);
754 
755         if (atkbd->scroll) {
756                 atkbd->dev.evbit[0] |= BIT(EV_REL);
757                 atkbd->dev.relbit[0] = BIT(REL_WHEEL);
758                 set_bit(BTN_MIDDLE, atkbd->dev.keybit);
759         }
760 
761         atkbd->dev.keycode = atkbd->keycode;
762         atkbd->dev.keycodesize = sizeof(unsigned char);
763         atkbd->dev.keycodemax = ARRAY_SIZE(atkbd_set2_keycode);
764 
765         for (i = 0; i < 512; i++)
766                 if (atkbd->keycode[i] && atkbd->keycode[i] < ATKBD_SPECIAL)
767                         set_bit(atkbd->keycode[i], atkbd->dev.keybit);
768 }
769 
770 /*
771  * atkbd_connect() is called when the serio module finds and interface
772  * that isn't handled yet by an appropriate device driver. We check if
773  * there is an AT keyboard out there and if yes, we register ourselves
774  * to the input module.
775  */
776 
777 static void atkbd_connect(struct serio *serio, struct serio_driver *drv)
778 {
779         struct atkbd *atkbd;
780 
781         if (!(atkbd = kmalloc(sizeof(struct atkbd), GFP_KERNEL)))
782                 return;
783         memset(atkbd, 0, sizeof(struct atkbd));
784 
785         ps2_init(&atkbd->ps2dev, serio);
786 
787         switch (serio->type & SERIO_TYPE) {
788 
789                 case SERIO_8042_XL:
790                         atkbd->translated = 1;
791                 case SERIO_8042:
792                         if (serio->write)
793                                 atkbd->write = 1;
794                         break;
795                 case SERIO_RS232:
796                         if ((serio->type & SERIO_PROTO) == SERIO_PS2SER)
797                                 break;
798                 default:
799                         kfree(atkbd);
800                         return;
801         }
802 
803         atkbd->softraw = atkbd_softraw;
804         atkbd->softrepeat = atkbd_softrepeat;
805         atkbd->scroll = atkbd_scroll;
806 
807         if (!atkbd->write)
808                 atkbd->softrepeat = 1;
809 
810         if (atkbd->softrepeat)
811                 atkbd->softraw = 1;
812 
813         serio->private = atkbd;
814 
815         if (serio_open(serio, drv)) {
816                 kfree(atkbd);
817                 return;
818         }
819 
820         if (atkbd->write) {
821 
822                 if (atkbd_probe(atkbd)) {
823                         serio_close(serio);
824                         serio->private = NULL;
825                         kfree(atkbd);
826                         return;
827                 }
828 
829                 atkbd->set = atkbd_select_set(atkbd, atkbd_set, atkbd_extra);
830                 atkbd_activate(atkbd);
831 
832         } else {
833                 atkbd->set = 2;
834                 atkbd->id = 0xab00;
835         }
836 
837         if (atkbd->extra)
838                 sprintf(atkbd->name, "AT Set 2 Extra keyboard");
839         else
840                 sprintf(atkbd->name, "AT %s Set %d keyboard",
841                         atkbd->translated ? "Translated" : "Raw", atkbd->set);
842 
843         sprintf(atkbd->phys, "%s/input0", serio->phys);
844 
845         atkbd_set_keycode_table(atkbd);
846         atkbd_set_device_attrs(atkbd);
847 
848         input_register_device(&atkbd->dev);
849 
850         device_create_file(&serio->dev, &atkbd_attr_extra);
851         device_create_file(&serio->dev, &atkbd_attr_scroll);
852         device_create_file(&serio->dev, &atkbd_attr_set);
853         device_create_file(&serio->dev, &atkbd_attr_softrepeat);
854         device_create_file(&serio->dev, &atkbd_attr_softraw);
855 
856         atkbd_enable(atkbd);
857 
858         printk(KERN_INFO "input: %s on %s\n", atkbd->name, serio->phys);
859 }
860 
861 /*
862  * atkbd_reconnect() tries to restore keyboard into a sane state and is
863  * most likely called on resume.
864  */
865 
866 static int atkbd_reconnect(struct serio *serio)
867 {
868         struct atkbd *atkbd = serio->private;
869         struct serio_driver *drv = serio->drv;
870         unsigned char param[1];
871 
872         if (!atkbd || !drv) {
873                 printk(KERN_DEBUG "atkbd: reconnect request, but serio is disconnected, ignoring...\n");
874                 return -1;
875         }
876 
877         atkbd_disable(atkbd);
878 
879         if (atkbd->write) {
880                 param[0] = (test_bit(LED_SCROLLL, atkbd->dev.led) ? 1 : 0)
881                          | (test_bit(LED_NUML,    atkbd->dev.led) ? 2 : 0)
882                          | (test_bit(LED_CAPSL,   atkbd->dev.led) ? 4 : 0);
883 
884                 if (atkbd_probe(atkbd))
885                         return -1;
886                 if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra))
887                         return -1;
888 
889                 atkbd_activate(atkbd);
890 
891                 if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS))
892                         return -1;
893         }
894 
895         atkbd_enable(atkbd);
896 
897         return 0;
898 }
899 
900 static struct serio_driver atkbd_drv = {
901         .driver         = {
902                 .name   = "atkbd",
903         },
904         .description    = DRIVER_DESC,
905         .interrupt      = atkbd_interrupt,
906         .connect        = atkbd_connect,
907         .reconnect      = atkbd_reconnect,
908         .disconnect     = atkbd_disconnect,
909         .cleanup        = atkbd_cleanup,
910 };
911 
912 static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf,
913                                 ssize_t (*handler)(struct atkbd *, char *))
914 {
915         struct serio *serio = to_serio_port(dev);
916         int retval;
917 
918         retval = serio_pin_driver(serio);
919         if (retval)
920                 return retval;
921 
922         if (serio->drv != &atkbd_drv) {
923                 retval = -ENODEV;
924                 goto out;
925         }
926 
927         retval = handler((struct atkbd *)serio->private, buf);
928 
929 out:
930         serio_unpin_driver(serio);
931         return retval;
932 }
933 
934 static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count,
935                                 ssize_t (*handler)(struct atkbd *, const char *, size_t))
936 {
937         struct serio *serio = to_serio_port(dev);
938         struct atkbd *atkbd;
939         int retval;
940 
941         retval = serio_pin_driver(serio);
942         if (retval)
943                 return retval;
944 
945         if (serio->drv != &atkbd_drv) {
946                 retval = -ENODEV;
947                 goto out;
948         }
949 
950         atkbd = serio->private;
951         atkbd_disable(atkbd);
952         retval = handler(atkbd, buf, count);
953         atkbd_enable(atkbd);
954 
955 out:
956         serio_unpin_driver(serio);
957         return retval;
958 }
959 
960 static ssize_t atkbd_show_extra(struct atkbd *atkbd, char *buf)
961 {
962         return sprintf(buf, "%d\n", atkbd->extra ? 1 : 0);
963 }
964 
965 static ssize_t atkbd_set_extra(struct atkbd *atkbd, const char *buf, size_t count)
966 {
967         unsigned long value;
968         char *rest;
969 
970         if (!atkbd->write)
971                 return -EIO;
972 
973         value = simple_strtoul(buf, &rest, 10);
974         if (*rest || value > 1)
975                 return -EINVAL;
976 
977         if (atkbd->extra != value) {
978                 /* unregister device as it's properties will change */
979                 input_unregister_device(&atkbd->dev);
980                 atkbd->set = atkbd_select_set(atkbd, atkbd->set, value);
981                 atkbd_activate(atkbd);
982                 atkbd_set_device_attrs(atkbd);
983                 input_register_device(&atkbd->dev);
984         }
985         return count;
986 }
987 
988 static ssize_t atkbd_show_scroll(struct atkbd *atkbd, char *buf)
989 {
990         return sprintf(buf, "%d\n", atkbd->scroll ? 1 : 0);
991 }
992 
993 static ssize_t atkbd_set_scroll(struct atkbd *atkbd, const char *buf, size_t count)
994 {
995         unsigned long value;
996         char *rest;
997 
998         value = simple_strtoul(buf, &rest, 10);
999         if (*rest || value > 1)
1000                 return -EINVAL;
1001 
1002         if (atkbd->scroll != value) {
1003                 /* unregister device as it's properties will change */
1004                 input_unregister_device(&atkbd->dev);
1005                 atkbd->scroll = value;
1006                 atkbd_set_keycode_table(atkbd);
1007                 atkbd_set_device_attrs(atkbd);
1008                 input_register_device(&atkbd->dev);
1009         }
1010         return count;
1011 }
1012 
1013 static ssize_t atkbd_show_set(struct atkbd *atkbd, char *buf)
1014 {
1015         return sprintf(buf, "%d\n", atkbd->set);
1016 }
1017 
1018 static ssize_t atkbd_set_set(struct atkbd *atkbd, const char *buf, size_t count)
1019 {
1020         unsigned long value;
1021         char *rest;
1022 
1023         if (!atkbd->write)
1024                 return -EIO;
1025 
1026         value = simple_strtoul(buf, &rest, 10);
1027         if (*rest || (value != 2 && value != 3))
1028                 return -EINVAL;
1029 
1030         if (atkbd->set != value) {
1031                 /* unregister device as it's properties will change */
1032                 input_unregister_device(&atkbd->dev);
1033                 atkbd->set = atkbd_select_set(atkbd, value, atkbd->extra);
1034                 atkbd_activate(atkbd);
1035                 atkbd_set_keycode_table(atkbd);
1036                 atkbd_set_device_attrs(atkbd);
1037                 input_register_device(&atkbd->dev);
1038         }
1039         return count;
1040 }
1041 
1042 static ssize_t atkbd_show_softrepeat(struct atkbd *atkbd, char *buf)
1043 {
1044         return sprintf(buf, "%d\n", atkbd->softrepeat ? 1 : 0);
1045 }
1046 
1047 static ssize_t atkbd_set_softrepeat(struct atkbd *atkbd, const char *buf, size_t count)
1048 {
1049         unsigned long value;
1050         char *rest;
1051 
1052         if (!atkbd->write)
1053                 return -EIO;
1054 
1055         value = simple_strtoul(buf, &rest, 10);
1056         if (*rest || value > 1)
1057                 return -EINVAL;
1058 
1059         if (atkbd->softrepeat != value) {
1060                 /* unregister device as it's properties will change */
1061                 input_unregister_device(&atkbd->dev);
1062                 atkbd->softrepeat = value;
1063                 if (atkbd->softrepeat)
1064                         atkbd->softraw = 1;
1065                 atkbd_set_device_attrs(atkbd);
1066                 input_register_device(&atkbd->dev);
1067         }
1068 
1069         return count;
1070 }
1071 
1072 
1073 static ssize_t atkbd_show_softraw(struct atkbd *atkbd, char *buf)
1074 {
1075         return sprintf(buf, "%d\n", atkbd->softraw ? 1 : 0);
1076 }
1077 
1078 static ssize_t atkbd_set_softraw(struct atkbd *atkbd, const char *buf, size_t count)
1079 {
1080         unsigned long value;
1081         char *rest;
1082 
1083         value = simple_strtoul(buf, &rest, 10);
1084         if (*rest || value > 1)
1085                 return -EINVAL;
1086 
1087         if (atkbd->softraw != value) {
1088                 /* unregister device as it's properties will change */
1089                 input_unregister_device(&atkbd->dev);
1090                 atkbd->softraw = value;
1091                 atkbd_set_device_attrs(atkbd);
1092                 input_register_device(&atkbd->dev);
1093         }
1094         return count;
1095 }
1096 
1097 
1098 int __init atkbd_init(void)
1099 {
1100         serio_register_driver(&atkbd_drv);
1101         return 0;
1102 }
1103 
1104 void __exit atkbd_exit(void)
1105 {
1106         serio_unregister_driver(&atkbd_drv);
1107 }
1108 
1109 module_init(atkbd_init);
1110 module_exit(atkbd_exit);
1111 
  This page was automatically generated by the LXR engine.