
From: Gerd Knorr <kraxel@bytesex.org>

This is a cx88 driver update, changes:

 * adapt to video-buf changes.
 * add support for a new card.
 * use the new video-buf-dvb module.

The dvb stuff doesn't build yet as it depends on some cutting-edge code
from the linuxtv cvs and is tagged as 'BROKEN' because of that.

The patch also removes all trailing whitespaces.  I've a script to remove
them from my sources now, that should kill those no-op whitespace changes
in my patches after merging this initial cleanup.

Signed-off-by: Gerd Knorr <kraxel@bytesex.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/drivers/media/video/Kconfig               |   13 
 25-akpm/drivers/media/video/cx88/Makefile         |    4 
 25-akpm/drivers/media/video/cx88/cx88-blackbird.c |   51 +--
 25-akpm/drivers/media/video/cx88/cx88-cards.c     |   32 +-
 25-akpm/drivers/media/video/cx88/cx88-core.c      |   23 -
 25-akpm/drivers/media/video/cx88/cx88-dvb.c       |  343 ++++++++--------------
 25-akpm/drivers/media/video/cx88/cx88-i2c.c       |    6 
 25-akpm/drivers/media/video/cx88/cx88-mpeg.c      |    5 
 25-akpm/drivers/media/video/cx88/cx88-reg.h       |   66 ++--
 25-akpm/drivers/media/video/cx88/cx88-tvaudio.c   |   28 +
 25-akpm/drivers/media/video/cx88/cx88-vbi.c       |   22 -
 25-akpm/drivers/media/video/cx88/cx88-video.c     |  153 +++++----
 25-akpm/drivers/media/video/cx88/cx88.h           |   28 -
 13 files changed, 350 insertions(+), 424 deletions(-)

diff -puN drivers/media/video/cx88/cx88-blackbird.c~v4l-cx88-update drivers/media/video/cx88/cx88-blackbird.c
--- 25/drivers/media/video/cx88/cx88-blackbird.c~v4l-cx88-update	Mon Nov  8 13:51:46 2004
+++ 25-akpm/drivers/media/video/cx88/cx88-blackbird.c	Mon Nov  8 13:51:46 2004
@@ -1,5 +1,5 @@
 /*
- * $Id: cx88-blackbird.c,v 1.14 2004/10/12 07:33:22 kraxel Exp $
+ * $Id: cx88-blackbird.c,v 1.17 2004/11/07 13:17:15 kraxel Exp $
  *
  *  Support for a cx23416 mpeg encoder via cx2388x host port.
  *  "blackbird" reference design.
@@ -543,9 +543,10 @@ static int blackbird_initialize_codec(st
 
 /* ------------------------------------------------------------------ */
 
-static int bb_buf_setup(void *priv, unsigned int *count, unsigned int *size)
+static int bb_buf_setup(struct videobuf_queue *q,
+			unsigned int *count, unsigned int *size)
 {
-	struct cx8802_fh *fh = priv;
+	struct cx8802_fh *fh = q->priv_data;
 
 	fh->dev->ts_packet_size  = 512;
 	fh->dev->ts_packet_count = 100;
@@ -561,23 +562,24 @@ static int bb_buf_setup(void *priv, unsi
 }
 
 static int
-bb_buf_prepare(void *priv, struct videobuf_buffer *vb,
-		 enum v4l2_field field)
+bb_buf_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
+	       enum v4l2_field field)
 {
-	struct cx8802_fh *fh = priv;
+	struct cx8802_fh *fh = q->priv_data;
 	return cx8802_buf_prepare(fh->dev, (struct cx88_buffer*)vb);
 }
 
 static void
-bb_buf_queue(void *priv, struct videobuf_buffer *vb)
+bb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
 {
-	struct cx8802_fh *fh = priv;
+	struct cx8802_fh *fh = q->priv_data;
 	cx8802_buf_queue(fh->dev, (struct cx88_buffer*)vb);
 }
 
-static void bb_buf_release(void *priv, struct videobuf_buffer *vb)
+static void
+bb_buf_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
 {
-	struct cx8802_fh *fh = priv;
+	struct cx8802_fh *fh = q->priv_data;
 	cx88_free_buffer(fh->dev->pci, (struct cx88_buffer*)vb);
 }
 
@@ -635,23 +637,23 @@ static int mpeg_do_ioctl(struct inode *i
 
 	/* --- streaming capture ------------------------------------- */
 	case VIDIOC_REQBUFS:
-		return videobuf_reqbufs(file->private_data, &fh->mpegq, arg);
+		return videobuf_reqbufs(&fh->mpegq, arg);
 
 	case VIDIOC_QUERYBUF:
 		return videobuf_querybuf(&fh->mpegq, arg);
 
 	case VIDIOC_QBUF:
-		return videobuf_qbuf(file->private_data, &fh->mpegq, arg);
+		return videobuf_qbuf(&fh->mpegq, arg);
 
 	case VIDIOC_DQBUF:
-		return videobuf_dqbuf(file->private_data, &fh->mpegq, arg,
+		return videobuf_dqbuf(&fh->mpegq, arg,
 				      file->f_flags & O_NONBLOCK);
 
 	case VIDIOC_STREAMON:
-		return videobuf_streamon(file->private_data, &fh->mpegq);
+		return videobuf_streamon(&fh->mpegq);
 
 	case VIDIOC_STREAMOFF:
-		return videobuf_streamoff(file->private_data, &fh->mpegq);
+		return videobuf_streamoff(&fh->mpegq);
 
 	default:
 		return -EINVAL;
@@ -696,9 +698,8 @@ static int mpeg_open(struct inode *inode
 			    dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VIDEO_CAPTURE,
 			    V4L2_FIELD_TOP,
-			    sizeof(struct cx88_buffer));
-	init_MUTEX(&fh->mpegq.lock);
-
+			    sizeof(struct cx88_buffer),
+			    fh);
 	return 0;
 }
 
@@ -710,9 +711,9 @@ static int mpeg_release(struct inode *in
 
 	/* stop mpeg capture */
 	if (fh->mpegq.streaming)
-		videobuf_streamoff(file->private_data,&fh->mpegq);
+		videobuf_streamoff(&fh->mpegq);
 	if (fh->mpegq.reading)
-		videobuf_read_stop(file->private_data,&fh->mpegq);
+		videobuf_read_stop(&fh->mpegq);
 
 	file->private_data = NULL;
 	kfree(fh);
@@ -724,8 +725,7 @@ mpeg_read(struct file *file, char *data,
 {
 	struct cx8802_fh *fh = file->private_data;
 
-	return videobuf_read_stream(file->private_data,
-				    &fh->mpegq, data, count, ppos, 0,
+	return videobuf_read_stream(&fh->mpegq, data, count, ppos, 0,
 				    file->f_flags & O_NONBLOCK);
 }
 
@@ -734,8 +734,7 @@ mpeg_poll(struct file *file, struct poll
 {
 	struct cx8802_fh *fh = file->private_data;
 
-	return videobuf_poll_stream(file, file->private_data,
-				    &fh->mpegq, wait);
+	return videobuf_poll_stream(file, &fh->mpegq, wait);
 }
 
 static int
@@ -743,7 +742,7 @@ mpeg_mmap(struct file *file, struct vm_a
 {
 	struct cx8802_fh *fh = file->private_data;
 
-	return videobuf_mmap_mapper(vma, &fh->mpegq);
+	return videobuf_mmap_mapper(&fh->mpegq, vma);
 }
 
 static struct file_operations mpeg_fops =
@@ -871,7 +870,7 @@ static struct pci_driver blackbird_pci_d
         .name     = "cx88-blackbird",
         .id_table = cx8802_pci_tbl,
         .probe    = blackbird_probe,
-        .remove   = blackbird_remove,
+        .remove   = __devexit_p(blackbird_remove),
 	.suspend  = cx8802_suspend_common,
 	.resume   = cx8802_resume_common,
 };
diff -puN drivers/media/video/cx88/cx88-cards.c~v4l-cx88-update drivers/media/video/cx88/cx88-cards.c
--- 25/drivers/media/video/cx88/cx88-cards.c~v4l-cx88-update	Mon Nov  8 13:51:46 2004
+++ 25-akpm/drivers/media/video/cx88/cx88-cards.c	Mon Nov  8 13:51:46 2004
@@ -1,5 +1,5 @@
 /*
- * $Id: cx88-cards.c,v 1.44 2004/10/12 07:33:22 kraxel Exp $
+ * $Id: cx88-cards.c,v 1.47 2004/11/03 09:04:50 kraxel Exp $
  *
  * device driver for Conexant 2388x based TV cards
  * card-specific stuff.
@@ -336,11 +336,11 @@ struct cx88_board cx88_boards[] = {
 		.tuner_type     = TUNER_ABSENT, /* No analog tuner */
 		.input          = {{
 			.type   = CX88_VMUX_COMPOSITE1,
-			.vmux   = 0,
+			.vmux   = 1,
 			.gpio0  = 0x000027df,
 		 },{
 			.type   = CX88_VMUX_SVIDEO,
-			.vmux   = 1,
+			.vmux   = 2,
 			.gpio0  = 0x000027df,
 		}},
 		.dvb            = 1,
@@ -438,6 +438,20 @@ struct cx88_board cx88_boards[] = {
 		}},
 		.blackbird = 1,
 	},
+	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS] = {
+		.name           = "DVICO FusionHDTV DVB-T Plus",
+		.tuner_type     = TUNER_ABSENT, /* No analog tuner */
+		.input          = {{
+			.type   = CX88_VMUX_COMPOSITE1,
+			.vmux   = 1,
+			.gpio0  = 0x000027df,
+		 },{
+			.type   = CX88_VMUX_SVIDEO,
+			.vmux   = 2,
+			.gpio0  = 0x000027df,
+		}},
+		.dvb            = 1,
+	},
 };
 const unsigned int cx88_bcount = ARRAY_SIZE(cx88_boards);
 
@@ -525,6 +539,10 @@ struct cx88_subid cx88_subids[] = {
 		.subvendor = 0x1540,
 		.subdevice = 0x2580,
 		.card      = CX88_BOARD_PROVIDEO_PV259,
+	},{
+		.subvendor = 0x18AC,
+		.subdevice = 0xDB10,
+		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
 	}
 };
 const unsigned int cx88_idcount = ARRAY_SIZE(cx88_subids);
@@ -612,7 +630,7 @@ static struct {
 	{ TUNER_ABSENT,        "Philips TD1536D_FH_44"},
 	{ TUNER_LG_NTSC_FM,    "LG TPI8NSR01F"},
 	{ TUNER_LG_PAL_FM,     "LG TPI8PSB01D"},
-	{ TUNER_LG_PAL,        "LG TPI8PSB11D"},	
+	{ TUNER_LG_PAL,        "LG TPI8PSB11D"},
 	{ TUNER_LG_PAL_I_FM,   "LG TAPC-I001D"},
 	{ TUNER_LG_PAL_I,      "LG TAPC-I701D"}
 };
@@ -634,12 +652,12 @@ static void hauppauge_eeprom(struct cx88
 	model = eeprom_data[12] << 8 | eeprom_data[11];
 	tuner = eeprom_data[9];
 	radio = eeprom_data[blk2-1] & 0x01;
-	
+
         if (tuner < ARRAY_SIZE(hauppauge_tuner))
                 core->tuner_type = hauppauge_tuner[tuner].id;
 	if (radio)
 		core->has_radio = 1;
-	
+
 	printk(KERN_INFO "%s: hauppauge eeprom: model=%d, "
 	       "tuner=%s (%d), radio=%s\n",
 	       core->name, model, (tuner < ARRAY_SIZE(hauppauge_tuner)
@@ -804,7 +822,7 @@ void cx88_card_list(struct cx88_core *co
 void cx88_card_setup(struct cx88_core *core)
 {
 	static u8 eeprom[128];
-		
+
 	switch (core->board) {
 	case CX88_BOARD_HAUPPAUGE:
 		if (0 == core->i2c_rc)
diff -puN drivers/media/video/cx88/cx88-core.c~v4l-cx88-update drivers/media/video/cx88/cx88-core.c
--- 25/drivers/media/video/cx88/cx88-core.c~v4l-cx88-update	Mon Nov  8 13:51:46 2004
+++ 25-akpm/drivers/media/video/cx88/cx88-core.c	Mon Nov  8 13:51:46 2004
@@ -1,5 +1,5 @@
 /*
- * $Id: cx88-core.c,v 1.13 2004/10/12 07:33:22 kraxel Exp $
+ * $Id: cx88-core.c,v 1.15 2004/10/25 11:26:36 kraxel Exp $
  *
  * device driver for Conexant 2388x based TV cards
  * driver core
@@ -50,13 +50,12 @@ module_param(latency,int,0444);
 MODULE_PARM_DESC(latency,"pci latency timer");
 
 static unsigned int tuner[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
-static int tuner_num;
-module_param_array(tuner,int,&tuner_num,0444);
-MODULE_PARM_DESC(tuner,"tuner type");
+static unsigned int card[]  = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
+
+module_param_array(tuner, int, NULL, 0444);
+module_param_array(card,  int, NULL, 0444);
 
-static unsigned int card[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
-static int card_num;
-module_param_array(card,int,&card_num,0444);
+MODULE_PARM_DESC(tuner,"tuner type");
 MODULE_PARM_DESC(card,"card type");
 
 static unsigned int nicam = 0;
@@ -137,7 +136,7 @@ static u32* cx88_risc_field(u32 *rp, str
 	/* sync instruction */
 	if (sync_line != NO_SYNC_LINE)
 		*(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
-	
+
 	/* scan lines */
 	sg = sglist;
 	for (line = 0; line < lines; line++) {
@@ -291,7 +290,7 @@ cx88_free_buffer(struct pci_dev *pci, st
  *
  * Every channel has 160 bytes control data (64 bytes instruction
  * queue and 6 CDT entries), which is close to 2k total.
- * 
+ *
  * Address layout:
  *    0x0000 - 0x03ff    CMDs / reserved
  *    0x0400 - 0x0bff    instruction queues + CDs
@@ -467,7 +466,7 @@ void cx88_risc_disasm(struct cx88_core *
 		      struct btcx_riscmem *risc)
 {
 	unsigned int i,j,n;
-	
+
 	printk("%s: risc disasm: %p [dma=0x%08lx]\n",
 	       core->name, risc->cpu, (unsigned long)risc->dma);
 	for (i = 0; i < (risc->size >> 2); i += n) {
@@ -537,13 +536,13 @@ void cx88_sram_channel_dump(struct cx88_
 }
 
 char *cx88_pci_irqs[32] = {
-	"vid", "aud", "ts", "vip", "hst", "5", "6", "tm1", 
+	"vid", "aud", "ts", "vip", "hst", "5", "6", "tm1",
 	"src_dma", "dst_dma", "risc_rd_err", "risc_wr_err",
 	"brdg_err", "src_dma_err", "dst_dma_err", "ipb_dma_err",
 	"i2c", "i2c_rack", "ir_smp", "gpio0", "gpio1"
 };
 char *cx88_vid_irqs[32] = {
-	"y_risci1", "u_risci1", "v_risci1", "vbi_risc1", 
+	"y_risci1", "u_risci1", "v_risci1", "vbi_risc1",
 	"y_risci2", "u_risci2", "v_risci2", "vbi_risc2",
 	"y_oflow",  "u_oflow",  "v_oflow",  "vbi_oflow",
 	"y_sync",   "u_sync",   "v_sync",   "vbi_sync",
diff -puN drivers/media/video/cx88/cx88-dvb.c~v4l-cx88-update drivers/media/video/cx88/cx88-dvb.c
--- 25/drivers/media/video/cx88/cx88-dvb.c~v4l-cx88-update	Mon Nov  8 13:51:46 2004
+++ 25-akpm/drivers/media/video/cx88/cx88-dvb.c	Mon Nov  8 13:51:46 2004
@@ -1,5 +1,5 @@
 /*
- * $Id: cx88-dvb.c,v 1.12 2004/10/12 07:33:22 kraxel Exp $
+ * $Id: cx88-dvb.c,v 1.19 2004/11/07 14:44:59 kraxel Exp $
  *
  * device driver for Conexant 2388x based TV cards
  * MPEG Transport Stream (DVB) routines
@@ -32,6 +32,8 @@
 
 #include "cx88.h"
 #include "cx22702.h"
+#include "mt352.h"
+#include "mt352_priv.h" /* FIXME */
 
 MODULE_DESCRIPTION("driver for cx2388x based DVB cards");
 MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>");
@@ -47,9 +49,10 @@ MODULE_PARM_DESC(debug,"enable debug mes
 
 /* ------------------------------------------------------------------ */
 
-static int dvb_buf_setup(void *priv, unsigned int *count, unsigned int *size)
+static int dvb_buf_setup(struct videobuf_queue *q,
+			 unsigned int *count, unsigned int *size)
 {
-	struct cx8802_dev *dev = priv;
+	struct cx8802_dev *dev = q->priv_data;
 
 	dev->ts_packet_size  = 188 * 4;
 	dev->ts_packet_count = 32;
@@ -59,22 +62,22 @@ static int dvb_buf_setup(void *priv, uns
 	return 0;
 }
 
-static int dvb_buf_prepare(void *priv, struct videobuf_buffer *vb,
+static int dvb_buf_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
 			   enum v4l2_field field)
 {
-	struct cx8802_dev *dev = priv;
+	struct cx8802_dev *dev = q->priv_data;
 	return cx8802_buf_prepare(dev, (struct cx88_buffer*)vb);
 }
 
-static void dvb_buf_queue(void *priv, struct videobuf_buffer *vb)
+static void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
 {
-	struct cx8802_dev *dev = priv;
+	struct cx8802_dev *dev = q->priv_data;
 	cx8802_buf_queue(dev, (struct cx88_buffer*)vb);
 }
 
-static void dvb_buf_release(void *priv, struct videobuf_buffer *vb)
+static void dvb_buf_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
 {
-	struct cx8802_dev *dev = priv;
+	struct cx8802_dev *dev = q->priv_data;
 	cx88_free_buffer(dev->pci, (struct cx88_buffer*)vb);
 }
 
@@ -85,233 +88,141 @@ struct videobuf_queue_ops dvb_qops = {
 	.buf_release  = dvb_buf_release,
 };
 
-static int dvb_thread(void *data)
-{
-	struct cx8802_dev *dev = data;
-	struct videobuf_buffer *buf;
-	unsigned long flags;
-	int err;
-
-	dprintk(1,"dvb thread started\n");
-	videobuf_read_start(dev, &dev->dvbq);
-
-	for (;;) {
-		/* fetch next buffer */
-		buf = list_entry(dev->dvbq.stream.next,
-				 struct videobuf_buffer, stream);
-		list_del(&buf->stream);
-		err = videobuf_waiton(buf,0,1);
-		BUG_ON(0 != err);
-
-		/* no more feeds left or stop_feed() asked us to quit */
-		if (0 == dev->nfeeds)
-			break;
-		if (kthread_should_stop())
-			break;
-		if (current->flags & PF_FREEZE)
-			refrigerator(PF_FREEZE);
-
-		/* feed buffer data to demux */
-		if (buf->state == STATE_DONE)
-			dvb_dmx_swfilter(&dev->demux, buf->dma.vmalloc,
-					 buf->size);
-
-		/* requeue buffer */
-		list_add_tail(&buf->stream,&dev->dvbq.stream);
-		spin_lock_irqsave(dev->dvbq.irqlock,flags);
-		dev->dvbq.ops->buf_queue(dev,buf);
-		spin_unlock_irqrestore(dev->dvbq.irqlock,flags);
-
-		/* log errors if any */
-		if (dev->error_count || dev->stopper_count) {
-			printk("%s: error=%d stopper=%d\n",
-			       dev->core->name, dev->error_count,
-			       dev->stopper_count);
-			dev->error_count   = 0;
-			dev->stopper_count = 0;
-		}
-		if (debug && dev->timeout_count) {
-			printk("%s: timeout=%d (FE not locked?)\n",
-			       dev->core->name, dev->timeout_count);
-			dev->timeout_count = 0;
-		}
-	}
-
-	videobuf_read_stop(dev, &dev->dvbq);
-	dprintk(1,"dvb thread stopped\n");
+/* ------------------------------------------------------------------ */
 
-	/* Hmm, linux becomes *very* unhappy without this ... */
-	while (!kthread_should_stop()) {
-		set_current_state(TASK_UNINTERRUPTIBLE);
-		schedule();
-	}
+static int dvico_fusionhdtv_demod_init(struct dvb_frontend* fe)
+{
+	static u8 clock_config []  = { CLOCK_CTL,  0x38, 0x39 };
+	static u8 reset []         = { RESET,      0x80 };
+	static u8 adc_ctl_1_cfg [] = { ADC_CTL_1,  0x40 };
+	static u8 agc_cfg []       = { AGC_TARGET, 0x24, 0x20 };
+	static u8 gpp_ctl_cfg []   = { GPP_CTL,    0x33 };
+	static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
+
+	mt352_write(fe, clock_config,   sizeof(clock_config));
+	udelay(200);
+	mt352_write(fe, reset,          sizeof(reset));
+	mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
+
+	mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
+	mt352_write(fe, gpp_ctl_cfg,    sizeof(gpp_ctl_cfg));
+	mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
 	return 0;
 }
 
-/* ---------------------------------------------------------------------------- */
+#define IF_FREQUENCYx6 217    /* 6 * 36.16666666667MHz */
 
-static int dvb_start_feed(struct dvb_demux_feed *feed)
+static int lg_z201_pll_set(struct dvb_frontend* fe,
+			   struct dvb_frontend_parameters* params, u8* pllbuf)
 {
-	struct dvb_demux *demux = feed->demux;
-	struct cx8802_dev *dev = demux->priv;
-	int rc;
+	u32 div;
+	unsigned char cp = 0;
+	unsigned char bs = 0;
+
+	div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6;
+
+	if (params->frequency < 542000000) cp = 0xbc;
+	else if (params->frequency < 830000000) cp = 0xf4;
+	else cp = 0xfc;
+
+	if (params->frequency == 0) bs = 0x03;
+	else if (params->frequency < 157500000) bs = 0x01;
+	else if (params->frequency < 443250000) bs = 0x02;
+	else bs = 0x04;
+
+	pllbuf[0] = 0xC2; /* Note: non-linux standard PLL I2C address */
+	pllbuf[1] = div >> 8;
+	pllbuf[2] = div & 0xff;
+	pllbuf[3] = cp;
+	pllbuf[4] = bs;
 
-	if (!demux->dmx.frontend)
-		return -EINVAL;
+	return 0;
+}
 
-	down(&dev->lock);
-	dev->nfeeds++;
-	rc = dev->nfeeds;
-
-	if (NULL != dev->dvb_thread)
-		goto out;
-	dev->dvb_thread = kthread_run(dvb_thread, dev, "%s dvb", dev->core->name);
-	if (IS_ERR(dev->dvb_thread)) {
-		rc = PTR_ERR(dev->dvb_thread);
-		dev->dvb_thread = NULL;
-	}
+static int thomson_dtt7579_pll_set(struct dvb_frontend* fe,
+				   struct dvb_frontend_parameters* params,
+				   u8* pllbuf)
+{
+	u32 div;
+	unsigned char cp = 0;
+	unsigned char bs = 0;
+
+	div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6;
+
+	if (params->frequency < 542000000) cp = 0xb4;
+	else if (params->frequency < 771000000) cp = 0xbc;
+	else cp = 0xf4;
+
+        if (params->frequency == 0) bs = 0x03;
+	else if (params->frequency < 443250000) bs = 0x02;
+	else bs = 0x08;
+
+	pllbuf[0] = 0xc0; // Note: non-linux standard PLL i2c address
+	pllbuf[1] = div >> 8;
+   	pllbuf[2] = div & 0xff;
+   	pllbuf[3] = cp;
+   	pllbuf[4] = bs;
 
-out:
-	up(&dev->lock);
-	dprintk(2, "%s rc=%d\n",__FUNCTION__,rc);
-	return rc;
-}
-
-static int dvb_stop_feed(struct dvb_demux_feed *feed)
-{
-	struct dvb_demux *demux = feed->demux;
-	struct cx8802_dev *dev = demux->priv;
-	int err = 0;
-
-	dprintk(2, "%s\n",__FUNCTION__);
-
-	down(&dev->lock);
-	dev->nfeeds--;
-	if (0 == dev->nfeeds  &&  NULL != dev->dvb_thread) {
-		cx8802_cancel_buffers(dev);
-		err = kthread_stop(dev->dvb_thread);
-		dev->dvb_thread = NULL;
-	}
-	up(&dev->lock);
-	return err;
+	return 0;
 }
 
-static void dvb_unregister(struct cx8802_dev *dev)
-{
-#if 1 /* really needed? */
-	down(&dev->lock);
-	if (NULL != dev->dvb_thread) {
-		kthread_stop(dev->dvb_thread);
-		BUG();
-	}
-	up(&dev->lock);
-#endif
+struct mt352_config dvico_fusionhdtv_dvbt1 = {
+	.demod_address = 0x0F,
+	.demod_init    = dvico_fusionhdtv_demod_init,
+	.pll_set       = lg_z201_pll_set,
+};
 
-	dvb_net_release(&dev->dvbnet);
-	dev->demux.dmx.remove_frontend(&dev->demux.dmx, &dev->fe_mem);
-	dev->demux.dmx.remove_frontend(&dev->demux.dmx, &dev->fe_hw);
-	dvb_dmxdev_release(&dev->dmxdev);
-	dvb_dmx_release(&dev->demux);
-	if (dev->fe_handle)
-		dev->fe_release(dev->fe_handle);
-	dvb_unregister_adapter(dev->dvb_adapter);
-	return;
-}
+struct mt352_config dvico_fusionhdtv_dvbt_plus = {
+	.demod_address = 0x0F,
+	.demod_init    = dvico_fusionhdtv_demod_init,
+	.pll_set       = thomson_dtt7579_pll_set,
+};
 
 static int dvb_register(struct cx8802_dev *dev)
 {
-	int result;
+	/* init struct videobuf_dvb */
+	dev->dvb.name = dev->core->name;
 
-	/* adapter */
-	result = dvb_register_adapter(&dev->dvb_adapter, dev->core->name,
-				      THIS_MODULE);
-	if (result < 0) {
-		printk(KERN_WARNING "%s: dvb_register_adapter failed (errno = %d)\n",
-		       dev->core->name, result);
-		goto fail1;
-	}
-
-	/* frontend */
+	/* init frontend */
 	switch (dev->core->board) {
 	case CX88_BOARD_HAUPPAUGE_DVB_T1:
 	case CX88_BOARD_CONEXANT_DVB_T1:
-		dev->fe_handle = cx22702_create(&dev->core->i2c_adap,
-						dev->dvb_adapter,
-						dev->core->pll_addr,
-						dev->core->pll_type,
-						dev->core->demod_addr);
-		dev->fe_release = cx22702_destroy;
+		dev->dvb.frontend = cx22702_create(&dev->core->i2c_adap,
+						   dev->core->pll_addr,
+						   dev->core->pll_type,
+						   dev->core->demod_addr);
+		break;
+	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1:
+		dev->dvb.frontend = mt352_attach(&dvico_fusionhdtv_dvbt1,
+						 &dev->core->i2c_adap);
+		if (dev->dvb.frontend) {
+			dev->dvb.frontend->ops->info.frequency_min = 174000000;
+			dev->dvb.frontend->ops->info.frequency_max = 862000000;
+		}
+		break;
+	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:
+		dev->dvb.frontend = mt352_attach(&dvico_fusionhdtv_dvbt_plus,
+						 &dev->core->i2c_adap);
+		if (dev->dvb.frontend) {
+			dev->dvb.frontend->ops->info.frequency_min = 174000000;
+			dev->dvb.frontend->ops->info.frequency_max = 862000000;
+		}
 		break;
 	default:
-		printk("%s: FIXME: frontend handing not here yet ...\n",
+		printk("%s: FIXME: frontend handling not here yet ...\n",
 		       dev->core->name);
 		break;
 	}
+	if (NULL == dev->dvb.frontend)
+		return -1;
 
-	/* demux */
-	dev->demux.dmx.capabilities =
-		DMX_TS_FILTERING | DMX_SECTION_FILTERING |
-		DMX_MEMORY_BASED_FILTERING;
-	dev->demux.priv       = dev;
-	dev->demux.filternum  = 256;
-	dev->demux.feednum    = 256;
-	dev->demux.start_feed = dvb_start_feed;
-	dev->demux.stop_feed  = dvb_stop_feed;
-	result = dvb_dmx_init(&dev->demux);
-	if (result < 0) {
-		printk(KERN_WARNING "%s: dvb_dmx_init failed (errno = %d)\n",
-		       dev->core->name, result);
-		goto fail2;
-	}
+	/* Copy the board name into the DVB structure */
+	strlcpy(dev->dvb.frontend->ops->info.name,
+		cx88_boards[dev->core->board].name,
+		sizeof(dev->dvb.frontend->ops->info.name));
 
-	dev->dmxdev.filternum    = 256;
-	dev->dmxdev.demux        = &dev->demux.dmx;
-	dev->dmxdev.capabilities = 0;
-	result = dvb_dmxdev_init(&dev->dmxdev, dev->dvb_adapter);
-	if (result < 0) {
-		printk(KERN_WARNING "%s: dvb_dmxdev_init failed (errno = %d)\n",
-		       dev->core->name, result);
-		goto fail3;
-	}
-
-	dev->fe_hw.source = DMX_FRONTEND_0;
-	result = dev->demux.dmx.add_frontend(&dev->demux.dmx, &dev->fe_hw);
-	if (result < 0) {
-		printk(KERN_WARNING "%s: add_frontend failed (DMX_FRONTEND_0, errno = %d)\n",
-		       dev->core->name, result);
-		goto fail4;
-	}
-
-	dev->fe_mem.source = DMX_MEMORY_FE;
-	result = dev->demux.dmx.add_frontend(&dev->demux.dmx, &dev->fe_mem);
-	if (result < 0) {
-		printk(KERN_WARNING "%s: add_frontend failed (DMX_MEMORY_FE, errno = %d)\n",
-		       dev->core->name, result);
-		goto fail5;
-	}
-
-	result = dev->demux.dmx.connect_frontend(&dev->demux.dmx, &dev->fe_hw);
-	if (result < 0) {
-		printk(KERN_WARNING "%s: connect_frontend failed (errno = %d)\n",
-		       dev->core->name, result);
-		goto fail6;
-	}
-
-	dvb_net_init(dev->dvb_adapter, &dev->dvbnet, &dev->demux.dmx);
-	return 0;
-
-fail6:
-	dev->demux.dmx.remove_frontend(&dev->demux.dmx, &dev->fe_mem);
-fail5:
-	dev->demux.dmx.remove_frontend(&dev->demux.dmx, &dev->fe_hw);
-fail4:
-	dvb_dmxdev_release(&dev->dmxdev);
-fail3:
-	dvb_dmx_release(&dev->demux);
-fail2:
-	dvb_unregister_adapter(dev->dvb_adapter);
-fail1:
-	return result;
+	/* register everything */
+	return videobuf_dvb_register(&dev->dvb);
 }
 
 /* ----------------------------------------------------------- */
@@ -346,13 +257,12 @@ static int __devinit dvb_probe(struct pc
 
 	/* dvb stuff */
 	printk("%s/2: cx2388x based dvb card\n", core->name);
-	videobuf_queue_init(&dev->dvbq, &dvb_qops,
+	videobuf_queue_init(&dev->dvb.dvbq, &dvb_qops,
 			    dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VIDEO_CAPTURE,
 			    V4L2_FIELD_TOP,
-			    sizeof(struct cx88_buffer));
-	init_MUTEX(&dev->dvbq.lock);
-
+			    sizeof(struct cx88_buffer),
+			    dev);
 	err = dvb_register(dev);
 	if (0 != err)
 		goto fail_free;
@@ -370,7 +280,7 @@ static void __devexit dvb_remove(struct 
         struct cx8802_dev *dev = pci_get_drvdata(pci_dev);
 
 	/* dvb */
-	dvb_unregister(dev);
+	videobuf_dvb_unregister(&dev->dvb);
 
 	/* common */
 	cx8802_fini_common(dev);
@@ -394,7 +304,7 @@ static struct pci_driver dvb_pci_driver 
         .name     = "cx88-dvb",
         .id_table = cx8802_pci_tbl,
         .probe    = dvb_probe,
-        .remove   = dvb_remove,
+        .remove   = __devexit_p(dvb_remove),
 	.suspend  = cx8802_suspend_common,
 	.resume   = cx8802_resume_common,
 };
@@ -423,5 +333,6 @@ module_exit(dvb_fini);
 /*
  * Local variables:
  * c-basic-offset: 8
+ * compile-command: "make DVB=1"
  * End:
  */
diff -puN drivers/media/video/cx88/cx88.h~v4l-cx88-update drivers/media/video/cx88/cx88.h
--- 25/drivers/media/video/cx88/cx88.h~v4l-cx88-update	Mon Nov  8 13:51:46 2004
+++ 25-akpm/drivers/media/video/cx88/cx88.h	Mon Nov  8 13:51:46 2004
@@ -1,5 +1,5 @@
 /*
- * $Id: cx88.h,v 1.37 2004/10/12 07:33:22 kraxel Exp $
+ * $Id: cx88.h,v 1.40 2004/11/03 09:04:51 kraxel Exp $
  *
  * v4l2 device driver for cx2388x based TV cards
  *
@@ -26,15 +26,10 @@
 #include <linux/videodev.h>
 #include <linux/kdev_t.h>
 
-#include <dvbdev.h>
-#include <dmxdev.h>
-#include <dvb_demux.h>
-#include <dvb_net.h>
-#include <dvb_frontend.h>
-
-#include <media/video-buf.h>
 #include <media/tuner.h>
 #include <media/audiochip.h>
+#include <media/video-buf.h>
+#include <media/video-buf-dvb.h>
 
 #include "btcx-risc.h"
 #include "cx88-reg.h"
@@ -160,6 +155,7 @@ extern struct sram_channel cx88_sram_cha
 #define CX88_BOARD_HAUPPAUGE_DVB_T1        18
 #define CX88_BOARD_CONEXANT_DVB_T1         19
 #define CX88_BOARD_PROVIDEO_PV259          20
+#define CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS 21
 
 enum cx88_itype {
 	CX88_VMUX_COMPOSITE1 = 1,
@@ -351,7 +347,6 @@ struct cx8802_fh {
 };
 
 struct cx8802_suspend_state {
-	u32                        pci_cfg[64 / sizeof(u32)];
 	int                        disabled;
 };
 
@@ -369,11 +364,6 @@ struct cx8802_dev {
 	u32                        ts_packet_size;
 	u32                        ts_packet_count;
 
-	/* error stats */
-	u32                        stopper_count;
-	u32                        error_count;
-	u32                        timeout_count;
-
 	/* other global state info */
 	struct cx8802_suspend_state state;
 
@@ -383,15 +373,7 @@ struct cx8802_dev {
 	u32                        mailbox;
 
 	/* for dvb only */
-	struct dvb_adapter         *dvb_adapter;
-	struct videobuf_queue      dvbq;
-	struct task_struct         *dvb_thread;
-	struct dvb_demux           demux;
-	struct dmxdev              dmxdev;
-	struct dmx_frontend        fe_hw;
-	struct dmx_frontend        fe_mem;
-	struct dvb_net             dvbnet;
-	int                        nfeeds;
+	struct videobuf_dvb        dvb;
 	void*                      fe_handle;
 	int                        (*fe_release)(void *handle);
 };
diff -puN drivers/media/video/cx88/cx88-i2c.c~v4l-cx88-update drivers/media/video/cx88/cx88-i2c.c
--- 25/drivers/media/video/cx88/cx88-i2c.c~v4l-cx88-update	Mon Nov  8 13:51:46 2004
+++ 25-akpm/drivers/media/video/cx88/cx88-i2c.c	Mon Nov  8 13:51:46 2004
@@ -1,5 +1,5 @@
 /*
-    $Id: cx88-i2c.c,v 1.17 2004/10/11 13:45:51 kraxel Exp $
+    $Id: cx88-i2c.c,v 1.18 2004/10/13 10:39:00 kraxel Exp $
 
     cx88-i2c.c  --  all the i2c code is here
 
@@ -21,7 +21,7 @@
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-    
+
 */
 
 #include <linux/module.h>
@@ -72,7 +72,7 @@ static int cx8800_bit_getscl(void *data)
 {
 	struct cx88_core *core = data;
 	u32 state;
-	
+
 	state = cx_read(MO_I2C);
 	return state & 0x02 ? 1 : 0;
 }
diff -puN drivers/media/video/cx88/cx88-mpeg.c~v4l-cx88-update drivers/media/video/cx88/cx88-mpeg.c
--- 25/drivers/media/video/cx88/cx88-mpeg.c~v4l-cx88-update	Mon Nov  8 13:51:46 2004
+++ 25-akpm/drivers/media/video/cx88/cx88-mpeg.c	Mon Nov  8 13:51:46 2004
@@ -1,5 +1,5 @@
 /*
- * $Id: cx88-mpeg.c,v 1.11 2004/10/12 07:33:22 kraxel Exp $
+ * $Id: cx88-mpeg.c,v 1.14 2004/10/25 11:26:36 kraxel Exp $
  *
  *  Support for the mpeg transport stream transfers
  *  PCI function #2 of the cx2388x.
@@ -239,7 +239,6 @@ static void cx8802_timeout(unsigned long
 	if (debug)
 		cx88_sram_channel_dump(dev->core, &cx88_sram_channels[SRAM_CH28]);
 	cx8802_stop_dma(dev);
-	dev->timeout_count++;
 	do_cancel_buffers(dev,"timeout",1);
 }
 
@@ -276,7 +275,6 @@ static void cx8802_mpeg_irq(struct cx880
 	/* risc2 y */
 	if (status & 0x10) {
 		spin_lock(&dev->slock);
-		dev->stopper_count++;
 		cx8802_restart_queue(dev,&dev->mpegq);
 		spin_unlock(&dev->slock);
 	}
@@ -284,7 +282,6 @@ static void cx8802_mpeg_irq(struct cx880
         /* other general errors */
         if (status & 0x1f0100) {
                 spin_lock(&dev->slock);
-		dev->error_count++;
 		cx8802_stop_dma(dev);
                 cx8802_restart_queue(dev,&dev->mpegq);
                 spin_unlock(&dev->slock);
diff -puN drivers/media/video/cx88/cx88-reg.h~v4l-cx88-update drivers/media/video/cx88/cx88-reg.h
--- 25/drivers/media/video/cx88/cx88-reg.h~v4l-cx88-update	Mon Nov  8 13:51:46 2004
+++ 25-akpm/drivers/media/video/cx88/cx88-reg.h	Mon Nov  8 13:51:46 2004
@@ -1,5 +1,5 @@
-/* 
-    $Id: cx88-reg.h,v 1.5 2004/09/15 16:15:24 kraxel Exp $
+/*
+    $Id: cx88-reg.h,v 1.6 2004/10/13 10:39:00 kraxel Exp $
 
     cx88x-hw.h - CX2388x register offsets
 
@@ -559,11 +559,11 @@
 /* ---------------------------------------------------------------------- */
 /* various constants                                                      */
 
-#define SEL_BTSC     0x01 
-#define SEL_EIAJ     0x02 
-#define SEL_A2       0x04 
+#define SEL_BTSC     0x01
+#define SEL_EIAJ     0x02
+#define SEL_A2       0x04
 #define SEL_SAP      0x08
-#define SEL_NICAM    0x10 
+#define SEL_NICAM    0x10
 #define SEL_FMRADIO  0x20
 
 // AUD_CTL
@@ -618,7 +618,7 @@
 #define EN_DMTRX_BYPASS         (1 << 11)
 #endif
 
-// Video 
+// Video
 #define VID_CAPTURE_CONTROL		0x310180
 
 #define CX23880_CAP_CTL_CAPTURE_VBI_ODD  (1<<3)
@@ -630,10 +630,10 @@
 #define VideoInputMux1		 0x1
 #define VideoInputMux2		 0x2
 #define VideoInputMux3		 0x3
-#define VideoInputTuner		 0x0 
-#define VideoInputComposite	 0x1 
+#define VideoInputTuner		 0x0
+#define VideoInputComposite	 0x1
 #define VideoInputSVideo	 0x2
-#define VideoInputOther		 0x3 
+#define VideoInputOther		 0x3
 
 #define Xtal0		 0x1
 #define Xtal1		 0x2
@@ -644,12 +644,12 @@
 #define VideoFormatNTSCJapan	 0x2
 #define VideoFormatNTSC443	 0x3
 #define VideoFormatPAL		 0x4
-#define VideoFormatPALB		 0x4 
-#define VideoFormatPALD		 0x4 
-#define VideoFormatPALG		 0x4 
-#define VideoFormatPALH		 0x4 
-#define VideoFormatPALI		 0x4 
-#define VideoFormatPALBDGHI	 0x4 
+#define VideoFormatPALB		 0x4
+#define VideoFormatPALD		 0x4
+#define VideoFormatPALG		 0x4
+#define VideoFormatPALH		 0x4
+#define VideoFormatPALI		 0x4
+#define VideoFormatPALBDGHI	 0x4
 #define VideoFormatPALM		 0x5
 #define VideoFormatPALN		 0x6
 #define VideoFormatPALNC	 0x7
@@ -661,12 +661,12 @@
 #define VideoFormatNTSCJapan27MHz	 0x12
 #define VideoFormatNTSC44327MHz		 0x13
 #define VideoFormatPAL27MHz		 0x14
-#define VideoFormatPALB27MHz		 0x14 
-#define VideoFormatPALD27MHz		 0x14 
-#define VideoFormatPALG27MHz		 0x14 
-#define VideoFormatPALH27MHz		 0x14 
-#define VideoFormatPALI27MHz		 0x14 
-#define VideoFormatPALBDGHI27MHz	 0x14 
+#define VideoFormatPALB27MHz		 0x14
+#define VideoFormatPALD27MHz		 0x14
+#define VideoFormatPALG27MHz		 0x14
+#define VideoFormatPALH27MHz		 0x14
+#define VideoFormatPALI27MHz		 0x14
+#define VideoFormatPALBDGHI27MHz	 0x14
 #define VideoFormatPALM27MHz		 0x15
 #define VideoFormatPALN27MHz		 0x16
 #define VideoFormatPALNC27MHz		 0x17
@@ -745,8 +745,8 @@
 #define CHANNEL_VIP_UP		 0xA
 #define CHANNEL_HOST_DN		 0xB
 #define CHANNEL_HOST_UP		 0xC
-#define CHANNEL_FIRST		 0x1 
-#define CHANNEL_LAST		 0xC 
+#define CHANNEL_FIRST		 0x1
+#define CHANNEL_LAST		 0xC
 
 #define GP_COUNT_CONTROL_NONE		 0x0
 #define GP_COUNT_CONTROL_INC		 0x1
@@ -773,15 +773,15 @@
 #define DEFAULT_SAT_U_NTSC			0x7F
 #define DEFAULT_SAT_V_NTSC			0x5A
 
-typedef enum                                                                          
-{                                                                                     
-	SOURCE_TUNER = 0,                                                             
-	SOURCE_COMPOSITE,                                                             
-	SOURCE_SVIDEO,                                                                
-	SOURCE_OTHER1,                                                                
-	SOURCE_OTHER2,                                                                
-	SOURCE_COMPVIASVIDEO,                                                         
-	SOURCE_CCIR656                                                                    
+typedef enum
+{
+	SOURCE_TUNER = 0,
+	SOURCE_COMPOSITE,
+	SOURCE_SVIDEO,
+	SOURCE_OTHER1,
+	SOURCE_OTHER2,
+	SOURCE_COMPVIASVIDEO,
+	SOURCE_CCIR656
 } VIDEOSOURCETYPE;
 
 #endif /* _CX88_REG_H_ */
diff -puN drivers/media/video/cx88/cx88-tvaudio.c~v4l-cx88-update drivers/media/video/cx88/cx88-tvaudio.c
--- 25/drivers/media/video/cx88/cx88-tvaudio.c~v4l-cx88-update	Mon Nov  8 13:51:46 2004
+++ 25-akpm/drivers/media/video/cx88/cx88-tvaudio.c	Mon Nov  8 13:51:46 2004
@@ -1,5 +1,5 @@
 /*
-    $Id: cx88-tvaudio.c,v 1.22 2004/10/11 13:45:51 kraxel Exp $
+    $Id: cx88-tvaudio.c,v 1.24 2004/10/25 11:51:00 kraxel Exp $
 
     cx88x-audio.c - Conexant CX23880/23881 audio downstream driver driver
 
@@ -18,9 +18,9 @@
 
     Some comes from the dscaler sources, one of the dscaler driver guy works
     for Conexant ...
-    
+
     -----------------------------------------------------------------------
-    
+
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation; either version 2 of the License, or
@@ -553,6 +553,13 @@ static void set_audio_standard_A2(struct
 	set_audio_start(core, 0x0004, EN_DMTRX_SUMDIFF | EN_A2_AUTO_STEREO);
 	set_audio_registers(core, a2_common);
 	switch (core->tvaudio) {
+	case WW_NICAM_I:
+		/* gives at least mono according to the dscaler guys */
+		/* so use use that while nicam is broken ...         */
+		dprintk("%s PAL-I mono (status: unknown)\n",__FUNCTION__);
+		set_audio_registers(core, a2_table1);
+		cx_write(AUD_CTL, EN_A2_FORCE_MONO1);
+		break;
 	case WW_A2_BG:
 		dprintk("%s PAL-BG A2 (status: known-good)\n",__FUNCTION__);
 		set_audio_registers(core, a2_table1);
@@ -601,7 +608,7 @@ static void set_audio_standard_FM(struct
 			cx_write(AUD_DEEMPH1_B0, 0x1C29);
 			cx_write(AUD_DEEMPH1_A1, 0x3FC66);
 			cx_write(AUD_DEEMPH1_B1, 0x399A);
-			
+
 			break;
 
 		case WW_FM_DEEMPH_75:
@@ -639,10 +646,11 @@ void cx88_set_tvaudio(struct cx88_core *
 	case WW_BTSC:
 		set_audio_standard_BTSC(core,0);
 		break;
-	case WW_NICAM_I:
+	// case WW_NICAM_I:
 	case WW_NICAM_BGDKL:
 		set_audio_standard_NICAM(core);
 		break;
+	case WW_NICAM_I:
 	case WW_A2_BG:
 	case WW_A2_DK:
 	case WW_A2_M:
@@ -750,7 +758,7 @@ void cx88_set_stereo(struct cx88_core *c
 	case WW_A2_DK:
 	case WW_A2_M:
 		switch (mode) {
-		case V4L2_TUNER_MODE_MONO:   
+		case V4L2_TUNER_MODE_MONO:
 		case V4L2_TUNER_MODE_LANG1:
 			ctl  = EN_A2_FORCE_MONO1;
 			mask = 0x3f;
@@ -767,7 +775,7 @@ void cx88_set_stereo(struct cx88_core *c
 		break;
 	case WW_NICAM_BGDKL:
 		switch (mode) {
-		case V4L2_TUNER_MODE_MONO:   
+		case V4L2_TUNER_MODE_MONO:
 			ctl  = EN_NICAM_FORCE_MONO1;
 			mask = 0x3f;
 			break;
@@ -780,10 +788,10 @@ void cx88_set_stereo(struct cx88_core *c
 			mask = 0x93f;
 			break;
 		}
-		break;	
+		break;
 	case WW_FM:
 		switch (mode) {
-		case V4L2_TUNER_MODE_MONO:   
+		case V4L2_TUNER_MODE_MONO:
 			ctl  = EN_FMRADIO_FORCE_MONO;
 			mask = 0x3f;
 			break;
@@ -792,7 +800,7 @@ void cx88_set_stereo(struct cx88_core *c
 			mask = 0x3f;
 			break;
 		}
-		break;	
+		break;
 	}
 
 	if (UNSET != ctl) {
diff -puN drivers/media/video/cx88/cx88-vbi.c~v4l-cx88-update drivers/media/video/cx88/cx88-vbi.c
--- 25/drivers/media/video/cx88/cx88-vbi.c~v4l-cx88-update	Mon Nov  8 13:51:46 2004
+++ 25-akpm/drivers/media/video/cx88/cx88-vbi.c	Mon Nov  8 13:51:46 2004
@@ -1,5 +1,5 @@
 /*
- * $Id: cx88-vbi.c,v 1.12 2004/10/11 13:45:51 kraxel Exp $
+ * $Id: cx88-vbi.c,v 1.14 2004/11/07 13:17:15 kraxel Exp $
  */
 #include <linux/kernel.h>
 #include <linux/module.h>
@@ -143,7 +143,7 @@ void cx8800_vbi_timeout(unsigned long da
 /* ------------------------------------------------------------------ */
 
 static int
-vbi_setup(void *priv, unsigned int *count, unsigned int *size)
+vbi_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
 {
 	*size = VBI_LINE_COUNT * VBI_LINE_LENGTH * 2;
 	if (0 == *count)
@@ -156,12 +156,12 @@ vbi_setup(void *priv, unsigned int *coun
 }
 
 static int
-vbi_prepare(void *priv, struct videobuf_buffer *vb,
+vbi_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
 	    enum v4l2_field field)
 {
-	struct cx8800_fh   *fh  = priv;
+	struct cx8800_fh   *fh  = q->priv_data;
 	struct cx8800_dev  *dev = fh->dev;
-	struct cx88_buffer *buf = (struct cx88_buffer*)vb;
+	struct cx88_buffer *buf = container_of(vb,struct cx88_buffer,vb);
 	unsigned int size;
 	int rc;
 
@@ -192,11 +192,11 @@ vbi_prepare(void *priv, struct videobuf_
 }
 
 static void
-vbi_queue(void *priv, struct videobuf_buffer *vb)
+vbi_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
 {
-	struct cx88_buffer    *buf  = (struct cx88_buffer*)vb;
+	struct cx88_buffer    *buf = container_of(vb,struct cx88_buffer,vb);
 	struct cx88_buffer    *prev;
-	struct cx8800_fh      *fh   = priv;
+	struct cx8800_fh      *fh   = vq->priv_data;
 	struct cx8800_dev     *dev  = fh->dev;
 	struct cx88_dmaqueue  *q    = &dev->vbiq;
 
@@ -224,10 +224,10 @@ vbi_queue(void *priv, struct videobuf_bu
 	}
 }
 
-static void vbi_release(void *priv, struct videobuf_buffer *vb)
+static void vbi_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
 {
-	struct cx88_buffer *buf = (struct cx88_buffer*)vb;
-	struct cx8800_fh   *fh  = priv;
+	struct cx88_buffer *buf = container_of(vb,struct cx88_buffer,vb);
+	struct cx8800_fh   *fh  = q->priv_data;
 
 	cx88_free_buffer(fh->dev->pci,buf);
 }
diff -puN drivers/media/video/cx88/cx88-video.c~v4l-cx88-update drivers/media/video/cx88/cx88-video.c
--- 25/drivers/media/video/cx88/cx88-video.c~v4l-cx88-update	Mon Nov  8 13:51:46 2004
+++ 25-akpm/drivers/media/video/cx88/cx88-video.c	Mon Nov  8 13:51:46 2004
@@ -1,5 +1,5 @@
 /*
- * $Id: cx88-video.c,v 1.40 2004/10/12 07:33:22 kraxel Exp $
+ * $Id: cx88-video.c,v 1.46 2004/11/07 14:44:59 kraxel Exp $
  *
  * device driver for Conexant 2388x based TV cards
  * video4linux video interface
@@ -41,18 +41,15 @@ MODULE_LICENSE("GPL");
 /* ------------------------------------------------------------------ */
 
 static unsigned int video_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
-static unsigned int video_nr_num;
-module_param_array(video_nr,int,&video_nr_num,0444);
-MODULE_PARM_DESC(video_nr,"video device numbers");
+static unsigned int vbi_nr[]   = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
+static unsigned int radio_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
 
-static unsigned int vbi_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
-static unsigned int vbi_nr_num;
-module_param_array(vbi_nr,int,&vbi_nr_num,0444);
-MODULE_PARM_DESC(vbi_nr,"vbi device numbers");
+module_param_array(video_nr, int, NULL, 0444);
+module_param_array(vbi_nr,   int, NULL, 0444);
+module_param_array(radio_nr, int, NULL, 0444);
 
-static unsigned int radio_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
-static unsigned int radio_nr_num;
-module_param_array(radio_nr,int,&radio_nr_num,0444);
+MODULE_PARM_DESC(video_nr,"video device numbers");
+MODULE_PARM_DESC(vbi_nr,"vbi device numbers");
 MODULE_PARM_DESC(radio_nr,"radio device numbers");
 
 static unsigned int video_debug = 0;
@@ -210,7 +207,7 @@ static struct cx8800_fmt formats[] = {
 static struct cx8800_fmt* format_by_fourcc(unsigned int fourcc)
 {
 	unsigned int i;
-	
+
 	for (i = 0; i < ARRAY_SIZE(formats); i++)
 		if (formats[i].fourcc == fourcc)
 			return formats+i;
@@ -433,10 +430,10 @@ static int start_video_dma(struct cx8800
 	/* enable irqs */
 	cx_set(MO_PCI_INTMSK, 0x00fc01);
 	cx_set(MO_VID_INTMSK, 0x0f0011);
-	
+
 	/* enable capture */
 	cx_set(VID_CAPTURE_CONTROL,0x06);
-	
+
 	/* start dma */
 	cx_set(MO_DEV_CNTRL2, (1<<5));
 	cx_set(MO_VID_DMACNTRL, 0x11);
@@ -465,7 +462,7 @@ static int restart_video_queue(struct cx
 {
 	struct cx88_buffer *buf, *prev;
 	struct list_head *item;
-	
+
 	if (!list_empty(&q->active)) {
 	        buf = list_entry(q->active.next, struct cx88_buffer, vb.queue);
 		dprintk(2,"restart_queue [%p/%d]: restart dma\n",
@@ -514,10 +511,10 @@ static int restart_video_queue(struct cx
 /* ------------------------------------------------------------------ */
 
 static int
-buffer_setup(void *priv, unsigned int *count, unsigned int *size)
+buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
 {
-	struct cx8800_fh *fh = priv;
-	
+	struct cx8800_fh *fh = q->priv_data;
+
 	*size = fh->fmt->depth*fh->width*fh->height >> 3;
 	if (0 == *count)
 		*count = 32;
@@ -527,12 +524,12 @@ buffer_setup(void *priv, unsigned int *c
 }
 
 static int
-buffer_prepare(void *priv, struct videobuf_buffer *vb,
+buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
 	       enum v4l2_field field)
 {
-	struct cx8800_fh   *fh  = priv;
+	struct cx8800_fh   *fh  = q->priv_data;
 	struct cx8800_dev  *dev = fh->dev;
-	struct cx88_buffer *buf = (struct cx88_buffer*)vb;
+	struct cx88_buffer *buf = container_of(vb,struct cx88_buffer,vb);
 	int rc, init_buffer = 0;
 
 	BUG_ON(NULL == fh->fmt);
@@ -611,11 +608,11 @@ buffer_prepare(void *priv, struct videob
 }
 
 static void
-buffer_queue(void *priv, struct videobuf_buffer *vb)
+buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
 {
-	struct cx88_buffer    *buf  = (struct cx88_buffer*)vb;
+	struct cx88_buffer    *buf = container_of(vb,struct cx88_buffer,vb);
 	struct cx88_buffer    *prev;
-	struct cx8800_fh      *fh   = priv;
+	struct cx8800_fh      *fh   = vq->priv_data;
 	struct cx8800_dev     *dev  = fh->dev;
 	struct cx88_dmaqueue  *q    = &dev->vidq;
 
@@ -659,10 +656,10 @@ buffer_queue(void *priv, struct videobuf
 	}
 }
 
-static void buffer_release(void *priv, struct videobuf_buffer *vb)
+static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
 {
-	struct cx88_buffer *buf = (struct cx88_buffer*)vb;
-	struct cx8800_fh   *fh  = priv;
+	struct cx88_buffer *buf = container_of(vb,struct cx88_buffer,vb);
+	struct cx8800_fh   *fh  = q->priv_data;
 
 	cx88_free_buffer(fh->dev->pci,buf);
 }
@@ -722,7 +719,7 @@ static u32* ov_risc_field(struct cx8800_
 				ra = addr + (fh->fmt->depth>>3)*start;
 			else
 				ra = 0;
-				
+
 			if (0 == start)
 				ri |= RISC_SOL;
 			if (fh->win.w.width == end)
@@ -745,11 +742,11 @@ static int ov_risc_frame(struct cx8800_d
 	u32 instructions,fields;
 	u32 *rp;
 	int rc;
-	
+
 	/* skip list for window clipping */
 	if (NULL == (skips = kmalloc(sizeof(*skips) * fh->nclips,GFP_KERNEL)))
 		return -ENOMEM;
-	
+
 	fields = 0;
 	if (V4L2_FIELD_HAS_TOP(fh->win.field))
 		fields++;
@@ -875,7 +872,7 @@ static int setup_window(struct cx8800_de
 	default:
 		BUG();
 	}
-	
+
 	down(&fh->vidq.lock);
 	if (fh->clips)
 		kfree(fh->clips);
@@ -885,13 +882,13 @@ static int setup_window(struct cx8800_de
 #if 0
 	fh->ov.setup_ok = 1;
 #endif
-	
+
 	/* update overlay if needed */
 	retval = 0;
 #if 0
 	if (check_btres(fh, RESOURCE_OVERLAY)) {
 		struct bttv_buffer *new;
-		
+
 		new = videobuf_alloc(sizeof(*new));
 		bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
 		retval = bttv_switch_overlay(btv,fh,new);
@@ -938,7 +935,7 @@ static int video_open(struct inode *inod
 	struct list_head *list;
 	enum v4l2_buf_type type = 0;
 	int radio = 0;
-	
+
 	list_for_each(list,&cx8800_devlist) {
 		h = list_entry(list, struct cx8800_dev, devlist);
 		if (h->video_dev->minor == minor) {
@@ -978,14 +975,14 @@ static int video_open(struct inode *inod
 			    dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VIDEO_CAPTURE,
 			    V4L2_FIELD_INTERLACED,
-			    sizeof(struct cx88_buffer));
+			    sizeof(struct cx88_buffer),
+			    fh);
 	videobuf_queue_init(&fh->vbiq, &cx8800_vbi_qops,
 			    dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VBI_CAPTURE,
 			    V4L2_FIELD_SEQ_TB,
-			    sizeof(struct cx88_buffer));
-	init_MUTEX(&fh->vidq.lock);
-	init_MUTEX(&fh->vbiq.lock);
+			    sizeof(struct cx88_buffer),
+			    fh);
 
 	if (fh->radio) {
 		struct cx88_core *core = dev->core;
@@ -1013,14 +1010,12 @@ video_read(struct file *file, char *data
 	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
 		if (res_locked(fh->dev,RESOURCE_VIDEO))
 			return -EBUSY;
-		return videobuf_read_one(file->private_data,
-					 &fh->vidq, data, count, ppos,
+		return videobuf_read_one(&fh->vidq, data, count, ppos,
 					 file->f_flags & O_NONBLOCK);
 	case V4L2_BUF_TYPE_VBI_CAPTURE:
 		if (!res_get(fh->dev,fh,RESOURCE_VBI))
 			return -EBUSY;
-		return videobuf_read_stream(file->private_data,
-					    &fh->vbiq, data, count, ppos, 1,
+		return videobuf_read_stream(&fh->vbiq, data, count, ppos, 1,
 					    file->f_flags & O_NONBLOCK);
 	default:
 		BUG();
@@ -1032,16 +1027,30 @@ static unsigned int
 video_poll(struct file *file, struct poll_table_struct *wait)
 {
 	struct cx8800_fh *fh = file->private_data;
+	struct cx88_buffer *buf;
 
 	if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) {
 		if (!res_get(fh->dev,fh,RESOURCE_VBI))
 			return POLLERR;
-		return videobuf_poll_stream(file, file->private_data,
-					    &fh->vbiq, wait);
+		return videobuf_poll_stream(file, &fh->vbiq, wait);
 	}
 
-	/* FIXME */
-	return POLLERR;
+	if (res_check(fh,RESOURCE_VIDEO)) {
+		/* streaming capture */
+		if (list_empty(&fh->vidq.stream))
+			return POLLERR;
+		buf = list_entry(fh->vidq.stream.next,struct cx88_buffer,vb.stream);
+	} else {
+		/* read() capture */
+		buf = (struct cx88_buffer*)fh->vidq.read_buf;
+		if (NULL == buf)
+			return POLLERR;
+	}
+	poll_wait(file, &buf->vb.done, wait);
+	if (buf->vb.state == STATE_DONE ||
+	    buf->vb.state == STATE_ERROR)
+		return POLLIN|POLLRDNORM;
+	return 0;
 }
 
 static int video_release(struct inode *inode, struct file *file)
@@ -1057,7 +1066,7 @@ static int video_release(struct inode *i
 
 	/* stop video capture */
 	if (res_check(fh, RESOURCE_VIDEO)) {
-		videobuf_queue_cancel(file->private_data,&fh->vidq);
+		videobuf_queue_cancel(&fh->vidq);
 		res_free(dev,fh,RESOURCE_VIDEO);
 	}
 	if (fh->vidq.read_buf) {
@@ -1068,9 +1077,9 @@ static int video_release(struct inode *i
 	/* stop vbi capture */
 	if (res_check(fh, RESOURCE_VBI)) {
 		if (fh->vbiq.streaming)
-			videobuf_streamoff(file->private_data,&fh->vbiq);
+			videobuf_streamoff(&fh->vbiq);
 		if (fh->vbiq.reading)
-			videobuf_read_stop(file->private_data,&fh->vbiq);
+			videobuf_read_stop(&fh->vbiq);
 		res_free(dev,fh,RESOURCE_VBI);
 	}
 
@@ -1084,7 +1093,7 @@ video_mmap(struct file *file, struct vm_
 {
 	struct cx8800_fh *fh = file->private_data;
 
-	return videobuf_mmap_mapper(vma, get_queue(fh));
+	return videobuf_mmap_mapper(get_queue(fh), vma);
 }
 
 /* ------------------------------------------------------------------ */
@@ -1095,7 +1104,7 @@ static int get_control(struct cx8800_dev
 	struct cx88_ctrl *c = NULL;
 	u32 value;
 	int i;
-	
+
 	for (i = 0; i < CX8800_CTLS; i++)
 		if (cx8800_ctls[i].v.id == ctl->id)
 			c = &cx8800_ctls[i];
@@ -1269,7 +1278,7 @@ static int cx8800_s_fmt(struct cx8800_de
 			struct v4l2_format *f)
 {
 	int err;
-	
+
 	switch (f->type) {
 	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
 		err = cx8800_try_fmt(dev,fh,f);
@@ -1311,7 +1320,7 @@ static int video_do_ioctl(struct inode *
 	case VIDIOC_QUERYCAP:
 	{
 		struct v4l2_capability *cap = arg;
-		
+
 		memset(cap,0,sizeof(*cap));
                 strcpy(cap->driver, "cx8800");
 		strlcpy(cap->card, cx88_boards[core->board].name,
@@ -1416,7 +1425,7 @@ static int video_do_ioctl(struct inode *
 	case VIDIOC_S_INPUT:
 	{
 		unsigned int *i = arg;
-		
+
 		if (*i >= 4)
 			return -EINVAL;
 		down(&dev->lock);
@@ -1520,13 +1529,13 @@ static int video_do_ioctl(struct inode *
 		return get_control(dev,arg);
 	case VIDIOC_S_CTRL:
 		return set_control(dev,arg);
-		
+
 	/* --- tuner ioctls ------------------------------------------ */
 	case VIDIOC_G_TUNER:
 	{
 		struct v4l2_tuner *t = arg;
 		u32 reg;
-		
+
 		if (UNSET == core->tuner_type)
 			return -EINVAL;
 		if (0 != t->index)
@@ -1603,7 +1612,7 @@ static int video_do_ioctl(struct inode *
 		req.type   = q->type;
 		req.count  = 8;
 		req.memory = V4L2_MEMORY_MMAP;
-		err = videobuf_reqbufs(file->private_data,q,&req);
+		err = videobuf_reqbufs(q,&req);
 		if (err < 0)
 			return err;
 		memset(mbuf,0,sizeof(*mbuf));
@@ -1616,16 +1625,16 @@ static int video_do_ioctl(struct inode *
 		return 0;
 	}
 	case VIDIOC_REQBUFS:
-		return videobuf_reqbufs(file->private_data, get_queue(fh), arg);
+		return videobuf_reqbufs(get_queue(fh), arg);
 
 	case VIDIOC_QUERYBUF:
 		return videobuf_querybuf(get_queue(fh), arg);
 
 	case VIDIOC_QBUF:
-		return videobuf_qbuf(file->private_data, get_queue(fh), arg);
+		return videobuf_qbuf(get_queue(fh), arg);
 
 	case VIDIOC_DQBUF:
-		return videobuf_dqbuf(file->private_data, get_queue(fh), arg,
+		return videobuf_dqbuf(get_queue(fh), arg,
 				      file->f_flags & O_NONBLOCK);
 
 	case VIDIOC_STREAMON:
@@ -1634,13 +1643,13 @@ static int video_do_ioctl(struct inode *
 
                 if (!res_get(dev,fh,res))
 			return -EBUSY;
-		return videobuf_streamon(file->private_data, get_queue(fh));
+		return videobuf_streamon(get_queue(fh));
 	}
 	case VIDIOC_STREAMOFF:
 	{
 		int res = get_ressource(fh);
 
-		err = videobuf_streamoff(file->private_data, get_queue(fh));
+		err = videobuf_streamoff(get_queue(fh));
 		if (err < 0)
 			return err;
 		res_free(dev,fh,res);
@@ -1668,7 +1677,7 @@ static int radio_do_ioctl(struct inode *
 	struct cx8800_fh *fh    = file->private_data;
 	struct cx8800_dev *dev  = fh->dev;
 	struct cx88_core  *core = dev->core;
-	
+
 	if (video_debug > 1)
 		cx88_print_ioctl(core->name,cmd);
 
@@ -1676,7 +1685,7 @@ static int radio_do_ioctl(struct inode *
 	case VIDIOC_QUERYCAP:
 	{
 		struct v4l2_capability *cap = arg;
-		
+
 		memset(cap,0,sizeof(*cap));
                 strcpy(cap->driver, "cx8800");
 		strlcpy(cap->card, cx88_boards[core->board].name,
@@ -1697,7 +1706,7 @@ static int radio_do_ioctl(struct inode *
 		strcpy(t->name, "Radio");
                 t->rangelow  = (int)(65*16);
                 t->rangehigh = (int)(108*16);
-		
+
 #ifdef V4L2_I2C_CLIENTS
 		cx88_call_i2c_clients(dev->core,VIDIOC_G_TUNER,t);
 #else
@@ -1713,7 +1722,7 @@ static int radio_do_ioctl(struct inode *
 	case VIDIOC_ENUMINPUT:
 	{
 		struct v4l2_input *i = arg;
-		
+
 		if (i->index != 0)
 			return -EINVAL;
 		strcpy(i->name,"Radio");
@@ -1770,7 +1779,7 @@ static int radio_do_ioctl(struct inode *
 	case VIDIOC_G_FREQUENCY:
 	case VIDIOC_S_FREQUENCY:
 		return video_do_ioctl(inode,file,cmd,arg);
-		
+
 	default:
 		return v4l_compat_translate_ioctl(inode,file,cmd,arg,
 						  radio_do_ioctl);
@@ -1795,7 +1804,7 @@ static void cx8800_vid_timeout(unsigned 
 	unsigned long flags;
 
 	cx88_sram_channel_dump(dev->core, &cx88_sram_channels[SRAM_CH21]);
-	
+
 	cx_clear(MO_VID_DMACNTRL, 0x11);
 	cx_clear(VID_CAPTURE_CONTROL, 0x06);
 
@@ -1833,7 +1842,7 @@ static void cx8800_vid_irq(struct cx8800
 		cx_clear(VID_CAPTURE_CONTROL, 0x06);
 		cx88_sram_channel_dump(dev->core, &cx88_sram_channels[SRAM_CH21]);
 	}
-	
+
 	/* risc1 y */
 	if (status & 0x01) {
 		spin_lock(&dev->slock);
@@ -1892,7 +1901,7 @@ static irqreturn_t cx8800_irq(int irq, v
 		       core->name);
 		cx_write(MO_PCI_INTMSK,0);
 	}
-	
+
  out:
 	return IRQ_RETVAL(handled);
 }
@@ -2134,7 +2143,7 @@ static void __devexit cx8800_finidev(str
 	cx88_shutdown(dev->core); /* FIXME */
 	pci_disable_device(pci_dev);
 
-	/* unregister stuff */	
+	/* unregister stuff */
 
 	free_irq(pci_dev->irq, dev);
 	cx8800_unregister_video(dev);
@@ -2170,7 +2179,7 @@ static int cx8800_suspend(struct pci_dev
 	/* FIXME -- shutdown device */
 	cx88_shutdown(dev->core);
 #endif
-	
+
 	pci_save_state(pci_dev);
 	if (0 != pci_set_power_state(pci_dev, state)) {
 		pci_disable_device(pci_dev);
diff -puN drivers/media/video/cx88/Makefile~v4l-cx88-update drivers/media/video/cx88/Makefile
--- 25/drivers/media/video/cx88/Makefile~v4l-cx88-update	Mon Nov  8 13:51:46 2004
+++ 25-akpm/drivers/media/video/cx88/Makefile	Mon Nov  8 13:51:46 2004
@@ -5,4 +5,6 @@ cx8802-objs	:= cx88-mpeg.o
 obj-$(CONFIG_VIDEO_CX88) += cx88xx.o cx8800.o cx8802.o cx88-blackbird.o
 obj-$(CONFIG_VIDEO_CX88_DVB) += cx88-dvb.o
 
-EXTRA_CFLAGS = -I$(src)/.. -I$(srctree)/drivers/media/dvb/dvb-core
+EXTRA_CFLAGS += -I$(src)/..
+EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core
+EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/frontends
diff -puN drivers/media/video/Kconfig~v4l-cx88-update drivers/media/video/Kconfig
--- 25/drivers/media/video/Kconfig~v4l-cx88-update	Mon Nov  8 13:51:46 2004
+++ 25-akpm/drivers/media/video/Kconfig	Mon Nov  8 13:51:46 2004
@@ -315,12 +315,13 @@ config VIDEO_CX88
 	  To compile this driver as a module, choose M here: the
 	  module will be called cx8800
 
-#config VIDEO_CX88_DVB
-#	tristate "DVB Support for cx2388x based TV cards"
-#	depends on VIDEO_CX88 && DVB_CORE
-#	---help---
-#	  This adds support for DVB cards based on the
-#	  Connexant 2388x chip.
+config VIDEO_CX88_DVB
+	tristate "DVB Support for cx2388x based TV cards"
+	depends on VIDEO_CX88 && DVB_CORE && BROKEN
+	select VIDEO_BUF_DVB
+	---help---
+	  This adds support for DVB cards based on the
+	  Connexant 2388x chip.
 
 config VIDEO_OVCAMCHIP
 	tristate "OmniVision Camera Chip support"
_
