@@ -179,4 +179,5 @@
extern struct ir_scancode_table ir_codes_terratec_cinergy_xs_table;
extern struct ir_scancode_table ir_codes_videomate_s350_table;
extern struct ir_scancode_table ir_codes_gadmei_rm008z_table;
+extern struct ir_scancode_table ir_codes_lwtu2d_table;
#endif
@@ -3302,3 +3302,42 @@
.size = ARRAY_SIZE(ir_codes_gadmei_rm008z),
};
EXPORT_SYMBOL_GPL(ir_codes_gadmei_rm008z_table);
+
+static struct ir_scancode ir_codes_lwtu2d[] = {
+ { 0x70, KEY_POWER2}, /* POWER OFF*/
+ { 0x72, KEY_MODE}, /* TV/FM */
+ { 0x21, KEY_CHANNEL}, /* CHANNEL SURF */
+ { 0x73, KEY_ZOOM}, /* FULLSECREEN */
+ { 0x39, KEY_CLOSE}, /* MINIMIZE */
+ { 0x66, KEY_INFO}, /* DISPLAY */
+ { 0x61, KEY_PREVIOUS}, /* RECALL */
+ { 0x64, KEY_MUTE}, /* MUTE */
+
+ { 0x75, KEY_1},
+ { 0x76, KEY_2},
+ { 0x77, KEY_3},
+ { 0x79, KEY_4},
+ { 0x7a, KEY_5},
+ { 0x7b, KEY_6},
+ { 0x7d, KEY_7},
+ { 0x7e, KEY_8},
+ { 0x7f, KEY_9},
+ { 0x62, KEY_0},
+ { 0x31, KEY_DOT}, /* '.' */
+ { 0x63, KEY_ENTER}, /* ENTER */
+
+ { 0x35, KEY_TIME}, /* TIMESHIFT */
+ { 0x38, KEY_CAMERA}, /* SNAPSHOT */
+ { 0x37, KEY_RECORD}, /* RECORD */
+ { 0x3a, KEY_TV2}, /* PIP */
+
+ { 0x74, KEY_VOLUMEUP}, /* VOLUMEUP */
+ { 0x78, KEY_VOLUMEDOWN}, /* VOLUMEDOWN */
+ { 0x7c, KEY_CHANNELUP}, /* CHANNELUP */
+ { 0x60, KEY_CHANNELDOWN}, /* CHANNELDOWN */
+};
+struct ir_scancode_table ir_codes_lwtu2d_table = {
+ .scan = ir_codes_lwtu2d,
+ .size = ARRAY_SIZE(ir_codes_lwtu2d),
+};
+EXPORT_SYMBOL_GPL(ir_codes_lwtu2d_table);
@@ -295,6 +295,37 @@
return 1;
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 30)
+static int get_key_lwtu2d(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
+{
+ unsigned char subaddr, keydetect, key;
+
+ struct i2c_msg msg[] = { { .addr = ir->c.addr, .flags = 0,
+ .buf = &subaddr, .len = 1},
+ { .addr = ir->c.addr, .flags = I2C_M_RD,
+ .buf = &keydetect, .len = 1} };
+ subaddr = 0x10;
+ if (2 != i2c_transfer(ir->c.adapter, msg, 2)) {
+ dprintk(1, "read error\n");
+ return -EIO;
+ }
+ if (keydetect == 0x00)
+ return 0;
+
+ subaddr = 0x00;
+ msg[1].buf = &key;
+ if (2 != i2c_transfer(ir->c.adapter, msg, 2)) {
+ dprintk(1, "read error\n");
+ return -EIO;
+ }
+ if (key == 0x00)
+ return 0;
+
+ *ir_key = key;
+ *ir_raw = key;
+ return 1;
+}
+#endif
/* ----------------------------------------------------------------------- */
static void ir_key_poll(struct IR_i2c *ir)
@@ -416,6 +447,14 @@
ir_codes = &ir_codes_pv951_table;
break;
case 0x18:
+ case 0x1f:
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 30)
+ name = "Leadtek Winfast TV USB II Deluxe remote";
+ ir->get_key = get_key_lwtu2d;
+ ir_type = IR_TYPE_OTHER;
+ ir_codes = &ir_codes_lwtu2d_table;
+ break;
+#endif
case 0x1a:
name = "Hauppauge";
ir->get_key = get_key_haup;
@@ -633,7 +672,7 @@
static const int probe_bttv[] = { 0x1a, 0x18, 0x4b, 0x64, 0x30, -1};
static const int probe_saa7134[] = { 0x7a, 0x47, 0x71, 0x2d, -1 };
- static const int probe_em28XX[] = { 0x30, 0x47, -1 };
+ static const int probe_em28XX[] = { 0x1f, 0x30, 0x47, -1 };
static const int probe_cx88[] = { 0x18, 0x6b, 0x71, -1 };
static const int probe_cx23885[] = { 0x6b, -1 };
const int *probe;
@@ -466,22 +466,31 @@
.name = "Leadtek Winfast USB II Deluxe",
.valid = EM28XX_BOARD_NOT_VALIDATED,
.tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
- .tda9887_conf = TDA9887_PRESENT,
+ .has_ir_i2c = 1,
+ .tvaudio_addr = 0x58,
+ .tda9887_conf = TDA9887_PRESENT |
+ TDA9887_PORT2_ACTIVE |
+ TDA9887_QSS,
.decoder = EM28XX_SAA711X,
+ .adecoder = EM28XX_TVAUDIO,
.input = { {
.type = EM28XX_VMUX_TELEVISION,
- .vmux = SAA7115_COMPOSITE2,
- .amux = EM28XX_AMUX_VIDEO,
- }, {
+ .vmux = SAA7115_COMPOSITE4,
+ .amux = EM28XX_AMUX_AUX,
+ }, {
.type = EM28XX_VMUX_COMPOSITE1,
- .vmux = SAA7115_COMPOSITE0,
+ .vmux = SAA7115_COMPOSITE5,
.amux = EM28XX_AMUX_LINE_IN,
- }, {
+ }, {
.type = EM28XX_VMUX_SVIDEO,
- .vmux = SAA7115_COMPOSITE0,
+ .vmux = SAA7115_SVIDEO3,
.amux = EM28XX_AMUX_LINE_IN,
- } },
- },
+ } },
+ .radio = {
+ .type = EM28XX_RADIO,
+ .amux = EM28XX_AMUX_AUX,
+ }
+ },
[EM2820_BOARD_VIDEOLOGY_20K14XUSB] = {
.name = "Videology 20K14XUSB USB2.0",
.valid = EM28XX_BOARD_NOT_VALIDATED,
@@ -2310,9 +2319,9 @@
}
#else
const unsigned short addr_list[] = {
- 0x30, 0x47, I2C_CLIENT_END
- };
-
+ 0x1f, 0x30, 0x47, I2C_CLIENT_END
+ };
+
if (disable_ir)
return;
@@ -2360,6 +2369,13 @@
dev->init_data.name = "i2c IR (EM2840 Hauppauge)";
#endif
break;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30)
+ case EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE:
+ dev->init_data.ir_codes = &ir_codes_lwtu2d_table;
+ dev->init_data.get_key = em28xx_get_key_lwtu2d;
+ dev->init_data.name = "i2c IR (EM2820 Winfast tvu2d)";
+ break;
+#endif
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30)
@@ -179,7 +179,36 @@
return 1;
}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30)
+int em28xx_get_key_lwtu2d(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
+{
+ unsigned char subaddr, keydetect, key;
+
+ struct i2c_msg msg[] = { { .addr = ir->c->addr, .flags = 0, .buf = &subaddr, .len = 1},
+ { .addr = ir->c->addr, .flags = I2C_M_RD, .buf = &keydetect, .len = 1} };
+
+ subaddr = 0x10;
+ if (2 != i2c_transfer(ir->c->adapter, msg, 2)) {
+ i2cdprintk("read error\n");
+ return -EIO;
+ }
+ if (keydetect == 0x00)
+ return 0;
+
+ subaddr = 0x00;
+ msg[1].buf = &key;
+ if (2 != i2c_transfer(ir->c->adapter, msg, 2)) {
+ i2cdprintk("read error\n");
+ return -EIO;
+ }
+ if (key == 0x00)
+ return 0;
+
+ *ir_key = key;
+ *ir_raw = key;
+ return 1;
+}
+#endif
/**********************************************************
Poll based get keycode functions
**********************************************************/
@@ -708,6 +708,9 @@
int em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
int em28xx_get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key,
u32 *ir_raw);
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 30)
+int em28xx_get_key_lwtu2d(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
+#endif
void em28xx_register_snapshot_button(struct em28xx *dev);
void em28xx_deregister_snapshot_button(struct em28xx *dev);