X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fmedia%2Fvideo%2Fcx88%2Fcx88-vbi.c;h=aa2a69770098cf48b085d9f35c79f154ec20c9b6;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=5379e237332fd334a27d38c2d65a3232a20e9607;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/drivers/media/video/cx88/cx88-vbi.c b/drivers/media/video/cx88/cx88-vbi.c index 5379e2373..aa2a69770 100644 --- a/drivers/media/video/cx88/cx88-vbi.c +++ b/drivers/media/video/cx88/cx88-vbi.c @@ -1,20 +1,23 @@ +/* + */ #include #include +#include #include #include #include "cx88.h" static unsigned int vbibufs = 4; -MODULE_PARM(vbibufs,"i"); +module_param(vbibufs,int,0644); MODULE_PARM_DESC(vbibufs,"number of vbi buffers, range 2-32"); static unsigned int vbi_debug = 0; -MODULE_PARM(vbi_debug,"i"); -MODULE_PARM_DESC(vbi_debug,"enable debug messages [video]"); +module_param(vbi_debug,int,0644); +MODULE_PARM_DESC(vbi_debug,"enable debug messages [vbi]"); #define dprintk(level,fmt, arg...) if (vbi_debug >= level) \ - printk(KERN_DEBUG "%s: " fmt, dev->name , ## arg) + printk(KERN_DEBUG "%s: " fmt, dev->core->name , ## arg) /* ------------------------------------------------------------------ */ @@ -28,29 +31,28 @@ void cx8800_vbi_fmt(struct cx8800_dev *dev, struct v4l2_format *f) f->fmt.vbi.count[0] = VBI_LINE_COUNT; f->fmt.vbi.count[1] = VBI_LINE_COUNT; - switch (dev->tvnorm->id) { - case V4L2_STD_NTSC_M: - case V4L2_STD_NTSC_M_JP: + if (dev->core->tvnorm->id & V4L2_STD_525_60) { + /* ntsc */ f->fmt.vbi.sampling_rate = 28636363; - f->fmt.vbi.start[0] = 10 -1; - f->fmt.vbi.start[1] = 273 -1; - break; - case V4L2_STD_PAL_BG: - case V4L2_STD_PAL_DK: - case V4L2_STD_PAL_I: - case V4L2_STD_SECAM: + f->fmt.vbi.start[0] = 10; + f->fmt.vbi.start[1] = 273; + + } else if (dev->core->tvnorm->id & V4L2_STD_625_50) { + /* pal */ f->fmt.vbi.sampling_rate = 35468950; f->fmt.vbi.start[0] = 7 -1; f->fmt.vbi.start[1] = 319 -1; } } -int cx8800_start_vbi_dma(struct cx8800_dev *dev, +static int cx8800_start_vbi_dma(struct cx8800_dev *dev, struct cx88_dmaqueue *q, struct cx88_buffer *buf) { + struct cx88_core *core = dev->core; + /* setup fifo + format */ - cx88_sram_channel_setup(dev, &cx88_sram_channels[SRAM_CH24], + cx88_sram_channel_setup(dev->core, &cx88_sram_channels[SRAM_CH24], buf->vb.width, buf->risc.dma); cx_write(MO_VBOS_CONTROL, ( (1 << 18) | // comb filter delay fixup @@ -58,11 +60,11 @@ int cx8800_start_vbi_dma(struct cx8800_dev *dev, (1 << 11) )); /* reset counter */ - cx_write(MO_VBI_GPCNTRL,0x3); + cx_write(MO_VBI_GPCNTRL, GP_COUNT_CONTROL_RESET); q->count = 1; /* enable irqs */ - cx_set(MO_PCI_INTMSK, 0x00fc01); + cx_set(MO_PCI_INTMSK, core->pci_irqmask | 0x01); cx_set(MO_VID_INTMSK, 0x0f0088); /* enable capture */ @@ -75,6 +77,22 @@ int cx8800_start_vbi_dma(struct cx8800_dev *dev, return 0; } +int cx8800_stop_vbi_dma(struct cx8800_dev *dev) +{ + struct cx88_core *core = dev->core; + + /* stop dma */ + cx_clear(MO_VID_DMACNTRL, 0x88); + + /* disable capture */ + cx_clear(VID_CAPTURE_CONTROL,0x18); + + /* disable irqs */ + cx_clear(MO_PCI_INTMSK, 0x000001); + cx_clear(MO_VID_INTMSK, 0x0f0088); + return 0; +} + int cx8800_restart_vbi_queue(struct cx8800_dev *dev, struct cx88_dmaqueue *q) { @@ -99,11 +117,12 @@ int cx8800_restart_vbi_queue(struct cx8800_dev *dev, void cx8800_vbi_timeout(unsigned long data) { struct cx8800_dev *dev = (struct cx8800_dev*)data; + struct cx88_core *core = dev->core; struct cx88_dmaqueue *q = &dev->vbiq; struct cx88_buffer *buf; unsigned long flags; - cx88_sram_channel_dump(dev, &cx88_sram_channels[SRAM_CH24]); + cx88_sram_channel_dump(dev->core, &cx88_sram_channels[SRAM_CH24]); cx_clear(MO_VID_DMACNTRL, 0x88); cx_clear(VID_CAPTURE_CONTROL, 0x18); @@ -114,7 +133,7 @@ void cx8800_vbi_timeout(unsigned long data) list_del(&buf->vb.queue); buf->vb.state = STATE_ERROR; wake_up(&buf->vb.done); - printk("%s: [%p/%d] timeout - dma=0x%08lx\n", dev->name, + printk("%s/0: [%p/%d] timeout - dma=0x%08lx\n", dev->core->name, buf, buf->vb.i, (unsigned long)buf->risc.dma); } cx8800_restart_vbi_queue(dev,q); @@ -124,7 +143,7 @@ void cx8800_vbi_timeout(unsigned long data) /* ------------------------------------------------------------------ */ static int -vbi_setup(struct file *file, 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) @@ -137,12 +156,12 @@ vbi_setup(struct file *file, unsigned int *count, unsigned int *size) } static int -vbi_prepare(struct file *file, struct videobuf_buffer *vb, +vbi_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb, enum v4l2_field field) { - struct cx8800_fh *fh = file->private_data; + 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; @@ -156,7 +175,7 @@ vbi_prepare(struct file *file, struct videobuf_buffer *vb, buf->vb.size = size; buf->vb.field = V4L2_FIELD_SEQ_TB; - if (0 != (rc = videobuf_iolock(dev->pci,&buf->vb,NULL))) + if (0 != (rc = videobuf_iolock(q,&buf->vb,NULL))) goto fail; cx88_risc_buffer(dev->pci, &buf->risc, buf->vb.dma.sglist, @@ -168,21 +187,21 @@ vbi_prepare(struct file *file, struct videobuf_buffer *vb, return 0; fail: - cx88_free_buffer(dev->pci,buf); + cx88_free_buffer(q,buf); return rc; } static void -vbi_queue(struct file *file, 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 = file->private_data; + struct cx8800_fh *fh = vq->priv_data; struct cx8800_dev *dev = fh->dev; struct cx88_dmaqueue *q = &dev->vbiq; /* add jump to stopper */ - buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP | RISC_IRQ1 | 0x10000); + buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC); buf->risc.jmp[1] = cpu_to_le32(q->stopper.dma); if (list_empty(&q->active)) { @@ -205,12 +224,11 @@ vbi_queue(struct file *file, struct videobuf_buffer *vb) } } -static void vbi_release(struct file *file, 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 = file->private_data; + struct cx88_buffer *buf = container_of(vb,struct cx88_buffer,vb); - cx88_free_buffer(fh->dev->pci,buf); + cx88_free_buffer(q,buf); } struct videobuf_queue_ops cx8800_vbi_qops = {