Commit 0602fbb2 authored by Peter Missel's avatar Peter Missel Committed by Mauro Carvalho Chehab

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: default avatarRicardo Cerqueira <v4l@cerqueira.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@brturbo.com.br>
parent cab462f7
...@@ -539,11 +539,38 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs) ...@@ -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) ...@@ -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) ...@@ -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] = { ...@@ -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) ...@@ -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;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment