diff -Naur v4l-dvb/linux/Documentation/video4linux/CARDLIST.cx23885 v4l-dvb1/linux/Documentation/video4linux/CARDLIST.cx23885 --- v4l-dvb/linux/Documentation/video4linux/CARDLIST.cx23885 2008-06-06 14:57:55.000000000 +1000 +++ v4l-dvb1/linux/Documentation/video4linux/CARDLIST.cx23885 2008-06-06 15:04:37.000000000 +1000 @@ -9,3 +9,4 @@ 8 -> Hauppauge WinTV-HVR1700 [0070:8101] 9 -> Hauppauge WinTV-HVR1400 [0070:8010] 10 -> DViCO FusionHDTV7 Dual Express [18ac:d618] + 11 -> DViCO FusionHDTV DVB-T Dual Express [18ac:db78] diff -Naur v4l-dvb/linux/drivers/media/video/cx23885/cx23885-cards.c v4l-dvb1/linux/drivers/media/video/cx23885/cx23885-cards.c --- v4l-dvb/linux/drivers/media/video/cx23885/cx23885-cards.c 2008-06-06 14:57:55.000000000 +1000 +++ v4l-dvb1/linux/drivers/media/video/cx23885/cx23885-cards.c 2008-06-06 15:11:24.000000000 +1000 @@ -151,6 +151,11 @@ #endif .portc = CX23885_MPEG_DVB, }, + [CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP] = { + .name = "DViCO FusionHDTV DVB-T Dual Express", + .portb = CX23885_MPEG_DVB, + .portc = CX23885_MPEG_DVB, + }, }; const unsigned int cx23885_bcount = ARRAY_SIZE(cx23885_boards); @@ -222,7 +227,11 @@ .subvendor = 0x18ac, .subdevice = 0xd618, .card = CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP, - }, + },{ + .subvendor = 0x18ac, + .subdevice = 0xdb78, + .card = CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP, + }, }; const unsigned int cx23885_idcount = ARRAY_SIZE(cx23885_subids); @@ -439,6 +448,13 @@ mdelay(20); cx_set(GP0_IO, 0x00050005); break; + case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP: + /* GPIO-0 portb xc3028 reset */ + /* GPIO-1 portb zl10353 reset */ + /* GPIO-2 portc xc3028 reset */ + /* GPIO-3 portc zl10353 reset */ + cx_write(GP0_IO, 0x002f1000); + break; } } @@ -453,7 +469,10 @@ case CX23885_BOARD_HAUPPAUGE_HVR1400: /* FIXME: Implement me */ break; - } + case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP: + request_module("ir-kbd-i2c"); + break; + } return 0; } @@ -490,6 +509,7 @@ switch (dev->board) { case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP: + case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP: ts2->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */ ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */ ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; diff -Naur v4l-dvb/linux/drivers/media/video/cx23885/cx23885-dvb.c v4l-dvb1/linux/drivers/media/video/cx23885/cx23885-dvb.c --- v4l-dvb/linux/drivers/media/video/cx23885/cx23885-dvb.c 2008-06-06 14:57:55.000000000 +1000 +++ v4l-dvb1/linux/drivers/media/video/cx23885/cx23885-dvb.c 2008-06-06 15:18:46.000000000 +1000 @@ -36,9 +36,11 @@ #include "tda8290.h" #include "tda18271.h" #include "lgdt330x.h" +#include "zl10353.h" #include "xc5000.h" #include "tda10048.h" #include "tuner-xc2028.h" +#include "tuner-xc2028-types.h" #include "tuner-simple.h" #include "dib7000p.h" #include "dibx000_common.h" @@ -155,6 +157,44 @@ .serial_mpeg = 0x40, }; +static int cx23885_dvico_xc2028_callback(void *ptr, int command, int arg) +{ + struct cx23885_tsport *port = ptr; + struct cx23885_dev *dev = port->dev; + u32 reset_mask = 0; + + switch (command) { + case XC2028_TUNER_RESET: + dprintk(1, "%s: XC2028_TUNER_RESET %d, port %d\n", __func__, + arg, port->nr); + + if (port->nr == 0) + reset_mask = 0x0101; + else if (port->nr == 1) + reset_mask = 0x0404; + + cx_clear(GP0_IO, reset_mask); + mdelay(5); + cx_set(GP0_IO, reset_mask); + break; + case XC2028_RESET_CLK: + dprintk(1, "%s: XC2028_RESET_CLK %d\n", __func__, arg); + break; + default: + dprintk(1, "%s: unknown command %d, arg %d\n", __func__, + command, arg); + return -EINVAL; + } + + return 0; +} + +static struct zl10353_config dvico_fusionhdtv_xc3028 = { + .demod_address = 0x0f, + .if2 = 45600, + .no_tuner = 1, +}; + static struct s5h1409_config hauppauge_hvr1500q_config = { .demod_address = 0x32 >> 1, .output_mode = S5H1409_SERIAL_OUTPUT, @@ -481,7 +521,39 @@ &i2c_bus->i2c_adap, &dvico_xc5000_tunerconfig, i2c_bus); break; - default: + case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP: + i2c_bus = &dev->i2c_bus[port->nr - 1]; + + /* Take demod and tuner out of reset */ + if (port->nr == 1) + cx_set(GP0_IO, 0x0303); + else if (port->nr == 2) + cx_set(GP0_IO, 0x0c0c); + mdelay(5); + port->dvb.frontend = dvb_attach(zl10353_attach, + &dvico_fusionhdtv_xc3028, + &i2c_bus->i2c_adap); + if (port->dvb.frontend != NULL) { + struct dvb_frontend *fe; + struct xc2028_config cfg = { + .i2c_adap = &i2c_bus->i2c_adap, + .i2c_addr = 0x61, + .video_dev = port, + .callback = cx23885_dvico_xc2028_callback, + }; + static struct xc2028_ctrl ctl = { + .fname = "xc3028-v27.fw", + .max_len = 64, + .demod = XC3028_FE_ZARLINK456, + }; + + fe = dvb_attach(xc2028_attach, port->dvb.frontend, + &cfg); + if (fe != NULL && fe->ops.tuner_ops.set_config != NULL) + fe->ops.tuner_ops.set_config(fe, &ctl); + } + break; + default: printk("%s: The frontend of your DVB/ATSC card isn't supported yet\n", dev->name); break; diff -Naur v4l-dvb/linux/drivers/media/video/cx23885/cx23885.h v4l-dvb1/linux/drivers/media/video/cx23885/cx23885.h --- v4l-dvb/linux/drivers/media/video/cx23885/cx23885.h 2008-06-06 14:57:55.000000000 +1000 +++ v4l-dvb1/linux/drivers/media/video/cx23885/cx23885.h 2008-06-06 15:19:43.000000000 +1000 @@ -67,6 +67,7 @@ #define CX23885_BOARD_HAUPPAUGE_HVR1700 8 #define CX23885_BOARD_HAUPPAUGE_HVR1400 9 #define CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP 10 +#define CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP 11 /* Currently unsupported by the driver: PAL/H, NTSC/Kr, SECAM B/G/H/LC */ #define CX23885_NORMS (\ diff -Naur v4l-dvb/linux/drivers/media/video/cx23885/Kconfig v4l-dvb1/linux/drivers/media/video/cx23885/Kconfig --- v4l-dvb/linux/drivers/media/video/cx23885/Kconfig 2008-05-13 10:21:15.000000000 +1000 +++ v4l-dvb1/linux/drivers/media/video/cx23885/Kconfig 2008-06-06 15:20:18.000000000 +1000 @@ -15,6 +15,7 @@ select MEDIA_TUNER_MT2131 if !DVB_FE_CUSTOMISE select DVB_S5H1409 if !DVB_FE_CUSTOMISE select DVB_LGDT330X if !DVB_FE_CUSTOMISE + select DVB_ZL10353 if !DVB_FE_CUSTOMISE select MEDIA_TUNER_XC2028 if !DVB_FE_CUSTOMIZE select MEDIA_TUNER_TDA8290 if !DVB_FE_CUSTOMIZE select MEDIA_TUNER_TDA18271 if !DVB_FE_CUSTOMIZE