|
@@ -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);
|