diff options
Diffstat (limited to 'drivers/media/pci/saa7134/saa7134-vbi.c')
-rw-r--r-- | drivers/media/pci/saa7134/saa7134-vbi.c | 108 |
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 | ||
116 | static int buffer_prepare(struct videobuf_queue *q, | 116 | static 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 | ||
160 | static int | 138 | static int queue_setup(struct vb2_queue *q, const struct v4l2_format *fmt, |
161 | buffer_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 | ||
177 | static void buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb) | 158 | static 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 | ||
186 | static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb) | 168 | static 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 | ||
193 | struct videobuf_queue_ops saa7134_vbi_qops = { | 178 | struct 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 | ||