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

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
...@@ -353,6 +353,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id) ...@@ -353,6 +353,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)
ir_type = IR_TYPE_RC5; ir_type = IR_TYPE_RC5;
ir_codes = &ir_codes_fusionhdtv_mce_table; ir_codes = &ir_codes_fusionhdtv_mce_table;
break; break;
case 0x0b:
case 0x47: case 0x47:
case 0x71: case 0x71:
if (adap->id == I2C_HW_B_CX2388x || 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) ...@@ -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 */ /* Make sure we are all setup before going on */
if (!name || !ir->get_key || !ir_type || !ir_codes) { 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); addr);
err = -ENODEV; err = -ENODEV;
goto err_out_free; goto err_out_free;
......
...@@ -7211,9 +7211,31 @@ int saa7134_board_init2(struct saa7134_dev *dev) ...@@ -7211,9 +7211,31 @@ int saa7134_board_init2(struct saa7134_dev *dev)
} }
case SAA7134_BOARD_FLYDVB_TRIO: case SAA7134_BOARD_FLYDVB_TRIO:
{ {
u8 temp = 0;
int rc;
u8 data[] = { 0x3c, 0x33, 0x62}; u8 data[] = { 0x3c, 0x33, 0x62};
struct i2c_msg msg = {.addr=0x09, .flags=0, .buf=data, .len = sizeof(data)}; struct i2c_msg msg = {.addr=0x09, .flags=0, .buf=data, .len = sizeof(data)};
i2c_transfer(&dev->i2c_adap, &msg, 1); 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; break;
} }
case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331: case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331:
......
...@@ -127,6 +127,61 @@ static int build_key(struct saa7134_dev *dev) ...@@ -127,6 +127,61 @@ static int build_key(struct saa7134_dev *dev)
/* --------------------- Chip specific I2C key builders ----------------- */ /* --------------------- 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, static int get_key_msi_tvanywhere_plus(struct IR_i2c *ir, u32 *ir_key,
u32 *ir_raw) u32 *ir_raw)
{ {
...@@ -622,6 +677,7 @@ int saa7134_input_init1(struct saa7134_dev *dev) ...@@ -622,6 +677,7 @@ int saa7134_input_init1(struct saa7134_dev *dev)
mask_keyup = 0x020000; mask_keyup = 0x020000;
polling = 50; /* ms */ polling = 50; /* ms */
break; break;
break;
} }
if (NULL == ir_codes) { if (NULL == ir_codes) {
printk("%s: Oops: IR config error [card=%d]\n", printk("%s: Oops: IR config error [card=%d]\n",
...@@ -788,6 +844,12 @@ void saa7134_probe_i2c_ir(struct saa7134_dev *dev) ...@@ -788,6 +844,12 @@ void saa7134_probe_i2c_ir(struct saa7134_dev *dev)
case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
info.addr = 0x40; info.addr = 0x40;
break; 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: default:
dprintk("No I2C IR support for board %x\n", dev->board); dprintk("No I2C IR support for board %x\n", dev->board);
return; return;
......
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