aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/pci/saa7134/saa7134-vbi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/pci/saa7134/saa7134-vbi.c')
-rw-r--r--drivers/media/pci/saa7134/saa7134-vbi.c108
1 files changed, 48 insertions, 60 deletions
diff --git a/drivers/media/pci/saa7134/saa7134-vbi.c b/drivers/media/pci/saa7134/saa7134-vbi.c
index 4954a5483299..4479af5e4b9c 100644
--- a/drivers/media/pci/saa7134/saa7134-vbi.c
+++ b/drivers/media/pci/saa7134/saa7134-vbi.c
@@ -81,10 +81,10 @@ static int buffer_activate(struct saa7134_dev *dev,
81 struct saa7134_buf *buf, 81 struct saa7134_buf *buf,
82 struct saa7134_buf *next) 82 struct saa7134_buf *next)
83{ 83{
84 struct saa7134_dmaqueue *dmaq = buf->vb2.vb2_queue->drv_priv;
84 unsigned long control, base; 85 unsigned long control, base;
85 86
86 dprintk("buffer_activate [%p]\n", buf); 87 dprintk("buffer_activate [%p]\n", buf);
87 buf->vb.state = VIDEOBUF_ACTIVE;
88 buf->top_seen = 0; 88 buf->top_seen = 0;
89 89
90 task_init(dev, buf, TASK_A); 90 task_init(dev, buf, TASK_A);
@@ -96,7 +96,7 @@ static int buffer_activate(struct saa7134_dev *dev,
96 base = saa7134_buffer_base(buf); 96 base = saa7134_buffer_base(buf);
97 control = SAA7134_RS_CONTROL_BURST_16 | 97 control = SAA7134_RS_CONTROL_BURST_16 |
98 SAA7134_RS_CONTROL_ME | 98 SAA7134_RS_CONTROL_ME |
99 (dev->vbi_q.pt.dma >> 12); 99 (dmaq->pt.dma >> 12);
100 saa_writel(SAA7134_RS_BA1(2), base); 100 saa_writel(SAA7134_RS_BA1(2), base);
101 saa_writel(SAA7134_RS_BA2(2), base + dev->vbi_hlen * dev->vbi_vlen); 101 saa_writel(SAA7134_RS_BA2(2), base + dev->vbi_hlen * dev->vbi_vlen);
102 saa_writel(SAA7134_RS_PITCH(2), dev->vbi_hlen); 102 saa_writel(SAA7134_RS_PITCH(2), dev->vbi_hlen);
@@ -108,93 +108,83 @@ static int buffer_activate(struct saa7134_dev *dev,
108 108
109 /* start DMA */ 109 /* start DMA */
110 saa7134_set_dmabits(dev); 110 saa7134_set_dmabits(dev);
111 mod_timer(&dev->vbi_q.timeout, jiffies + BUFFER_TIMEOUT); 111 mod_timer(&dmaq->timeout, jiffies + BUFFER_TIMEOUT);
112 112
113 return 0; 113 return 0;
114} 114}
115 115
116static int buffer_prepare(struct videobuf_queue *q, 116static int buffer_prepare(struct vb2_buffer *vb2)
117 struct videobuf_buffer *vb,
118 enum v4l2_field field)
119{ 117{
120 struct saa7134_dmaqueue *dmaq = q->priv_data; 118 struct saa7134_dmaqueue *dmaq = vb2->vb2_queue->drv_priv;
121 struct saa7134_dev *dev = dmaq->dev; 119 struct saa7134_dev *dev = dmaq->dev;
122 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb); 120 struct saa7134_buf *buf = container_of(vb2, struct saa7134_buf, vb2);
121 struct sg_table *dma = vb2_dma_sg_plane_desc(&buf->vb2, 0);
123 unsigned int size; 122 unsigned int size;
124 int err; 123 int ret;
125 124
126 size = dev->vbi_hlen * dev->vbi_vlen * 2; 125 size = dev->vbi_hlen * dev->vbi_vlen * 2;
127 if (0 != buf->vb.baddr && buf->vb.bsize < size) 126 if (vb2_plane_size(vb2, 0) < size)
128 return -EINVAL; 127 return -EINVAL;
129 128
130 if (buf->vb.size != size) 129 vb2_set_plane_payload(vb2, 0, size);
131 saa7134_dma_free(q,buf);
132
133 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
134 struct videobuf_dmabuf *dma=videobuf_to_dma(&buf->vb);
135
136 buf->vb.width = dev->vbi_hlen;
137 buf->vb.height = dev->vbi_vlen;
138 buf->vb.size = size;
139
140 err = videobuf_iolock(q,&buf->vb,NULL);
141 if (err)
142 goto oops;
143 err = saa7134_pgtable_build(dev->pci, &dmaq->pt,
144 dma->sglist,
145 dma->sglen,
146 saa7134_buffer_startpage(buf));
147 if (err)
148 goto oops;
149 }
150 buf->vb.state = VIDEOBUF_PREPARED;
151 buf->activate = buffer_activate;
152 buf->vb.field = field;
153 return 0;
154 130
155 oops: 131 ret = dma_map_sg(&dev->pci->dev, dma->sgl, dma->nents, DMA_FROM_DEVICE);
156 saa7134_dma_free(q,buf); 132 if (!ret)
157 return err; 133 return -EIO;
134 return saa7134_pgtable_build(dev->pci, &dmaq->pt, dma->sgl, dma->nents,
135 saa7134_buffer_startpage(buf));
158} 136}
159 137
160static int 138static int queue_setup(struct vb2_queue *q, const struct v4l2_format *fmt,
161buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size) 139 unsigned int *nbuffers, unsigned int *nplanes,
140 unsigned int sizes[], void *alloc_ctxs[])
162{ 141{
163 struct saa7134_dmaqueue *dmaq = q->priv_data; 142 struct saa7134_dmaqueue *dmaq = q->drv_priv;
164 struct saa7134_dev *dev = dmaq->dev; 143 struct saa7134_dev *dev = dmaq->dev;
144 unsigned int size;
165 145
166 dev->vbi_vlen = dev->tvnorm->vbi_v_stop_0 - dev->tvnorm->vbi_v_start_0 + 1; 146 dev->vbi_vlen = dev->tvnorm->vbi_v_stop_0 - dev->tvnorm->vbi_v_start_0 + 1;
167 if (dev->vbi_vlen > VBI_LINE_COUNT) 147 if (dev->vbi_vlen > VBI_LINE_COUNT)
168 dev->vbi_vlen = VBI_LINE_COUNT; 148 dev->vbi_vlen = VBI_LINE_COUNT;
169 dev->vbi_hlen = VBI_LINE_LENGTH; 149 dev->vbi_hlen = VBI_LINE_LENGTH;
170 *size = dev->vbi_hlen * dev->vbi_vlen * 2; 150 size = dev->vbi_hlen * dev->vbi_vlen * 2;
171 if (0 == *count) 151
172 *count = vbibufs; 152 *nbuffers = saa7134_buffer_count(size, *nbuffers);
173 *count = saa7134_buffer_count(*size,*count); 153 *nplanes = 1;
154 sizes[0] = size;
174 return 0; 155 return 0;
175} 156}
176 157
177static void buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb) 158static int buffer_init(struct vb2_buffer *vb2)
178{ 159{
179 struct saa7134_dmaqueue *dmaq = q->priv_data; 160 struct saa7134_dmaqueue *dmaq = vb2->vb2_queue->drv_priv;
180 struct saa7134_dev *dev = dmaq->dev; 161 struct saa7134_buf *buf = container_of(vb2, struct saa7134_buf, vb2);
181 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
182 162
183 saa7134_buffer_queue(dev,&dev->vbi_q,buf); 163 dmaq->curr = NULL;
164 buf->activate = buffer_activate;
165 return 0;
184} 166}
185 167
186static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb) 168static void buffer_finish(struct vb2_buffer *vb2)
187{ 169{
188 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb); 170 struct saa7134_dmaqueue *dmaq = vb2->vb2_queue->drv_priv;
171 struct saa7134_dev *dev = dmaq->dev;
172 struct saa7134_buf *buf = container_of(vb2, struct saa7134_buf, vb2);
173 struct sg_table *dma = vb2_dma_sg_plane_desc(&buf->vb2, 0);
189 174
190 saa7134_dma_free(q,buf); 175 dma_unmap_sg(&dev->pci->dev, dma->sgl, dma->nents, DMA_FROM_DEVICE);
191} 176}
192 177
193struct videobuf_queue_ops saa7134_vbi_qops = { 178struct vb2_ops saa7134_vbi_qops = {
194 .buf_setup = buffer_setup, 179 .queue_setup = queue_setup,
195 .buf_prepare = buffer_prepare, 180 .buf_init = buffer_init,
196 .buf_queue = buffer_queue, 181 .buf_prepare = buffer_prepare,
197 .buf_release = buffer_release, 182 .buf_finish = buffer_finish,
183 .buf_queue = saa7134_vb2_buffer_queue,
184 .wait_prepare = vb2_ops_wait_prepare,
185 .wait_finish = vb2_ops_wait_finish,
186 .start_streaming = saa7134_vb2_start_streaming,
187 .stop_streaming = saa7134_vb2_stop_streaming,
198}; 188};
199 189
200/* ------------------------------------------------------------------ */ 190/* ------------------------------------------------------------------ */
@@ -224,7 +214,6 @@ void saa7134_irq_vbi_done(struct saa7134_dev *dev, unsigned long status)
224{ 214{
225 spin_lock(&dev->slock); 215 spin_lock(&dev->slock);
226 if (dev->vbi_q.curr) { 216 if (dev->vbi_q.curr) {
227 dev->vbi_fieldcount++;
228 /* make sure we have seen both fields */ 217 /* make sure we have seen both fields */
229 if ((status & 0x10) == 0x00) { 218 if ((status & 0x10) == 0x00) {
230 dev->vbi_q.curr->top_seen = 1; 219 dev->vbi_q.curr->top_seen = 1;
@@ -233,8 +222,7 @@ void saa7134_irq_vbi_done(struct saa7134_dev *dev, unsigned long status)
233 if (!dev->vbi_q.curr->top_seen) 222 if (!dev->vbi_q.curr->top_seen)
234 goto done; 223 goto done;
235 224
236 dev->vbi_q.curr->vb.field_count = dev->vbi_fieldcount; 225 saa7134_buffer_finish(dev, &dev->vbi_q, VB2_BUF_STATE_DONE);
237 saa7134_buffer_finish(dev, &dev->vbi_q, VIDEOBUF_DONE);
238 } 226 }
239 saa7134_buffer_next(dev, &dev->vbi_q); 227 saa7134_buffer_next(dev, &dev->vbi_q);
240 228