[linux-dvb] [PATCH] Add initial support for DViCO FusionHDTV DVB-T Dual Express
Steven Toth
stoth at linuxtv.org
Thu Jul 31 17:08:07 CEST 2008
Anton Blanchard wrote:
> Hi Stephen,
>
> Thanks a lot for doing this! I have one of these cards and was working
> on Chris Pascoe's patch as a base, but just noticed this mail where you
> have done the same.
>
> I have a few comments after comparing the two patches (mine is attached).
>
>> +#if 0
>> + .portb = CX23885_MPEG_DVB,
>> +#endif
>
> I noticed recent changes to the cx32885 SRAM definitions in the upstream
> git tree and I was able to get both ports working, so I guess this can
> be re-enabled (as you suggest in your comment).
>
> cx23885_gpio_setup():
>> + 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;
>
> I'm wondering where this magic number came from (did Chris get it from a
> register dump out of Windows?). All of the other cards (including the
> Fusion HDTV7 dual express) just take the tuner and demodulator out of
> reset here. Thats what I'm doing in my patch below and it seems to
> work fine.
>
>> #include "xc5000.h"
>> #include "tda10048.h"
>> #include "tuner-xc2028.h"
>> +#include "tuner-xc2028-types.h"
>
> This looks like a private header and after your change to the firmware
> load code (so it no longer references ZARLINK456) we can remove it.
>
> cx23885_dvico_xc2028_callback():
>> + if (port->nr == 0)
>> + reset_mask = 0x0101;
>> + else if (port->nr == 1)
>> + reset_mask = 0x0404;
>
> Do we need to hit both GPIO bits (0x101)? I was only hitting the lower
> bit (0x1) and it works fine. (cc-ing Stephen Toth since I noticed an
> email from him about this in the archives).
>
> dvb_register():
>> + 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);
>
> Taking the tuner and demodulator out of reset here makes this driver the
> odd one out, I'd suggest putting it into the gpio_setup routine.
>
> Anton
>
> --
>
> Add support for DViCO FusionHDTV DVB-T Dual Express, based on work by
> Chris Pascoe and Stephen Backway.
>
> Signed-off-by: Anton Blanchard <anton at samba.org>
> ---
>
> diff --git a/Documentation/video4linux/CARDLIST.cx23885 b/Documentation/video4linux/CARDLIST.cx23885
> index f0e613b..bccafd3 100644
> --- a/Documentation/video4linux/CARDLIST.cx23885
> +++ b/Documentation/video4linux/CARDLIST.cx23885
> @@ -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 --git a/drivers/media/video/cx23885/cx23885-cards.c b/drivers/media/video/cx23885/cx23885-cards.c
> index a19de85..d21adc8 100644
> --- a/drivers/media/video/cx23885/cx23885-cards.c
> +++ b/drivers/media/video/cx23885/cx23885-cards.c
> @@ -148,6 +148,11 @@ struct cx23885_board cx23885_boards[] = {
> .portb = CX23885_MPEG_DVB,
> .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);
>
> @@ -219,6 +224,10 @@ struct cx23885_subid cx23885_subids[] = {
> .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);
> @@ -465,6 +474,19 @@ void cx23885_gpio_setup(struct cx23885_dev *dev)
> mdelay(20);
> cx_set(GP0_IO, 0x000f000f);
> 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 */
> +
> + /* Put the parts into reset and back */
> + cx_set(GP0_IO, 0x000f0000);
> + mdelay(20);
> + cx_clear(GP0_IO, 0x0000000f);
> + mdelay(20);
> + cx_set(GP0_IO, 0x000f000f);
> + break;
> }
> }
>
> @@ -516,6 +538,7 @@ void cx23885_card_setup(struct cx23885_dev *dev)
>
> 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 --git a/drivers/media/video/cx23885/cx23885-dvb.c b/drivers/media/video/cx23885/cx23885-dvb.c
> index 0a2e655..c5a5306 100644
> --- a/drivers/media/video/cx23885/cx23885-dvb.c
> +++ b/drivers/media/video/cx23885/cx23885-dvb.c
> @@ -42,6 +42,7 @@
> #include "tuner-simple.h"
> #include "dib7000p.h"
> #include "dibx000_common.h"
> +#include "zl10353.h"
>
> static unsigned int debug;
>
> @@ -333,6 +334,44 @@ static int cx23885_hvr1500_xc3028_callback(void *ptr, int command, int arg)
> return 0;
> }
>
> +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", __FUNCTION__,
> + arg, port->nr);
> +
> + if (port->nr == 0)
> + reset_mask = 0x01;
> + else if (port->nr == 1)
> + reset_mask = 0x04;
> +
> + cx_clear(GP0_IO, reset_mask);
> + mdelay(20);
> + cx_set(GP0_IO, reset_mask);
> + break;
> + case XC2028_RESET_CLK:
> + dprintk(1, "%s: XC2028_RESET_CLK %d\n", __FUNCTION__, arg);
> + break;
> + default:
> + dprintk(1, "%s: unknown command %d, arg %d\n", __FUNCTION__,
> + command, arg);
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +
> +static struct zl10353_config dvico_fusionhdtv_xc3028 = {
> + .demod_address = 0x0f,
> + .if2 = 45600,
> + .no_tuner = 1,
> +};
> +
> static int dvb_register(struct cx23885_tsport *port)
> {
> struct cx23885_dev *dev = port->dev;
> @@ -495,6 +534,33 @@ static int dvb_register(struct cx23885_tsport *port)
> &i2c_bus->i2c_adap,
> &dvico_xc5000_tunerconfig, i2c_bus);
> break;
> + case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP: {
> + i2c_bus = &dev->i2c_bus[port->nr - 1];
> +
> + 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);
> diff --git a/drivers/media/video/cx23885/cx23885.h b/drivers/media/video/cx23885/cx23885.h
> index 00dfdc8..7b3ec5b 100644
> --- a/drivers/media/video/cx23885/cx23885.h
> +++ b/drivers/media/video/cx23885/cx23885.h
> @@ -64,6 +64,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 (\
Please try to confirm to the callback cx23885_tuner_callback, we don't
want/need a dvico specific callback.:
http://linuxtv.org/hg/~stoth/v4l-dvb/rev/2d925110d38a
If you have a specific reason why you need a 2028 callback, let's
discuss, we should refactor the current callback.
Please refine the tuner callback and rebase the patch from the current
v4l-dvb tree.
Good work, thanks, you're almost done.
- Steve
More information about the linux-dvb
mailing list