Commit cab8e5c4 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
  Input: document some of keycodes
  Input: add a new EV_SW SW_RADIO event, for radio switches on laptops
  Input: serio - take drv_mutex in serio_cleanup()
  Input: atkbd - use printk_ratelimit for spurious ACK messages
  Input: atkbd - throttle LED switching
  Input: i8042 - add HP Pavilion ZT1000 to the MUX blacklist
parents 0dac723e 4e4eda86
...@@ -219,7 +219,8 @@ struct atkbd { ...@@ -219,7 +219,8 @@ struct atkbd {
unsigned long time; unsigned long time;
unsigned long err_count; unsigned long err_count;
struct work_struct event_work; struct delayed_work event_work;
unsigned long event_jiffies;
struct mutex event_mutex; struct mutex event_mutex;
unsigned long event_mask; unsigned long event_mask;
}; };
...@@ -408,9 +409,10 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, ...@@ -408,9 +409,10 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
goto out; goto out;
case ATKBD_RET_ACK: case ATKBD_RET_ACK:
case ATKBD_RET_NAK: case ATKBD_RET_NAK:
printk(KERN_WARNING "atkbd.c: Spurious %s on %s. " if (printk_ratelimit())
"Some program might be trying access hardware directly.\n", printk(KERN_WARNING "atkbd.c: Spurious %s on %s. "
data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys); "Some program might be trying access hardware directly.\n",
data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys);
goto out; goto out;
case ATKBD_RET_HANGEUL: case ATKBD_RET_HANGEUL:
case ATKBD_RET_HANJA: case ATKBD_RET_HANJA:
...@@ -565,7 +567,7 @@ static int atkbd_set_leds(struct atkbd *atkbd) ...@@ -565,7 +567,7 @@ static int atkbd_set_leds(struct atkbd *atkbd)
static void atkbd_event_work(struct work_struct *work) static void atkbd_event_work(struct work_struct *work)
{ {
struct atkbd *atkbd = container_of(work, struct atkbd, event_work); struct atkbd *atkbd = container_of(work, struct atkbd, event_work.work);
mutex_lock(&atkbd->event_mutex); mutex_lock(&atkbd->event_mutex);
...@@ -578,13 +580,31 @@ static void atkbd_event_work(struct work_struct *work) ...@@ -578,13 +580,31 @@ static void atkbd_event_work(struct work_struct *work)
mutex_unlock(&atkbd->event_mutex); mutex_unlock(&atkbd->event_mutex);
} }
/*
* Schedule switch for execution. We need to throttle requests,
* otherwise keyboard may become unresponsive.
*/
static void atkbd_schedule_event_work(struct atkbd *atkbd, int event_bit)
{
unsigned long delay = msecs_to_jiffies(50);
if (time_after(jiffies, atkbd->event_jiffies + delay))
delay = 0;
atkbd->event_jiffies = jiffies;
set_bit(event_bit, &atkbd->event_mask);
wmb();
schedule_delayed_work(&atkbd->event_work, delay);
}
/* /*
* Event callback from the input module. Events that change the state of * Event callback from the input module. Events that change the state of
* the hardware are processed here. If action can not be performed in * the hardware are processed here. If action can not be performed in
* interrupt context it is offloaded to atkbd_event_work. * interrupt context it is offloaded to atkbd_event_work.
*/ */
static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) static int atkbd_event(struct input_dev *dev,
unsigned int type, unsigned int code, int value)
{ {
struct atkbd *atkbd = input_get_drvdata(dev); struct atkbd *atkbd = input_get_drvdata(dev);
...@@ -594,19 +614,12 @@ static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int co ...@@ -594,19 +614,12 @@ static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int co
switch (type) { switch (type) {
case EV_LED: case EV_LED:
set_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask); atkbd_schedule_event_work(atkbd, ATKBD_LED_EVENT_BIT);
wmb();
schedule_work(&atkbd->event_work);
return 0; return 0;
case EV_REP: case EV_REP:
if (!atkbd->softrepeat)
if (!atkbd->softrepeat) { atkbd_schedule_event_work(atkbd, ATKBD_REP_EVENT_BIT);
set_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask);
wmb();
schedule_work(&atkbd->event_work);
}
return 0; return 0;
} }
...@@ -940,7 +953,7 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv) ...@@ -940,7 +953,7 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv)
atkbd->dev = dev; atkbd->dev = dev;
ps2_init(&atkbd->ps2dev, serio); ps2_init(&atkbd->ps2dev, serio);
INIT_WORK(&atkbd->event_work, atkbd_event_work); INIT_DELAYED_WORK(&atkbd->event_work, atkbd_event_work);
mutex_init(&atkbd->event_mutex); mutex_init(&atkbd->event_mutex);
switch (serio->id.type) { switch (serio->id.type) {
......
...@@ -199,6 +199,17 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = { ...@@ -199,6 +199,17 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EA032EA#ABF)"), DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EA032EA#ABF)"),
}, },
}, },
{
/*
* Like DV4017EA does not raise AUXERR for errors on MUX ports.
*/
.ident = "HP Pavilion ZT1000",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"),
DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"),
},
},
{ {
.ident = "Toshiba P10", .ident = "Toshiba P10",
.matches = { .matches = {
......
...@@ -769,8 +769,10 @@ static int serio_driver_remove(struct device *dev) ...@@ -769,8 +769,10 @@ static int serio_driver_remove(struct device *dev)
static void serio_cleanup(struct serio *serio) static void serio_cleanup(struct serio *serio)
{ {
mutex_lock(&serio->drv_mutex);
if (serio->drv && serio->drv->cleanup) if (serio->drv && serio->drv->cleanup)
serio->drv->cleanup(serio); serio->drv->cleanup(serio);
mutex_unlock(&serio->drv_mutex);
} }
static void serio_shutdown(struct device *dev) static void serio_shutdown(struct device *dev)
......
...@@ -108,6 +108,13 @@ struct input_absinfo { ...@@ -108,6 +108,13 @@ struct input_absinfo {
/* /*
* Keys and buttons * Keys and buttons
*
* Most of the keys/buttons are modeled after USB HUT 1.12
* (see http://www.usb.org/developers/hidpage).
* Abbreviations in the comments:
* AC - Application Control
* AL - Application Launch Button
* SC - System Control
*/ */
#define KEY_RESERVED 0 #define KEY_RESERVED 0
...@@ -226,7 +233,7 @@ struct input_absinfo { ...@@ -226,7 +233,7 @@ struct input_absinfo {
#define KEY_MUTE 113 #define KEY_MUTE 113
#define KEY_VOLUMEDOWN 114 #define KEY_VOLUMEDOWN 114
#define KEY_VOLUMEUP 115 #define KEY_VOLUMEUP 115
#define KEY_POWER 116 #define KEY_POWER 116 /* SC System Power Down */
#define KEY_KPEQUAL 117 #define KEY_KPEQUAL 117
#define KEY_KPPLUSMINUS 118 #define KEY_KPPLUSMINUS 118
#define KEY_PAUSE 119 #define KEY_PAUSE 119
...@@ -240,38 +247,39 @@ struct input_absinfo { ...@@ -240,38 +247,39 @@ struct input_absinfo {
#define KEY_RIGHTMETA 126 #define KEY_RIGHTMETA 126
#define KEY_COMPOSE 127 #define KEY_COMPOSE 127
#define KEY_STOP 128 #define KEY_STOP 128 /* AC Stop */
#define KEY_AGAIN 129 #define KEY_AGAIN 129
#define KEY_PROPS 130 #define KEY_PROPS 130 /* AC Properties */
#define KEY_UNDO 131 #define KEY_UNDO 131 /* AC Undo */
#define KEY_FRONT 132 #define KEY_FRONT 132
#define KEY_COPY 133 #define KEY_COPY 133 /* AC Copy */
#define KEY_OPEN 134 #define KEY_OPEN 134 /* AC Open */
#define KEY_PASTE 135 #define KEY_PASTE 135 /* AC Paste */
#define KEY_FIND 136 #define KEY_FIND 136 /* AC Search */
#define KEY_CUT 137 #define KEY_CUT 137 /* AC Cut */
#define KEY_HELP 138 #define KEY_HELP 138 /* AL Integrated Help Center */
#define KEY_MENU 139 #define KEY_MENU 139 /* Menu (show menu) */
#define KEY_CALC 140 #define KEY_CALC 140 /* AL Calculator */
#define KEY_SETUP 141 #define KEY_SETUP 141
#define KEY_SLEEP 142 #define KEY_SLEEP 142 /* SC System Sleep */
#define KEY_WAKEUP 143 #define KEY_WAKEUP 143 /* System Wake Up */
#define KEY_FILE 144 #define KEY_FILE 144 /* AL Local Machine Browser */
#define KEY_SENDFILE 145 #define KEY_SENDFILE 145
#define KEY_DELETEFILE 146 #define KEY_DELETEFILE 146
#define KEY_XFER 147 #define KEY_XFER 147
#define KEY_PROG1 148 #define KEY_PROG1 148
#define KEY_PROG2 149 #define KEY_PROG2 149
#define KEY_WWW 150 #define KEY_WWW 150 /* AL Internet Browser */
#define KEY_MSDOS 151 #define KEY_MSDOS 151
#define KEY_COFFEE 152 #define KEY_COFFEE 152 /* AL Terminal Lock/Screensaver */
#define KEY_SCREENLOCK KEY_COFFEE
#define KEY_DIRECTION 153 #define KEY_DIRECTION 153
#define KEY_CYCLEWINDOWS 154 #define KEY_CYCLEWINDOWS 154
#define KEY_MAIL 155 #define KEY_MAIL 155
#define KEY_BOOKMARKS 156 #define KEY_BOOKMARKS 156 /* AC Bookmarks */
#define KEY_COMPUTER 157 #define KEY_COMPUTER 157
#define KEY_BACK 158 #define KEY_BACK 158 /* AC Back */
#define KEY_FORWARD 159 #define KEY_FORWARD 159 /* AC Forward */
#define KEY_CLOSECD 160 #define KEY_CLOSECD 160
#define KEY_EJECTCD 161 #define KEY_EJECTCD 161
#define KEY_EJECTCLOSECD 162 #define KEY_EJECTCLOSECD 162
...@@ -281,20 +289,20 @@ struct input_absinfo { ...@@ -281,20 +289,20 @@ struct input_absinfo {
#define KEY_STOPCD 166 #define KEY_STOPCD 166
#define KEY_RECORD 167 #define KEY_RECORD 167
#define KEY_REWIND 168 #define KEY_REWIND 168
#define KEY_PHONE 169 #define KEY_PHONE 169 /* Media Select Telephone */
#define KEY_ISO 170 #define KEY_ISO 170
#define KEY_CONFIG 171 #define KEY_CONFIG 171 /* AL Consumer Control Configuration */
#define KEY_HOMEPAGE 172 #define KEY_HOMEPAGE 172 /* AC Home */
#define KEY_REFRESH 173 #define KEY_REFRESH 173 /* AC Refresh */
#define KEY_EXIT 174 #define KEY_EXIT 174 /* AC Exit */
#define KEY_MOVE 175 #define KEY_MOVE 175
#define KEY_EDIT 176 #define KEY_EDIT 176
#define KEY_SCROLLUP 177 #define KEY_SCROLLUP 177
#define KEY_SCROLLDOWN 178 #define KEY_SCROLLDOWN 178
#define KEY_KPLEFTPAREN 179 #define KEY_KPLEFTPAREN 179
#define KEY_KPRIGHTPAREN 180 #define KEY_KPRIGHTPAREN 180
#define KEY_NEW 181 #define KEY_NEW 181 /* AC New */
#define KEY_REDO 182 #define KEY_REDO 182 /* AC Redo/Repeat */
#define KEY_F13 183 #define KEY_F13 183
#define KEY_F14 184 #define KEY_F14 184
...@@ -314,11 +322,11 @@ struct input_absinfo { ...@@ -314,11 +322,11 @@ struct input_absinfo {
#define KEY_PROG3 202 #define KEY_PROG3 202
#define KEY_PROG4 203 #define KEY_PROG4 203
#define KEY_SUSPEND 205 #define KEY_SUSPEND 205
#define KEY_CLOSE 206 #define KEY_CLOSE 206 /* AC Close */
#define KEY_PLAY 207 #define KEY_PLAY 207
#define KEY_FASTFORWARD 208 #define KEY_FASTFORWARD 208
#define KEY_BASSBOOST 209 #define KEY_BASSBOOST 209
#define KEY_PRINT 210 #define KEY_PRINT 210 /* AC Print */
#define KEY_HP 211 #define KEY_HP 211
#define KEY_CAMERA 212 #define KEY_CAMERA 212
#define KEY_SOUND 213 #define KEY_SOUND 213
...@@ -327,11 +335,11 @@ struct input_absinfo { ...@@ -327,11 +335,11 @@ struct input_absinfo {
#define KEY_CHAT 216 #define KEY_CHAT 216
#define KEY_SEARCH 217 #define KEY_SEARCH 217
#define KEY_CONNECT 218 #define KEY_CONNECT 218
#define KEY_FINANCE 219 #define KEY_FINANCE 219 /* AL Checkbook/Finance */
#define KEY_SPORT 220 #define KEY_SPORT 220
#define KEY_SHOP 221 #define KEY_SHOP 221
#define KEY_ALTERASE 222 #define KEY_ALTERASE 222
#define KEY_CANCEL 223 #define KEY_CANCEL 223 /* AC Cancel */
#define KEY_BRIGHTNESSDOWN 224 #define KEY_BRIGHTNESSDOWN 224
#define KEY_BRIGHTNESSUP 225 #define KEY_BRIGHTNESSUP 225
#define KEY_MEDIA 226 #define KEY_MEDIA 226
...@@ -341,10 +349,10 @@ struct input_absinfo { ...@@ -341,10 +349,10 @@ struct input_absinfo {
#define KEY_KBDILLUMDOWN 229 #define KEY_KBDILLUMDOWN 229
#define KEY_KBDILLUMUP 230 #define KEY_KBDILLUMUP 230
#define KEY_SEND 231 #define KEY_SEND 231 /* AC Send */
#define KEY_REPLY 232 #define KEY_REPLY 232 /* AC Reply */
#define KEY_FORWARDMAIL 233 #define KEY_FORWARDMAIL 233 /* AC Forward Msg */
#define KEY_SAVE 234 #define KEY_SAVE 234 /* AC Save */
#define KEY_DOCUMENTS 235 #define KEY_DOCUMENTS 235
#define KEY_BATTERY 236 #define KEY_BATTERY 236
...@@ -433,15 +441,15 @@ struct input_absinfo { ...@@ -433,15 +441,15 @@ struct input_absinfo {
#define KEY_CLEAR 0x163 #define KEY_CLEAR 0x163
#define KEY_POWER2 0x164 #define KEY_POWER2 0x164
#define KEY_OPTION 0x165 #define KEY_OPTION 0x165
#define KEY_INFO 0x166 #define KEY_INFO 0x166 /* AL OEM Features/Tips/Tutorial */
#define KEY_TIME 0x167 #define KEY_TIME 0x167
#define KEY_VENDOR 0x168 #define KEY_VENDOR 0x168
#define KEY_ARCHIVE 0x169 #define KEY_ARCHIVE 0x169
#define KEY_PROGRAM 0x16a #define KEY_PROGRAM 0x16a /* Media Select Program Guide */
#define KEY_CHANNEL 0x16b #define KEY_CHANNEL 0x16b
#define KEY_FAVORITES 0x16c #define KEY_FAVORITES 0x16c
#define KEY_EPG 0x16d #define KEY_EPG 0x16d
#define KEY_PVR 0x16e #define KEY_PVR 0x16e /* Media Select Home */
#define KEY_MHP 0x16f #define KEY_MHP 0x16f
#define KEY_LANGUAGE 0x170 #define KEY_LANGUAGE 0x170
#define KEY_TITLE 0x171 #define KEY_TITLE 0x171
...@@ -451,36 +459,36 @@ struct input_absinfo { ...@@ -451,36 +459,36 @@ struct input_absinfo {
#define KEY_MODE 0x175 #define KEY_MODE 0x175
#define KEY_KEYBOARD 0x176 #define KEY_KEYBOARD 0x176
#define KEY_SCREEN 0x177 #define KEY_SCREEN 0x177
#define KEY_PC 0x178 #define KEY_PC 0x178 /* Media Select Computer */
#define KEY_TV 0x179 #define KEY_TV 0x179 /* Media Select TV */
#define KEY_TV2 0x17a #define KEY_TV2 0x17a /* Media Select Cable */
#define KEY_VCR 0x17b #define KEY_VCR 0x17b /* Media Select VCR */
#define KEY_VCR2 0x17c #define KEY_VCR2 0x17c /* VCR Plus */
#define KEY_SAT 0x17d #define KEY_SAT 0x17d /* Media Select Satellite */
#define KEY_SAT2 0x17e #define KEY_SAT2 0x17e
#define KEY_CD 0x17f #define KEY_CD 0x17f /* Media Select CD */
#define KEY_TAPE 0x180 #define KEY_TAPE 0x180 /* Media Select Tape */
#define KEY_RADIO 0x181 #define KEY_RADIO 0x181
#define KEY_TUNER 0x182 #define KEY_TUNER 0x182 /* Media Select Tuner */
#define KEY_PLAYER 0x183 #define KEY_PLAYER 0x183
#define KEY_TEXT 0x184 #define KEY_TEXT 0x184
#define KEY_DVD 0x185 #define KEY_DVD 0x185 /* Media Select DVD */
#define KEY_AUX 0x186 #define KEY_AUX 0x186
#define KEY_MP3 0x187 #define KEY_MP3 0x187
#define KEY_AUDIO 0x188 #define KEY_AUDIO 0x188
#define KEY_VIDEO 0x189 #define KEY_VIDEO 0x189
#define KEY_DIRECTORY 0x18a #define KEY_DIRECTORY 0x18a
#define KEY_LIST 0x18b #define KEY_LIST 0x18b
#define KEY_MEMO 0x18c #define KEY_MEMO 0x18c /* Media Select Messages */
#define KEY_CALENDAR 0x18d #define KEY_CALENDAR 0x18d
#define KEY_RED 0x18e #define KEY_RED 0x18e
#define KEY_GREEN 0x18f #define KEY_GREEN 0x18f
#define KEY_YELLOW 0x190 #define KEY_YELLOW 0x190
#define KEY_BLUE 0x191 #define KEY_BLUE 0x191
#define KEY_CHANNELUP 0x192 #define KEY_CHANNELUP 0x192 /* Channel Increment */
#define KEY_CHANNELDOWN 0x193 #define KEY_CHANNELDOWN 0x193 /* Channel Decrement */
#define KEY_FIRST 0x194 #define KEY_FIRST 0x194
#define KEY_LAST 0x195 #define KEY_LAST 0x195 /* Recall Last */
#define KEY_AB 0x196 #define KEY_AB 0x196
#define KEY_NEXT 0x197 #define KEY_NEXT 0x197
#define KEY_RESTART 0x198 #define KEY_RESTART 0x198
...@@ -491,21 +499,21 @@ struct input_absinfo { ...@@ -491,21 +499,21 @@ struct input_absinfo {
#define KEY_DIGITS 0x19d #define KEY_DIGITS 0x19d
#define KEY_TEEN 0x19e #define KEY_TEEN 0x19e
#define KEY_TWEN 0x19f #define KEY_TWEN 0x19f
#define KEY_VIDEOPHONE 0x1a0 #define KEY_VIDEOPHONE 0x1a0 /* Media Select Video Phone */
#define KEY_GAMES 0x1a1 #define KEY_GAMES 0x1a1 /* Media Select Games */
#define KEY_ZOOMIN 0x1a2 #define KEY_ZOOMIN 0x1a2 /* AC Zoom In */
#define KEY_ZOOMOUT 0x1a3 #define KEY_ZOOMOUT 0x1a3 /* AC Zoom Out */
#define KEY_ZOOMRESET 0x1a4 #define KEY_ZOOMRESET 0x1a4 /* AC Zoom */
#define KEY_WORDPROCESSOR 0x1a5 #define KEY_WORDPROCESSOR 0x1a5 /* AL Word Processor */
#define KEY_EDITOR 0x1a6 #define KEY_EDITOR 0x1a6 /* AL Text Editor */
#define KEY_SPREADSHEET 0x1a7 #define KEY_SPREADSHEET 0x1a7 /* AL Spreadsheet */
#define KEY_GRAPHICSEDITOR 0x1a8 #define KEY_GRAPHICSEDITOR 0x1a8 /* AL Graphics Editor */
#define KEY_PRESENTATION 0x1a9 #define KEY_PRESENTATION 0x1a9 /* AL Presentation App */
#define KEY_DATABASE 0x1aa #define KEY_DATABASE 0x1aa /* AL Database App */
#define KEY_NEWS 0x1ab #define KEY_NEWS 0x1ab /* AL Newsreader */
#define KEY_VOICEMAIL 0x1ac #define KEY_VOICEMAIL 0x1ac /* AL Voicemail */
#define KEY_ADDRESSBOOK 0x1ad #define KEY_ADDRESSBOOK 0x1ad /* AL Contacts/Address Book */
#define KEY_MESSENGER 0x1ae #define KEY_MESSENGER 0x1ae /* AL Instant Messaging */
#define KEY_DISPLAYTOGGLE 0x1af /* Turn display (LCD) on and off */ #define KEY_DISPLAYTOGGLE 0x1af /* Turn display (LCD) on and off */
#define KEY_DEL_EOL 0x1c0 #define KEY_DEL_EOL 0x1c0
...@@ -603,6 +611,7 @@ struct input_absinfo { ...@@ -603,6 +611,7 @@ struct input_absinfo {
#define SW_LID 0x00 /* set = lid shut */ #define SW_LID 0x00 /* set = lid shut */
#define SW_TABLET_MODE 0x01 /* set = tablet mode */ #define SW_TABLET_MODE 0x01 /* set = tablet mode */
#define SW_HEADPHONE_INSERT 0x02 /* set = inserted */ #define SW_HEADPHONE_INSERT 0x02 /* set = inserted */
#define SW_RADIO 0x03 /* set = radio enabled */
#define SW_MAX 0x0f #define SW_MAX 0x0f
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment