summaryrefslogtreecommitdiff
path: root/linux/drivers/media/video/cx88
diff options
context:
space:
mode:
Diffstat (limited to 'linux/drivers/media/video/cx88')
-rw-r--r--linux/drivers/media/video/cx88/cx88-blackbird.c4
-rw-r--r--linux/drivers/media/video/cx88/cx88-cards.c12
-rw-r--r--linux/drivers/media/video/cx88/cx88-dvb.c211
-rw-r--r--linux/drivers/media/video/cx88/cx88-mpeg.c5
-rw-r--r--linux/drivers/media/video/cx88/cx88-video.c6
-rw-r--r--linux/drivers/media/video/cx88/cx88.h33
6 files changed, 41 insertions, 230 deletions
diff --git a/linux/drivers/media/video/cx88/cx88-blackbird.c b/linux/drivers/media/video/cx88/cx88-blackbird.c
index 3434952cf..6c4fe5199 100644
--- a/linux/drivers/media/video/cx88/cx88-blackbird.c
+++ b/linux/drivers/media/video/cx88/cx88-blackbird.c
@@ -1,5 +1,5 @@
/*
- * $Id: cx88-blackbird.c,v 1.15 2004/10/13 10:39:00 kraxel Exp $
+ * $Id: cx88-blackbird.c,v 1.16 2004/10/19 16:02:04 kraxel Exp $
*
* Support for a cx23416 mpeg encoder via cx2388x host port.
* "blackbird" reference design.
@@ -871,7 +871,7 @@ static struct pci_driver blackbird_pci_driver = {
.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 --git a/linux/drivers/media/video/cx88/cx88-cards.c b/linux/drivers/media/video/cx88/cx88-cards.c
index 26646fff1..8478d28b2 100644
--- a/linux/drivers/media/video/cx88/cx88-cards.c
+++ b/linux/drivers/media/video/cx88/cx88-cards.c
@@ -1,5 +1,5 @@
/*
- * $Id: cx88-cards.c,v 1.45 2004/10/13 10:39:00 kraxel Exp $
+ * $Id: cx88-cards.c,v 1.46 2004/10/19 16:02:04 kraxel Exp $
*
* device driver for Conexant 2388x based TV cards
* card-specific stuff.
@@ -26,8 +26,14 @@
#include <linux/pci.h>
#include <linux/delay.h>
+#if defined(CONFIG_VIDEO_CX88_DVB) || defined(CONFIG_VIDEO_CX88_DVB_MODULE)
+# define WITH_DVB 1
+#endif
+
#include "cx88.h"
+#ifdef WITH_DVB
#include "cx22702.h"
+#endif
/* ------------------------------------------------------------------ */
/* board config info */
@@ -641,6 +647,7 @@ static void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data)
core->tuner_type, radio ? "yes" : "no");
}
+#ifdef WITH_DVB
static int hauppauge_eeprom_dvb(struct cx88_core *core, u8 *ee)
{
int model;
@@ -683,6 +690,7 @@ static int hauppauge_eeprom_dvb(struct cx88_core *core, u8 *ee)
core->pll_addr = 0x61;
core->demod_addr = 0x43;
}
+#endif
/* ----------------------------------------------------------------------- */
/* some GDI (was: Modular Technology) specific stuff */
@@ -820,6 +828,7 @@ void cx88_card_setup(struct cx88_core *core)
msleep(1);
cx_set(MO_GP0_IO, 0x00000101);
break;
+#ifdef WITH_DVB
case CX88_BOARD_HAUPPAUGE_DVB_T1:
if (0 == core->i2c_rc)
i2c_eeprom(&core->i2c_client,eeprom,sizeof(eeprom));
@@ -830,6 +839,7 @@ void cx88_card_setup(struct cx88_core *core)
core->pll_addr = 0x60;
core->demod_addr = 0x43;
break;
+#endif
}
if (cx88_boards[core->board].radio.type == CX88_RADIO)
core->has_radio = 1;
diff --git a/linux/drivers/media/video/cx88/cx88-dvb.c b/linux/drivers/media/video/cx88/cx88-dvb.c
index 29a35e876..878d7c19d 100644
--- a/linux/drivers/media/video/cx88/cx88-dvb.c
+++ b/linux/drivers/media/video/cx88/cx88-dvb.c
@@ -1,5 +1,5 @@
/*
- * $Id: cx88-dvb.c,v 1.13 2004/10/13 10:39:00 kraxel Exp $
+ * $Id: cx88-dvb.c,v 1.14 2004/10/19 16:02:04 kraxel Exp $
*
* device driver for Conexant 2388x based TV cards
* MPEG Transport Stream (DVB) routines
@@ -85,136 +85,14 @@ 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();
- }
- return 0;
-}
-
-/* ---------------------------------------------------------------------------- */
-
-static int dvb_start_feed(struct dvb_demux_feed *feed)
-{
- struct dvb_demux *demux = feed->demux;
- struct cx8802_dev *dev = demux->priv;
- int rc;
-
- if (!demux->dmx.frontend)
- return -EINVAL;
-
- 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;
- }
-
-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;
-}
+/* ------------------------------------------------------------------ */
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
-
- 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);
+ videobuf_dvb_unregister(&dev->dvb);
if (dev->fe_handle)
dev->fe_release(dev->fe_handle);
- dvb_unregister_adapter(dev->dvb_adapter);
+ dvb_unregister_adapter(dev->dvb.adapter);
return;
}
@@ -222,8 +100,12 @@ static int dvb_register(struct cx8802_dev *dev)
{
int result;
- /* adapter */
- result = dvb_register_adapter(&dev->dvb_adapter, dev->core->name,
+ /* init struct videobuf_dvb */
+ dev->dvb.priv = dev;
+ dev->dvb.name = dev->core->name;
+
+ /* register 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",
@@ -231,12 +113,12 @@ static int dvb_register(struct cx8802_dev *dev)
goto fail1;
}
- /* frontend */
+ /* init + register 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->dvb.adapter,
dev->core->pll_addr,
dev->core->pll_type,
dev->core->demod_addr);
@@ -248,68 +130,14 @@ static int dvb_register(struct cx8802_dev *dev)
break;
}
- /* 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);
+ /* register everything else */
+ result = videobuf_dvb_register(&dev->dvb);
+ if (0 != result)
goto fail2;
- }
-
- 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);
+ dvb_unregister_adapter(dev->dvb.adapter);
fail1:
return result;
}
@@ -346,12 +174,12 @@ static int __devinit dvb_probe(struct pci_dev *pci_dev,
/* 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);
+ init_MUTEX(&dev->dvb.dvbq.lock);
err = dvb_register(dev);
if (0 != err)
@@ -394,7 +222,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 +251,6 @@ module_exit(dvb_fini);
/*
* Local variables:
* c-basic-offset: 8
+ * compile-command: "make DVB=1"
* End:
*/
diff --git a/linux/drivers/media/video/cx88/cx88-mpeg.c b/linux/drivers/media/video/cx88/cx88-mpeg.c
index 7df7bd412..7b45b5d8a 100644
--- a/linux/drivers/media/video/cx88/cx88-mpeg.c
+++ b/linux/drivers/media/video/cx88/cx88-mpeg.c
@@ -1,5 +1,5 @@
/*
- * $Id: cx88-mpeg.c,v 1.12 2004/10/13 10:39:00 kraxel Exp $
+ * $Id: cx88-mpeg.c,v 1.13 2004/10/19 16:02:04 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 data)
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 cx8802_dev *dev)
/* 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 cx8802_dev *dev)
/* 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 --git a/linux/drivers/media/video/cx88/cx88-video.c b/linux/drivers/media/video/cx88/cx88-video.c
index 31137f14e..c1ee8baa4 100644
--- a/linux/drivers/media/video/cx88/cx88-video.c
+++ b/linux/drivers/media/video/cx88/cx88-video.c
@@ -1,5 +1,5 @@
/*
- * $Id: cx88-video.c,v 1.42 2004/10/15 10:29:24 kraxel Exp $
+ * $Id: cx88-video.c,v 1.43 2004/10/19 16:02:05 kraxel Exp $
*
* device driver for Conexant 2388x based TV cards
* video4linux video interface
@@ -1033,7 +1033,7 @@ 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;
@@ -2244,7 +2244,7 @@ static struct pci_driver cx8800_pci_driver = {
.name = "cx8800",
.id_table = cx8800_pci_tbl,
.probe = cx8800_initdev,
- .remove = cx8800_finidev,
+ .remove = __devexit_p(cx8800_finidev),
.suspend = cx8800_suspend,
.resume = cx8800_resume,
diff --git a/linux/drivers/media/video/cx88/cx88.h b/linux/drivers/media/video/cx88/cx88.h
index 768de629a..f9412befd 100644
--- a/linux/drivers/media/video/cx88/cx88.h
+++ b/linux/drivers/media/video/cx88/cx88.h
@@ -1,5 +1,5 @@
/*
- * $Id: cx88.h,v 1.37 2004/10/12 07:33:22 kraxel Exp $
+ * $Id: cx88.h,v 1.38 2004/10/19 16:02:05 kraxel Exp $
*
* v4l2 device driver for cx2388x based TV cards
*
@@ -26,22 +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>
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,64)
-#include "video-buf.h"
-#include "tuner.h"
-#include "audiochip.h"
-#include "i2c-compat.h"
-#else
-#include <media/video-buf.h>
#include <media/tuner.h>
#include <media/audiochip.h>
-#endif
+#include <media/video-buf.h>
+#include <media/video-buf-dvb.h>
#include "compat.h"
#include "btcx-risc.h"
@@ -378,11 +366,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;
@@ -392,15 +375,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);
};