diff -Naur v4l-dvb-57e1c3e9ec94.old/linux/drivers/media/video/cx88/cx88-cards.c v4l-dvb-57e1c3e9ec94/linux/drivers/media/video/cx88/cx88-cards.c --- v4l-dvb-57e1c3e9ec94.old/linux/drivers/media/video/cx88/cx88-cards.c 2008-11-28 11:46:34.000000000 +0100 +++ v4l-dvb-57e1c3e9ec94/linux/drivers/media/video/cx88/cx88-cards.c 2008-11-28 11:41:06.000000000 +0100 @@ -1269,8 +1269,45 @@ .gpio0 = 0x074a, }, }, - [CX88_BOARD_WINFAST_DTV2000H] = { - .name = "WinFast DTV2000 H", + [CX88_BOARD_WINFAST_DTV1800H] = { + .name = "WinFast DTV1800 H", + .tuner_type = TUNER_XC2028, + .radio_type = TUNER_XC2028, + .tuner_addr = 0x61, + .radio_addr = 0x61, + .input = {{ + .type = CX88_VMUX_TELEVISION, + .vmux = 0, + .gpio0 = 0x0403, + .gpio1 = 0xf0d7, + .gpio2 = 0x0001, + .gpio3 = 0x0000, + }, { + .type = CX88_VMUX_COMPOSITE1, + .vmux = 1, + .gpio0 = 0x0407, + .gpio1 = 0xf0f7, + .gpio2 = 0x0001, + .gpio3 = 0x0000, + }, { + .type = CX88_VMUX_SVIDEO, + .vmux = 2, + .gpio0 = 0x0407, + .gpio1 = 0xf0f7, + .gpio2 = 0x0001, + .gpio3 = 0x0000, + }}, + .radio = { + .type = CX88_RADIO, + .gpio0 = 0x0403, + .gpio1 = 0xf097, + .gpio2 = 0x0001, + .gpio3 = 0x0000, + }, + .mpeg = CX88_MPEG_DVB, + }, + [CX88_BOARD_WINFAST_DTV2000H_I] = { + .name = "WinFast DTV2000 H (ver. I)", .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, .radio_type = UNSET, .tuner_addr = ADDR_UNSET, @@ -1306,11 +1343,100 @@ .gpio3 = 0x02000000, }}, .radio = { - .type = CX88_RADIO, - .gpio0 = 0x00015702, - .gpio1 = 0x0000f207, - .gpio2 = 0x00015702, - .gpio3 = 0x02000000, + .type = CX88_RADIO, + .gpio0 = 0x00015702, + .gpio1 = 0x0000f207, + .gpio2 = 0x00015702, + .gpio3 = 0x02000000, + }, + .mpeg = CX88_MPEG_DVB, + }, + [CX88_BOARD_WINFAST_DTV2000H_J] = { + .name = "WinFast DTV2000 H (ver. J)", + .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, + .radio_type = UNSET, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .tda9887_conf = TDA9887_PRESENT, + .input = {{ + .type = CX88_VMUX_TELEVISION, + .vmux = 0, + .gpio0 = 0x00013704, + .gpio1 = 0x00008207, + .gpio2 = 0x00013704, + .gpio3 = 0x02000000, + }, { + .type = CX88_VMUX_CABLE, + .vmux = 0, + .gpio0 = 0x0001b701, + .gpio1 = 0x00008207, + .gpio2 = 0x0001b701, + .gpio3 = 0x02000000, + }, { + .type = CX88_VMUX_COMPOSITE1, + .vmux = 1, + .gpio0 = 0x0001b701, + .gpio1 = 0x00008207, + .gpio2 = 0x0001b701, + .gpio3 = 0x02000000, + }, { + .type = CX88_VMUX_SVIDEO, + .vmux = 2, + .gpio0 = 0x0001b701, + .gpio1 = 0x00008207, + .gpio2 = 0x0001b701, + .gpio3 = 0x02000000, + }}, + .radio = { + .type = CX88_RADIO, + .gpio0 = 0x0001b702, + .gpio1 = 0x00008207, + .gpio2 = 0x0001b702, + .gpio3 = 0x02000000, + }, + .mpeg = CX88_MPEG_DVB, + }, + [CX88_BOARD_WINFAST_DTV2000H_PLUS] = { + .name = "WinFast DTV2000 H PLUS", + .tuner_type = TUNER_XC2028, + .radio_type = TUNER_XC2028, + .tuner_addr = 0x61, + .radio_addr = 0x61, + .input = {{ + .type = CX88_VMUX_TELEVISION, + .vmux = 0, + .gpio0 = 0x0403, + .gpio1 = 0xF0D7, + .gpio2 = 0x0101, + .gpio3 = 0x0000, + }, { + .type = CX88_VMUX_CABLE, + .vmux = 0, + .gpio0 = 0x0403, + .gpio1 = 0xF0D7, + .gpio2 = 0x0100, + .gpio3 = 0x0000, + }, { + .type = CX88_VMUX_COMPOSITE1, + .vmux = 1, + .gpio0 = 0x0407, + .gpio1 = 0xF0F7, + .gpio2 = 0x0101, + .gpio3 = 0x0000, + }, { + .type = CX88_VMUX_SVIDEO, + .vmux = 2, + .gpio0 = 0x0407, + .gpio1 = 0xF0F7, + .gpio2 = 0x0101, + .gpio3 = 0x0000, + }}, + .radio = { + .type = CX88_RADIO, + .gpio0 = 0x0403, + .gpio1 = 0xF097, + .gpio2 = 0x0100, + .gpio3 = 0x0000, }, .mpeg = CX88_MPEG_DVB, }, @@ -2217,8 +2343,20 @@ .card = CX88_BOARD_NPGTECH_REALTV_TOP10FM, },{ .subvendor = 0x107d, + .subdevice = 0x6654, + .card = CX88_BOARD_WINFAST_DTV1800H, + },{ + .subvendor = 0x107d, .subdevice = 0x665e, - .card = CX88_BOARD_WINFAST_DTV2000H, + .card = CX88_BOARD_WINFAST_DTV2000H_I, + },{ + .subvendor = 0x107d, + .subdevice = 0x6f2b, + .card = CX88_BOARD_WINFAST_DTV2000H_J, + },{ + .subvendor = 0x107d, + .subdevice = 0x6f42, + .card = CX88_BOARD_WINFAST_DTV2000H_PLUS, },{ .subvendor = 0x18ac, .subdevice = 0xd800, /* FusionHDTV 3 Gold (original revision) */ @@ -2573,6 +2711,23 @@ return -EINVAL; } +static int cx88_xc3028_winfast1800h_callback(struct cx88_core *core, + int command, int mode) +{ + switch (command) { + case XC2028_TUNER_RESET: + /* GPIO 12 (xc3028 tuner reset) */ + cx_set(MO_GP1_IO, 0x1010); + mdelay(50); + cx_clear(MO_GP1_IO, 0x10); + mdelay(50); + cx_set(MO_GP1_IO, 0x10); + mdelay(50); + return 0; + } + return -EINVAL; +} + /* ------------------------------------------------------------------- */ /* some Divco specific stuff */ static int cx88_pv_8000gt_callback(struct cx88_core *core, @@ -2645,6 +2800,10 @@ case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: return cx88_dvico_xc2028_callback(core, command, arg); + case CX88_BOARD_WINFAST_DTV2000H_PLUS: + case CX88_BOARD_WINFAST_DTV1800H: + return cx88_xc3028_winfast1800h_callback(core, command, arg); + } switch (command) { @@ -2819,6 +2978,17 @@ cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */ udelay(1000); break; + + case CX88_BOARD_WINFAST_DTV2000H_PLUS: + case CX88_BOARD_WINFAST_DTV1800H: + /* GPIO 12 (xc3028 tuner reset) */ + cx_set(MO_GP1_IO, 0x1010); + mdelay(50); + cx_clear(MO_GP1_IO, 0x10); + mdelay(50); + cx_set(MO_GP1_IO, 0x10); + mdelay(50); + break; } } @@ -2838,7 +3008,9 @@ if (core->i2c_algo.udelay < 16) core->i2c_algo.udelay = 16; break; - case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: + case CX88_BOARD_WINFAST_DTV2000H_PLUS: + case CX88_BOARD_WINFAST_DTV1800H: + case CX88_BOARD_PINNACLE_HYBRID_PCTV: ctl->demod = XC3028_FE_ZARLINK456; break; case CX88_BOARD_KWORLD_ATSC_120: @@ -2851,7 +3023,7 @@ * Those boards uses non-MTS firmware */ break; - case CX88_BOARD_PINNACLE_HYBRID_PCTV: + case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: ctl->demod = XC3028_FE_ZARLINK456; ctl->mts = 1; break; diff -Naur v4l-dvb-57e1c3e9ec94.old/linux/drivers/media/video/cx88/cx88-dvb.c v4l-dvb-57e1c3e9ec94/linux/drivers/media/video/cx88/cx88-dvb.c --- v4l-dvb-57e1c3e9ec94.old/linux/drivers/media/video/cx88/cx88-dvb.c 2008-11-28 11:46:34.000000000 +0100 +++ v4l-dvb-57e1c3e9ec94/linux/drivers/media/video/cx88/cx88-dvb.c 2008-11-28 11:43:24.000000000 +0100 @@ -262,6 +262,7 @@ .no_tuner = 1, }; + static struct mt352_config dvico_fusionhdtv_mt352_xc3028 = { .demod_address = 0x0f, .if2 = 4560, @@ -645,7 +646,8 @@ goto frontend_detach; } break; - case CX88_BOARD_WINFAST_DTV2000H: + case CX88_BOARD_WINFAST_DTV2000H_I: + case CX88_BOARD_WINFAST_DTV2000H_J: case CX88_BOARD_HAUPPAUGE_HVR1100: case CX88_BOARD_HAUPPAUGE_HVR1100LP: case CX88_BOARD_HAUPPAUGE_HVR1300: @@ -964,7 +966,9 @@ fe->ops.tuner_ops.set_config(fe, &ctl); } break; - case CX88_BOARD_PINNACLE_HYBRID_PCTV: + case CX88_BOARD_WINFAST_DTV1800H: + case CX88_BOARD_WINFAST_DTV2000H_PLUS: + case CX88_BOARD_PINNACLE_HYBRID_PCTV: fe0->dvb.frontend = dvb_attach(zl10353_attach, &cx88_pinnacle_hybrid_pctv, &core->i2c_adap); @@ -974,7 +978,7 @@ goto frontend_detach; } break; - case CX88_BOARD_GENIATECH_X8000_MT: + case CX88_BOARD_GENIATECH_X8000_MT: dev->ts_gen_cntrl = 0x00; fe0->dvb.frontend = dvb_attach(zl10353_attach, @@ -983,7 +987,7 @@ if (attach_xc3028(0x61, dev) < 0) goto frontend_detach; break; - case CX88_BOARD_KWORLD_ATSC_120: + case CX88_BOARD_KWORLD_ATSC_120: fe0->dvb.frontend = dvb_attach(s5h1409_attach, &kworld_atsc_120_config, &core->i2c_adap); diff -Naur v4l-dvb-57e1c3e9ec94.old/linux/drivers/media/video/cx88/cx88.h v4l-dvb-57e1c3e9ec94/linux/drivers/media/video/cx88/cx88.h --- v4l-dvb-57e1c3e9ec94.old/linux/drivers/media/video/cx88/cx88.h 2008-11-28 11:46:34.000000000 +0100 +++ v4l-dvb-57e1c3e9ec94/linux/drivers/media/video/cx88/cx88.h 2008-11-27 23:44:54.000000000 +0100 @@ -204,7 +204,7 @@ #define CX88_BOARD_KWORLD_MCE200_DELUXE 48 #define CX88_BOARD_PIXELVIEW_PLAYTV_P7000 49 #define CX88_BOARD_NPGTECH_REALTV_TOP10FM 50 -#define CX88_BOARD_WINFAST_DTV2000H 51 +#define CX88_BOARD_WINFAST_DTV2000H_I 51 #define CX88_BOARD_GENIATECH_DVBS 52 #define CX88_BOARD_HAUPPAUGE_HVR3000 53 #define CX88_BOARD_NORWOOD_MICRO 54 @@ -232,6 +232,9 @@ #define CX88_BOARD_SATTRADE_ST4200 76 #define CX88_BOARD_TBS_8910 77 #define CX88_BOARD_PROF_6200 78 +#define CX88_BOARD_WINFAST_DTV1800H 79 +#define CX88_BOARD_WINFAST_DTV2000H_J 80 +#define CX88_BOARD_WINFAST_DTV2000H_PLUS 81 enum cx88_itype { CX88_VMUX_COMPOSITE1 = 1, diff -Naur v4l-dvb-57e1c3e9ec94.old/linux/drivers/media/video/cx88/cx88-input.c v4l-dvb-57e1c3e9ec94/linux/drivers/media/video/cx88/cx88-input.c --- v4l-dvb-57e1c3e9ec94.old/linux/drivers/media/video/cx88/cx88-input.c 2008-11-28 11:46:34.000000000 +0100 +++ v4l-dvb-57e1c3e9ec94/linux/drivers/media/video/cx88/cx88-input.c 2008-11-28 11:54:25.000000000 +0100 @@ -93,6 +93,10 @@ gpio=(gpio & 0x7fd) + (auxgpio & 0xef); break; case CX88_BOARD_WINFAST_DTV1000: + case CX88_BOARD_WINFAST_DTV1800H: + case CX88_BOARD_WINFAST_DTV2000H_I: + case CX88_BOARD_WINFAST_DTV2000H_J: + case CX88_BOARD_WINFAST_DTV2000H_PLUS: gpio = (gpio & 0x6ff) | ((cx_read(MO_GP1_IO) << 8) & 0x900); auxgpio = gpio; break; @@ -243,7 +247,10 @@ ir_type = IR_TYPE_RC5; ir->sampling = 1; break; - case CX88_BOARD_WINFAST_DTV2000H: + case CX88_BOARD_WINFAST_DTV1800H: + case CX88_BOARD_WINFAST_DTV2000H_I: + case CX88_BOARD_WINFAST_DTV2000H_J: + case CX88_BOARD_WINFAST_DTV2000H_PLUS: ir_codes = ir_codes_winfast; ir->gpio_addr = MO_GP0_IO; ir->mask_keycode = 0x8f8;