Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Thu, 5 Jul 2007 22:55:37 +0000 (15:55 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Thu, 5 Jul 2007 22:55:37 +0000 (15:55 -0700)
* '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

drivers/input/keyboard/atkbd.c
drivers/input/serio/i8042-x86ia64io.h
drivers/input/serio/serio.c
include/linux/input.h

index be1fe46cd3082d5c46968dc8d878f84a427ffe4b..9950fcb33650a6ef015fe3343e527249df47f58f 100644 (file)
@@ -219,7 +219,8 @@ struct atkbd {
        unsigned long time;
        unsigned long err_count;
 
-       struct work_struct event_work;
+       struct delayed_work event_work;
+       unsigned long event_jiffies;
        struct mutex event_mutex;
        unsigned long event_mask;
 };
@@ -408,9 +409,10 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
                        goto out;
                case ATKBD_RET_ACK:
                case ATKBD_RET_NAK:
-                       printk(KERN_WARNING "atkbd.c: Spurious %s on %s. "
-                              "Some program might be trying access hardware directly.\n",
-                              data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys);
+                       if (printk_ratelimit())
+                               printk(KERN_WARNING "atkbd.c: Spurious %s on %s. "
+                                      "Some program might be trying access hardware directly.\n",
+                                      data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys);
                        goto out;
                case ATKBD_RET_HANGEUL:
                case ATKBD_RET_HANJA:
@@ -565,7 +567,7 @@ static int atkbd_set_leds(struct atkbd *atkbd)
 
 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);
 
@@ -578,13 +580,31 @@ static void atkbd_event_work(struct work_struct *work)
        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
  * the hardware are processed here. If action can not be performed in
  * 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);
 
@@ -594,19 +614,12 @@ static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int co
        switch (type) {
 
                case EV_LED:
-                       set_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask);
-                       wmb();
-                       schedule_work(&atkbd->event_work);
+                       atkbd_schedule_event_work(atkbd, ATKBD_LED_EVENT_BIT);
                        return 0;
 
                case EV_REP:
-
-                       if (!atkbd->softrepeat) {
-                               set_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask);
-                               wmb();
-                               schedule_work(&atkbd->event_work);
-                       }
-
+                       if (!atkbd->softrepeat)
+                               atkbd_schedule_event_work(atkbd, ATKBD_REP_EVENT_BIT);
                        return 0;
        }
 
@@ -940,7 +953,7 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv)
 
        atkbd->dev = dev;
        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);
 
        switch (serio->id.type) {
index f4a2517925e4c3746b0beecd984ef906edc1ac3c..4fca1e7f26781e1ce874f98f0cf5941a483c0ae3 100644 (file)
@@ -199,6 +199,17 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
                        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",
                .matches = {
index 5895202b972c01ef1f85cda6a42585759fef65d9..a8f3bc1dff221ed00e0e2e513b0978a32f4a2779 100644 (file)
@@ -769,8 +769,10 @@ static int serio_driver_remove(struct device *dev)
 
 static void serio_cleanup(struct serio *serio)
 {
+       mutex_lock(&serio->drv_mutex);
        if (serio->drv && serio->drv->cleanup)
                serio->drv->cleanup(serio);
+       mutex_unlock(&serio->drv_mutex);
 }
 
 static void serio_shutdown(struct device *dev)
index be2bf3a2b0313aaa3293855ca69680d655168f47..d8521c72f69f9ff4aad1fc97223cd6dbadd5923d 100644 (file)
@@ -108,6 +108,13 @@ struct input_absinfo {
 
 /*
  * 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
@@ -226,7 +233,7 @@ struct input_absinfo {
 #define KEY_MUTE               113
 #define KEY_VOLUMEDOWN         114
 #define KEY_VOLUMEUP           115
-#define KEY_POWER              116
+#define KEY_POWER              116     /* SC System Power Down */
 #define KEY_KPEQUAL            117
 #define KEY_KPPLUSMINUS                118
 #define KEY_PAUSE              119
@@ -240,38 +247,39 @@ struct input_absinfo {
 #define KEY_RIGHTMETA          126
 #define KEY_COMPOSE            127
 
-#define KEY_STOP               128
+#define KEY_STOP               128     /* AC Stop */
 #define KEY_AGAIN              129
-#define KEY_PROPS              130
-#define KEY_UNDO               131
+#define KEY_PROPS              130     /* AC Properties */
+#define KEY_UNDO               131     /* AC Undo */
 #define KEY_FRONT              132
-#define KEY_COPY               133
-#define KEY_OPEN               134
-#define KEY_PASTE              135
-#define KEY_FIND               136
-#define KEY_CUT                        137
-#define KEY_HELP               138
-#define KEY_MENU               139
-#define KEY_CALC               140
+#define KEY_COPY               133     /* AC Copy */
+#define KEY_OPEN               134     /* AC Open */
+#define KEY_PASTE              135     /* AC Paste */
+#define KEY_FIND               136     /* AC Search */
+#define KEY_CUT                        137     /* AC Cut */
+#define KEY_HELP               138     /* AL Integrated Help Center */
+#define KEY_MENU               139     /* Menu (show menu) */
+#define KEY_CALC               140     /* AL Calculator */
 #define KEY_SETUP              141
-#define KEY_SLEEP              142
-#define KEY_WAKEUP             143
-#define KEY_FILE               144
+#define KEY_SLEEP              142     /* SC System Sleep */
+#define KEY_WAKEUP             143     /* System Wake Up */
+#define KEY_FILE               144     /* AL Local Machine Browser */
 #define KEY_SENDFILE           145
 #define KEY_DELETEFILE         146
 #define KEY_XFER               147
 #define KEY_PROG1              148
 #define KEY_PROG2              149
-#define KEY_WWW                        150
+#define KEY_WWW                        150     /* AL Internet Browser */
 #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_CYCLEWINDOWS       154
 #define KEY_MAIL               155
-#define KEY_BOOKMARKS          156
+#define KEY_BOOKMARKS          156     /* AC Bookmarks */
 #define KEY_COMPUTER           157
-#define KEY_BACK               158
-#define KEY_FORWARD            159
+#define KEY_BACK               158     /* AC Back */
+#define KEY_FORWARD            159     /* AC Forward */
 #define KEY_CLOSECD            160
 #define KEY_EJECTCD            161
 #define KEY_EJECTCLOSECD       162
@@ -281,20 +289,20 @@ struct input_absinfo {
 #define KEY_STOPCD             166
 #define KEY_RECORD             167
 #define KEY_REWIND             168
-#define KEY_PHONE              169
+#define KEY_PHONE              169     /* Media Select Telephone */
 #define KEY_ISO                        170
-#define KEY_CONFIG             171
-#define KEY_HOMEPAGE           172
-#define KEY_REFRESH            173
-#define KEY_EXIT               174
+#define KEY_CONFIG             171     /* AL Consumer Control Configuration */
+#define KEY_HOMEPAGE           172     /* AC Home */
+#define KEY_REFRESH            173     /* AC Refresh */
+#define KEY_EXIT               174     /* AC Exit */
 #define KEY_MOVE               175
 #define KEY_EDIT               176
 #define KEY_SCROLLUP           177
 #define KEY_SCROLLDOWN         178
 #define KEY_KPLEFTPAREN                179
 #define KEY_KPRIGHTPAREN       180
-#define KEY_NEW                        181
-#define KEY_REDO               182
+#define KEY_NEW                        181     /* AC New */
+#define KEY_REDO               182     /* AC Redo/Repeat */
 
 #define KEY_F13                        183
 #define KEY_F14                        184
@@ -314,11 +322,11 @@ struct input_absinfo {
 #define KEY_PROG3              202
 #define KEY_PROG4              203
 #define KEY_SUSPEND            205
-#define KEY_CLOSE              206
+#define KEY_CLOSE              206     /* AC Close */
 #define KEY_PLAY               207
 #define KEY_FASTFORWARD                208
 #define KEY_BASSBOOST          209
-#define KEY_PRINT              210
+#define KEY_PRINT              210     /* AC Print */
 #define KEY_HP                 211
 #define KEY_CAMERA             212
 #define KEY_SOUND              213
@@ -327,11 +335,11 @@ struct input_absinfo {
 #define KEY_CHAT               216
 #define KEY_SEARCH             217
 #define KEY_CONNECT            218
-#define KEY_FINANCE            219
+#define KEY_FINANCE            219     /* AL Checkbook/Finance */
 #define KEY_SPORT              220
 #define KEY_SHOP               221
 #define KEY_ALTERASE           222
-#define KEY_CANCEL             223
+#define KEY_CANCEL             223     /* AC Cancel */
 #define KEY_BRIGHTNESSDOWN     224
 #define KEY_BRIGHTNESSUP       225
 #define KEY_MEDIA              226
@@ -341,10 +349,10 @@ struct input_absinfo {
 #define KEY_KBDILLUMDOWN       229
 #define KEY_KBDILLUMUP         230
 
-#define KEY_SEND               231
-#define KEY_REPLY              232
-#define KEY_FORWARDMAIL                233
-#define KEY_SAVE               234
+#define KEY_SEND               231     /* AC Send */
+#define KEY_REPLY              232     /* AC Reply */
+#define KEY_FORWARDMAIL                233     /* AC Forward Msg */
+#define KEY_SAVE               234     /* AC Save */
 #define KEY_DOCUMENTS          235
 
 #define KEY_BATTERY            236
@@ -433,15 +441,15 @@ struct input_absinfo {
 #define KEY_CLEAR              0x163
 #define KEY_POWER2             0x164
 #define KEY_OPTION             0x165
-#define KEY_INFO               0x166
+#define KEY_INFO               0x166   /* AL OEM Features/Tips/Tutorial */
 #define KEY_TIME               0x167
 #define KEY_VENDOR             0x168
 #define KEY_ARCHIVE            0x169
-#define KEY_PROGRAM            0x16a
+#define KEY_PROGRAM            0x16a   /* Media Select Program Guide */
 #define KEY_CHANNEL            0x16b
 #define KEY_FAVORITES          0x16c
 #define KEY_EPG                        0x16d
-#define KEY_PVR                        0x16e
+#define KEY_PVR                        0x16e   /* Media Select Home */
 #define KEY_MHP                        0x16f
 #define KEY_LANGUAGE           0x170
 #define KEY_TITLE              0x171
@@ -451,36 +459,36 @@ struct input_absinfo {
 #define KEY_MODE               0x175
 #define KEY_KEYBOARD           0x176
 #define KEY_SCREEN             0x177
-#define KEY_PC                 0x178
-#define KEY_TV                 0x179
-#define KEY_TV2                        0x17a
-#define KEY_VCR                        0x17b
-#define KEY_VCR2               0x17c
-#define KEY_SAT                        0x17d
+#define KEY_PC                 0x178   /* Media Select Computer */
+#define KEY_TV                 0x179   /* Media Select TV */
+#define KEY_TV2                        0x17a   /* Media Select Cable */
+#define KEY_VCR                        0x17b   /* Media Select VCR */
+#define KEY_VCR2               0x17c   /* VCR Plus */
+#define KEY_SAT                        0x17d   /* Media Select Satellite */
 #define KEY_SAT2               0x17e
-#define KEY_CD                 0x17f
-#define KEY_TAPE               0x180
+#define KEY_CD                 0x17f   /* Media Select CD */
+#define KEY_TAPE               0x180   /* Media Select Tape */
 #define KEY_RADIO              0x181
-#define KEY_TUNER              0x182
+#define KEY_TUNER              0x182   /* Media Select Tuner */
 #define KEY_PLAYER             0x183
 #define KEY_TEXT               0x184
-#define KEY_DVD                        0x185
+#define KEY_DVD                        0x185   /* Media Select DVD */
 #define KEY_AUX                        0x186
 #define KEY_MP3                        0x187
 #define KEY_AUDIO              0x188
 #define KEY_VIDEO              0x189
 #define KEY_DIRECTORY          0x18a
 #define KEY_LIST               0x18b
-#define KEY_MEMO               0x18c
+#define KEY_MEMO               0x18c   /* Media Select Messages */
 #define KEY_CALENDAR           0x18d
 #define KEY_RED                        0x18e
 #define KEY_GREEN              0x18f
 #define KEY_YELLOW             0x190
 #define KEY_BLUE               0x191
-#define KEY_CHANNELUP          0x192
-#define KEY_CHANNELDOWN                0x193
+#define KEY_CHANNELUP          0x192   /* Channel Increment */
+#define KEY_CHANNELDOWN                0x193   /* Channel Decrement */
 #define KEY_FIRST              0x194
-#define KEY_LAST               0x195
+#define KEY_LAST               0x195   /* Recall Last */
 #define KEY_AB                 0x196
 #define KEY_NEXT               0x197
 #define KEY_RESTART            0x198
@@ -491,21 +499,21 @@ struct input_absinfo {
 #define KEY_DIGITS             0x19d
 #define KEY_TEEN               0x19e
 #define KEY_TWEN               0x19f
-#define KEY_VIDEOPHONE         0x1a0
-#define KEY_GAMES              0x1a1
-#define KEY_ZOOMIN             0x1a2
-#define KEY_ZOOMOUT            0x1a3
-#define KEY_ZOOMRESET          0x1a4
-#define KEY_WORDPROCESSOR      0x1a5
-#define KEY_EDITOR             0x1a6
-#define KEY_SPREADSHEET                0x1a7
-#define KEY_GRAPHICSEDITOR     0x1a8
-#define KEY_PRESENTATION       0x1a9
-#define KEY_DATABASE           0x1aa
-#define KEY_NEWS               0x1ab
-#define KEY_VOICEMAIL          0x1ac
-#define KEY_ADDRESSBOOK                0x1ad
-#define KEY_MESSENGER          0x1ae
+#define KEY_VIDEOPHONE         0x1a0   /* Media Select Video Phone */
+#define KEY_GAMES              0x1a1   /* Media Select Games */
+#define KEY_ZOOMIN             0x1a2   /* AC Zoom In */
+#define KEY_ZOOMOUT            0x1a3   /* AC Zoom Out */
+#define KEY_ZOOMRESET          0x1a4   /* AC Zoom */
+#define KEY_WORDPROCESSOR      0x1a5   /* AL Word Processor */
+#define KEY_EDITOR             0x1a6   /* AL Text Editor */
+#define KEY_SPREADSHEET                0x1a7   /* AL Spreadsheet */
+#define KEY_GRAPHICSEDITOR     0x1a8   /* AL Graphics Editor */
+#define KEY_PRESENTATION       0x1a9   /* AL Presentation App */
+#define KEY_DATABASE           0x1aa   /* AL Database App */
+#define KEY_NEWS               0x1ab   /* AL Newsreader */
+#define KEY_VOICEMAIL          0x1ac   /* AL Voicemail */
+#define KEY_ADDRESSBOOK                0x1ad   /* AL Contacts/Address Book */
+#define KEY_MESSENGER          0x1ae   /* AL Instant Messaging */
 #define KEY_DISPLAYTOGGLE      0x1af   /* Turn display (LCD) on and off */
 
 #define KEY_DEL_EOL            0x1c0
@@ -603,6 +611,7 @@ struct input_absinfo {
 #define SW_LID                 0x00  /* set = lid shut */
 #define SW_TABLET_MODE         0x01  /* set = tablet mode */
 #define SW_HEADPHONE_INSERT    0x02  /* set = inserted */
+#define SW_RADIO               0x03  /* set = radio enabled */
 #define SW_MAX                 0x0f
 
 /*