diff options
| -rw-r--r-- | drivers/media/i2c/ir-kbd-i2c.c | 47 | ||||
| -rw-r--r-- | drivers/media/pci/cx88/cx88-input.c | 2 | ||||
| -rw-r--r-- | drivers/media/pci/cx88/cx88-video.c | 1 | ||||
| -rw-r--r-- | include/media/i2c/ir-kbd-i2c.h | 1 | 
4 files changed, 50 insertions, 1 deletions
| diff --git a/drivers/media/i2c/ir-kbd-i2c.c b/drivers/media/i2c/ir-kbd-i2c.c index 56674173524f..a229e2d69ed6 100644 --- a/drivers/media/i2c/ir-kbd-i2c.c +++ b/drivers/media/i2c/ir-kbd-i2c.c @@ -238,6 +238,43 @@ static int get_key_knc1(struct IR_i2c *ir, enum rc_proto *protocol,  	return 1;  } +static int get_key_geniatech(struct IR_i2c *ir, enum rc_proto *protocol, +			     u32 *scancode, u8 *toggle) +{ +	int i, rc; +	unsigned char b; + +	/* poll IR chip */ +	for (i = 0; i < 4; i++) { +		rc = i2c_master_recv(ir->c, &b, 1); +		if (rc == 1) +			break; +		msleep(20); +	} +	if (rc != 1) { +		dev_dbg(&ir->rc->dev, "read error\n"); +		if (rc < 0) +			return rc; +		return -EIO; +	} + +	/* don't repeat the key */ +	if (ir->old == b) +		return 0; +	ir->old = b; + +	/* decode to RC5 */ +	b &= 0x7f; +	b = (b - 1) / 2; + +	dev_dbg(&ir->rc->dev, "key %02x\n", b); + +	*protocol = RC_PROTO_RC5; +	*scancode = b; +	*toggle = ir->old >> 7; +	return 1; +} +  static int get_key_avermedia_cardbus(struct IR_i2c *ir, enum rc_proto *protocol,  				     u32 *scancode, u8 *toggle)  { @@ -766,6 +803,13 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)  		rc_proto    = RC_PROTO_BIT_OTHER;  		ir_codes    = RC_MAP_EMPTY;  		break; +	case 0x33: +		name        = "Geniatech"; +		ir->get_key = get_key_geniatech; +		rc_proto    = RC_PROTO_BIT_RC5; +		ir_codes    = RC_MAP_TOTAL_MEDIA_IN_HAND_02; +		ir->old     = 0xfc; +		break;  	case 0x6b:  		name        = "FusionHDTV";  		ir->get_key = get_key_fusionhdtv; @@ -825,6 +869,9 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)  		case IR_KBD_GET_KEY_KNC1:  			ir->get_key = get_key_knc1;  			break; +		case IR_KBD_GET_KEY_GENIATECH: +			ir->get_key = get_key_geniatech; +			break;  		case IR_KBD_GET_KEY_FUSIONHDTV:  			ir->get_key = get_key_fusionhdtv;  			break; diff --git a/drivers/media/pci/cx88/cx88-input.c b/drivers/media/pci/cx88/cx88-input.c index ce0ef0b8186f..a04a1d33fadb 100644 --- a/drivers/media/pci/cx88/cx88-input.c +++ b/drivers/media/pci/cx88/cx88-input.c @@ -586,7 +586,7 @@ void cx88_i2c_init_ir(struct cx88_core *core)  {  	struct i2c_board_info info;  	static const unsigned short default_addr_list[] = { -		0x18, 0x6b, 0x71, +		0x18, 0x33, 0x6b, 0x71,  		I2C_CLIENT_END  	};  	static const unsigned short pvr2000_addr_list[] = { diff --git a/drivers/media/pci/cx88/cx88-video.c b/drivers/media/pci/cx88/cx88-video.c index b509c2a03852..c0ef03ed74f9 100644 --- a/drivers/media/pci/cx88/cx88-video.c +++ b/drivers/media/pci/cx88/cx88-video.c @@ -1388,6 +1388,7 @@ static int cx8800_initdev(struct pci_dev *pci_dev,  	}  		fallthrough;  	case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: +	case CX88_BOARD_NOTONLYTV_LV3H:  		request_module("ir-kbd-i2c");  	} diff --git a/include/media/i2c/ir-kbd-i2c.h b/include/media/i2c/ir-kbd-i2c.h index 9f47d6a48cff..0b58f8b9e7a4 100644 --- a/include/media/i2c/ir-kbd-i2c.h +++ b/include/media/i2c/ir-kbd-i2c.h @@ -35,6 +35,7 @@ enum ir_kbd_get_key_fn {  	IR_KBD_GET_KEY_PIXELVIEW,  	IR_KBD_GET_KEY_HAUP,  	IR_KBD_GET_KEY_KNC1, +	IR_KBD_GET_KEY_GENIATECH,  	IR_KBD_GET_KEY_FUSIONHDTV,  	IR_KBD_GET_KEY_HAUP_XVR,  	IR_KBD_GET_KEY_AVERMEDIA_CARDBUS, | 
