]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/media/video/saa7134/saa7134-input.c
V4L/DVB (3309): SAA7134: GPIO IRQ improvements
[karo-tx-linux.git] / drivers / media / video / saa7134 / saa7134-input.c
index 7175abbd2f8c58ff32aa7e2c46fe79c57a79135e..82d28cbf289f1a1fe1bb5e22168ee32d8de2e001 100644 (file)
@@ -56,23 +56,23 @@ static IR_KEYTAB_TYPE flyvideo_codes[IR_KEYTAB_SIZE] = {
        [   12 ] = KEY_KP8,
        [   13 ] = KEY_KP9,
 
-       [   14 ] = KEY_TUNER,        // Air/Cable
+       [   14 ] = KEY_MODE,         // Air/Cable
        [   17 ] = KEY_VIDEO,        // Video
        [   21 ] = KEY_AUDIO,        // Audio
-       [    0 ] = KEY_POWER,        // Pover
+       [    0 ] = KEY_POWER,        // Power
+       [   24 ] = KEY_TUNER,        // AV Source
        [    2 ] = KEY_ZOOM,         // Fullscreen
+       [   26 ] = KEY_LANGUAGE,     // Stereo
        [   27 ] = KEY_MUTE,         // Mute
-       [   20 ] = KEY_VOLUMEUP,
-       [   23 ] = KEY_VOLUMEDOWN,
+       [   20 ] = KEY_VOLUMEUP,     // Volume +
+       [   23 ] = KEY_VOLUMEDOWN,   // Volume -
        [   18 ] = KEY_CHANNELUP,    // Channel +
        [   19 ] = KEY_CHANNELDOWN,  // Channel -
-       [    6 ] = KEY_AGAIN,        // Recal
-       [   16 ] = KEY_KPENTER,      // Enter
-
-       [   26 ] = KEY_F22,          // Stereo
-       [   24 ] = KEY_EDIT,         // AV Source
+       [    6 ] = KEY_AGAIN,        // Recall
+       [   16 ] = KEY_ENTER,      // Enter
 };
 
+
 static IR_KEYTAB_TYPE cinergy_codes[IR_KEYTAB_SIZE] = {
        [    0 ] = KEY_KP0,
        [    1 ] = KEY_KP1,
@@ -543,12 +543,22 @@ static int build_key(struct saa7134_dev *dev)
        dprintk("build_key gpio=0x%x mask=0x%x data=%d\n",
                gpio, ir->mask_keycode, data);
 
-       if ((ir->mask_keydown  &&  (0 != (gpio & ir->mask_keydown))) ||
-           (ir->mask_keyup    &&  (0 == (gpio & ir->mask_keyup)))) {
-               ir_input_keydown(ir->dev, &ir->ir, data, data);
-       } else {
-               ir_input_nokey(ir->dev, &ir->ir);
+       if (ir->polling) {
+               if ((ir->mask_keydown  &&  (0 != (gpio & ir->mask_keydown))) ||
+                   (ir->mask_keyup    &&  (0 == (gpio & ir->mask_keyup)))) {
+                       ir_input_keydown(ir->dev, &ir->ir, data, data);
+               } else {
+                       ir_input_nokey(ir->dev, &ir->ir);
+               }
+       }
+       else {  /* IRQ driven mode - handle key press and release in one go */
+               if ((ir->mask_keydown  &&  (0 != (gpio & ir->mask_keydown))) ||
+                   (ir->mask_keyup    &&  (0 == (gpio & ir->mask_keyup)))) {
+                       ir_input_keydown(ir->dev, &ir->ir, data, data);
+                       ir_input_nokey(ir->dev, &ir->ir);
+               }
        }
+
        return 0;
 }