Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+48 −14
Original line number Original line Diff line number Diff line
@@ -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:
					if  (dev->remote->mask_keydown & 0x10000) {
						saa7134_input_irq(dev);
						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);
+24 −14
Original line number Original line Diff line number Diff line
@@ -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->polling) {
		if ((ir->mask_keydown  &&  (0 != (gpio & ir->mask_keydown))) ||
		if ((ir->mask_keydown  &&  (0 != (gpio & ir->mask_keydown))) ||
		    (ir->mask_keyup    &&  (0 == (gpio & ir->mask_keyup)))) {
		    (ir->mask_keyup    &&  (0 == (gpio & ir->mask_keyup)))) {
			ir_input_keydown(ir->dev, &ir->ir, data, data);
			ir_input_keydown(ir->dev, &ir->ir, data, data);
		} else {
		} else {
			ir_input_nokey(ir->dev, &ir->ir);
			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;
}
}