Loading drivers/media/i2c/ir-kbd-i2c.c +60 −30 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ * */ #include <asm/unaligned.h> #include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h> Loading Loading @@ -63,15 +64,18 @@ module_param(debug, int, 0644); /* debug level (0,1,2) */ /* ----------------------------------------------------------------------- */ static int get_key_haup_common(struct IR_i2c *ir, enum rc_type *protocol, u32 *scancode, u8 *ptoggle, int size, int offset) u32 *scancode, u8 *ptoggle, int size) { unsigned char buf[6]; int start, range, toggle, dev, code, ircode; int start, range, toggle, dev, code, ircode, vendor; /* poll IR chip */ if (size != i2c_master_recv(ir->c, buf, size)) return -EIO; if (buf[0] & 0x80) { int offset = (size == 6) ? 3 : 0; /* split rc5 data block ... */ start = (buf[offset] >> 7) & 1; range = (buf[offset] >> 6) & 1; Loading @@ -81,7 +85,8 @@ static int get_key_haup_common(struct IR_i2c *ir, enum rc_type *protocol, /* rc5 has two start bits * the first bit must be one * the second bit defines the command range (1 = 0-63, 0 = 64 - 127) * the second bit defines the command range: * 1 = 0-63, 0 = 64 - 127 */ if (!start) /* no key pressed */ Loading @@ -101,13 +106,38 @@ static int get_key_haup_common(struct IR_i2c *ir, enum rc_type *protocol, *protocol = RC_TYPE_RC5; *scancode = RC_SCANCODE_RC5(dev, code); *ptoggle = toggle; return 1; } else if (size == 6 && (buf[0] & 0x40)) { code = buf[4]; dev = buf[3]; vendor = get_unaligned_be16(buf + 1); if (vendor == 0x800f) { *ptoggle = (dev & 0x80) != 0; *protocol = RC_TYPE_RC6_MCE; dev &= 0x7f; dprintk(1, "ir hauppauge (rc6-mce): t%d vendor=%d dev=%d code=%d\n", toggle, vendor, dev, code); } else { *ptoggle = 0; *protocol = RC_TYPE_RC6_6A_32; dprintk(1, "ir hauppauge (rc6-6a-32): vendor=%d dev=%d code=%d\n", vendor, dev, code); } *scancode = RC_SCANCODE_RC6_6A(vendor, dev, code); return 1; } return 0; } static int get_key_haup(struct IR_i2c *ir, enum rc_type *protocol, u32 *scancode, u8 *toggle) { return get_key_haup_common (ir, protocol, scancode, toggle, 3, 0); return get_key_haup_common(ir, protocol, scancode, toggle, 3); } static int get_key_haup_xvr(struct IR_i2c *ir, enum rc_type *protocol, Loading @@ -126,7 +156,7 @@ static int get_key_haup_xvr(struct IR_i2c *ir, enum rc_type *protocol, if (ret != 1) return (ret < 0) ? ret : -EINVAL; return get_key_haup_common(ir, protocol, scancode, toggle, 6, 3); return get_key_haup_common(ir, protocol, scancode, toggle, 6); } static int get_key_pixelview(struct IR_i2c *ir, enum rc_type *protocol, Loading Loading @@ -347,7 +377,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id) case 0x71: name = "Hauppauge/Zilog Z8"; ir->get_key = get_key_haup_xvr; rc_type = RC_BIT_RC5; rc_type = RC_BIT_RC5 | RC_BIT_RC6_MCE | RC_BIT_RC6_6A_32; ir_codes = RC_MAP_HAUPPAUGE; break; } Loading drivers/media/pci/cx18/cx18-i2c.c +2 −1 Original line number Diff line number Diff line Loading @@ -98,7 +98,8 @@ static int cx18_i2c_new_ir(struct cx18 *cx, struct i2c_adapter *adap, u32 hw, case CX18_HW_Z8F0811_IR_RX_HAUP: init_data->ir_codes = RC_MAP_HAUPPAUGE; init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; init_data->type = RC_BIT_RC5; init_data->type = RC_BIT_RC5 | RC_BIT_RC6_MCE | RC_BIT_RC6_6A_32; init_data->name = cx->card_name; info.platform_data = init_data; break; Loading drivers/media/pci/cx88/cx88-input.c +2 −1 Original line number Diff line number Diff line Loading @@ -631,7 +631,8 @@ void cx88_i2c_init_ir(struct cx88_core *core) /* Hauppauge XVR */ core->init_data.name = "cx88 Hauppauge XVR remote"; core->init_data.ir_codes = RC_MAP_HAUPPAUGE; core->init_data.type = RC_BIT_RC5; core->init_data.type = RC_BIT_RC5 | RC_BIT_RC6_MCE | RC_BIT_RC6_6A_32; core->init_data.internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; info.platform_data = &core->init_data; Loading drivers/media/pci/ivtv/ivtv-i2c.c +2 −1 Original line number Diff line number Diff line Loading @@ -215,7 +215,8 @@ static int ivtv_i2c_new_ir(struct ivtv *itv, u32 hw, const char *type, u8 addr) /* Default to grey remote */ init_data->ir_codes = RC_MAP_HAUPPAUGE; init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; init_data->type = RC_BIT_RC5; init_data->type = RC_BIT_RC5 | RC_BIT_RC6_MCE | RC_BIT_RC6_6A_32; init_data->name = itv->card_name; break; case IVTV_HW_I2C_IR_RX_ADAPTEC: Loading drivers/media/usb/hdpvr/hdpvr-i2c.c +1 −1 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ struct i2c_client *hdpvr_register_ir_rx_i2c(struct hdpvr_device *dev) /* Our default information for ir-kbd-i2c.c to use */ init_data->ir_codes = RC_MAP_HAUPPAUGE; init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; init_data->type = RC_BIT_RC5; init_data->type = RC_BIT_RC5 | RC_BIT_RC6_MCE | RC_BIT_RC6_6A_32; init_data->name = "HD-PVR"; init_data->polling_interval = 405; /* ms, duplicated from Windows */ hdpvr_ir_rx_i2c_board_info.platform_data = init_data; Loading Loading
drivers/media/i2c/ir-kbd-i2c.c +60 −30 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ * */ #include <asm/unaligned.h> #include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h> Loading Loading @@ -63,15 +64,18 @@ module_param(debug, int, 0644); /* debug level (0,1,2) */ /* ----------------------------------------------------------------------- */ static int get_key_haup_common(struct IR_i2c *ir, enum rc_type *protocol, u32 *scancode, u8 *ptoggle, int size, int offset) u32 *scancode, u8 *ptoggle, int size) { unsigned char buf[6]; int start, range, toggle, dev, code, ircode; int start, range, toggle, dev, code, ircode, vendor; /* poll IR chip */ if (size != i2c_master_recv(ir->c, buf, size)) return -EIO; if (buf[0] & 0x80) { int offset = (size == 6) ? 3 : 0; /* split rc5 data block ... */ start = (buf[offset] >> 7) & 1; range = (buf[offset] >> 6) & 1; Loading @@ -81,7 +85,8 @@ static int get_key_haup_common(struct IR_i2c *ir, enum rc_type *protocol, /* rc5 has two start bits * the first bit must be one * the second bit defines the command range (1 = 0-63, 0 = 64 - 127) * the second bit defines the command range: * 1 = 0-63, 0 = 64 - 127 */ if (!start) /* no key pressed */ Loading @@ -101,13 +106,38 @@ static int get_key_haup_common(struct IR_i2c *ir, enum rc_type *protocol, *protocol = RC_TYPE_RC5; *scancode = RC_SCANCODE_RC5(dev, code); *ptoggle = toggle; return 1; } else if (size == 6 && (buf[0] & 0x40)) { code = buf[4]; dev = buf[3]; vendor = get_unaligned_be16(buf + 1); if (vendor == 0x800f) { *ptoggle = (dev & 0x80) != 0; *protocol = RC_TYPE_RC6_MCE; dev &= 0x7f; dprintk(1, "ir hauppauge (rc6-mce): t%d vendor=%d dev=%d code=%d\n", toggle, vendor, dev, code); } else { *ptoggle = 0; *protocol = RC_TYPE_RC6_6A_32; dprintk(1, "ir hauppauge (rc6-6a-32): vendor=%d dev=%d code=%d\n", vendor, dev, code); } *scancode = RC_SCANCODE_RC6_6A(vendor, dev, code); return 1; } return 0; } static int get_key_haup(struct IR_i2c *ir, enum rc_type *protocol, u32 *scancode, u8 *toggle) { return get_key_haup_common (ir, protocol, scancode, toggle, 3, 0); return get_key_haup_common(ir, protocol, scancode, toggle, 3); } static int get_key_haup_xvr(struct IR_i2c *ir, enum rc_type *protocol, Loading @@ -126,7 +156,7 @@ static int get_key_haup_xvr(struct IR_i2c *ir, enum rc_type *protocol, if (ret != 1) return (ret < 0) ? ret : -EINVAL; return get_key_haup_common(ir, protocol, scancode, toggle, 6, 3); return get_key_haup_common(ir, protocol, scancode, toggle, 6); } static int get_key_pixelview(struct IR_i2c *ir, enum rc_type *protocol, Loading Loading @@ -347,7 +377,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id) case 0x71: name = "Hauppauge/Zilog Z8"; ir->get_key = get_key_haup_xvr; rc_type = RC_BIT_RC5; rc_type = RC_BIT_RC5 | RC_BIT_RC6_MCE | RC_BIT_RC6_6A_32; ir_codes = RC_MAP_HAUPPAUGE; break; } Loading
drivers/media/pci/cx18/cx18-i2c.c +2 −1 Original line number Diff line number Diff line Loading @@ -98,7 +98,8 @@ static int cx18_i2c_new_ir(struct cx18 *cx, struct i2c_adapter *adap, u32 hw, case CX18_HW_Z8F0811_IR_RX_HAUP: init_data->ir_codes = RC_MAP_HAUPPAUGE; init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; init_data->type = RC_BIT_RC5; init_data->type = RC_BIT_RC5 | RC_BIT_RC6_MCE | RC_BIT_RC6_6A_32; init_data->name = cx->card_name; info.platform_data = init_data; break; Loading
drivers/media/pci/cx88/cx88-input.c +2 −1 Original line number Diff line number Diff line Loading @@ -631,7 +631,8 @@ void cx88_i2c_init_ir(struct cx88_core *core) /* Hauppauge XVR */ core->init_data.name = "cx88 Hauppauge XVR remote"; core->init_data.ir_codes = RC_MAP_HAUPPAUGE; core->init_data.type = RC_BIT_RC5; core->init_data.type = RC_BIT_RC5 | RC_BIT_RC6_MCE | RC_BIT_RC6_6A_32; core->init_data.internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; info.platform_data = &core->init_data; Loading
drivers/media/pci/ivtv/ivtv-i2c.c +2 −1 Original line number Diff line number Diff line Loading @@ -215,7 +215,8 @@ static int ivtv_i2c_new_ir(struct ivtv *itv, u32 hw, const char *type, u8 addr) /* Default to grey remote */ init_data->ir_codes = RC_MAP_HAUPPAUGE; init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; init_data->type = RC_BIT_RC5; init_data->type = RC_BIT_RC5 | RC_BIT_RC6_MCE | RC_BIT_RC6_6A_32; init_data->name = itv->card_name; break; case IVTV_HW_I2C_IR_RX_ADAPTEC: Loading
drivers/media/usb/hdpvr/hdpvr-i2c.c +1 −1 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ struct i2c_client *hdpvr_register_ir_rx_i2c(struct hdpvr_device *dev) /* Our default information for ir-kbd-i2c.c to use */ init_data->ir_codes = RC_MAP_HAUPPAUGE; init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; init_data->type = RC_BIT_RC5; init_data->type = RC_BIT_RC5 | RC_BIT_RC6_MCE | RC_BIT_RC6_6A_32; init_data->name = "HD-PVR"; init_data->polling_interval = 405; /* ms, duplicated from Windows */ hdpvr_ir_rx_i2c_board_info.platform_data = init_data; Loading