diff options
Diffstat (limited to 'drivers/input/keyboard/atkbd.c')
-rw-r--r-- | drivers/input/keyboard/atkbd.c | 409 |
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); | |||
40 | MODULE_PARM_DESC(set, "Select keyboard code set (2 = default, 3 = PS/2 native)"); | 40 | MODULE_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__) |
43 | static int atkbd_reset; | 43 | static bool atkbd_reset; |
44 | #else | 44 | #else |
45 | static int atkbd_reset = 1; | 45 | static bool atkbd_reset = true; |
46 | #endif | 46 | #endif |
47 | module_param_named(reset, atkbd_reset, bool, 0); | 47 | module_param_named(reset, atkbd_reset, bool, 0); |
48 | MODULE_PARM_DESC(reset, "Reset keyboard during initialization"); | 48 | MODULE_PARM_DESC(reset, "Reset keyboard during initialization"); |
49 | 49 | ||
50 | static int atkbd_softrepeat; | 50 | static bool atkbd_softrepeat; |
51 | module_param_named(softrepeat, atkbd_softrepeat, bool, 0); | 51 | module_param_named(softrepeat, atkbd_softrepeat, bool, 0); |
52 | MODULE_PARM_DESC(softrepeat, "Use software keyboard repeat"); | 52 | MODULE_PARM_DESC(softrepeat, "Use software keyboard repeat"); |
53 | 53 | ||
54 | static int atkbd_softraw = 1; | 54 | static bool atkbd_softraw = true; |
55 | module_param_named(softraw, atkbd_softraw, bool, 0); | 55 | module_param_named(softraw, atkbd_softraw, bool, 0); |
56 | MODULE_PARM_DESC(softraw, "Use software generated rawmode"); | 56 | MODULE_PARM_DESC(softraw, "Use software generated rawmode"); |
57 | 57 | ||
58 | static int atkbd_scroll; | 58 | static bool atkbd_scroll; |
59 | module_param_named(scroll, atkbd_scroll, bool, 0); | 59 | module_param_named(scroll, atkbd_scroll, bool, 0); |
60 | MODULE_PARM_DESC(scroll, "Enable scroll-wheel on MS Office and similar keyboards"); | 60 | MODULE_PARM_DESC(scroll, "Enable scroll-wheel on MS Office and similar keyboards"); |
61 | 61 | ||
62 | static int atkbd_extra; | 62 | static bool atkbd_extra; |
63 | module_param_named(extra, atkbd_extra, bool, 0); | 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"); | 64 | MODULE_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 | ||
178 | static const struct { | 179 | static 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 | */ |
301 | static int atkbd_need_xlate(unsigned long xl_bit, unsigned char code) | 304 | static 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 | ||
358 | static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, | 361 | static 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; |
516 | out: | 518 | out: |
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, | |||
652 | static inline void atkbd_enable(struct atkbd *atkbd) | 655 | static 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) | |||
664 | static inline void atkbd_disable(struct atkbd *atkbd) | 667 | static 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 | ||
1196 | static struct serio_device_id atkbd_serio_ids[] = { | 1224 | static 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 | ||
1250 | out: | 1267 | return handler(atkbd, buf); |
1251 | serio_unpin_driver(serio); | ||
1252 | return retval; | ||
1253 | } | 1268 | } |
1254 | 1269 | ||
1255 | static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count, | 1270 | static 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 | ||
1276 | out: | 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 | ||
1570 | static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { | 1581 | static 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"), |