aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/input/keyboard/atkbd.c47
-rw-r--r--drivers/input/serio/i8042-x86ia64io.h11
-rw-r--r--drivers/input/serio/serio.c2
-rw-r--r--include/linux/input.h143
4 files changed, 119 insertions, 84 deletions
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
index be1fe46cd308..9950fcb33650 100644
--- a/drivers/input/keyboard/atkbd.c
+++ b/drivers/input/keyboard/atkbd.c
@@ -219,7 +219,8 @@ struct atkbd {
219 unsigned long time; 219 unsigned long time;
220 unsigned long err_count; 220 unsigned long err_count;
221 221
222 struct work_struct event_work; 222 struct delayed_work event_work;
223 unsigned long event_jiffies;
223 struct mutex event_mutex; 224 struct mutex event_mutex;
224 unsigned long event_mask; 225 unsigned long event_mask;
225}; 226};
@@ -408,9 +409,10 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
408 goto out; 409 goto out;
409 case ATKBD_RET_ACK: 410 case ATKBD_RET_ACK:
410 case ATKBD_RET_NAK: 411 case ATKBD_RET_NAK:
411 printk(KERN_WARNING "atkbd.c: Spurious %s on %s. " 412 if (printk_ratelimit())
412 "Some program might be trying access hardware directly.\n", 413 printk(KERN_WARNING "atkbd.c: Spurious %s on %s. "
413 data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys); 414 "Some program might be trying access hardware directly.\n",
415 data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys);
414 goto out; 416 goto out;
415 case ATKBD_RET_HANGEUL: 417 case ATKBD_RET_HANGEUL:
416 case ATKBD_RET_HANJA: 418 case ATKBD_RET_HANJA:
@@ -565,7 +567,7 @@ static int atkbd_set_leds(struct atkbd *atkbd)
565 567
566static void atkbd_event_work(struct work_struct *work) 568static void atkbd_event_work(struct work_struct *work)
567{ 569{
568 struct atkbd *atkbd = container_of(work, struct atkbd, event_work); 570 struct atkbd *atkbd = container_of(work, struct atkbd, event_work.work);
569 571
570 mutex_lock(&atkbd->event_mutex); 572 mutex_lock(&atkbd->event_mutex);
571 573
@@ -579,12 +581,30 @@ static void atkbd_event_work(struct work_struct *work)
579} 581}
580 582
581/* 583/*
584 * Schedule switch for execution. We need to throttle requests,
585 * otherwise keyboard may become unresponsive.
586 */
587static void atkbd_schedule_event_work(struct atkbd *atkbd, int event_bit)
588{
589 unsigned long delay = msecs_to_jiffies(50);
590
591 if (time_after(jiffies, atkbd->event_jiffies + delay))
592 delay = 0;
593
594 atkbd->event_jiffies = jiffies;
595 set_bit(event_bit, &atkbd->event_mask);
596 wmb();
597 schedule_delayed_work(&atkbd->event_work, delay);
598}
599
600/*
582 * Event callback from the input module. Events that change the state of 601 * Event callback from the input module. Events that change the state of
583 * the hardware are processed here. If action can not be performed in 602 * the hardware are processed here. If action can not be performed in
584 * interrupt context it is offloaded to atkbd_event_work. 603 * interrupt context it is offloaded to atkbd_event_work.
585 */ 604 */
586 605
587static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) 606static int atkbd_event(struct input_dev *dev,
607 unsigned int type, unsigned int code, int value)
588{ 608{
589 struct atkbd *atkbd = input_get_drvdata(dev); 609 struct atkbd *atkbd = input_get_drvdata(dev);
590 610
@@ -594,19 +614,12 @@ static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int co
594 switch (type) { 614 switch (type) {
595 615
596 case EV_LED: 616 case EV_LED:
597 set_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask); 617 atkbd_schedule_event_work(atkbd, ATKBD_LED_EVENT_BIT);
598 wmb();
599 schedule_work(&atkbd->event_work);
600 return 0; 618 return 0;
601 619
602 case EV_REP: 620 case EV_REP:
603 621 if (!atkbd->softrepeat)
604 if (!atkbd->softrepeat) { 622 atkbd_schedule_event_work(atkbd, ATKBD_REP_EVENT_BIT);
605 set_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask);
606 wmb();
607 schedule_work(&atkbd->event_work);
608 }
609
610 return 0; 623 return 0;
611 } 624 }
612 625
@@ -940,7 +953,7 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv)
940 953
941 atkbd->dev = dev; 954 atkbd->dev = dev;
942 ps2_init(&atkbd->ps2dev, serio); 955 ps2_init(&atkbd->ps2dev, serio);
943 INIT_WORK(&atkbd->event_work, atkbd_event_work); 956 INIT_DELAYED_WORK(&atkbd->event_work, atkbd_event_work);
944 mutex_init(&atkbd->event_mutex); 957 mutex_init(&atkbd->event_mutex);
945 958
946 switch (serio->id.type) { 959 switch (serio->id.type) {
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
index f4a2517925e4..4fca1e7f2678 100644
--- a/drivers/input/serio/i8042-x86ia64io.h
+++ b/drivers/input/serio/i8042-x86ia64io.h
@@ -200,6 +200,17 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
200 }, 200 },
201 }, 201 },
202 { 202 {
203 /*
204 * Like DV4017EA does not raise AUXERR for errors on MUX ports.
205 */
206 .ident = "HP Pavilion ZT1000",
207 .matches = {
208 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
209 DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"),
210 DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"),
211 },
212 },
213 {
203 .ident = "Toshiba P10", 214 .ident = "Toshiba P10",
204 .matches = { 215 .matches = {
205 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), 216 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c
index 5895202b972c..a8f3bc1dff22 100644
--- a/drivers/input/serio/serio.c
+++ b/drivers/input/serio/serio.c
@@ -769,8 +769,10 @@ static int serio_driver_remove(struct device *dev)
769 769
770static void serio_cleanup(struct serio *serio) 770static void serio_cleanup(struct serio *serio)
771{ 771{
772 mutex_lock(&serio->drv_mutex);
772 if (serio->drv && serio->drv->cleanup) 773 if (serio->drv && serio->drv->cleanup)
773 serio->drv->cleanup(serio); 774 serio->drv->cleanup(serio);
775 mutex_unlock(&serio->drv_mutex);
774} 776}
775 777
776static void serio_shutdown(struct device *dev) 778static void serio_shutdown(struct device *dev)
diff --git a/include/linux/input.h b/include/linux/input.h
index be2bf3a2b031..d8521c72f69f 100644
--- a/include/linux/input.h
+++ b/include/linux/input.h
@@ -108,6 +108,13 @@ struct input_absinfo {
108 108
109/* 109/*
110 * Keys and buttons 110 * Keys and buttons
111 *
112 * Most of the keys/buttons are modeled after USB HUT 1.12
113 * (see http://www.usb.org/developers/hidpage).
114 * Abbreviations in the comments:
115 * AC - Application Control
116 * AL - Application Launch Button
117 * SC - System Control
111 */ 118 */
112 119
113#define KEY_RESERVED 0 120#define KEY_RESERVED 0
@@ -226,7 +233,7 @@ struct input_absinfo {
226#define KEY_MUTE 113 233#define KEY_MUTE 113
227#define KEY_VOLUMEDOWN 114 234#define KEY_VOLUMEDOWN 114
228#define KEY_VOLUMEUP 115 235#define KEY_VOLUMEUP 115
229#define KEY_POWER 116 236#define KEY_POWER 116 /* SC System Power Down */
230#define KEY_KPEQUAL 117 237#define KEY_KPEQUAL 117
231#define KEY_KPPLUSMINUS 118 238#define KEY_KPPLUSMINUS 118
232#define KEY_PAUSE 119 239#define KEY_PAUSE 119
@@ -240,38 +247,39 @@ struct input_absinfo {
240#define KEY_RIGHTMETA 126 247#define KEY_RIGHTMETA 126
241#define KEY_COMPOSE 127 248#define KEY_COMPOSE 127
242 249
243#define KEY_STOP 128 250#define KEY_STOP 128 /* AC Stop */
244#define KEY_AGAIN 129 251#define KEY_AGAIN 129
245#define KEY_PROPS 130 252#define KEY_PROPS 130 /* AC Properties */
246#define KEY_UNDO 131 253#define KEY_UNDO 131 /* AC Undo */
247#define KEY_FRONT 132 254#define KEY_FRONT 132
248#define KEY_COPY 133 255#define KEY_COPY 133 /* AC Copy */
249#define KEY_OPEN 134 256#define KEY_OPEN 134 /* AC Open */
250#define KEY_PASTE 135 257#define KEY_PASTE 135 /* AC Paste */
251#define KEY_FIND 136 258#define KEY_FIND 136 /* AC Search */
252#define KEY_CUT 137 259#define KEY_CUT 137 /* AC Cut */
253#define KEY_HELP 138 260#define KEY_HELP 138 /* AL Integrated Help Center */
254#define KEY_MENU 139 261#define KEY_MENU 139 /* Menu (show menu) */
255#define KEY_CALC 140 262#define KEY_CALC 140 /* AL Calculator */
256#define KEY_SETUP 141 263#define KEY_SETUP 141
257#define KEY_SLEEP 142 264#define KEY_SLEEP 142 /* SC System Sleep */
258#define KEY_WAKEUP 143 265#define KEY_WAKEUP 143 /* System Wake Up */
259#define KEY_FILE 144 266#define KEY_FILE 144 /* AL Local Machine Browser */
260#define KEY_SENDFILE 145 267#define KEY_SENDFILE 145
261#define KEY_DELETEFILE 146 268#define KEY_DELETEFILE 146
262#define KEY_XFER 147 269#define KEY_XFER 147
263#define KEY_PROG1 148 270#define KEY_PROG1 148
264#define KEY_PROG2 149 271#define KEY_PROG2 149
265#define KEY_WWW 150 272#define KEY_WWW 150 /* AL Internet Browser */
266#define KEY_MSDOS 151 273#define KEY_MSDOS 151
267#define KEY_COFFEE 152 274#define KEY_COFFEE 152 /* AL Terminal Lock/Screensaver */
275#define KEY_SCREENLOCK KEY_COFFEE
268#define KEY_DIRECTION 153 276#define KEY_DIRECTION 153
269#define KEY_CYCLEWINDOWS 154 277#define KEY_CYCLEWINDOWS 154
270#define KEY_MAIL 155 278#define KEY_MAIL 155
271#define KEY_BOOKMARKS 156 279#define KEY_BOOKMARKS 156 /* AC Bookmarks */
272#define KEY_COMPUTER 157 280#define KEY_COMPUTER 157
273#define KEY_BACK 158 281#define KEY_BACK 158 /* AC Back */
274#define KEY_FORWARD 159 282#define KEY_FORWARD 159 /* AC Forward */
275#define KEY_CLOSECD 160 283#define KEY_CLOSECD 160
276#define KEY_EJECTCD 161 284#define KEY_EJECTCD 161
277#define KEY_EJECTCLOSECD 162 285#define KEY_EJECTCLOSECD 162
@@ -281,20 +289,20 @@ struct input_absinfo {
281#define KEY_STOPCD 166 289#define KEY_STOPCD 166
282#define KEY_RECORD 167 290#define KEY_RECORD 167
283#define KEY_REWIND 168 291#define KEY_REWIND 168
284#define KEY_PHONE 169 292#define KEY_PHONE 169 /* Media Select Telephone */
285#define KEY_ISO 170 293#define KEY_ISO 170
286#define KEY_CONFIG 171 294#define KEY_CONFIG 171 /* AL Consumer Control Configuration */
287#define KEY_HOMEPAGE 172 295#define KEY_HOMEPAGE 172 /* AC Home */
288#define KEY_REFRESH 173 296#define KEY_REFRESH 173 /* AC Refresh */
289#define KEY_EXIT 174 297#define KEY_EXIT 174 /* AC Exit */
290#define KEY_MOVE 175 298#define KEY_MOVE 175
291#define KEY_EDIT 176 299#define KEY_EDIT 176
292#define KEY_SCROLLUP 177 300#define KEY_SCROLLUP 177
293#define KEY_SCROLLDOWN 178 301#define KEY_SCROLLDOWN 178
294#define KEY_KPLEFTPAREN 179 302#define KEY_KPLEFTPAREN 179
295#define KEY_KPRIGHTPAREN 180 303#define KEY_KPRIGHTPAREN 180
296#define KEY_NEW 181 304#define KEY_NEW 181 /* AC New */
297#define KEY_REDO 182 305#define KEY_REDO 182 /* AC Redo/Repeat */
298 306
299#define KEY_F13 183 307#define KEY_F13 183
300#define KEY_F14 184 308#define KEY_F14 184
@@ -314,11 +322,11 @@ struct input_absinfo {
314#define KEY_PROG3 202 322#define KEY_PROG3 202
315#define KEY_PROG4 203 323#define KEY_PROG4 203
316#define KEY_SUSPEND 205 324#define KEY_SUSPEND 205
317#define KEY_CLOSE 206 325#define KEY_CLOSE 206 /* AC Close */
318#define KEY_PLAY 207 326#define KEY_PLAY 207
319#define KEY_FASTFORWARD 208 327#define KEY_FASTFORWARD 208
320#define KEY_BASSBOOST 209 328#define KEY_BASSBOOST 209
321#define KEY_PRINT 210 329#define KEY_PRINT 210 /* AC Print */
322#define KEY_HP 211 330#define KEY_HP 211
323#define KEY_CAMERA 212 331#define KEY_CAMERA 212
324#define KEY_SOUND 213 332#define KEY_SOUND 213
@@ -327,11 +335,11 @@ struct input_absinfo {
327#define KEY_CHAT 216 335#define KEY_CHAT 216
328#define KEY_SEARCH 217 336#define KEY_SEARCH 217
329#define KEY_CONNECT 218 337#define KEY_CONNECT 218
330#define KEY_FINANCE 219 338#define KEY_FINANCE 219 /* AL Checkbook/Finance */
331#define KEY_SPORT 220 339#define KEY_SPORT 220
332#define KEY_SHOP 221 340#define KEY_SHOP 221
333#define KEY_ALTERASE 222 341#define KEY_ALTERASE 222
334#define KEY_CANCEL 223 342#define KEY_CANCEL 223 /* AC Cancel */
335#define KEY_BRIGHTNESSDOWN 224 343#define KEY_BRIGHTNESSDOWN 224
336#define KEY_BRIGHTNESSUP 225 344#define KEY_BRIGHTNESSUP 225
337#define KEY_MEDIA 226 345#define KEY_MEDIA 226
@@ -341,10 +349,10 @@ struct input_absinfo {
341#define KEY_KBDILLUMDOWN 229 349#define KEY_KBDILLUMDOWN 229
342#define KEY_KBDILLUMUP 230 350#define KEY_KBDILLUMUP 230
343 351
344#define KEY_SEND 231 352#define KEY_SEND 231 /* AC Send */
345#define KEY_REPLY 232 353#define KEY_REPLY 232 /* AC Reply */
346#define KEY_FORWARDMAIL 233 354#define KEY_FORWARDMAIL 233 /* AC Forward Msg */
347#define KEY_SAVE 234 355#define KEY_SAVE 234 /* AC Save */
348#define KEY_DOCUMENTS 235 356#define KEY_DOCUMENTS 235
349 357
350#define KEY_BATTERY 236 358#define KEY_BATTERY 236
@@ -433,15 +441,15 @@ struct input_absinfo {
433#define KEY_CLEAR 0x163 441#define KEY_CLEAR 0x163
434#define KEY_POWER2 0x164 442#define KEY_POWER2 0x164
435#define KEY_OPTION 0x165 443#define KEY_OPTION 0x165
436#define KEY_INFO 0x166 444#define KEY_INFO 0x166 /* AL OEM Features/Tips/Tutorial */
437#define KEY_TIME 0x167 445#define KEY_TIME 0x167
438#define KEY_VENDOR 0x168 446#define KEY_VENDOR 0x168
439#define KEY_ARCHIVE 0x169 447#define KEY_ARCHIVE 0x169
440#define KEY_PROGRAM 0x16a 448#define KEY_PROGRAM 0x16a /* Media Select Program Guide */
441#define KEY_CHANNEL 0x16b 449#define KEY_CHANNEL 0x16b
442#define KEY_FAVORITES 0x16c 450#define KEY_FAVORITES 0x16c
443#define KEY_EPG 0x16d 451#define KEY_EPG 0x16d
444#define KEY_PVR 0x16e 452#define KEY_PVR 0x16e /* Media Select Home */
445#define KEY_MHP 0x16f 453#define KEY_MHP 0x16f
446#define KEY_LANGUAGE 0x170 454#define KEY_LANGUAGE 0x170
447#define KEY_TITLE 0x171 455#define KEY_TITLE 0x171
@@ -451,36 +459,36 @@ struct input_absinfo {
451#define KEY_MODE 0x175 459#define KEY_MODE 0x175
452#define KEY_KEYBOARD 0x176 460#define KEY_KEYBOARD 0x176
453#define KEY_SCREEN 0x177 461#define KEY_SCREEN 0x177
454#define KEY_PC 0x178 462#define KEY_PC 0x178 /* Media Select Computer */
455#define KEY_TV 0x179 463#define KEY_TV 0x179 /* Media Select TV */
456#define KEY_TV2 0x17a 464#define KEY_TV2 0x17a /* Media Select Cable */
457#define KEY_VCR 0x17b 465#define KEY_VCR 0x17b /* Media Select VCR */
458#define KEY_VCR2 0x17c 466#define KEY_VCR2 0x17c /* VCR Plus */
459#define KEY_SAT 0x17d 467#define KEY_SAT 0x17d /* Media Select Satellite */
460#define KEY_SAT2 0x17e 468#define KEY_SAT2 0x17e
461#define KEY_CD 0x17f 469#define KEY_CD 0x17f /* Media Select CD */
462#define KEY_TAPE 0x180 470#define KEY_TAPE 0x180 /* Media Select Tape */
463#define KEY_RADIO 0x181 471#define KEY_RADIO 0x181
464#define KEY_TUNER 0x182 472#define KEY_TUNER 0x182 /* Media Select Tuner */
465#define KEY_PLAYER 0x183 473#define KEY_PLAYER 0x183
466#define KEY_TEXT 0x184 474#define KEY_TEXT 0x184
467#define KEY_DVD 0x185 475#define KEY_DVD 0x185 /* Media Select DVD */
468#define KEY_AUX 0x186 476#define KEY_AUX 0x186
469#define KEY_MP3 0x187 477#define KEY_MP3 0x187
470#define KEY_AUDIO 0x188 478#define KEY_AUDIO 0x188
471#define KEY_VIDEO 0x189 479#define KEY_VIDEO 0x189
472#define KEY_DIRECTORY 0x18a 480#define KEY_DIRECTORY 0x18a
473#define KEY_LIST 0x18b 481#define KEY_LIST 0x18b
474#define KEY_MEMO 0x18c 482#define KEY_MEMO 0x18c /* Media Select Messages */
475#define KEY_CALENDAR 0x18d 483#define KEY_CALENDAR 0x18d
476#define KEY_RED 0x18e 484#define KEY_RED 0x18e
477#define KEY_GREEN 0x18f 485#define KEY_GREEN 0x18f
478#define KEY_YELLOW 0x190 486#define KEY_YELLOW 0x190
479#define KEY_BLUE 0x191 487#define KEY_BLUE 0x191
480#define KEY_CHANNELUP 0x192 488#define KEY_CHANNELUP 0x192 /* Channel Increment */
481#define KEY_CHANNELDOWN 0x193 489#define KEY_CHANNELDOWN 0x193 /* Channel Decrement */
482#define KEY_FIRST 0x194 490#define KEY_FIRST 0x194
483#define KEY_LAST 0x195 491#define KEY_LAST 0x195 /* Recall Last */
484#define KEY_AB 0x196 492#define KEY_AB 0x196
485#define KEY_NEXT 0x197 493#define KEY_NEXT 0x197
486#define KEY_RESTART 0x198 494#define KEY_RESTART 0x198
@@ -491,21 +499,21 @@ struct input_absinfo {
491#define KEY_DIGITS 0x19d 499#define KEY_DIGITS 0x19d
492#define KEY_TEEN 0x19e 500#define KEY_TEEN 0x19e
493#define KEY_TWEN 0x19f 501#define KEY_TWEN 0x19f
494#define KEY_VIDEOPHONE 0x1a0 502#define KEY_VIDEOPHONE 0x1a0 /* Media Select Video Phone */
495#define KEY_GAMES 0x1a1 503#define KEY_GAMES 0x1a1 /* Media Select Games */
496#define KEY_ZOOMIN 0x1a2 504#define KEY_ZOOMIN 0x1a2 /* AC Zoom In */
497#define KEY_ZOOMOUT 0x1a3 505#define KEY_ZOOMOUT 0x1a3 /* AC Zoom Out */
498#define KEY_ZOOMRESET 0x1a4 506#define KEY_ZOOMRESET 0x1a4 /* AC Zoom */
499#define KEY_WORDPROCESSOR 0x1a5 507#define KEY_WORDPROCESSOR 0x1a5 /* AL Word Processor */
500#define KEY_EDITOR 0x1a6 508#define KEY_EDITOR 0x1a6 /* AL Text Editor */
501#define KEY_SPREADSHEET 0x1a7 509#define KEY_SPREADSHEET 0x1a7 /* AL Spreadsheet */
502#define KEY_GRAPHICSEDITOR 0x1a8 510#define KEY_GRAPHICSEDITOR 0x1a8 /* AL Graphics Editor */
503#define KEY_PRESENTATION 0x1a9 511#define KEY_PRESENTATION 0x1a9 /* AL Presentation App */
504#define KEY_DATABASE 0x1aa 512#define KEY_DATABASE 0x1aa /* AL Database App */
505#define KEY_NEWS 0x1ab 513#define KEY_NEWS 0x1ab /* AL Newsreader */
506#define KEY_VOICEMAIL 0x1ac 514#define KEY_VOICEMAIL 0x1ac /* AL Voicemail */
507#define KEY_ADDRESSBOOK 0x1ad 515#define KEY_ADDRESSBOOK 0x1ad /* AL Contacts/Address Book */
508#define KEY_MESSENGER 0x1ae 516#define KEY_MESSENGER 0x1ae /* AL Instant Messaging */
509#define KEY_DISPLAYTOGGLE 0x1af /* Turn display (LCD) on and off */ 517#define KEY_DISPLAYTOGGLE 0x1af /* Turn display (LCD) on and off */
510 518
511#define KEY_DEL_EOL 0x1c0 519#define KEY_DEL_EOL 0x1c0
@@ -603,6 +611,7 @@ struct input_absinfo {
603#define SW_LID 0x00 /* set = lid shut */ 611#define SW_LID 0x00 /* set = lid shut */
604#define SW_TABLET_MODE 0x01 /* set = tablet mode */ 612#define SW_TABLET_MODE 0x01 /* set = tablet mode */
605#define SW_HEADPHONE_INSERT 0x02 /* set = inserted */ 613#define SW_HEADPHONE_INSERT 0x02 /* set = inserted */
614#define SW_RADIO 0x03 /* set = radio enabled */
606#define SW_MAX 0x0f 615#define SW_MAX 0x0f
607 616
608/* 617/*