aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/platform/davinci/vpbe_display.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-12-13 22:22:22 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-12-13 22:22:22 -0500
commitd8c532c40721f7507896d202b8cae3b3642d2b0d (patch)
tree42b1ce76671eb85324281ed93491432f4523f983 /drivers/media/platform/davinci/vpbe_display.c
parente777d192ffb9f2929d547a2f8a5f65b7db7a9552 (diff)
parent77c53d0b56264a8fc5844e087ad15fffe20c299d (diff)
Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media updates from Mauro Carvalho Chehab: - Missing MAINTAINERS entries were added for several drivers - Adds V4L2 support for DMABUF handling, allowing zero-copy buffer sharing between V4L2 devices and GPU - Got rid of all warnings when compiling with W=1 on x86 - Add a new driver for Exynos hardware (s3c-camif) - Several bug fixes, cleanups and driver improvements * 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (243 commits) [media] omap3isp: Replace cpu_is_omap3630() with ISP revision check [media] omap3isp: Prepare/unprepare clocks before/after enable/disable [media] omap3isp: preview: Add support for 8-bit formats at the sink pad [media] omap3isp: Replace printk with dev_* [media] omap3isp: Find source pad from external entity [media] omap3isp: Configure CSI-2 phy based on platform data [media] omap3isp: Add PHY routing configuration [media] omap3isp: Add CSI configuration registers from control block to ISP resources [media] omap3isp: Remove unneeded module memory address definitions [media] omap3isp: Use monotonic timestamps for statistics buffers [media] uvcvideo: Fix control value clamping for unsigned integer controls [media] uvcvideo: Mark first output terminal as default video node [media] uvcvideo: Add VIDIOC_[GS]_PRIORITY support [media] uvcvideo: Return -ENOTTY for unsupported ioctls [media] uvcvideo: Set device_caps in VIDIOC_QUERYCAP [media] uvcvideo: Don't fail when an unsupported format is requested [media] uvcvideo: Return -EACCES when trying to access a read/write-only control [media] uvcvideo: Set error_idx properly for extended controls API failures [media] rtl28xxu: add NOXON DAB/DAB+ USB dongle rev 2 [media] fc2580: write some registers conditionally ...
Diffstat (limited to 'drivers/media/platform/davinci/vpbe_display.c')
-rw-r--r--drivers/media/platform/davinci/vpbe_display.c303
1 files changed, 181 insertions, 122 deletions
diff --git a/drivers/media/platform/davinci/vpbe_display.c b/drivers/media/platform/davinci/vpbe_display.c
index 161c77650e2f..2bfde7958fef 100644
--- a/drivers/media/platform/davinci/vpbe_display.c
+++ b/drivers/media/platform/davinci/vpbe_display.c
@@ -47,6 +47,9 @@ static int debug;
47 47
48module_param(debug, int, 0644); 48module_param(debug, int, 0644);
49 49
50static int vpbe_set_osd_display_params(struct vpbe_display *disp_dev,
51 struct vpbe_layer *layer);
52
50static int venc_is_second_field(struct vpbe_display *disp_dev) 53static int venc_is_second_field(struct vpbe_display *disp_dev)
51{ 54{
52 struct vpbe_device *vpbe_dev = disp_dev->vpbe_dev; 55 struct vpbe_device *vpbe_dev = disp_dev->vpbe_dev;
@@ -73,10 +76,11 @@ static void vpbe_isr_even_field(struct vpbe_display *disp_obj,
73 if (layer->cur_frm == layer->next_frm) 76 if (layer->cur_frm == layer->next_frm)
74 return; 77 return;
75 ktime_get_ts(&timevalue); 78 ktime_get_ts(&timevalue);
76 layer->cur_frm->ts.tv_sec = timevalue.tv_sec; 79 layer->cur_frm->vb.v4l2_buf.timestamp.tv_sec =
77 layer->cur_frm->ts.tv_usec = timevalue.tv_nsec / NSEC_PER_USEC; 80 timevalue.tv_sec;
78 layer->cur_frm->state = VIDEOBUF_DONE; 81 layer->cur_frm->vb.v4l2_buf.timestamp.tv_usec =
79 wake_up_interruptible(&layer->cur_frm->done); 82 timevalue.tv_nsec / NSEC_PER_USEC;
83 vb2_buffer_done(&layer->cur_frm->vb, VB2_BUF_STATE_DONE);
80 /* Make cur_frm pointing to next_frm */ 84 /* Make cur_frm pointing to next_frm */
81 layer->cur_frm = layer->next_frm; 85 layer->cur_frm = layer->next_frm;
82} 86}
@@ -99,16 +103,14 @@ static void vpbe_isr_odd_field(struct vpbe_display *disp_obj,
99 * otherwise hold on current frame 103 * otherwise hold on current frame
100 * Get next from the buffer queue 104 * Get next from the buffer queue
101 */ 105 */
102 layer->next_frm = list_entry( 106 layer->next_frm = list_entry(layer->dma_queue.next,
103 layer->dma_queue.next, 107 struct vpbe_disp_buffer, list);
104 struct videobuf_buffer,
105 queue);
106 /* Remove that from the buffer queue */ 108 /* Remove that from the buffer queue */
107 list_del(&layer->next_frm->queue); 109 list_del(&layer->next_frm->list);
108 spin_unlock(&disp_obj->dma_queue_lock); 110 spin_unlock(&disp_obj->dma_queue_lock);
109 /* Mark state of the frame to active */ 111 /* Mark state of the frame to active */
110 layer->next_frm->state = VIDEOBUF_ACTIVE; 112 layer->next_frm->vb.state = VB2_BUF_STATE_ACTIVE;
111 addr = videobuf_to_dma_contig(layer->next_frm); 113 addr = vb2_dma_contig_plane_dma_addr(&layer->next_frm->vb, 0);
112 osd_device->ops.start_layer(osd_device, 114 osd_device->ops.start_layer(osd_device,
113 layer->layer_info.id, 115 layer->layer_info.id,
114 addr, 116 addr,
@@ -199,39 +201,29 @@ static irqreturn_t venc_isr(int irq, void *arg)
199 201
200/* 202/*
201 * vpbe_buffer_prepare() 203 * vpbe_buffer_prepare()
202 * This is the callback function called from videobuf_qbuf() function 204 * This is the callback function called from vb2_qbuf() function
203 * the buffer is prepared and user space virtual address is converted into 205 * the buffer is prepared and user space virtual address is converted into
204 * physical address 206 * physical address
205 */ 207 */
206static int vpbe_buffer_prepare(struct videobuf_queue *q, 208static int vpbe_buffer_prepare(struct vb2_buffer *vb)
207 struct videobuf_buffer *vb,
208 enum v4l2_field field)
209{ 209{
210 struct vpbe_fh *fh = q->priv_data; 210 struct vpbe_fh *fh = vb2_get_drv_priv(vb->vb2_queue);
211 struct vb2_queue *q = vb->vb2_queue;
211 struct vpbe_layer *layer = fh->layer; 212 struct vpbe_layer *layer = fh->layer;
212 struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; 213 struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev;
213 unsigned long addr; 214 unsigned long addr;
214 int ret;
215 215
216 v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, 216 v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev,
217 "vpbe_buffer_prepare\n"); 217 "vpbe_buffer_prepare\n");
218 218
219 /* If buffer is not initialized, initialize it */ 219 if (vb->state != VB2_BUF_STATE_ACTIVE &&
220 if (VIDEOBUF_NEEDS_INIT == vb->state) { 220 vb->state != VB2_BUF_STATE_PREPARED) {
221 vb->width = layer->pix_fmt.width; 221 vb2_set_plane_payload(vb, 0, layer->pix_fmt.sizeimage);
222 vb->height = layer->pix_fmt.height; 222 if (vb2_plane_vaddr(vb, 0) &&
223 vb->size = layer->pix_fmt.sizeimage; 223 vb2_get_plane_payload(vb, 0) > vb2_plane_size(vb, 0))
224 vb->field = field;
225
226 ret = videobuf_iolock(q, vb, NULL);
227 if (ret < 0) {
228 v4l2_err(&vpbe_dev->v4l2_dev, "Failed to map \
229 user address\n");
230 return -EINVAL; 224 return -EINVAL;
231 }
232
233 addr = videobuf_to_dma_contig(vb);
234 225
226 addr = vb2_dma_contig_plane_dma_addr(vb, 0);
235 if (q->streaming) { 227 if (q->streaming) {
236 if (!IS_ALIGNED(addr, 8)) { 228 if (!IS_ALIGNED(addr, 8)) {
237 v4l2_err(&vpbe_dev->v4l2_dev, 229 v4l2_err(&vpbe_dev->v4l2_dev,
@@ -240,7 +232,6 @@ static int vpbe_buffer_prepare(struct videobuf_queue *q,
240 return -EINVAL; 232 return -EINVAL;
241 } 233 }
242 } 234 }
243 vb->state = VIDEOBUF_PREPARED;
244 } 235 }
245 return 0; 236 return 0;
246} 237}
@@ -249,22 +240,26 @@ static int vpbe_buffer_prepare(struct videobuf_queue *q,
249 * vpbe_buffer_setup() 240 * vpbe_buffer_setup()
250 * This function allocates memory for the buffers 241 * This function allocates memory for the buffers
251 */ 242 */
252static int vpbe_buffer_setup(struct videobuf_queue *q, 243static int
253 unsigned int *count, 244vpbe_buffer_queue_setup(struct vb2_queue *vq, const struct v4l2_format *fmt,
254 unsigned int *size) 245 unsigned int *nbuffers, unsigned int *nplanes,
246 unsigned int sizes[], void *alloc_ctxs[])
247
255{ 248{
256 /* Get the file handle object and layer object */ 249 /* Get the file handle object and layer object */
257 struct vpbe_fh *fh = q->priv_data; 250 struct vpbe_fh *fh = vb2_get_drv_priv(vq);
258 struct vpbe_layer *layer = fh->layer; 251 struct vpbe_layer *layer = fh->layer;
259 struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; 252 struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev;
260 253
261 v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, "vpbe_buffer_setup\n"); 254 v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, "vpbe_buffer_setup\n");
262 255
263 *size = layer->pix_fmt.sizeimage;
264
265 /* Store number of buffers allocated in numbuffer member */ 256 /* Store number of buffers allocated in numbuffer member */
266 if (*count < VPBE_DEFAULT_NUM_BUFS) 257 if (*nbuffers < VPBE_DEFAULT_NUM_BUFS)
267 *count = layer->numbuffers = VPBE_DEFAULT_NUM_BUFS; 258 *nbuffers = layer->numbuffers = VPBE_DEFAULT_NUM_BUFS;
259
260 *nplanes = 1;
261 sizes[0] = layer->pix_fmt.sizeimage;
262 alloc_ctxs[0] = layer->alloc_ctx;
268 263
269 return 0; 264 return 0;
270} 265}
@@ -273,11 +268,12 @@ static int vpbe_buffer_setup(struct videobuf_queue *q,
273 * vpbe_buffer_queue() 268 * vpbe_buffer_queue()
274 * This function adds the buffer to DMA queue 269 * This function adds the buffer to DMA queue
275 */ 270 */
276static void vpbe_buffer_queue(struct videobuf_queue *q, 271static void vpbe_buffer_queue(struct vb2_buffer *vb)
277 struct videobuf_buffer *vb)
278{ 272{
279 /* Get the file handle object and layer object */ 273 /* Get the file handle object and layer object */
280 struct vpbe_fh *fh = q->priv_data; 274 struct vpbe_fh *fh = vb2_get_drv_priv(vb->vb2_queue);
275 struct vpbe_disp_buffer *buf = container_of(vb,
276 struct vpbe_disp_buffer, vb);
281 struct vpbe_layer *layer = fh->layer; 277 struct vpbe_layer *layer = fh->layer;
282 struct vpbe_display *disp = fh->disp_dev; 278 struct vpbe_display *disp = fh->disp_dev;
283 struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; 279 struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev;
@@ -288,39 +284,125 @@ static void vpbe_buffer_queue(struct videobuf_queue *q,
288 284
289 /* add the buffer to the DMA queue */ 285 /* add the buffer to the DMA queue */
290 spin_lock_irqsave(&disp->dma_queue_lock, flags); 286 spin_lock_irqsave(&disp->dma_queue_lock, flags);
291 list_add_tail(&vb->queue, &layer->dma_queue); 287 list_add_tail(&buf->list, &layer->dma_queue);
292 spin_unlock_irqrestore(&disp->dma_queue_lock, flags); 288 spin_unlock_irqrestore(&disp->dma_queue_lock, flags);
293 /* Change state of the buffer */
294 vb->state = VIDEOBUF_QUEUED;
295} 289}
296 290
297/* 291/*
298 * vpbe_buffer_release() 292 * vpbe_buf_cleanup()
299 * This function is called from the videobuf layer to free memory allocated to 293 * This function is called from the vb2 layer to free memory allocated to
300 * the buffers 294 * the buffers
301 */ 295 */
302static void vpbe_buffer_release(struct videobuf_queue *q, 296static void vpbe_buf_cleanup(struct vb2_buffer *vb)
303 struct videobuf_buffer *vb)
304{ 297{
305 /* Get the file handle object and layer object */ 298 /* Get the file handle object and layer object */
306 struct vpbe_fh *fh = q->priv_data; 299 struct vpbe_fh *fh = vb2_get_drv_priv(vb->vb2_queue);
307 struct vpbe_layer *layer = fh->layer; 300 struct vpbe_layer *layer = fh->layer;
308 struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; 301 struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev;
302 struct vpbe_disp_buffer *buf = container_of(vb,
303 struct vpbe_disp_buffer, vb);
304 unsigned long flags;
309 305
310 v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, 306 v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev,
311 "vpbe_buffer_release\n"); 307 "vpbe_buf_cleanup\n");
308
309 spin_lock_irqsave(&layer->irqlock, flags);
310 if (vb->state == VB2_BUF_STATE_ACTIVE)
311 list_del_init(&buf->list);
312 spin_unlock_irqrestore(&layer->irqlock, flags);
313}
314
315static void vpbe_wait_prepare(struct vb2_queue *vq)
316{
317 struct vpbe_fh *fh = vb2_get_drv_priv(vq);
318 struct vpbe_layer *layer = fh->layer;
319
320 mutex_unlock(&layer->opslock);
321}
322
323static void vpbe_wait_finish(struct vb2_queue *vq)
324{
325 struct vpbe_fh *fh = vb2_get_drv_priv(vq);
326 struct vpbe_layer *layer = fh->layer;
327
328 mutex_lock(&layer->opslock);
329}
330
331static int vpbe_buffer_init(struct vb2_buffer *vb)
332{
333 struct vpbe_disp_buffer *buf = container_of(vb,
334 struct vpbe_disp_buffer, vb);
335
336 INIT_LIST_HEAD(&buf->list);
337 return 0;
338}
339
340static int vpbe_start_streaming(struct vb2_queue *vq, unsigned int count)
341{
342 struct vpbe_fh *fh = vb2_get_drv_priv(vq);
343 struct vpbe_layer *layer = fh->layer;
344 struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev;
345 int ret;
346
347 /* If buffer queue is empty, return error */
348 if (list_empty(&layer->dma_queue)) {
349 v4l2_err(&vpbe_dev->v4l2_dev, "buffer queue is empty\n");
350 return -EINVAL;
351 }
352 /* Get the next frame from the buffer queue */
353 layer->next_frm = layer->cur_frm = list_entry(layer->dma_queue.next,
354 struct vpbe_disp_buffer, list);
355 /* Remove buffer from the buffer queue */
356 list_del(&layer->cur_frm->list);
357 /* Mark state of the current frame to active */
358 layer->cur_frm->vb.state = VB2_BUF_STATE_ACTIVE;
359 /* Initialize field_id and started member */
360 layer->field_id = 0;
361
362 /* Set parameters in OSD and VENC */
363 ret = vpbe_set_osd_display_params(fh->disp_dev, layer);
364 if (ret < 0)
365 return ret;
312 366
313 if (V4L2_MEMORY_USERPTR != layer->memory) 367 /*
314 videobuf_dma_contig_free(q, vb); 368 * if request format is yuv420 semiplanar, need to
369 * enable both video windows
370 */
371 layer->started = 1;
372 layer->layer_first_int = 1;
373
374 return ret;
375}
376
377static int vpbe_stop_streaming(struct vb2_queue *vq)
378{
379 struct vpbe_fh *fh = vb2_get_drv_priv(vq);
380 struct vpbe_layer *layer = fh->layer;
381
382 if (!vb2_is_streaming(vq))
383 return 0;
384
385 /* release all active buffers */
386 while (!list_empty(&layer->dma_queue)) {
387 layer->next_frm = list_entry(layer->dma_queue.next,
388 struct vpbe_disp_buffer, list);
389 list_del(&layer->next_frm->list);
390 vb2_buffer_done(&layer->next_frm->vb, VB2_BUF_STATE_ERROR);
391 }
315 392
316 vb->state = VIDEOBUF_NEEDS_INIT; 393 return 0;
317} 394}
318 395
319static struct videobuf_queue_ops video_qops = { 396static struct vb2_ops video_qops = {
320 .buf_setup = vpbe_buffer_setup, 397 .queue_setup = vpbe_buffer_queue_setup,
398 .wait_prepare = vpbe_wait_prepare,
399 .wait_finish = vpbe_wait_finish,
400 .buf_init = vpbe_buffer_init,
321 .buf_prepare = vpbe_buffer_prepare, 401 .buf_prepare = vpbe_buffer_prepare,
402 .start_streaming = vpbe_start_streaming,
403 .stop_streaming = vpbe_stop_streaming,
404 .buf_cleanup = vpbe_buf_cleanup,
322 .buf_queue = vpbe_buffer_queue, 405 .buf_queue = vpbe_buffer_queue,
323 .buf_release = vpbe_buffer_release,
324}; 406};
325 407
326static 408static
@@ -345,7 +427,7 @@ static int vpbe_set_osd_display_params(struct vpbe_display *disp_dev,
345 unsigned long addr; 427 unsigned long addr;
346 int ret; 428 int ret;
347 429
348 addr = videobuf_to_dma_contig(layer->cur_frm); 430 addr = vb2_dma_contig_plane_dma_addr(&layer->cur_frm->vb, 0);
349 /* Set address in the display registers */ 431 /* Set address in the display registers */
350 osd_device->ops.start_layer(osd_device, 432 osd_device->ops.start_layer(osd_device,
351 layer->layer_info.id, 433 layer->layer_info.id,
@@ -620,9 +702,12 @@ static int vpbe_display_querycap(struct file *file, void *priv,
620 struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; 702 struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev;
621 703
622 cap->version = VPBE_DISPLAY_VERSION_CODE; 704 cap->version = VPBE_DISPLAY_VERSION_CODE;
623 cap->capabilities = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING; 705 cap->device_caps = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING;
624 strlcpy(cap->driver, VPBE_DISPLAY_DRIVER, sizeof(cap->driver)); 706 cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
625 strlcpy(cap->bus_info, "platform", sizeof(cap->bus_info)); 707 snprintf(cap->driver, sizeof(cap->driver), "%s",
708 dev_name(vpbe_dev->pdev));
709 snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s",
710 dev_name(vpbe_dev->pdev));
626 strlcpy(cap->card, vpbe_dev->cfg->module_name, sizeof(cap->card)); 711 strlcpy(cap->card, vpbe_dev->cfg->module_name, sizeof(cap->card));
627 712
628 return 0; 713 return 0;
@@ -1161,7 +1246,7 @@ static int vpbe_display_streamoff(struct file *file, void *priv,
1161 osd_device->ops.disable_layer(osd_device, 1246 osd_device->ops.disable_layer(osd_device,
1162 layer->layer_info.id); 1247 layer->layer_info.id);
1163 layer->started = 0; 1248 layer->started = 0;
1164 ret = videobuf_streamoff(&layer->buffer_queue); 1249 ret = vb2_streamoff(&layer->buffer_queue, buf_type);
1165 1250
1166 return ret; 1251 return ret;
1167} 1252}
@@ -1199,46 +1284,15 @@ static int vpbe_display_streamon(struct file *file, void *priv,
1199 } 1284 }
1200 1285
1201 /* 1286 /*
1202 * Call videobuf_streamon to start streaming 1287 * Call vb2_streamon to start streaming
1203 * in videobuf 1288 * in videobuf
1204 */ 1289 */
1205 ret = videobuf_streamon(&layer->buffer_queue); 1290 ret = vb2_streamon(&layer->buffer_queue, buf_type);
1206 if (ret) { 1291 if (ret) {
1207 v4l2_err(&vpbe_dev->v4l2_dev, 1292 v4l2_err(&vpbe_dev->v4l2_dev,
1208 "error in videobuf_streamon\n"); 1293 "error in vb2_streamon\n");
1209 return ret; 1294 return ret;
1210 } 1295 }
1211 /* If buffer queue is empty, return error */
1212 if (list_empty(&layer->dma_queue)) {
1213 v4l2_err(&vpbe_dev->v4l2_dev, "buffer queue is empty\n");
1214 goto streamoff;
1215 }
1216 /* Get the next frame from the buffer queue */
1217 layer->next_frm = layer->cur_frm = list_entry(layer->dma_queue.next,
1218 struct videobuf_buffer, queue);
1219 /* Remove buffer from the buffer queue */
1220 list_del(&layer->cur_frm->queue);
1221 /* Mark state of the current frame to active */
1222 layer->cur_frm->state = VIDEOBUF_ACTIVE;
1223 /* Initialize field_id and started member */
1224 layer->field_id = 0;
1225
1226 /* Set parameters in OSD and VENC */
1227 ret = vpbe_set_osd_display_params(disp_dev, layer);
1228 if (ret < 0)
1229 goto streamoff;
1230
1231 /*
1232 * if request format is yuv420 semiplanar, need to
1233 * enable both video windows
1234 */
1235 layer->started = 1;
1236
1237 layer->layer_first_int = 1;
1238
1239 return ret;
1240streamoff:
1241 ret = videobuf_streamoff(&layer->buffer_queue);
1242 return ret; 1296 return ret;
1243} 1297}
1244 1298
@@ -1265,10 +1319,10 @@ static int vpbe_display_dqbuf(struct file *file, void *priv,
1265 } 1319 }
1266 if (file->f_flags & O_NONBLOCK) 1320 if (file->f_flags & O_NONBLOCK)
1267 /* Call videobuf_dqbuf for non blocking mode */ 1321 /* Call videobuf_dqbuf for non blocking mode */
1268 ret = videobuf_dqbuf(&layer->buffer_queue, buf, 1); 1322 ret = vb2_dqbuf(&layer->buffer_queue, buf, 1);
1269 else 1323 else
1270 /* Call videobuf_dqbuf for blocking mode */ 1324 /* Call videobuf_dqbuf for blocking mode */
1271 ret = videobuf_dqbuf(&layer->buffer_queue, buf, 0); 1325 ret = vb2_dqbuf(&layer->buffer_queue, buf, 0);
1272 1326
1273 return ret; 1327 return ret;
1274} 1328}
@@ -1295,7 +1349,7 @@ static int vpbe_display_qbuf(struct file *file, void *priv,
1295 return -EACCES; 1349 return -EACCES;
1296 } 1350 }
1297 1351
1298 return videobuf_qbuf(&layer->buffer_queue, p); 1352 return vb2_qbuf(&layer->buffer_queue, p);
1299} 1353}
1300 1354
1301static int vpbe_display_querybuf(struct file *file, void *priv, 1355static int vpbe_display_querybuf(struct file *file, void *priv,
@@ -1304,7 +1358,6 @@ static int vpbe_display_querybuf(struct file *file, void *priv,
1304 struct vpbe_fh *fh = file->private_data; 1358 struct vpbe_fh *fh = file->private_data;
1305 struct vpbe_layer *layer = fh->layer; 1359 struct vpbe_layer *layer = fh->layer;
1306 struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; 1360 struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev;
1307 int ret;
1308 1361
1309 v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, 1362 v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev,
1310 "VIDIOC_QUERYBUF, layer id = %d\n", 1363 "VIDIOC_QUERYBUF, layer id = %d\n",
@@ -1314,11 +1367,8 @@ static int vpbe_display_querybuf(struct file *file, void *priv,
1314 v4l2_err(&vpbe_dev->v4l2_dev, "Invalid buffer type\n"); 1367 v4l2_err(&vpbe_dev->v4l2_dev, "Invalid buffer type\n");
1315 return -EINVAL; 1368 return -EINVAL;
1316 } 1369 }
1317 1370 /* Call vb2_querybuf to get information */
1318 /* Call videobuf_querybuf to get information */ 1371 return vb2_querybuf(&layer->buffer_queue, buf);
1319 ret = videobuf_querybuf(&layer->buffer_queue, buf);
1320
1321 return ret;
1322} 1372}
1323 1373
1324static int vpbe_display_reqbufs(struct file *file, void *priv, 1374static int vpbe_display_reqbufs(struct file *file, void *priv,
@@ -1327,8 +1377,8 @@ static int vpbe_display_reqbufs(struct file *file, void *priv,
1327 struct vpbe_fh *fh = file->private_data; 1377 struct vpbe_fh *fh = file->private_data;
1328 struct vpbe_layer *layer = fh->layer; 1378 struct vpbe_layer *layer = fh->layer;
1329 struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; 1379 struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev;
1380 struct vb2_queue *q;
1330 int ret; 1381 int ret;
1331
1332 v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, "vpbe_display_reqbufs\n"); 1382 v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, "vpbe_display_reqbufs\n");
1333 1383
1334 if (V4L2_BUF_TYPE_VIDEO_OUTPUT != req_buf->type) { 1384 if (V4L2_BUF_TYPE_VIDEO_OUTPUT != req_buf->type) {
@@ -1342,15 +1392,26 @@ static int vpbe_display_reqbufs(struct file *file, void *priv,
1342 return -EBUSY; 1392 return -EBUSY;
1343 } 1393 }
1344 /* Initialize videobuf queue as per the buffer type */ 1394 /* Initialize videobuf queue as per the buffer type */
1345 videobuf_queue_dma_contig_init(&layer->buffer_queue, 1395 layer->alloc_ctx = vb2_dma_contig_init_ctx(vpbe_dev->pdev);
1346 &video_qops, 1396 if (!layer->alloc_ctx) {
1347 vpbe_dev->pdev, 1397 v4l2_err(&vpbe_dev->v4l2_dev, "Failed to get the context\n");
1348 &layer->irqlock, 1398 return -EINVAL;
1349 V4L2_BUF_TYPE_VIDEO_OUTPUT, 1399 }
1350 layer->pix_fmt.field, 1400 q = &layer->buffer_queue;
1351 sizeof(struct videobuf_buffer), 1401 memset(q, 0, sizeof(*q));
1352 fh, NULL); 1402 q->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
1403 q->io_modes = VB2_MMAP | VB2_USERPTR;
1404 q->drv_priv = fh;
1405 q->ops = &video_qops;
1406 q->mem_ops = &vb2_dma_contig_memops;
1407 q->buf_struct_size = sizeof(struct vpbe_disp_buffer);
1353 1408
1409 ret = vb2_queue_init(q);
1410 if (ret) {
1411 v4l2_err(&vpbe_dev->v4l2_dev, "vb2_queue_init() failed\n");
1412 vb2_dma_contig_cleanup_ctx(layer->alloc_ctx);
1413 return ret;
1414 }
1354 /* Set io allowed member of file handle to TRUE */ 1415 /* Set io allowed member of file handle to TRUE */
1355 fh->io_allowed = 1; 1416 fh->io_allowed = 1;
1356 /* Increment io usrs member of layer object to 1 */ 1417 /* Increment io usrs member of layer object to 1 */
@@ -1360,9 +1421,7 @@ static int vpbe_display_reqbufs(struct file *file, void *priv,
1360 /* Initialize buffer queue */ 1421 /* Initialize buffer queue */
1361 INIT_LIST_HEAD(&layer->dma_queue); 1422 INIT_LIST_HEAD(&layer->dma_queue);
1362 /* Allocate buffers */ 1423 /* Allocate buffers */
1363 ret = videobuf_reqbufs(&layer->buffer_queue, req_buf); 1424 return vb2_reqbufs(q, req_buf);
1364
1365 return ret;
1366} 1425}
1367 1426
1368/* 1427/*
@@ -1381,7 +1440,7 @@ static int vpbe_display_mmap(struct file *filep, struct vm_area_struct *vma)
1381 1440
1382 if (mutex_lock_interruptible(&layer->opslock)) 1441 if (mutex_lock_interruptible(&layer->opslock))
1383 return -ERESTARTSYS; 1442 return -ERESTARTSYS;
1384 ret = videobuf_mmap_mapper(&layer->buffer_queue, vma); 1443 ret = vb2_mmap(&layer->buffer_queue, vma);
1385 mutex_unlock(&layer->opslock); 1444 mutex_unlock(&layer->opslock);
1386 return ret; 1445 return ret;
1387} 1446}
@@ -1398,7 +1457,7 @@ static unsigned int vpbe_display_poll(struct file *filep, poll_table *wait)
1398 v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, "vpbe_display_poll\n"); 1457 v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, "vpbe_display_poll\n");
1399 if (layer->started) { 1458 if (layer->started) {
1400 mutex_lock(&layer->opslock); 1459 mutex_lock(&layer->opslock);
1401 err = videobuf_poll_stream(filep, &layer->buffer_queue, wait); 1460 err = vb2_poll(&layer->buffer_queue, filep, wait);
1402 mutex_unlock(&layer->opslock); 1461 mutex_unlock(&layer->opslock);
1403 } 1462 }
1404 return err; 1463 return err;
@@ -1488,8 +1547,8 @@ static int vpbe_display_release(struct file *file)
1488 layer->layer_info.id); 1547 layer->layer_info.id);
1489 layer->started = 0; 1548 layer->started = 0;
1490 /* Free buffers allocated */ 1549 /* Free buffers allocated */
1491 videobuf_queue_cancel(&layer->buffer_queue); 1550 vb2_queue_release(&layer->buffer_queue);
1492 videobuf_mmap_free(&layer->buffer_queue); 1551 vb2_dma_contig_cleanup_ctx(&layer->buffer_queue);
1493 } 1552 }
1494 1553
1495 /* Decrement layer usrs counter */ 1554 /* Decrement layer usrs counter */