Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / media / video / saa7134 / saa7134-ts.c
index 345eb2a..60a90a2 100644 (file)
@@ -1,5 +1,4 @@
 /*
- * $Id: saa7134-ts.c,v 1.14 2005/02/03 10:24:33 kraxel Exp $
  *
  * device driver for philips saa7134 based TV cards
  * video4linux video interface
@@ -47,17 +46,11 @@ static int buffer_activate(struct saa7134_dev *dev,
                           struct saa7134_buf *buf,
                           struct saa7134_buf *next)
 {
-       u32 control;
 
        dprintk("buffer_activate [%p]",buf);
        buf->vb.state = STATE_ACTIVE;
        buf->top_seen = 0;
 
-        /* dma: setup channel 5 (= TS) */
-        control = SAA7134_RS_CONTROL_BURST_16 |
-                SAA7134_RS_CONTROL_ME |
-                (buf->pt->dma >> 12);
-
        if (NULL == next)
                next = buf;
        if (V4L2_FIELD_TOP == buf->vb.field) {
@@ -69,8 +62,6 @@ static int buffer_activate(struct saa7134_dev *dev,
                saa_writel(SAA7134_RS_BA1(5),saa7134_buffer_base(next));
                saa_writel(SAA7134_RS_BA2(5),saa7134_buffer_base(buf));
        }
-       saa_writel(SAA7134_RS_PITCH(5),TS_PACKET_SIZE);
-       saa_writel(SAA7134_RS_CONTROL(5),control);
 
        /* start DMA */
        saa7134_set_dmabits(dev);
@@ -85,6 +76,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
        struct saa7134_dev *dev = q->priv_data;
        struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
        unsigned int lines, llength, size;
+       u32 control;
        int err;
 
        dprintk("buffer_prepare [%p,%s]\n",buf,v4l2_field_names[field]);
@@ -97,7 +89,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
                return -EINVAL;
 
        if (buf->vb.size != size) {
-               saa7134_dma_free(dev,buf);
+               saa7134_dma_free(q,buf);
        }
 
        if (STATE_NEEDS_INIT == buf->vb.state) {
@@ -106,7 +98,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
                buf->vb.size   = size;
                buf->pt        = &dev->ts.pt_ts;
 
-               err = videobuf_iolock(dev->pci,&buf->vb,NULL);
+               err = videobuf_iolock(q,&buf->vb,NULL);
                if (err)
                        goto oops;
                err = saa7134_pgtable_build(dev->pci,buf->pt,
@@ -116,13 +108,25 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
                if (err)
                        goto oops;
        }
+
+       /* dma: setup channel 5 (= TS) */
+       control = SAA7134_RS_CONTROL_BURST_16 |
+                 SAA7134_RS_CONTROL_ME |
+                 (buf->pt->dma >> 12);
+
+       saa_writeb(SAA7134_TS_DMA0, ((lines-1)&0xff));
+       saa_writeb(SAA7134_TS_DMA1, (((lines-1)>>8)&0xff));
+       saa_writeb(SAA7134_TS_DMA2, ((((lines-1)>>16)&0x3f) | 0x00)); /* TSNOPIT=0, TSCOLAP=0 */
+       saa_writel(SAA7134_RS_PITCH(5),TS_PACKET_SIZE);
+       saa_writel(SAA7134_RS_CONTROL(5),control);
+
        buf->vb.state = STATE_PREPARED;
        buf->activate = buffer_activate;
        buf->vb.field = field;
        return 0;
 
  oops:
-       saa7134_dma_free(dev,buf);
+       saa7134_dma_free(q,buf);
        return err;
 }
 
@@ -148,10 +152,9 @@ static void buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
 
 static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
 {
-       struct saa7134_dev *dev = q->priv_data;
        struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
 
-       saa7134_dma_free(dev,buf);
+       saa7134_dma_free(q,buf);
 }
 
 struct videobuf_queue_ops saa7134_ts_qops = {
@@ -165,11 +168,11 @@ EXPORT_SYMBOL_GPL(saa7134_ts_qops);
 /* ----------------------------------------------------------- */
 /* exported stuff                                              */
 
-static unsigned int tsbufs = 4;
+static unsigned int tsbufs = 8;
 module_param(tsbufs, int, 0444);
 MODULE_PARM_DESC(tsbufs,"number of ts buffers, range 2-32");
 
-static unsigned int ts_nr_packets = 30;
+static unsigned int ts_nr_packets = 64;
 module_param(ts_nr_packets, int, 0444);
 MODULE_PARM_DESC(ts_nr_packets,"size of a ts buffers (in ts packets)");