]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/media/video/saa7134/saa7134-core.c
V4L/DVB (3309): SAA7134: GPIO IRQ improvements
[karo-tx-linux.git] / drivers / media / video / saa7134 / saa7134-core.c
index d4be1fd20a36262d4a523c6b38f1b0a246f89978..accbc32725cf9d9fdd190c0ff5590e83d8d97291 100644 (file)
@@ -539,11 +539,38 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs)
                    card_has_mpeg(dev))
                        saa7134_irq_ts_done(dev,status);
 
-               if ((report & (SAA7134_IRQ_REPORT_GPIO16 |
-                              SAA7134_IRQ_REPORT_GPIO18)) &&
-                   dev->remote)
-                       saa7134_input_irq(dev);
+               if (report & SAA7134_IRQ_REPORT_GPIO16) {
+                       switch (dev->has_remote) {
+                               case SAA7134_REMOTE_GPIO:
+                                       if  (dev->remote->mask_keydown & 0x10000) {
+                                               saa7134_input_irq(dev);
+                                       }
+                                       break;
+
+                               case SAA7134_REMOTE_I2C:
+                                       break;                  /* FIXME: invoke I2C get_key() */
+
+                               default:                        /* GPIO16 not used by IR remote */
+                                       break;
+                       }
+               }
 
+               if (report & SAA7134_IRQ_REPORT_GPIO18) {
+                       switch (dev->has_remote) {
+                               case SAA7134_REMOTE_GPIO:
+                                       if ((dev->remote->mask_keydown & 0x40000) ||
+                                           (dev->remote->mask_keyup & 0x40000)) {
+                                               saa7134_input_irq(dev);
+                                       }
+                                       break;
+
+                               case SAA7134_REMOTE_I2C:
+                                       break;                  /* FIXME: invoke I2C get_key() */
+
+                               default:                        /* GPIO18 not used by IR remote */
+                                       break;
+                       }
+               }
        }
 
        if (10 == loop) {
@@ -553,13 +580,16 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs)
                        printk(KERN_WARNING "%s/irq: looping -- "
                               "clearing PE (parity error!) enable bit\n",dev->name);
                        saa_clearl(SAA7134_IRQ2,SAA7134_IRQ2_INTE_PE);
-               } else if (report & (SAA7134_IRQ_REPORT_GPIO16 |
-                                    SAA7134_IRQ_REPORT_GPIO18)) {
-                       /* disable gpio IRQs */
+               } else if (report & SAA7134_IRQ_REPORT_GPIO16) {
+                       /* disable gpio16 IRQ */
                        printk(KERN_WARNING "%s/irq: looping -- "
-                              "clearing GPIO enable bits\n",dev->name);
-                       saa_clearl(SAA7134_IRQ2, (SAA7134_IRQ2_INTE_GPIO16 |
-                                                 SAA7134_IRQ2_INTE_GPIO18));
+                              "clearing GPIO16 enable bit\n",dev->name);
+                       saa_clearl(SAA7134_IRQ2, SAA7134_IRQ2_INTE_GPIO16);
+               } else if (report & SAA7134_IRQ_REPORT_GPIO18) {
+                       /* disable gpio18 IRQs */
+                       printk(KERN_WARNING "%s/irq: looping -- "
+                              "clearing GPIO18 enable bit\n",dev->name);
+                       saa_clearl(SAA7134_IRQ2, SAA7134_IRQ2_INTE_GPIO18);
                } else {
                        /* disable all irqs */
                        printk(KERN_WARNING "%s/irq: looping -- "
@@ -640,10 +670,14 @@ static int saa7134_hwinit2(struct saa7134_dev *dev)
                SAA7134_IRQ2_INTE_PE      |
                SAA7134_IRQ2_INTE_AR;
 
-       if (dev->has_remote == SAA7134_REMOTE_GPIO)
-               irq2_mask |= (SAA7134_IRQ2_INTE_GPIO18  |
-                             SAA7134_IRQ2_INTE_GPIO18A |
-                             SAA7134_IRQ2_INTE_GPIO16  );
+       if (dev->has_remote == SAA7134_REMOTE_GPIO) {
+               if (dev->remote->mask_keydown & 0x10000)
+                       irq2_mask |= SAA7134_IRQ2_INTE_GPIO16;
+               else if (dev->remote->mask_keydown & 0x40000)
+                       irq2_mask |= SAA7134_IRQ2_INTE_GPIO18;
+               else if (dev->remote->mask_keyup & 0x40000)
+                       irq2_mask |= SAA7134_IRQ2_INTE_GPIO18A;
+       }
 
        saa_writel(SAA7134_IRQ1, 0);
        saa_writel(SAA7134_IRQ2, irq2_mask);