Commit 3234bd2f authored by Hans-Frieder Vogt's avatar Hans-Frieder Vogt Committed by Mauro Carvalho Chehab

[media] af9035: add remote control support

Signed-off-by: default avatarHans-Frieder Vogt <hfvogt@gmx.net>
Signed-off-by: default avatarAntti Palosaari <crope@iki.fi>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 52560b72
...@@ -313,6 +313,37 @@ static struct i2c_algorithm af9035_i2c_algo = { ...@@ -313,6 +313,37 @@ static struct i2c_algorithm af9035_i2c_algo = {
.functionality = af9035_i2c_functionality, .functionality = af9035_i2c_functionality,
}; };
#define AF9035_POLL 250
static int af9035_rc_query(struct dvb_usb_device *d)
{
unsigned int key;
unsigned char b[4];
int ret;
struct usb_req req = { CMD_IR_GET, 0, 0, NULL, 4, b };
ret = af9035_ctrl_msg(d->udev, &req);
if (ret < 0)
goto err;
if ((b[2] + b[3]) == 0xff) {
if ((b[0] + b[1]) == 0xff) {
/* NEC */
key = b[0] << 8 | b[2];
} else {
/* ext. NEC */
key = b[0] << 16 | b[1] << 8 | b[2];
}
} else {
key = b[0] << 24 | b[1] << 16 | b[2] << 8 | b[3];
}
rc_keydown(d->rc_dev, key, 0);
err:
/* ignore errors */
return 0;
}
static int af9035_init(struct dvb_usb_device *d) static int af9035_init(struct dvb_usb_device *d)
{ {
int ret, i; int ret, i;
...@@ -627,6 +658,32 @@ static int af9035_read_mac_address(struct dvb_usb_device *d, u8 mac[6]) ...@@ -627,6 +658,32 @@ static int af9035_read_mac_address(struct dvb_usb_device *d, u8 mac[6])
for (i = 0; i < af9035_properties[0].num_adapters; i++) for (i = 0; i < af9035_properties[0].num_adapters; i++)
af9035_af9033_config[i].clock = clock_lut[tmp]; af9035_af9033_config[i].clock = clock_lut[tmp];
ret = af9035_rd_reg(d, EEPROM_IR_MODE, &tmp);
if (ret < 0)
goto err;
pr_debug("%s: ir_mode=%02x\n", __func__, tmp);
/* don't activate rc if in HID mode or if not available */
if (tmp == 5) {
ret = af9035_rd_reg(d, EEPROM_IR_TYPE, &tmp);
if (ret < 0)
goto err;
pr_debug("%s: ir_type=%02x\n", __func__, tmp);
switch (tmp) {
case 0: /* NEC */
default:
d->props.rc.core.protocol = RC_TYPE_NEC;
d->props.rc.core.allowed_protos = RC_TYPE_NEC;
break;
case 1: /* RC6 */
d->props.rc.core.protocol = RC_TYPE_RC6;
d->props.rc.core.allowed_protos = RC_TYPE_RC6;
break;
}
d->props.rc.core.rc_query = af9035_rc_query;
}
return 0; return 0;
err: err:
...@@ -1003,6 +1060,14 @@ static struct dvb_usb_device_properties af9035_properties[] = { ...@@ -1003,6 +1060,14 @@ static struct dvb_usb_device_properties af9035_properties[] = {
.i2c_algo = &af9035_i2c_algo, .i2c_algo = &af9035_i2c_algo,
.rc.core = {
.protocol = RC_TYPE_UNKNOWN,
.module_name = "af9035",
.rc_query = NULL,
.rc_interval = AF9035_POLL,
.allowed_protos = RC_TYPE_UNKNOWN,
.rc_codes = RC_MAP_EMPTY,
},
.num_device_descs = 5, .num_device_descs = 5,
.devices = { .devices = {
{ {
......
...@@ -96,6 +96,7 @@ u32 clock_lut_it9135[] = { ...@@ -96,6 +96,7 @@ u32 clock_lut_it9135[] = {
#define CMD_MEM_WR 0x01 #define CMD_MEM_WR 0x01
#define CMD_I2C_RD 0x02 #define CMD_I2C_RD 0x02
#define CMD_I2C_WR 0x03 #define CMD_I2C_WR 0x03
#define CMD_IR_GET 0x18
#define CMD_FW_DL 0x21 #define CMD_FW_DL 0x21
#define CMD_FW_QUERYINFO 0x22 #define CMD_FW_QUERYINFO 0x22
#define CMD_FW_BOOT 0x23 #define CMD_FW_BOOT 0x23
......
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