aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/keyboard/atkbd.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/keyboard/atkbd.c')
-rw-r--r--drivers/input/keyboard/atkbd.c409
1 files changed, 206 insertions, 203 deletions
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
index 28e6110d1ff8..d358ef8623f4 100644
--- a/drivers/input/keyboard/atkbd.c
+++ b/drivers/input/keyboard/atkbd.c
@@ -40,26 +40,26 @@ module_param_named(set, atkbd_set, int, 0);
40MODULE_PARM_DESC(set, "Select keyboard code set (2 = default, 3 = PS/2 native)"); 40MODULE_PARM_DESC(set, "Select keyboard code set (2 = default, 3 = PS/2 native)");
41 41
42#if defined(__i386__) || defined(__x86_64__) || defined(__hppa__) 42#if defined(__i386__) || defined(__x86_64__) || defined(__hppa__)
43static int atkbd_reset; 43static bool atkbd_reset;
44#else 44#else
45static int atkbd_reset = 1; 45static bool atkbd_reset = true;
46#endif 46#endif
47module_param_named(reset, atkbd_reset, bool, 0); 47module_param_named(reset, atkbd_reset, bool, 0);
48MODULE_PARM_DESC(reset, "Reset keyboard during initialization"); 48MODULE_PARM_DESC(reset, "Reset keyboard during initialization");
49 49
50static int atkbd_softrepeat; 50static bool atkbd_softrepeat;
51module_param_named(softrepeat, atkbd_softrepeat, bool, 0); 51module_param_named(softrepeat, atkbd_softrepeat, bool, 0);
52MODULE_PARM_DESC(softrepeat, "Use software keyboard repeat"); 52MODULE_PARM_DESC(softrepeat, "Use software keyboard repeat");
53 53
54static int atkbd_softraw = 1; 54static bool atkbd_softraw = true;
55module_param_named(softraw, atkbd_softraw, bool, 0); 55module_param_named(softraw, atkbd_softraw, bool, 0);
56MODULE_PARM_DESC(softraw, "Use software generated rawmode"); 56MODULE_PARM_DESC(softraw, "Use software generated rawmode");
57 57
58static int atkbd_scroll; 58static bool atkbd_scroll;
59module_param_named(scroll, atkbd_scroll, bool, 0); 59module_param_named(scroll, atkbd_scroll, bool, 0);
60MODULE_PARM_DESC(scroll, "Enable scroll-wheel on MS Office and similar keyboards"); 60MODULE_PARM_DESC(scroll, "Enable scroll-wheel on MS Office and similar keyboards");
61 61
62static int atkbd_extra; 62static bool atkbd_extra;
63module_param_named(extra, atkbd_extra, bool, 0); 63module_param_named(extra, atkbd_extra, bool, 0);
64MODULE_PARM_DESC(extra, "Enable extra LEDs and keys on IBM RapidAcces, EzKey and similar keyboards"); 64MODULE_PARM_DESC(extra, "Enable extra LEDs and keys on IBM RapidAcces, EzKey and similar keyboards");
65 65
@@ -134,7 +134,8 @@ static const unsigned short atkbd_unxlate_table[128] = {
134#define ATKBD_CMD_GETID 0x02f2 134#define ATKBD_CMD_GETID 0x02f2
135#define ATKBD_CMD_SETREP 0x10f3 135#define ATKBD_CMD_SETREP 0x10f3
136#define ATKBD_CMD_ENABLE 0x00f4 136#define ATKBD_CMD_ENABLE 0x00f4
137#define ATKBD_CMD_RESET_DIS 0x00f5 137#define ATKBD_CMD_RESET_DIS 0x00f5 /* Reset to defaults and disable */
138#define ATKBD_CMD_RESET_DEF 0x00f6 /* Reset to defaults */
138#define ATKBD_CMD_SETALL_MBR 0x00fa 139#define ATKBD_CMD_SETALL_MBR 0x00fa
139#define ATKBD_CMD_RESET_BAT 0x02ff 140#define ATKBD_CMD_RESET_BAT 0x02ff
140#define ATKBD_CMD_RESEND 0x00fe 141#define ATKBD_CMD_RESEND 0x00fe
@@ -152,16 +153,16 @@ static const unsigned short atkbd_unxlate_table[128] = {
152#define ATKBD_RET_HANGEUL 0xf2 153#define ATKBD_RET_HANGEUL 0xf2
153#define ATKBD_RET_ERR 0xff 154#define ATKBD_RET_ERR 0xff
154 155
155#define ATKBD_KEY_UNKNOWN 0 156#define ATKBD_KEY_UNKNOWN 0
156#define ATKBD_KEY_NULL 255 157#define ATKBD_KEY_NULL 255
157 158
158#define ATKBD_SCR_1 254 159#define ATKBD_SCR_1 0xfffe
159#define ATKBD_SCR_2 253 160#define ATKBD_SCR_2 0xfffd
160#define ATKBD_SCR_4 252 161#define ATKBD_SCR_4 0xfffc
161#define ATKBD_SCR_8 251 162#define ATKBD_SCR_8 0xfffb
162#define ATKBD_SCR_CLICK 250 163#define ATKBD_SCR_CLICK 0xfffa
163#define ATKBD_SCR_LEFT 249 164#define ATKBD_SCR_LEFT 0xfff9
164#define ATKBD_SCR_RIGHT 248 165#define ATKBD_SCR_RIGHT 0xfff8
165 166
166#define ATKBD_SPECIAL ATKBD_SCR_RIGHT 167#define ATKBD_SPECIAL ATKBD_SCR_RIGHT
167 168
@@ -176,7 +177,7 @@ static const unsigned short atkbd_unxlate_table[128] = {
176#define ATKBD_XL_HANJA 0x20 177#define ATKBD_XL_HANJA 0x20
177 178
178static const struct { 179static const struct {
179 unsigned char keycode; 180 unsigned short keycode;
180 unsigned char set2; 181 unsigned char set2;
181} atkbd_scroll_keys[] = { 182} atkbd_scroll_keys[] = {
182 { ATKBD_SCR_1, 0xc5 }, 183 { ATKBD_SCR_1, 0xc5 },
@@ -205,18 +206,18 @@ struct atkbd {
205 unsigned short keycode[ATKBD_KEYMAP_SIZE]; 206 unsigned short keycode[ATKBD_KEYMAP_SIZE];
206 DECLARE_BITMAP(force_release_mask, ATKBD_KEYMAP_SIZE); 207 DECLARE_BITMAP(force_release_mask, ATKBD_KEYMAP_SIZE);
207 unsigned char set; 208 unsigned char set;
208 unsigned char translated; 209 bool translated;
209 unsigned char extra; 210 bool extra;
210 unsigned char write; 211 bool write;
211 unsigned char softrepeat; 212 bool softrepeat;
212 unsigned char softraw; 213 bool softraw;
213 unsigned char scroll; 214 bool scroll;
214 unsigned char enabled; 215 bool enabled;
215 216
216 /* Accessed only from interrupt */ 217 /* Accessed only from interrupt */
217 unsigned char emul; 218 unsigned char emul;
218 unsigned char resend; 219 bool resend;
219 unsigned char release; 220 bool release;
220 unsigned long xl_bit; 221 unsigned long xl_bit;
221 unsigned int last; 222 unsigned int last;
222 unsigned long time; 223 unsigned long time;
@@ -224,8 +225,10 @@ struct atkbd {
224 225
225 struct delayed_work event_work; 226 struct delayed_work event_work;
226 unsigned long event_jiffies; 227 unsigned long event_jiffies;
227 struct mutex event_mutex;
228 unsigned long event_mask; 228 unsigned long event_mask;
229
230 /* Serializes reconnect(), attr->set() and event work */
231 struct mutex mutex;
229}; 232};
230 233
231/* 234/*
@@ -298,18 +301,18 @@ static const unsigned int xl_table[] = {
298 * Checks if we should mangle the scancode to extract 'release' bit 301 * Checks if we should mangle the scancode to extract 'release' bit
299 * in translated mode. 302 * in translated mode.
300 */ 303 */
301static int atkbd_need_xlate(unsigned long xl_bit, unsigned char code) 304static bool atkbd_need_xlate(unsigned long xl_bit, unsigned char code)
302{ 305{
303 int i; 306 int i;
304 307
305 if (code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1) 308 if (code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1)
306 return 0; 309 return false;
307 310
308 for (i = 0; i < ARRAY_SIZE(xl_table); i++) 311 for (i = 0; i < ARRAY_SIZE(xl_table); i++)
309 if (code == xl_table[i]) 312 if (code == xl_table[i])
310 return test_bit(i, &xl_bit); 313 return test_bit(i, &xl_bit);
311 314
312 return 1; 315 return true;
313} 316}
314 317
315/* 318/*
@@ -356,7 +359,7 @@ static unsigned int atkbd_compat_scancode(struct atkbd *atkbd, unsigned int code
356 */ 359 */
357 360
358static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, 361static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
359 unsigned int flags) 362 unsigned int flags)
360{ 363{
361 struct atkbd *atkbd = serio_get_drvdata(serio); 364 struct atkbd *atkbd = serio_get_drvdata(serio);
362 struct input_dev *dev = atkbd->dev; 365 struct input_dev *dev = atkbd->dev;
@@ -365,20 +368,18 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
365 int value; 368 int value;
366 unsigned short keycode; 369 unsigned short keycode;
367 370
368#ifdef ATKBD_DEBUG 371 dev_dbg(&serio->dev, "Received %02x flags %02x\n", data, flags);
369 printk(KERN_DEBUG "atkbd.c: Received %02x flags %02x\n", data, flags);
370#endif
371 372
372#if !defined(__i386__) && !defined (__x86_64__) 373#if !defined(__i386__) && !defined (__x86_64__)
373 if ((flags & (SERIO_FRAME | SERIO_PARITY)) && (~flags & SERIO_TIMEOUT) && !atkbd->resend && atkbd->write) { 374 if ((flags & (SERIO_FRAME | SERIO_PARITY)) && (~flags & SERIO_TIMEOUT) && !atkbd->resend && atkbd->write) {
374 printk(KERN_WARNING "atkbd.c: frame/parity error: %02x\n", flags); 375 dev_warn(&serio->dev, "Frame/parity error: %02x\n", flags);
375 serio_write(serio, ATKBD_CMD_RESEND); 376 serio_write(serio, ATKBD_CMD_RESEND);
376 atkbd->resend = 1; 377 atkbd->resend = true;
377 goto out; 378 goto out;
378 } 379 }
379 380
380 if (!flags && data == ATKBD_RET_ACK) 381 if (!flags && data == ATKBD_RET_ACK)
381 atkbd->resend = 0; 382 atkbd->resend = false;
382#endif 383#endif
383 384
384 if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_ACK)) 385 if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_ACK))
@@ -409,32 +410,32 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
409 } 410 }
410 411
411 switch (code) { 412 switch (code) {
412 case ATKBD_RET_BAT: 413 case ATKBD_RET_BAT:
413 atkbd->enabled = 0; 414 atkbd->enabled = false;
414 serio_reconnect(atkbd->ps2dev.serio); 415 serio_reconnect(atkbd->ps2dev.serio);
415 goto out; 416 goto out;
416 case ATKBD_RET_EMUL0: 417 case ATKBD_RET_EMUL0:
417 atkbd->emul = 1; 418 atkbd->emul = 1;
418 goto out; 419 goto out;
419 case ATKBD_RET_EMUL1: 420 case ATKBD_RET_EMUL1:
420 atkbd->emul = 2; 421 atkbd->emul = 2;
421 goto out; 422 goto out;
422 case ATKBD_RET_RELEASE: 423 case ATKBD_RET_RELEASE:
423 atkbd->release = 1; 424 atkbd->release = true;
424 goto out; 425 goto out;
425 case ATKBD_RET_ACK: 426 case ATKBD_RET_ACK:
426 case ATKBD_RET_NAK: 427 case ATKBD_RET_NAK:
427 if (printk_ratelimit()) 428 if (printk_ratelimit())
428 printk(KERN_WARNING "atkbd.c: Spurious %s on %s. " 429 dev_warn(&serio->dev,
429 "Some program might be trying access hardware directly.\n", 430 "Spurious %s on %s. "
430 data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys); 431 "Some program might be trying access hardware directly.\n",
431 goto out; 432 data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys);
432 case ATKBD_RET_ERR: 433 goto out;
433 atkbd->err_count++; 434 case ATKBD_RET_ERR:
434#ifdef ATKBD_DEBUG 435 atkbd->err_count++;
435 printk(KERN_DEBUG "atkbd.c: Keyboard on %s reports too many keys pressed.\n", serio->phys); 436 dev_dbg(&serio->dev, "Keyboard on %s reports too many keys pressed.\n",
436#endif 437 serio->phys);
437 goto out; 438 goto out;
438 } 439 }
439 440
440 code = atkbd_compat_scancode(atkbd, code); 441 code = atkbd_compat_scancode(atkbd, code);
@@ -448,71 +449,72 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
448 input_event(dev, EV_MSC, MSC_SCAN, code); 449 input_event(dev, EV_MSC, MSC_SCAN, code);
449 450
450 switch (keycode) { 451 switch (keycode) {
451 case ATKBD_KEY_NULL: 452 case ATKBD_KEY_NULL:
452 break; 453 break;
453 case ATKBD_KEY_UNKNOWN: 454 case ATKBD_KEY_UNKNOWN:
454 printk(KERN_WARNING 455 dev_warn(&serio->dev,
455 "atkbd.c: Unknown key %s (%s set %d, code %#x on %s).\n", 456 "Unknown key %s (%s set %d, code %#x on %s).\n",
456 atkbd->release ? "released" : "pressed", 457 atkbd->release ? "released" : "pressed",
457 atkbd->translated ? "translated" : "raw", 458 atkbd->translated ? "translated" : "raw",
458 atkbd->set, code, serio->phys); 459 atkbd->set, code, serio->phys);
459 printk(KERN_WARNING 460 dev_warn(&serio->dev,
460 "atkbd.c: Use 'setkeycodes %s%02x <keycode>' to make it known.\n", 461 "Use 'setkeycodes %s%02x <keycode>' to make it known.\n",
461 code & 0x80 ? "e0" : "", code & 0x7f); 462 code & 0x80 ? "e0" : "", code & 0x7f);
462 input_sync(dev); 463 input_sync(dev);
463 break; 464 break;
464 case ATKBD_SCR_1: 465 case ATKBD_SCR_1:
465 scroll = 1 - atkbd->release * 2; 466 scroll = 1;
466 break; 467 break;
467 case ATKBD_SCR_2: 468 case ATKBD_SCR_2:
468 scroll = 2 - atkbd->release * 4; 469 scroll = 2;
469 break; 470 break;
470 case ATKBD_SCR_4: 471 case ATKBD_SCR_4:
471 scroll = 4 - atkbd->release * 8; 472 scroll = 4;
472 break; 473 break;
473 case ATKBD_SCR_8: 474 case ATKBD_SCR_8:
474 scroll = 8 - atkbd->release * 16; 475 scroll = 8;
475 break; 476 break;
476 case ATKBD_SCR_CLICK: 477 case ATKBD_SCR_CLICK:
477 click = !atkbd->release; 478 click = !atkbd->release;
478 break; 479 break;
479 case ATKBD_SCR_LEFT: 480 case ATKBD_SCR_LEFT:
480 hscroll = -1; 481 hscroll = -1;
481 break; 482 break;
482 case ATKBD_SCR_RIGHT: 483 case ATKBD_SCR_RIGHT:
483 hscroll = 1; 484 hscroll = 1;
484 break; 485 break;
485 default: 486 default:
486 if (atkbd->release) { 487 if (atkbd->release) {
487 value = 0; 488 value = 0;
488 atkbd->last = 0; 489 atkbd->last = 0;
489 } else if (!atkbd->softrepeat && test_bit(keycode, dev->key)) { 490 } else if (!atkbd->softrepeat && test_bit(keycode, dev->key)) {
490 /* Workaround Toshiba laptop multiple keypress */ 491 /* Workaround Toshiba laptop multiple keypress */
491 value = time_before(jiffies, atkbd->time) && atkbd->last == code ? 1 : 2; 492 value = time_before(jiffies, atkbd->time) && atkbd->last == code ? 1 : 2;
492 } else { 493 } else {
493 value = 1; 494 value = 1;
494 atkbd->last = code; 495 atkbd->last = code;
495 atkbd->time = jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]) / 2; 496 atkbd->time = jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]) / 2;
496 } 497 }
497 498
498 input_event(dev, EV_KEY, keycode, value); 499 input_event(dev, EV_KEY, keycode, value);
499 input_sync(dev); 500 input_sync(dev);
500 501
501 if (value && test_bit(code, atkbd->force_release_mask)) { 502 if (value && test_bit(code, atkbd->force_release_mask)) {
502 input_report_key(dev, keycode, 0); 503 input_report_key(dev, keycode, 0);
503 input_sync(dev); 504 input_sync(dev);
504 } 505 }
505 } 506 }
506 507
507 if (atkbd->scroll) { 508 if (atkbd->scroll) {
508 if (click != -1) 509 if (click != -1)
509 input_report_key(dev, BTN_MIDDLE, click); 510 input_report_key(dev, BTN_MIDDLE, click);
510 input_report_rel(dev, REL_WHEEL, scroll); 511 input_report_rel(dev, REL_WHEEL,
512 atkbd->release ? -scroll : scroll);
511 input_report_rel(dev, REL_HWHEEL, hscroll); 513 input_report_rel(dev, REL_HWHEEL, hscroll);
512 input_sync(dev); 514 input_sync(dev);
513 } 515 }
514 516
515 atkbd->release = 0; 517 atkbd->release = false;
516out: 518out:
517 return IRQ_HANDLED; 519 return IRQ_HANDLED;
518} 520}
@@ -576,7 +578,7 @@ static void atkbd_event_work(struct work_struct *work)
576{ 578{
577 struct atkbd *atkbd = container_of(work, struct atkbd, event_work.work); 579 struct atkbd *atkbd = container_of(work, struct atkbd, event_work.work);
578 580
579 mutex_lock(&atkbd->event_mutex); 581 mutex_lock(&atkbd->mutex);
580 582
581 if (!atkbd->enabled) { 583 if (!atkbd->enabled) {
582 /* 584 /*
@@ -595,7 +597,7 @@ static void atkbd_event_work(struct work_struct *work)
595 atkbd_set_repeat_rate(atkbd); 597 atkbd_set_repeat_rate(atkbd);
596 } 598 }
597 599
598 mutex_unlock(&atkbd->event_mutex); 600 mutex_unlock(&atkbd->mutex);
599} 601}
600 602
601/* 603/*
@@ -611,7 +613,7 @@ static void atkbd_schedule_event_work(struct atkbd *atkbd, int event_bit)
611 613
612 atkbd->event_jiffies = jiffies; 614 atkbd->event_jiffies = jiffies;
613 set_bit(event_bit, &atkbd->event_mask); 615 set_bit(event_bit, &atkbd->event_mask);
614 wmb(); 616 mb();
615 schedule_delayed_work(&atkbd->event_work, delay); 617 schedule_delayed_work(&atkbd->event_work, delay);
616} 618}
617 619
@@ -631,17 +633,18 @@ static int atkbd_event(struct input_dev *dev,
631 633
632 switch (type) { 634 switch (type) {
633 635
634 case EV_LED: 636 case EV_LED:
635 atkbd_schedule_event_work(atkbd, ATKBD_LED_EVENT_BIT); 637 atkbd_schedule_event_work(atkbd, ATKBD_LED_EVENT_BIT);
636 return 0; 638 return 0;
637 639
638 case EV_REP: 640 case EV_REP:
639 if (!atkbd->softrepeat) 641 if (!atkbd->softrepeat)
640 atkbd_schedule_event_work(atkbd, ATKBD_REP_EVENT_BIT); 642 atkbd_schedule_event_work(atkbd, ATKBD_REP_EVENT_BIT);
641 return 0; 643 return 0;
642 }
643 644
644 return -1; 645 default:
646 return -1;
647 }
645} 648}
646 649
647/* 650/*
@@ -652,7 +655,7 @@ static int atkbd_event(struct input_dev *dev,
652static inline void atkbd_enable(struct atkbd *atkbd) 655static inline void atkbd_enable(struct atkbd *atkbd)
653{ 656{
654 serio_pause_rx(atkbd->ps2dev.serio); 657 serio_pause_rx(atkbd->ps2dev.serio);
655 atkbd->enabled = 1; 658 atkbd->enabled = true;
656 serio_continue_rx(atkbd->ps2dev.serio); 659 serio_continue_rx(atkbd->ps2dev.serio);
657} 660}
658 661
@@ -664,7 +667,7 @@ static inline void atkbd_enable(struct atkbd *atkbd)
664static inline void atkbd_disable(struct atkbd *atkbd) 667static inline void atkbd_disable(struct atkbd *atkbd)
665{ 668{
666 serio_pause_rx(atkbd->ps2dev.serio); 669 serio_pause_rx(atkbd->ps2dev.serio);
667 atkbd->enabled = 0; 670 atkbd->enabled = false;
668 serio_continue_rx(atkbd->ps2dev.serio); 671 serio_continue_rx(atkbd->ps2dev.serio);
669} 672}
670 673
@@ -685,7 +688,9 @@ static int atkbd_probe(struct atkbd *atkbd)
685 688
686 if (atkbd_reset) 689 if (atkbd_reset)
687 if (ps2_command(ps2dev, NULL, ATKBD_CMD_RESET_BAT)) 690 if (ps2_command(ps2dev, NULL, ATKBD_CMD_RESET_BAT))
688 printk(KERN_WARNING "atkbd.c: keyboard reset failed on %s\n", ps2dev->serio->phys); 691 dev_warn(&ps2dev->serio->dev,
692 "keyboard reset failed on %s\n",
693 ps2dev->serio->phys);
689 694
690/* 695/*
691 * Then we check the keyboard ID. We should get 0xab83 under normal conditions. 696 * Then we check the keyboard ID. We should get 0xab83 under normal conditions.
@@ -715,8 +720,9 @@ static int atkbd_probe(struct atkbd *atkbd)
715 atkbd->id = (param[0] << 8) | param[1]; 720 atkbd->id = (param[0] << 8) | param[1];
716 721
717 if (atkbd->id == 0xaca1 && atkbd->translated) { 722 if (atkbd->id == 0xaca1 && atkbd->translated) {
718 printk(KERN_ERR "atkbd.c: NCD terminal keyboards are only supported on non-translating\n"); 723 dev_err(&ps2dev->serio->dev,
719 printk(KERN_ERR "atkbd.c: controllers. Use i8042.direct=1 to disable translation.\n"); 724 "NCD terminal keyboards are only supported on non-translating controlelrs. "
725 "Use i8042.direct=1 to disable translation.\n");
720 return -1; 726 return -1;
721 } 727 }
722 728
@@ -734,7 +740,7 @@ static int atkbd_select_set(struct atkbd *atkbd, int target_set, int allow_extra
734 struct ps2dev *ps2dev = &atkbd->ps2dev; 740 struct ps2dev *ps2dev = &atkbd->ps2dev;
735 unsigned char param[2]; 741 unsigned char param[2];
736 742
737 atkbd->extra = 0; 743 atkbd->extra = false;
738/* 744/*
739 * For known special keyboards we can go ahead and set the correct set. 745 * For known special keyboards we can go ahead and set the correct set.
740 * We check for NCD PS/2 Sun, NorthGate OmniKey 101 and 746 * We check for NCD PS/2 Sun, NorthGate OmniKey 101 and
@@ -753,7 +759,7 @@ static int atkbd_select_set(struct atkbd *atkbd, int target_set, int allow_extra
753 if (allow_extra) { 759 if (allow_extra) {
754 param[0] = 0x71; 760 param[0] = 0x71;
755 if (!ps2_command(ps2dev, param, ATKBD_CMD_EX_ENABLE)) { 761 if (!ps2_command(ps2dev, param, ATKBD_CMD_EX_ENABLE)) {
756 atkbd->extra = 1; 762 atkbd->extra = true;
757 return 2; 763 return 2;
758 } 764 }
759 } 765 }
@@ -818,7 +824,8 @@ static int atkbd_activate(struct atkbd *atkbd)
818 */ 824 */
819 825
820 if (ps2_command(ps2dev, NULL, ATKBD_CMD_ENABLE)) { 826 if (ps2_command(ps2dev, NULL, ATKBD_CMD_ENABLE)) {
821 printk(KERN_ERR "atkbd.c: Failed to enable keyboard on %s\n", 827 dev_err(&ps2dev->serio->dev,
828 "Failed to enable keyboard on %s\n",
822 ps2dev->serio->phys); 829 ps2dev->serio->phys);
823 return -1; 830 return -1;
824 } 831 }
@@ -836,7 +843,7 @@ static void atkbd_cleanup(struct serio *serio)
836 struct atkbd *atkbd = serio_get_drvdata(serio); 843 struct atkbd *atkbd = serio_get_drvdata(serio);
837 844
838 atkbd_disable(atkbd); 845 atkbd_disable(atkbd);
839 ps2_command(&atkbd->ps2dev, NULL, ATKBD_CMD_RESET_BAT); 846 ps2_command(&atkbd->ps2dev, NULL, ATKBD_CMD_RESET_DEF);
840} 847}
841 848
842 849
@@ -848,13 +855,20 @@ static void atkbd_disconnect(struct serio *serio)
848{ 855{
849 struct atkbd *atkbd = serio_get_drvdata(serio); 856 struct atkbd *atkbd = serio_get_drvdata(serio);
850 857
858 sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group);
859
851 atkbd_disable(atkbd); 860 atkbd_disable(atkbd);
852 861
853 /* make sure we don't have a command in flight */ 862 input_unregister_device(atkbd->dev);
863
864 /*
865 * Make sure we don't have a command in flight.
866 * Note that since atkbd->enabled is false event work will keep
867 * rescheduling itself until it gets canceled and will not try
868 * accessing freed input device or serio port.
869 */
854 cancel_delayed_work_sync(&atkbd->event_work); 870 cancel_delayed_work_sync(&atkbd->event_work);
855 871
856 sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group);
857 input_unregister_device(atkbd->dev);
858 serio_close(serio); 872 serio_close(serio);
859 serio_set_drvdata(serio, NULL); 873 serio_set_drvdata(serio, NULL);
860 kfree(atkbd); 874 kfree(atkbd);
@@ -1060,9 +1074,13 @@ static void atkbd_set_device_attrs(struct atkbd *atkbd)
1060 input_dev->keycodesize = sizeof(unsigned short); 1074 input_dev->keycodesize = sizeof(unsigned short);
1061 input_dev->keycodemax = ARRAY_SIZE(atkbd_set2_keycode); 1075 input_dev->keycodemax = ARRAY_SIZE(atkbd_set2_keycode);
1062 1076
1063 for (i = 0; i < ATKBD_KEYMAP_SIZE; i++) 1077 for (i = 0; i < ATKBD_KEYMAP_SIZE; i++) {
1064 if (atkbd->keycode[i] && atkbd->keycode[i] < ATKBD_SPECIAL) 1078 if (atkbd->keycode[i] != KEY_RESERVED &&
1079 atkbd->keycode[i] != ATKBD_KEY_NULL &&
1080 atkbd->keycode[i] < ATKBD_SPECIAL) {
1065 __set_bit(atkbd->keycode[i], input_dev->keybit); 1081 __set_bit(atkbd->keycode[i], input_dev->keybit);
1082 }
1083 }
1066} 1084}
1067 1085
1068/* 1086/*
@@ -1086,16 +1104,18 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv)
1086 atkbd->dev = dev; 1104 atkbd->dev = dev;
1087 ps2_init(&atkbd->ps2dev, serio); 1105 ps2_init(&atkbd->ps2dev, serio);
1088 INIT_DELAYED_WORK(&atkbd->event_work, atkbd_event_work); 1106 INIT_DELAYED_WORK(&atkbd->event_work, atkbd_event_work);
1089 mutex_init(&atkbd->event_mutex); 1107 mutex_init(&atkbd->mutex);
1090 1108
1091 switch (serio->id.type) { 1109 switch (serio->id.type) {
1092 1110
1093 case SERIO_8042_XL: 1111 case SERIO_8042_XL:
1094 atkbd->translated = 1; 1112 atkbd->translated = true;
1095 case SERIO_8042: 1113 /* Fall through */
1096 if (serio->write) 1114
1097 atkbd->write = 1; 1115 case SERIO_8042:
1098 break; 1116 if (serio->write)
1117 atkbd->write = true;
1118 break;
1099 } 1119 }
1100 1120
1101 atkbd->softraw = atkbd_softraw; 1121 atkbd->softraw = atkbd_softraw;
@@ -1103,7 +1123,7 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv)
1103 atkbd->scroll = atkbd_scroll; 1123 atkbd->scroll = atkbd_scroll;
1104 1124
1105 if (atkbd->softrepeat) 1125 if (atkbd->softrepeat)
1106 atkbd->softraw = 1; 1126 atkbd->softraw = true;
1107 1127
1108 serio_set_drvdata(serio, atkbd); 1128 serio_set_drvdata(serio, atkbd);
1109 1129
@@ -1159,19 +1179,24 @@ static int atkbd_reconnect(struct serio *serio)
1159{ 1179{
1160 struct atkbd *atkbd = serio_get_drvdata(serio); 1180 struct atkbd *atkbd = serio_get_drvdata(serio);
1161 struct serio_driver *drv = serio->drv; 1181 struct serio_driver *drv = serio->drv;
1182 int retval = -1;
1162 1183
1163 if (!atkbd || !drv) { 1184 if (!atkbd || !drv) {
1164 printk(KERN_DEBUG "atkbd: reconnect request, but serio is disconnected, ignoring...\n"); 1185 dev_dbg(&serio->dev,
1186 "reconnect request, but serio is disconnected, ignoring...\n");
1165 return -1; 1187 return -1;
1166 } 1188 }
1167 1189
1190 mutex_lock(&atkbd->mutex);
1191
1168 atkbd_disable(atkbd); 1192 atkbd_disable(atkbd);
1169 1193
1170 if (atkbd->write) { 1194 if (atkbd->write) {
1171 if (atkbd_probe(atkbd)) 1195 if (atkbd_probe(atkbd))
1172 return -1; 1196 goto out;
1197
1173 if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra)) 1198 if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra))
1174 return -1; 1199 goto out;
1175 1200
1176 atkbd_activate(atkbd); 1201 atkbd_activate(atkbd);
1177 1202
@@ -1189,8 +1214,11 @@ static int atkbd_reconnect(struct serio *serio)
1189 } 1214 }
1190 1215
1191 atkbd_enable(atkbd); 1216 atkbd_enable(atkbd);
1217 retval = 0;
1192 1218
1193 return 0; 1219 out:
1220 mutex_unlock(&atkbd->mutex);
1221 return retval;
1194} 1222}
1195 1223
1196static struct serio_device_id atkbd_serio_ids[] = { 1224static struct serio_device_id atkbd_serio_ids[] = {
@@ -1234,47 +1262,28 @@ static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf,
1234 ssize_t (*handler)(struct atkbd *, char *)) 1262 ssize_t (*handler)(struct atkbd *, char *))
1235{ 1263{
1236 struct serio *serio = to_serio_port(dev); 1264 struct serio *serio = to_serio_port(dev);
1237 int retval; 1265 struct atkbd *atkbd = serio_get_drvdata(serio);
1238
1239 retval = serio_pin_driver(serio);
1240 if (retval)
1241 return retval;
1242
1243 if (serio->drv != &atkbd_drv) {
1244 retval = -ENODEV;
1245 goto out;
1246 }
1247
1248 retval = handler((struct atkbd *)serio_get_drvdata(serio), buf);
1249 1266
1250out: 1267 return handler(atkbd, buf);
1251 serio_unpin_driver(serio);
1252 return retval;
1253} 1268}
1254 1269
1255static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count, 1270static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count,
1256 ssize_t (*handler)(struct atkbd *, const char *, size_t)) 1271 ssize_t (*handler)(struct atkbd *, const char *, size_t))
1257{ 1272{
1258 struct serio *serio = to_serio_port(dev); 1273 struct serio *serio = to_serio_port(dev);
1259 struct atkbd *atkbd; 1274 struct atkbd *atkbd = serio_get_drvdata(serio);
1260 int retval; 1275 int retval;
1261 1276
1262 retval = serio_pin_driver(serio); 1277 retval = mutex_lock_interruptible(&atkbd->mutex);
1263 if (retval) 1278 if (retval)
1264 return retval; 1279 return retval;
1265 1280
1266 if (serio->drv != &atkbd_drv) {
1267 retval = -ENODEV;
1268 goto out;
1269 }
1270
1271 atkbd = serio_get_drvdata(serio);
1272 atkbd_disable(atkbd); 1281 atkbd_disable(atkbd);
1273 retval = handler(atkbd, buf, count); 1282 retval = handler(atkbd, buf, count);
1274 atkbd_enable(atkbd); 1283 atkbd_enable(atkbd);
1275 1284
1276out: 1285 mutex_unlock(&atkbd->mutex);
1277 serio_unpin_driver(serio); 1286
1278 return retval; 1287 return retval;
1279} 1288}
1280 1289
@@ -1288,7 +1297,8 @@ static ssize_t atkbd_set_extra(struct atkbd *atkbd, const char *buf, size_t coun
1288 struct input_dev *old_dev, *new_dev; 1297 struct input_dev *old_dev, *new_dev;
1289 unsigned long value; 1298 unsigned long value;
1290 int err; 1299 int err;
1291 unsigned char old_extra, old_set; 1300 bool old_extra;
1301 unsigned char old_set;
1292 1302
1293 if (!atkbd->write) 1303 if (!atkbd->write)
1294 return -EIO; 1304 return -EIO;
@@ -1371,7 +1381,7 @@ static ssize_t atkbd_set_scroll(struct atkbd *atkbd, const char *buf, size_t cou
1371 struct input_dev *old_dev, *new_dev; 1381 struct input_dev *old_dev, *new_dev;
1372 unsigned long value; 1382 unsigned long value;
1373 int err; 1383 int err;
1374 unsigned char old_scroll; 1384 bool old_scroll;
1375 1385
1376 if (strict_strtoul(buf, 10, &value) || value > 1) 1386 if (strict_strtoul(buf, 10, &value) || value > 1)
1377 return -EINVAL; 1387 return -EINVAL;
@@ -1415,7 +1425,8 @@ static ssize_t atkbd_set_set(struct atkbd *atkbd, const char *buf, size_t count)
1415 struct input_dev *old_dev, *new_dev; 1425 struct input_dev *old_dev, *new_dev;
1416 unsigned long value; 1426 unsigned long value;
1417 int err; 1427 int err;
1418 unsigned char old_set, old_extra; 1428 unsigned char old_set;
1429 bool old_extra;
1419 1430
1420 if (!atkbd->write) 1431 if (!atkbd->write)
1421 return -EIO; 1432 return -EIO;
@@ -1465,7 +1476,7 @@ static ssize_t atkbd_set_softrepeat(struct atkbd *atkbd, const char *buf, size_t
1465 struct input_dev *old_dev, *new_dev; 1476 struct input_dev *old_dev, *new_dev;
1466 unsigned long value; 1477 unsigned long value;
1467 int err; 1478 int err;
1468 unsigned char old_softrepeat, old_softraw; 1479 bool old_softrepeat, old_softraw;
1469 1480
1470 if (!atkbd->write) 1481 if (!atkbd->write)
1471 return -EIO; 1482 return -EIO;
@@ -1485,7 +1496,7 @@ static ssize_t atkbd_set_softrepeat(struct atkbd *atkbd, const char *buf, size_t
1485 atkbd->dev = new_dev; 1496 atkbd->dev = new_dev;
1486 atkbd->softrepeat = value; 1497 atkbd->softrepeat = value;
1487 if (atkbd->softrepeat) 1498 if (atkbd->softrepeat)
1488 atkbd->softraw = 1; 1499 atkbd->softraw = true;
1489 atkbd_set_device_attrs(atkbd); 1500 atkbd_set_device_attrs(atkbd);
1490 1501
1491 err = input_register_device(atkbd->dev); 1502 err = input_register_device(atkbd->dev);
@@ -1515,7 +1526,7 @@ static ssize_t atkbd_set_softraw(struct atkbd *atkbd, const char *buf, size_t co
1515 struct input_dev *old_dev, *new_dev; 1526 struct input_dev *old_dev, *new_dev;
1516 unsigned long value; 1527 unsigned long value;
1517 int err; 1528 int err;
1518 unsigned char old_softraw; 1529 bool old_softraw;
1519 1530
1520 if (strict_strtoul(buf, 10, &value) || value > 1) 1531 if (strict_strtoul(buf, 10, &value) || value > 1)
1521 return -EINVAL; 1532 return -EINVAL;
@@ -1567,9 +1578,8 @@ static int __init atkbd_setup_scancode_fixup(const struct dmi_system_id *id)
1567 return 0; 1578 return 0;
1568} 1579}
1569 1580
1570static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { 1581static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = {
1571 { 1582 {
1572 .ident = "Dell Laptop",
1573 .matches = { 1583 .matches = {
1574 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 1584 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1575 DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */ 1585 DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */
@@ -1578,7 +1588,6 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
1578 .driver_data = atkbd_dell_laptop_forced_release_keys, 1588 .driver_data = atkbd_dell_laptop_forced_release_keys,
1579 }, 1589 },
1580 { 1590 {
1581 .ident = "Dell Laptop",
1582 .matches = { 1591 .matches = {
1583 DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"), 1592 DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
1584 DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */ 1593 DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */
@@ -1587,7 +1596,6 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
1587 .driver_data = atkbd_dell_laptop_forced_release_keys, 1596 .driver_data = atkbd_dell_laptop_forced_release_keys,
1588 }, 1597 },
1589 { 1598 {
1590 .ident = "HP 2133",
1591 .matches = { 1599 .matches = {
1592 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 1600 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1593 DMI_MATCH(DMI_PRODUCT_NAME, "HP 2133"), 1601 DMI_MATCH(DMI_PRODUCT_NAME, "HP 2133"),
@@ -1596,7 +1604,6 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
1596 .driver_data = atkbd_hp_forced_release_keys, 1604 .driver_data = atkbd_hp_forced_release_keys,
1597 }, 1605 },
1598 { 1606 {
1599 .ident = "HP Pavilion ZV6100",
1600 .matches = { 1607 .matches = {
1601 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 1608 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1602 DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion ZV6100"), 1609 DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion ZV6100"),
@@ -1605,7 +1612,6 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
1605 .driver_data = atkbd_volume_forced_release_keys, 1612 .driver_data = atkbd_volume_forced_release_keys,
1606 }, 1613 },
1607 { 1614 {
1608 .ident = "HP Presario R4000",
1609 .matches = { 1615 .matches = {
1610 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 1616 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1611 DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4000"), 1617 DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4000"),
@@ -1614,7 +1620,6 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
1614 .driver_data = atkbd_volume_forced_release_keys, 1620 .driver_data = atkbd_volume_forced_release_keys,
1615 }, 1621 },
1616 { 1622 {
1617 .ident = "HP Presario R4100",
1618 .matches = { 1623 .matches = {
1619 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 1624 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1620 DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4100"), 1625 DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4100"),
@@ -1623,7 +1628,6 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
1623 .driver_data = atkbd_volume_forced_release_keys, 1628 .driver_data = atkbd_volume_forced_release_keys,
1624 }, 1629 },
1625 { 1630 {
1626 .ident = "HP Presario R4200",
1627 .matches = { 1631 .matches = {
1628 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 1632 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1629 DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4200"), 1633 DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4200"),
@@ -1632,7 +1636,7 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
1632 .driver_data = atkbd_volume_forced_release_keys, 1636 .driver_data = atkbd_volume_forced_release_keys,
1633 }, 1637 },
1634 { 1638 {
1635 .ident = "Inventec Symphony", 1639 /* Inventec Symphony */
1636 .matches = { 1640 .matches = {
1637 DMI_MATCH(DMI_SYS_VENDOR, "INVENTEC"), 1641 DMI_MATCH(DMI_SYS_VENDOR, "INVENTEC"),
1638 DMI_MATCH(DMI_PRODUCT_NAME, "SYMPHONY 6.0/7.0"), 1642 DMI_MATCH(DMI_PRODUCT_NAME, "SYMPHONY 6.0/7.0"),
@@ -1641,7 +1645,7 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
1641 .driver_data = atkbd_volume_forced_release_keys, 1645 .driver_data = atkbd_volume_forced_release_keys,
1642 }, 1646 },
1643 { 1647 {
1644 .ident = "Samsung NC10", 1648 /* Samsung NC10 */
1645 .matches = { 1649 .matches = {
1646 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), 1650 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
1647 DMI_MATCH(DMI_PRODUCT_NAME, "NC10"), 1651 DMI_MATCH(DMI_PRODUCT_NAME, "NC10"),
@@ -1650,7 +1654,7 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
1650 .driver_data = atkbd_samsung_forced_release_keys, 1654 .driver_data = atkbd_samsung_forced_release_keys,
1651 }, 1655 },
1652 { 1656 {
1653 .ident = "Samsung NC20", 1657 /* Samsung NC20 */
1654 .matches = { 1658 .matches = {
1655 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), 1659 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
1656 DMI_MATCH(DMI_PRODUCT_NAME, "NC20"), 1660 DMI_MATCH(DMI_PRODUCT_NAME, "NC20"),
@@ -1659,7 +1663,7 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
1659 .driver_data = atkbd_samsung_forced_release_keys, 1663 .driver_data = atkbd_samsung_forced_release_keys,
1660 }, 1664 },
1661 { 1665 {
1662 .ident = "Samsung SQ45S70S", 1666 /* Samsung SQ45S70S */
1663 .matches = { 1667 .matches = {
1664 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), 1668 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
1665 DMI_MATCH(DMI_PRODUCT_NAME, "SQ45S70S"), 1669 DMI_MATCH(DMI_PRODUCT_NAME, "SQ45S70S"),
@@ -1668,7 +1672,7 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
1668 .driver_data = atkbd_samsung_forced_release_keys, 1672 .driver_data = atkbd_samsung_forced_release_keys,
1669 }, 1673 },
1670 { 1674 {
1671 .ident = "Fujitsu Amilo PA 1510", 1675 /* Fujitsu Amilo PA 1510 */
1672 .matches = { 1676 .matches = {
1673 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 1677 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
1674 DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 1510"), 1678 DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 1510"),
@@ -1677,7 +1681,7 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
1677 .driver_data = atkbd_volume_forced_release_keys, 1681 .driver_data = atkbd_volume_forced_release_keys,
1678 }, 1682 },
1679 { 1683 {
1680 .ident = "Fujitsu Amilo Pi 3525", 1684 /* Fujitsu Amilo Pi 3525 */
1681 .matches = { 1685 .matches = {
1682 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 1686 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
1683 DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 3525"), 1687 DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 3525"),
@@ -1686,7 +1690,7 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
1686 .driver_data = atkbd_amilo_pi3525_forced_release_keys, 1690 .driver_data = atkbd_amilo_pi3525_forced_release_keys,
1687 }, 1691 },
1688 { 1692 {
1689 .ident = "Fujitsu Amilo Xi 3650", 1693 /* Fujitsu Amilo Xi 3650 */
1690 .matches = { 1694 .matches = {
1691 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 1695 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
1692 DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 3650"), 1696 DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 3650"),
@@ -1695,7 +1699,6 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
1695 .driver_data = atkbd_amilo_xi3650_forced_release_keys, 1699 .driver_data = atkbd_amilo_xi3650_forced_release_keys,
1696 }, 1700 },
1697 { 1701 {
1698 .ident = "Soltech Corporation TA12",
1699 .matches = { 1702 .matches = {
1700 DMI_MATCH(DMI_SYS_VENDOR, "Soltech Corporation"), 1703 DMI_MATCH(DMI_SYS_VENDOR, "Soltech Corporation"),
1701 DMI_MATCH(DMI_PRODUCT_NAME, "TA12"), 1704 DMI_MATCH(DMI_PRODUCT_NAME, "TA12"),
@@ -1704,7 +1707,7 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
1704 .driver_data = atkdb_soltech_ta12_forced_release_keys, 1707 .driver_data = atkdb_soltech_ta12_forced_release_keys,
1705 }, 1708 },
1706 { 1709 {
1707 .ident = "OQO Model 01+", 1710 /* OQO Model 01+ */
1708 .matches = { 1711 .matches = {
1709 DMI_MATCH(DMI_SYS_VENDOR, "OQO"), 1712 DMI_MATCH(DMI_SYS_VENDOR, "OQO"),
1710 DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"), 1713 DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"),