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

Commit d995a187 authored by Lukas Karas's avatar Lukas Karas Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (13591): add support for IR on FlyDVB Trio (saa7134)

saa7134: Add support for IR reciever on card LifeView FlyDVB Trio

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[mchehab@redhat.com: CodingStyle fixes and ported upstream]
Tested-by: default avatarPetr Fiala <petr.fiala@gmail.com>
Signed-off-by: default avatarLukas Karas <lukas.karas@centrum.cz>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 7eca61eb
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -353,6 +353,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)
		ir_type     = IR_TYPE_RC5;
		ir_codes    = &ir_codes_fusionhdtv_mce_table;
		break;
	case 0x0b:
	case 0x47:
	case 0x71:
		if (adap->id == I2C_HW_B_CX2388x ||
@@ -422,7 +423,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)

	/* Make sure we are all setup before going on */
	if (!name || !ir->get_key || !ir_type || !ir_codes) {
		dprintk(1, DEVNAME ": Unsupported device at address 0x%02x\n",
		dprintk(1, ": Unsupported device at address 0x%02x\n",
			addr);
		err = -ENODEV;
		goto err_out_free;
+22 −0
Original line number Diff line number Diff line
@@ -7211,9 +7211,31 @@ int saa7134_board_init2(struct saa7134_dev *dev)
	}
	case SAA7134_BOARD_FLYDVB_TRIO:
	{
		u8 temp = 0;
		int rc;
		u8 data[] = { 0x3c, 0x33, 0x62};
		struct i2c_msg msg = {.addr=0x09, .flags=0, .buf=data, .len = sizeof(data)};
		i2c_transfer(&dev->i2c_adap, &msg, 1);

		/*
		 * send weak up message to pic16C505 chip
		 * @ LifeView FlyDVB Trio
		 */
		msg.buf = &temp;
		msg.addr = 0x0b;
		msg.len = 1;
		if (1 != i2c_transfer(&dev->i2c_adap, &msg, 1)) {
			printk(KERN_WARNING "%s: send wake up byte to pic16C505"
					"(IR chip) failed\n", dev->name);
		} else {
			msg.flags = I2C_M_RD;
			rc = i2c_transfer(&dev->i2c_adap, &msg, 1);
			printk(KERN_INFO "%s: probe IR chip @ i2c 0x%02x: %s\n",
				   dev->name, msg.addr,
				   (1 == rc) ? "yes" : "no");
			if (rc == 1)
				dev->has_remote = SAA7134_REMOTE_I2C;
		}
		break;
	}
	case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331:
+62 −0
Original line number Diff line number Diff line
@@ -127,6 +127,61 @@ static int build_key(struct saa7134_dev *dev)

/* --------------------- Chip specific I2C key builders ----------------- */

static int get_key_flydvb_trio(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
{
	int gpio;
	int attempt = 0;
	unsigned char b;

	/* We need this to access GPI Used by the saa_readl macro. */
	struct saa7134_dev *dev = ir->c->adapter->algo_data;

	if (dev == NULL) {
		dprintk("get_key_flydvb_trio: "
			 "gir->c->adapter->algo_data is NULL!\n");
		return -EIO;
	}

	/* rising SAA7134_GPIGPRESCAN reads the status */
	saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
	saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);

	gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);

	if (0x40000 & ~gpio)
		return 0; /* No button press */

	/* No button press - only before first key pressed */
	if (b == 0xFF)
		return 0;

	/* poll IR chip */
	/* weak up the IR chip */
	b = 0;

	while (1 != i2c_master_send(ir->c, &b, 1)) {
		if ((attempt++) < 10) {
			/*
			 * wait a bit for next attempt -
			 * I don't know how make it better
			 */
			msleep(10);
			continue;
		}
		i2cdprintk("send wake up byte to pic16C505 (IR chip)"
			   "failed %dx\n", attempt);
		return -EIO;
	}
	if (1 != i2c_master_recv(ir->c, &b, 1)) {
		i2cdprintk("read error\n");
		return -EIO;
	}

	*ir_key = b;
	*ir_raw = b;
	return 1;
}

static int get_key_msi_tvanywhere_plus(struct IR_i2c *ir, u32 *ir_key,
				       u32 *ir_raw)
{
@@ -622,6 +677,7 @@ int saa7134_input_init1(struct saa7134_dev *dev)
		mask_keyup   = 0x020000;
		polling      = 50; /* ms */
		break;
	break;
	}
	if (NULL == ir_codes) {
		printk("%s: Oops: IR config error [card=%d]\n",
@@ -788,6 +844,12 @@ void saa7134_probe_i2c_ir(struct saa7134_dev *dev)
	case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
		info.addr = 0x40;
		break;
	case SAA7134_BOARD_FLYDVB_TRIO:
		dev->init_data.name = "FlyDVB Trio";
		dev->init_data.get_key = get_key_flydvb_trio;
		dev->init_data.ir_codes = &ir_codes_flydvb_table;
		info.addr = 0x0b;
		break;
	default:
		dprintk("No I2C IR support for board %x\n", dev->board);
		return;