V4L/DVB (3309): SAA7134: GPIO IRQ improvements
- Saa7134-core.c saa7134_irq(): Separate GPIO16 and GPIO18 handling. Call IR-remote-GPIO handler only if the GPIO IRQ is "owned" by it. Added infrastructure to branch out to a future I2C-IR IRQ handler. saa7134-core.c saa7134_hwinit2(): Enable only the one GPIO pin and edge to trigger an IRQ that is wired as keyup/keydown mask. IRQ will only be generated for an actual key-down event. saa7134-input.c flyvideo_codes[]: Replace numpad keys with normal ones. Put meaning to mystery keys. Change some key definitions to have their functions match their labels better. Fix typos. saa7134-input.c flydvb_codes[]: Added new table for the larger remote that comes with the LifeView FlyDVB series. saa7134-input.c build_key(): In IRQ mode, signal key-down and then key-up straight in one go. Signed-off-by: Ricardo Cerqueira <v4l@cerqueira.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@brturbo.com.br>
This commit is contained in:
parent
cab462f716
commit
0602fbb2c8
2 changed files with 72 additions and 28 deletions
|
@ -539,11 +539,38 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
card_has_mpeg(dev))
|
card_has_mpeg(dev))
|
||||||
saa7134_irq_ts_done(dev,status);
|
saa7134_irq_ts_done(dev,status);
|
||||||
|
|
||||||
if ((report & (SAA7134_IRQ_REPORT_GPIO16 |
|
if (report & SAA7134_IRQ_REPORT_GPIO16) {
|
||||||
SAA7134_IRQ_REPORT_GPIO18)) &&
|
switch (dev->has_remote) {
|
||||||
dev->remote)
|
case SAA7134_REMOTE_GPIO:
|
||||||
saa7134_input_irq(dev);
|
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) {
|
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 -- "
|
printk(KERN_WARNING "%s/irq: looping -- "
|
||||||
"clearing PE (parity error!) enable bit\n",dev->name);
|
"clearing PE (parity error!) enable bit\n",dev->name);
|
||||||
saa_clearl(SAA7134_IRQ2,SAA7134_IRQ2_INTE_PE);
|
saa_clearl(SAA7134_IRQ2,SAA7134_IRQ2_INTE_PE);
|
||||||
} else if (report & (SAA7134_IRQ_REPORT_GPIO16 |
|
} else if (report & SAA7134_IRQ_REPORT_GPIO16) {
|
||||||
SAA7134_IRQ_REPORT_GPIO18)) {
|
/* disable gpio16 IRQ */
|
||||||
/* disable gpio IRQs */
|
|
||||||
printk(KERN_WARNING "%s/irq: looping -- "
|
printk(KERN_WARNING "%s/irq: looping -- "
|
||||||
"clearing GPIO enable bits\n",dev->name);
|
"clearing GPIO16 enable bit\n",dev->name);
|
||||||
saa_clearl(SAA7134_IRQ2, (SAA7134_IRQ2_INTE_GPIO16 |
|
saa_clearl(SAA7134_IRQ2, SAA7134_IRQ2_INTE_GPIO16);
|
||||||
SAA7134_IRQ2_INTE_GPIO18));
|
} 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 {
|
} else {
|
||||||
/* disable all irqs */
|
/* disable all irqs */
|
||||||
printk(KERN_WARNING "%s/irq: looping -- "
|
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_PE |
|
||||||
SAA7134_IRQ2_INTE_AR;
|
SAA7134_IRQ2_INTE_AR;
|
||||||
|
|
||||||
if (dev->has_remote == SAA7134_REMOTE_GPIO)
|
if (dev->has_remote == SAA7134_REMOTE_GPIO) {
|
||||||
irq2_mask |= (SAA7134_IRQ2_INTE_GPIO18 |
|
if (dev->remote->mask_keydown & 0x10000)
|
||||||
SAA7134_IRQ2_INTE_GPIO18A |
|
irq2_mask |= SAA7134_IRQ2_INTE_GPIO16;
|
||||||
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_IRQ1, 0);
|
||||||
saa_writel(SAA7134_IRQ2, irq2_mask);
|
saa_writel(SAA7134_IRQ2, irq2_mask);
|
||||||
|
|
|
@ -56,23 +56,23 @@ static IR_KEYTAB_TYPE flyvideo_codes[IR_KEYTAB_SIZE] = {
|
||||||
[ 12 ] = KEY_KP8,
|
[ 12 ] = KEY_KP8,
|
||||||
[ 13 ] = KEY_KP9,
|
[ 13 ] = KEY_KP9,
|
||||||
|
|
||||||
[ 14 ] = KEY_TUNER, // Air/Cable
|
[ 14 ] = KEY_MODE, // Air/Cable
|
||||||
[ 17 ] = KEY_VIDEO, // Video
|
[ 17 ] = KEY_VIDEO, // Video
|
||||||
[ 21 ] = KEY_AUDIO, // Audio
|
[ 21 ] = KEY_AUDIO, // Audio
|
||||||
[ 0 ] = KEY_POWER, // Pover
|
[ 0 ] = KEY_POWER, // Power
|
||||||
|
[ 24 ] = KEY_TUNER, // AV Source
|
||||||
[ 2 ] = KEY_ZOOM, // Fullscreen
|
[ 2 ] = KEY_ZOOM, // Fullscreen
|
||||||
|
[ 26 ] = KEY_LANGUAGE, // Stereo
|
||||||
[ 27 ] = KEY_MUTE, // Mute
|
[ 27 ] = KEY_MUTE, // Mute
|
||||||
[ 20 ] = KEY_VOLUMEUP,
|
[ 20 ] = KEY_VOLUMEUP, // Volume +
|
||||||
[ 23 ] = KEY_VOLUMEDOWN,
|
[ 23 ] = KEY_VOLUMEDOWN, // Volume -
|
||||||
[ 18 ] = KEY_CHANNELUP, // Channel +
|
[ 18 ] = KEY_CHANNELUP, // Channel +
|
||||||
[ 19 ] = KEY_CHANNELDOWN, // Channel -
|
[ 19 ] = KEY_CHANNELDOWN, // Channel -
|
||||||
[ 6 ] = KEY_AGAIN, // Recal
|
[ 6 ] = KEY_AGAIN, // Recall
|
||||||
[ 16 ] = KEY_KPENTER, // Enter
|
[ 16 ] = KEY_ENTER, // Enter
|
||||||
|
|
||||||
[ 26 ] = KEY_F22, // Stereo
|
|
||||||
[ 24 ] = KEY_EDIT, // AV Source
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static IR_KEYTAB_TYPE cinergy_codes[IR_KEYTAB_SIZE] = {
|
static IR_KEYTAB_TYPE cinergy_codes[IR_KEYTAB_SIZE] = {
|
||||||
[ 0 ] = KEY_KP0,
|
[ 0 ] = KEY_KP0,
|
||||||
[ 1 ] = KEY_KP1,
|
[ 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",
|
dprintk("build_key gpio=0x%x mask=0x%x data=%d\n",
|
||||||
gpio, ir->mask_keycode, data);
|
gpio, ir->mask_keycode, data);
|
||||||
|
|
||||||
if ((ir->mask_keydown && (0 != (gpio & ir->mask_keydown))) ||
|
if (ir->polling) {
|
||||||
(ir->mask_keyup && (0 == (gpio & ir->mask_keyup)))) {
|
if ((ir->mask_keydown && (0 != (gpio & ir->mask_keydown))) ||
|
||||||
ir_input_keydown(ir->dev, &ir->ir, data, data);
|
(ir->mask_keyup && (0 == (gpio & ir->mask_keyup)))) {
|
||||||
} else {
|
ir_input_keydown(ir->dev, &ir->ir, data, data);
|
||||||
ir_input_nokey(ir->dev, &ir->ir);
|
} 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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue