fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / media / video / cx88 / cx88-vbi.c
index 5379e23..aa2a697 100644 (file)
@@ -1,20 +1,23 @@
+/*
+ */
 #include <linux/kernel.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/init.h>
 #include <linux/slab.h>
 
 #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 = {