diff options
Diffstat (limited to 'linux/drivers/media/video/cx88')
-rw-r--r-- | linux/drivers/media/video/cx88/cx88-blackbird.c | 4 | ||||
-rw-r--r-- | linux/drivers/media/video/cx88/cx88-cards.c | 12 | ||||
-rw-r--r-- | linux/drivers/media/video/cx88/cx88-dvb.c | 211 | ||||
-rw-r--r-- | linux/drivers/media/video/cx88/cx88-mpeg.c | 5 | ||||
-rw-r--r-- | linux/drivers/media/video/cx88/cx88-video.c | 6 | ||||
-rw-r--r-- | linux/drivers/media/video/cx88/cx88.h | 33 |
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); }; |