Merge tag 'v3.14.25' into backport/v3.14.24-ltsi-rc1+v3.14.25/snapshot-merge.wip
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / staging / media / davinci_vpfe / vpfe_video.c
1 /*
2  * Copyright (C) 2012 Texas Instruments Inc
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation version 2.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16  *
17  * Contributors:
18  *      Manjunath Hadli <manjunath.hadli@ti.com>
19  *      Prabhakar Lad <prabhakar.lad@ti.com>
20  */
21
22 #include <linux/module.h>
23 #include <linux/slab.h>
24
25 #include <media/v4l2-ioctl.h>
26
27 #include "vpfe.h"
28 #include "vpfe_mc_capture.h"
29
30 /* minimum number of buffers needed in cont-mode */
31 #define MIN_NUM_BUFFERS                 3
32
33 static int debug;
34
35 /* get v4l2 subdev pointer to external subdev which is active */
36 static struct media_entity *vpfe_get_input_entity
37                         (struct vpfe_video_device *video)
38 {
39         struct vpfe_device *vpfe_dev = video->vpfe_dev;
40         struct media_pad *remote;
41
42         remote = media_entity_remote_pad(&vpfe_dev->vpfe_isif.pads[0]);
43         if (remote == NULL) {
44                 pr_err("Invalid media connection to isif/ccdc\n");
45                 return NULL;
46         }
47         return remote->entity;
48 }
49
50 /* updates external subdev(sensor/decoder) which is active */
51 static int vpfe_update_current_ext_subdev(struct vpfe_video_device *video)
52 {
53         struct vpfe_device *vpfe_dev = video->vpfe_dev;
54         struct vpfe_config *vpfe_cfg;
55         struct v4l2_subdev *subdev;
56         struct media_pad *remote;
57         int i;
58
59         remote = media_entity_remote_pad(&vpfe_dev->vpfe_isif.pads[0]);
60         if (remote == NULL) {
61                 pr_err("Invalid media connection to isif/ccdc\n");
62                 return -EINVAL;
63         }
64
65         subdev = media_entity_to_v4l2_subdev(remote->entity);
66         vpfe_cfg = vpfe_dev->pdev->platform_data;
67         for (i = 0; i < vpfe_cfg->num_subdevs; i++) {
68                 if (!strcmp(vpfe_cfg->sub_devs[i].module_name, subdev->name)) {
69                         video->current_ext_subdev = &vpfe_cfg->sub_devs[i];
70                         break;
71                 }
72         }
73
74         /* if user not linked decoder/sensor to isif/ccdc */
75         if (i == vpfe_cfg->num_subdevs) {
76                 pr_err("Invalid media chain connection to isif/ccdc\n");
77                 return -EINVAL;
78         }
79         /* find the v4l2 subdev pointer */
80         for (i = 0; i < vpfe_dev->num_ext_subdevs; i++) {
81                 if (!strcmp(video->current_ext_subdev->module_name,
82                         vpfe_dev->sd[i]->name))
83                         video->current_ext_subdev->subdev = vpfe_dev->sd[i];
84         }
85         return 0;
86 }
87
88 /* get the subdev which is connected to the output video node */
89 static struct v4l2_subdev *
90 vpfe_video_remote_subdev(struct vpfe_video_device *video, u32 *pad)
91 {
92         struct media_pad *remote = media_entity_remote_pad(&video->pad);
93
94         if (remote == NULL || remote->entity->type != MEDIA_ENT_T_V4L2_SUBDEV)
95                 return NULL;
96         if (pad)
97                 *pad = remote->index;
98         return media_entity_to_v4l2_subdev(remote->entity);
99 }
100
101 /* get the format set at output pad of the adjacent subdev */
102 static int
103 __vpfe_video_get_format(struct vpfe_video_device *video,
104                         struct v4l2_format *format)
105 {
106         struct v4l2_subdev_format fmt;
107         struct v4l2_subdev *subdev;
108         struct media_pad *remote;
109         u32 pad;
110         int ret;
111
112         subdev = vpfe_video_remote_subdev(video, &pad);
113         if (subdev == NULL)
114                 return -EINVAL;
115
116         fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
117         remote = media_entity_remote_pad(&video->pad);
118         fmt.pad = remote->index;
119
120         ret = v4l2_subdev_call(subdev, pad, get_fmt, NULL, &fmt);
121         if (ret == -ENOIOCTLCMD)
122                 return -EINVAL;
123
124         format->type = video->type;
125         /* convert mbus_format to v4l2_format */
126         v4l2_fill_pix_format(&format->fmt.pix, &fmt.format);
127         mbus_to_pix(&fmt.format, &format->fmt.pix);
128
129         return 0;
130 }
131
132 /* make a note of pipeline details */
133 static void vpfe_prepare_pipeline(struct vpfe_video_device *video)
134 {
135         struct media_entity *entity = &video->video_dev.entity;
136         struct media_device *mdev = entity->parent;
137         struct vpfe_pipeline *pipe = &video->pipe;
138         struct vpfe_video_device *far_end = NULL;
139         struct media_entity_graph graph;
140
141         pipe->input_num = 0;
142         pipe->output_num = 0;
143
144         if (video->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
145                 pipe->inputs[pipe->input_num++] = video;
146         else
147                 pipe->outputs[pipe->output_num++] = video;
148
149         mutex_lock(&mdev->graph_mutex);
150         media_entity_graph_walk_start(&graph, entity);
151         while ((entity = media_entity_graph_walk_next(&graph))) {
152                 if (entity == &video->video_dev.entity)
153                         continue;
154                 if (media_entity_type(entity) != MEDIA_ENT_T_DEVNODE)
155                         continue;
156                 far_end = to_vpfe_video(media_entity_to_video_device(entity));
157                 if (far_end->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
158                         pipe->inputs[pipe->input_num++] = far_end;
159                 else
160                         pipe->outputs[pipe->output_num++] = far_end;
161         }
162         mutex_unlock(&mdev->graph_mutex);
163 }
164
165 /* update pipe state selected by user */
166 static int vpfe_update_pipe_state(struct vpfe_video_device *video)
167 {
168         struct vpfe_pipeline *pipe = &video->pipe;
169         int ret;
170
171         vpfe_prepare_pipeline(video);
172
173         /* Find out if there is any input video
174           if yes, it is single shot.
175         */
176         if (pipe->input_num == 0) {
177                 pipe->state = VPFE_PIPELINE_STREAM_CONTINUOUS;
178                 ret = vpfe_update_current_ext_subdev(video);
179                 if (ret) {
180                         pr_err("Invalid external subdev\n");
181                         return ret;
182                 }
183         } else {
184                 pipe->state = VPFE_PIPELINE_STREAM_SINGLESHOT;
185         }
186         video->initialized = 1;
187         video->skip_frame_count = 1;
188         video->skip_frame_count_init = 1;
189         return 0;
190 }
191
192 /* checks wether pipeline is ready for enabling */
193 int vpfe_video_is_pipe_ready(struct vpfe_pipeline *pipe)
194 {
195         int i;
196
197         for (i = 0; i < pipe->input_num; i++)
198                 if (!pipe->inputs[i]->started ||
199                         pipe->inputs[i]->state != VPFE_VIDEO_BUFFER_QUEUED)
200                         return 0;
201         for (i = 0; i < pipe->output_num; i++)
202                 if (!pipe->outputs[i]->started ||
203                         pipe->outputs[i]->state != VPFE_VIDEO_BUFFER_QUEUED)
204                         return 0;
205         return 1;
206 }
207
208 /**
209  * Validate a pipeline by checking both ends of all links for format
210  * discrepancies.
211  *
212  * Return 0 if all formats match, or -EPIPE if at least one link is found with
213  * different formats on its two ends.
214  */
215 static int vpfe_video_validate_pipeline(struct vpfe_pipeline *pipe)
216 {
217         struct v4l2_subdev_format fmt_source;
218         struct v4l2_subdev_format fmt_sink;
219         struct v4l2_subdev *subdev;
220         struct media_pad *pad;
221         int ret;
222
223         /*
224          * Should not matter if it is output[0] or 1 as
225          * the general ideas is to traverse backwards and
226          * the fact that the out video node always has the
227          * format of the connected pad.
228          */
229         subdev = vpfe_video_remote_subdev(pipe->outputs[0], NULL);
230         if (subdev == NULL)
231                 return -EPIPE;
232
233         while (1) {
234                 /* Retrieve the sink format */
235                 pad = &subdev->entity.pads[0];
236                 if (!(pad->flags & MEDIA_PAD_FL_SINK))
237                         break;
238
239                 fmt_sink.which = V4L2_SUBDEV_FORMAT_ACTIVE;
240                 fmt_sink.pad = pad->index;
241                 ret = v4l2_subdev_call(subdev, pad, get_fmt, NULL,
242                                        &fmt_sink);
243
244                 if (ret < 0 && ret != -ENOIOCTLCMD)
245                         return -EPIPE;
246
247                 /* Retrieve the source format */
248                 pad = media_entity_remote_pad(pad);
249                 if (pad == NULL ||
250                         pad->entity->type != MEDIA_ENT_T_V4L2_SUBDEV)
251                         break;
252
253                 subdev = media_entity_to_v4l2_subdev(pad->entity);
254
255                 fmt_source.which = V4L2_SUBDEV_FORMAT_ACTIVE;
256                 fmt_source.pad = pad->index;
257                 ret = v4l2_subdev_call(subdev, pad, get_fmt, NULL, &fmt_source);
258                 if (ret < 0 && ret != -ENOIOCTLCMD)
259                         return -EPIPE;
260
261                 /* Check if the two ends match */
262                 if (fmt_source.format.code != fmt_sink.format.code ||
263                     fmt_source.format.width != fmt_sink.format.width ||
264                     fmt_source.format.height != fmt_sink.format.height)
265                         return -EPIPE;
266         }
267         return 0;
268 }
269
270 /*
271  * vpfe_pipeline_enable() - Enable streaming on a pipeline
272  * @vpfe_dev: vpfe device
273  * @pipe: vpfe pipeline
274  *
275  * Walk the entities chain starting at the pipeline output video node and start
276  * all modules in the chain in the given mode.
277  *
278  * Return 0 if successful, or the return value of the failed video::s_stream
279  * operation otherwise.
280  */
281 static int vpfe_pipeline_enable(struct vpfe_pipeline *pipe)
282 {
283         struct media_entity_graph graph;
284         struct media_entity *entity;
285         struct v4l2_subdev *subdev;
286         struct media_device *mdev;
287         int ret = 0;
288
289         if (pipe->state == VPFE_PIPELINE_STREAM_CONTINUOUS)
290                 entity = vpfe_get_input_entity(pipe->outputs[0]);
291         else
292                 entity = &pipe->inputs[0]->video_dev.entity;
293
294         mdev = entity->parent;
295         mutex_lock(&mdev->graph_mutex);
296         media_entity_graph_walk_start(&graph, entity);
297         while ((entity = media_entity_graph_walk_next(&graph))) {
298
299                 if (media_entity_type(entity) == MEDIA_ENT_T_DEVNODE)
300                         continue;
301                 subdev = media_entity_to_v4l2_subdev(entity);
302                 ret = v4l2_subdev_call(subdev, video, s_stream, 1);
303                 if (ret < 0 && ret != -ENOIOCTLCMD)
304                         break;
305         }
306         mutex_unlock(&mdev->graph_mutex);
307         return ret;
308 }
309
310 /*
311  * vpfe_pipeline_disable() - Disable streaming on a pipeline
312  * @vpfe_dev: vpfe device
313  * @pipe: VPFE pipeline
314  *
315  * Walk the entities chain starting at the pipeline output video node and stop
316  * all modules in the chain.
317  *
318  * Return 0 if all modules have been properly stopped, or -ETIMEDOUT if a module
319  * can't be stopped.
320  */
321 static int vpfe_pipeline_disable(struct vpfe_pipeline *pipe)
322 {
323         struct media_entity_graph graph;
324         struct media_entity *entity;
325         struct v4l2_subdev *subdev;
326         struct media_device *mdev;
327         int ret = 0;
328
329         if (pipe->state == VPFE_PIPELINE_STREAM_CONTINUOUS)
330                 entity = vpfe_get_input_entity(pipe->outputs[0]);
331         else
332                 entity = &pipe->inputs[0]->video_dev.entity;
333
334         mdev = entity->parent;
335         mutex_lock(&mdev->graph_mutex);
336         media_entity_graph_walk_start(&graph, entity);
337
338         while ((entity = media_entity_graph_walk_next(&graph))) {
339
340                 if (media_entity_type(entity) == MEDIA_ENT_T_DEVNODE)
341                         continue;
342                 subdev = media_entity_to_v4l2_subdev(entity);
343                 ret = v4l2_subdev_call(subdev, video, s_stream, 0);
344                 if (ret < 0 && ret != -ENOIOCTLCMD)
345                         break;
346         }
347         mutex_unlock(&mdev->graph_mutex);
348
349         return ret ? -ETIMEDOUT : 0;
350 }
351
352 /*
353  * vpfe_pipeline_set_stream() - Enable/disable streaming on a pipeline
354  * @vpfe_dev: VPFE device
355  * @pipe: VPFE pipeline
356  * @state: Stream state (stopped or active)
357  *
358  * Set the pipeline to the given stream state.
359  *
360  * Return 0 if successful, or the return value of the failed video::s_stream
361  * operation otherwise.
362  */
363 static int vpfe_pipeline_set_stream(struct vpfe_pipeline *pipe,
364                             enum vpfe_pipeline_stream_state state)
365 {
366         if (state == VPFE_PIPELINE_STREAM_STOPPED)
367                 return vpfe_pipeline_disable(pipe);
368
369         return vpfe_pipeline_enable(pipe);
370 }
371
372 static int all_videos_stopped(struct vpfe_video_device *video)
373 {
374         struct vpfe_pipeline *pipe = &video->pipe;
375         int i;
376
377         for (i = 0; i < pipe->input_num; i++)
378                 if (pipe->inputs[i]->started)
379                         return 0;
380         for (i = 0; i < pipe->output_num; i++)
381                 if (pipe->outputs[i]->started)
382                         return 0;
383         return 1;
384 }
385
386 /*
387  * vpfe_open() - open video device
388  * @file: file pointer
389  *
390  * initialize media pipeline state, allocate memory for file handle
391  *
392  * Return 0 if successful, or the return -ENODEV otherwise.
393  */
394 static int vpfe_open(struct file *file)
395 {
396         struct vpfe_video_device *video = video_drvdata(file);
397         struct vpfe_fh *handle;
398
399         /* Allocate memory for the file handle object */
400         handle = kzalloc(sizeof(struct vpfe_fh), GFP_KERNEL);
401
402         if (handle == NULL)
403                 return -ENOMEM;
404
405         v4l2_fh_init(&handle->vfh, &video->video_dev);
406         v4l2_fh_add(&handle->vfh);
407
408         mutex_lock(&video->lock);
409         /* If decoder is not initialized. initialize it */
410         if (!video->initialized && vpfe_update_pipe_state(video)) {
411                 mutex_unlock(&video->lock);
412                 return -ENODEV;
413         }
414         /* Increment device users counter */
415         video->usrs++;
416         /* Set io_allowed member to false */
417         handle->io_allowed = 0;
418         v4l2_prio_open(&video->prio, &handle->prio);
419         handle->video = video;
420         file->private_data = &handle->vfh;
421         mutex_unlock(&video->lock);
422
423         return 0;
424 }
425
426 /* get the next buffer available from dma queue */
427 static unsigned long
428 vpfe_video_get_next_buffer(struct vpfe_video_device *video)
429 {
430         video->cur_frm = video->next_frm =
431                 list_entry(video->dma_queue.next,
432                            struct vpfe_cap_buffer, list);
433
434         list_del(&video->next_frm->list);
435         video->next_frm->vb.state = VB2_BUF_STATE_ACTIVE;
436         return vb2_dma_contig_plane_dma_addr(&video->next_frm->vb, 0);
437 }
438
439 /* schedule the next buffer which is available on dma queue */
440 void vpfe_video_schedule_next_buffer(struct vpfe_video_device *video)
441 {
442         struct vpfe_device *vpfe_dev = video->vpfe_dev;
443         unsigned long addr;
444
445         if (list_empty(&video->dma_queue))
446                 return;
447
448         video->next_frm = list_entry(video->dma_queue.next,
449                                         struct vpfe_cap_buffer, list);
450
451         if (VPFE_PIPELINE_STREAM_SINGLESHOT == video->pipe.state)
452                 video->cur_frm = video->next_frm;
453
454         list_del(&video->next_frm->list);
455         video->next_frm->vb.state = VB2_BUF_STATE_ACTIVE;
456         addr = vb2_dma_contig_plane_dma_addr(&video->next_frm->vb, 0);
457         video->ops->queue(vpfe_dev, addr);
458         video->state = VPFE_VIDEO_BUFFER_QUEUED;
459 }
460
461 /* schedule the buffer for capturing bottom field */
462 void vpfe_video_schedule_bottom_field(struct vpfe_video_device *video)
463 {
464         struct vpfe_device *vpfe_dev = video->vpfe_dev;
465         unsigned long addr;
466
467         addr = vb2_dma_contig_plane_dma_addr(&video->cur_frm->vb, 0);
468         addr += video->field_off;
469         video->ops->queue(vpfe_dev, addr);
470 }
471
472 /* make buffer available for dequeue */
473 void vpfe_video_process_buffer_complete(struct vpfe_video_device *video)
474 {
475         struct vpfe_pipeline *pipe = &video->pipe;
476
477         do_gettimeofday(&video->cur_frm->vb.v4l2_buf.timestamp);
478         vb2_buffer_done(&video->cur_frm->vb, VB2_BUF_STATE_DONE);
479         if (pipe->state == VPFE_PIPELINE_STREAM_CONTINUOUS)
480                 video->cur_frm = video->next_frm;
481 }
482
483 /* vpfe_stop_capture() - stop streaming */
484 static void vpfe_stop_capture(struct vpfe_video_device *video)
485 {
486         struct vpfe_pipeline *pipe = &video->pipe;
487
488         video->started = 0;
489
490         if (video->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
491                 return;
492         if (all_videos_stopped(video))
493                 vpfe_pipeline_set_stream(pipe,
494                                          VPFE_PIPELINE_STREAM_STOPPED);
495 }
496
497 /*
498  * vpfe_release() - release video device
499  * @file: file pointer
500  *
501  * deletes buffer queue, frees the buffers and the vpfe file handle
502  *
503  * Return 0
504  */
505 static int vpfe_release(struct file *file)
506 {
507         struct vpfe_video_device *video = video_drvdata(file);
508         struct v4l2_fh *vfh = file->private_data;
509         struct vpfe_device *vpfe_dev = video->vpfe_dev;
510         struct vpfe_fh *fh = container_of(vfh, struct vpfe_fh, vfh);
511
512         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_release\n");
513
514         /* Get the device lock */
515         mutex_lock(&video->lock);
516         /* if this instance is doing IO */
517         if (fh->io_allowed) {
518                 if (video->started) {
519                         vpfe_stop_capture(video);
520                         /* mark pipe state as stopped in vpfe_release(),
521                            as app might call streamon() after streamoff()
522                            in which case driver has to start streaming.
523                         */
524                         video->pipe.state = VPFE_PIPELINE_STREAM_STOPPED;
525                         vb2_streamoff(&video->buffer_queue,
526                                       video->buffer_queue.type);
527                 }
528                 video->io_usrs = 0;
529                 /* Free buffers allocated */
530                 vb2_queue_release(&video->buffer_queue);
531                 vb2_dma_contig_cleanup_ctx(video->alloc_ctx);
532         }
533         /* Decrement device users counter */
534         video->usrs--;
535         /* Close the priority */
536         v4l2_prio_close(&video->prio, fh->prio);
537         /* If this is the last file handle */
538         if (!video->usrs)
539                 video->initialized = 0;
540         mutex_unlock(&video->lock);
541         file->private_data = NULL;
542         /* Free memory allocated to file handle object */
543         v4l2_fh_del(vfh);
544         kzfree(fh);
545         return 0;
546 }
547
548 /*
549  * vpfe_mmap() - It is used to map kernel space buffers
550  * into user spaces
551  */
552 static int vpfe_mmap(struct file *file, struct vm_area_struct *vma)
553 {
554         struct vpfe_video_device *video = video_drvdata(file);
555         struct vpfe_device *vpfe_dev = video->vpfe_dev;
556
557         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_mmap\n");
558         return vb2_mmap(&video->buffer_queue, vma);
559 }
560
561 /*
562  * vpfe_poll() - It is used for select/poll system call
563  */
564 static unsigned int vpfe_poll(struct file *file, poll_table *wait)
565 {
566         struct vpfe_video_device *video = video_drvdata(file);
567         struct vpfe_device *vpfe_dev = video->vpfe_dev;
568
569         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_poll\n");
570         if (video->started)
571                 return vb2_poll(&video->buffer_queue, file, wait);
572         return 0;
573 }
574
575 /* vpfe capture driver file operations */
576 static const struct v4l2_file_operations vpfe_fops = {
577         .owner = THIS_MODULE,
578         .open = vpfe_open,
579         .release = vpfe_release,
580         .unlocked_ioctl = video_ioctl2,
581         .mmap = vpfe_mmap,
582         .poll = vpfe_poll
583 };
584
585 /*
586  * vpfe_querycap() - query capabilities of video device
587  * @file: file pointer
588  * @priv: void pointer
589  * @cap: pointer to v4l2_capability structure
590  *
591  * fills v4l2 capabilities structure
592  *
593  * Return 0
594  */
595 static int vpfe_querycap(struct file *file, void  *priv,
596                                struct v4l2_capability *cap)
597 {
598         struct vpfe_video_device *video = video_drvdata(file);
599         struct vpfe_device *vpfe_dev = video->vpfe_dev;
600
601         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_querycap\n");
602
603         if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
604                 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
605         else
606                 cap->capabilities = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING;
607         cap->device_caps = cap->capabilities;
608         cap->version = VPFE_CAPTURE_VERSION_CODE;
609         strlcpy(cap->driver, CAPTURE_DRV_NAME, sizeof(cap->driver));
610         strlcpy(cap->bus_info, "VPFE", sizeof(cap->bus_info));
611         strlcpy(cap->card, vpfe_dev->cfg->card_name, sizeof(cap->card));
612
613         return 0;
614 }
615
616 /*
617  * vpfe_g_fmt() - get the format which is active on video device
618  * @file: file pointer
619  * @priv: void pointer
620  * @fmt: pointer to v4l2_format structure
621  *
622  * fills v4l2 format structure with active format
623  *
624  * Return 0
625  */
626 static int vpfe_g_fmt(struct file *file, void *priv,
627                                 struct v4l2_format *fmt)
628 {
629         struct vpfe_video_device *video = video_drvdata(file);
630         struct vpfe_device *vpfe_dev = video->vpfe_dev;
631
632         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_g_fmt\n");
633         /* Fill in the information about format */
634         *fmt = video->fmt;
635         return 0;
636 }
637
638 /*
639  * vpfe_enum_fmt() - enum formats supported on media chain
640  * @file: file pointer
641  * @priv: void pointer
642  * @fmt: pointer to v4l2_fmtdesc structure
643  *
644  * fills v4l2_fmtdesc structure with output format set on adjacent subdev,
645  * only one format is enumearted as subdevs are already configured
646  *
647  * Return 0 if successful, error code otherwise
648  */
649 static int vpfe_enum_fmt(struct file *file, void  *priv,
650                                    struct v4l2_fmtdesc *fmt)
651 {
652         struct vpfe_video_device *video = video_drvdata(file);
653         struct vpfe_device *vpfe_dev = video->vpfe_dev;
654         struct v4l2_subdev_format sd_fmt;
655         struct v4l2_mbus_framefmt mbus;
656         struct v4l2_subdev *subdev;
657         struct v4l2_format format;
658         struct media_pad *remote;
659         int ret;
660
661         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_enum_fmt\n");
662
663         /* since already subdev pad format is set,
664         only one pixel format is available */
665         if (fmt->index > 0) {
666                 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid index\n");
667                 return -EINVAL;
668         }
669         /* get the remote pad */
670         remote = media_entity_remote_pad(&video->pad);
671         if (remote == NULL) {
672                 v4l2_err(&vpfe_dev->v4l2_dev,
673                          "invalid remote pad for video node\n");
674                 return -EINVAL;
675         }
676         /* get the remote subdev */
677         subdev = vpfe_video_remote_subdev(video, NULL);
678         if (subdev == NULL) {
679                 v4l2_err(&vpfe_dev->v4l2_dev,
680                          "invalid remote subdev for video node\n");
681                 return -EINVAL;
682         }
683         sd_fmt.pad = remote->index;
684         sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
685         /* get output format of remote subdev */
686         ret = v4l2_subdev_call(subdev, pad, get_fmt, NULL, &sd_fmt);
687         if (ret) {
688                 v4l2_err(&vpfe_dev->v4l2_dev,
689                          "invalid remote subdev for video node\n");
690                 return ret;
691         }
692         /* convert to pix format */
693         mbus.code = sd_fmt.format.code;
694         mbus_to_pix(&mbus, &format.fmt.pix);
695         /* copy the result */
696         fmt->pixelformat = format.fmt.pix.pixelformat;
697
698         return 0;
699 }
700
701 /*
702  * vpfe_s_fmt() - set the format on video device
703  * @file: file pointer
704  * @priv: void pointer
705  * @fmt: pointer to v4l2_format structure
706  *
707  * validate and set the format on video device
708  *
709  * Return 0 on success, error code otherwise
710  */
711 static int vpfe_s_fmt(struct file *file, void *priv,
712                                 struct v4l2_format *fmt)
713 {
714         struct vpfe_video_device *video = video_drvdata(file);
715         struct vpfe_device *vpfe_dev = video->vpfe_dev;
716         struct v4l2_format format;
717         int ret;
718
719         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_fmt\n");
720         /* If streaming is started, return error */
721         if (video->started) {
722                 v4l2_err(&vpfe_dev->v4l2_dev, "Streaming is started\n");
723                 return -EBUSY;
724         }
725         /* get adjacent subdev's output pad format */
726         ret = __vpfe_video_get_format(video, &format);
727         if (ret)
728                 return ret;
729         *fmt = format;
730         video->fmt = *fmt;
731         return 0;
732 }
733
734 /*
735  * vpfe_try_fmt() - try the format on video device
736  * @file: file pointer
737  * @priv: void pointer
738  * @fmt: pointer to v4l2_format structure
739  *
740  * validate the format, update with correct format
741  * based on output format set on adjacent subdev
742  *
743  * Return 0 on success, error code otherwise
744  */
745 static int vpfe_try_fmt(struct file *file, void *priv,
746                                   struct v4l2_format *fmt)
747 {
748         struct vpfe_video_device *video = video_drvdata(file);
749         struct vpfe_device *vpfe_dev = video->vpfe_dev;
750         struct v4l2_format format;
751         int ret;
752
753         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_try_fmt\n");
754         /* get adjacent subdev's output pad format */
755         ret = __vpfe_video_get_format(video, &format);
756         if (ret)
757                 return ret;
758
759         *fmt = format;
760         return 0;
761 }
762
763 /*
764  * vpfe_enum_input() - enum inputs supported on media chain
765  * @file: file pointer
766  * @priv: void pointer
767  * @fmt: pointer to v4l2_fmtdesc structure
768  *
769  * fills v4l2_input structure with input available on media chain,
770  * only one input is enumearted as media chain is setup by this time
771  *
772  * Return 0 if successful, -EINVAL is media chain is invalid
773  */
774 static int vpfe_enum_input(struct file *file, void *priv,
775                                  struct v4l2_input *inp)
776 {
777         struct vpfe_video_device *video = video_drvdata(file);
778         struct vpfe_ext_subdev_info *sdinfo = video->current_ext_subdev;
779         struct vpfe_device *vpfe_dev = video->vpfe_dev;
780
781         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_enum_input\n");
782         /* enumerate from the subdev user has chosen through mc */
783         if (inp->index < sdinfo->num_inputs) {
784                 memcpy(inp, &sdinfo->inputs[inp->index],
785                        sizeof(struct v4l2_input));
786                 return 0;
787         }
788         return -EINVAL;
789 }
790
791 /*
792  * vpfe_g_input() - get index of the input which is active
793  * @file: file pointer
794  * @priv: void pointer
795  * @index: pointer to unsigned int
796  *
797  * set index with input index which is active
798  */
799 static int vpfe_g_input(struct file *file, void *priv, unsigned int *index)
800 {
801         struct vpfe_video_device *video = video_drvdata(file);
802         struct vpfe_device *vpfe_dev = video->vpfe_dev;
803
804         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_g_input\n");
805
806         *index = video->current_input;
807         return 0;
808 }
809
810 /*
811  * vpfe_s_input() - set input which is pointed by input index
812  * @file: file pointer
813  * @priv: void pointer
814  * @index: pointer to unsigned int
815  *
816  * set input on external subdev
817  *
818  * Return 0 on success, error code otherwise
819  */
820 static int vpfe_s_input(struct file *file, void *priv, unsigned int index)
821 {
822         struct vpfe_video_device *video = video_drvdata(file);
823         struct vpfe_device *vpfe_dev = video->vpfe_dev;
824         struct vpfe_ext_subdev_info *sdinfo;
825         struct vpfe_route *route;
826         struct v4l2_input *inps;
827         u32 output;
828         u32 input;
829         int ret;
830         int i;
831
832         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_input\n");
833
834         ret = mutex_lock_interruptible(&video->lock);
835         if (ret)
836                 return ret;
837         /*
838          * If streaming is started return device busy
839          * error
840          */
841         if (video->started) {
842                 v4l2_err(&vpfe_dev->v4l2_dev, "Streaming is on\n");
843                 ret = -EBUSY;
844                 goto unlock_out;
845         }
846
847         sdinfo = video->current_ext_subdev;
848         if (!sdinfo->registered) {
849                 ret = -EINVAL;
850                 goto unlock_out;
851         }
852         if (vpfe_dev->cfg->setup_input &&
853                 vpfe_dev->cfg->setup_input(sdinfo->grp_id) < 0) {
854                 ret = -EFAULT;
855                 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev,
856                           "couldn't setup input for %s\n",
857                           sdinfo->module_name);
858                 goto unlock_out;
859         }
860         route = &sdinfo->routes[index];
861         if (route && sdinfo->can_route) {
862                 input = route->input;
863                 output = route->output;
864                 ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev,
865                                                  sdinfo->grp_id, video,
866                                                  s_routing, input, output, 0);
867                 if (ret) {
868                         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev,
869                                 "s_input:error in setting input in decoder\n");
870                         ret = -EINVAL;
871                         goto unlock_out;
872                 }
873         }
874         /* set standards set by subdev in video device */
875         for (i = 0; i < sdinfo->num_inputs; i++) {
876                 inps = &sdinfo->inputs[i];
877                 video->video_dev.tvnorms |= inps->std;
878         }
879         video->current_input = index;
880 unlock_out:
881         mutex_unlock(&video->lock);
882         return ret;
883 }
884
885 /*
886  * vpfe_querystd() - query std which is being input on external subdev
887  * @file: file pointer
888  * @priv: void pointer
889  * @std_id: pointer to v4l2_std_id structure
890  *
891  * call external subdev through v4l2_device_call_until_err to
892  * get the std that is being active.
893  *
894  * Return 0 on success, error code otherwise
895  */
896 static int vpfe_querystd(struct file *file, void *priv, v4l2_std_id *std_id)
897 {
898         struct vpfe_video_device *video = video_drvdata(file);
899         struct vpfe_device *vpfe_dev = video->vpfe_dev;
900         struct vpfe_ext_subdev_info *sdinfo;
901         int ret;
902
903         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_querystd\n");
904
905         ret = mutex_lock_interruptible(&video->lock);
906         sdinfo = video->current_ext_subdev;
907         if (ret)
908                 return ret;
909         /* Call querystd function of decoder device */
910         ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, sdinfo->grp_id,
911                                          video, querystd, std_id);
912         mutex_unlock(&video->lock);
913         return ret;
914 }
915
916 /*
917  * vpfe_s_std() - set std on external subdev
918  * @file: file pointer
919  * @priv: void pointer
920  * @std_id: pointer to v4l2_std_id structure
921  *
922  * set std pointed by std_id on external subdev by calling it using
923  * v4l2_device_call_until_err
924  *
925  * Return 0 on success, error code otherwise
926  */
927 static int vpfe_s_std(struct file *file, void *priv, v4l2_std_id std_id)
928 {
929         struct vpfe_video_device *video = video_drvdata(file);
930         struct vpfe_device *vpfe_dev = video->vpfe_dev;
931         struct vpfe_ext_subdev_info *sdinfo;
932         int ret;
933
934         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_std\n");
935
936         /* Call decoder driver function to set the standard */
937         ret = mutex_lock_interruptible(&video->lock);
938         if (ret)
939                 return ret;
940         sdinfo = video->current_ext_subdev;
941         /* If streaming is started, return device busy error */
942         if (video->started) {
943                 v4l2_err(&vpfe_dev->v4l2_dev, "streaming is started\n");
944                 ret = -EBUSY;
945                 goto unlock_out;
946         }
947         ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, sdinfo->grp_id,
948                                          core, s_std, std_id);
949         if (ret < 0) {
950                 v4l2_err(&vpfe_dev->v4l2_dev, "Failed to set standard\n");
951                 video->stdid = V4L2_STD_UNKNOWN;
952                 goto unlock_out;
953         }
954         video->stdid = std_id;
955 unlock_out:
956         mutex_unlock(&video->lock);
957         return ret;
958 }
959
960 static int vpfe_g_std(struct file *file, void *priv, v4l2_std_id *tvnorm)
961 {
962         struct vpfe_video_device *video = video_drvdata(file);
963         struct vpfe_device *vpfe_dev = video->vpfe_dev;
964
965         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_g_std\n");
966         *tvnorm = video->stdid;
967         return 0;
968 }
969
970 /*
971  * vpfe_enum_dv_timings() - enumerate dv_timings which are supported by
972  *                      to external subdev
973  * @file: file pointer
974  * @priv: void pointer
975  * @timings: pointer to v4l2_enum_dv_timings structure
976  *
977  * enum dv_timings's which are supported by external subdev through
978  * v4l2_subdev_call
979  *
980  * Return 0 on success, error code otherwise
981  */
982 static int
983 vpfe_enum_dv_timings(struct file *file, void *fh,
984                   struct v4l2_enum_dv_timings *timings)
985 {
986         struct vpfe_video_device *video = video_drvdata(file);
987         struct vpfe_device *vpfe_dev = video->vpfe_dev;
988         struct v4l2_subdev *subdev = video->current_ext_subdev->subdev;
989
990         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_enum_dv_timings\n");
991         return v4l2_subdev_call(subdev, video, enum_dv_timings, timings);
992 }
993
994 /*
995  * vpfe_query_dv_timings() - query the dv_timings which is being input
996  *                      to external subdev
997  * @file: file pointer
998  * @priv: void pointer
999  * @timings: pointer to v4l2_dv_timings structure
1000  *
1001  * get dv_timings which is being input on external subdev through
1002  * v4l2_subdev_call
1003  *
1004  * Return 0 on success, error code otherwise
1005  */
1006 static int
1007 vpfe_query_dv_timings(struct file *file, void *fh,
1008                    struct v4l2_dv_timings *timings)
1009 {
1010         struct vpfe_video_device *video = video_drvdata(file);
1011         struct vpfe_device *vpfe_dev = video->vpfe_dev;
1012         struct v4l2_subdev *subdev = video->current_ext_subdev->subdev;
1013
1014         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_query_dv_timings\n");
1015         return v4l2_subdev_call(subdev, video, query_dv_timings, timings);
1016 }
1017
1018 /*
1019  * vpfe_s_dv_timings() - set dv_timings on external subdev
1020  * @file: file pointer
1021  * @priv: void pointer
1022  * @timings: pointer to v4l2_dv_timings structure
1023  *
1024  * set dv_timings pointed by timings on external subdev through
1025  * v4l2_device_call_until_err, this configures amplifier also
1026  *
1027  * Return 0 on success, error code otherwise
1028  */
1029 static int
1030 vpfe_s_dv_timings(struct file *file, void *fh,
1031                   struct v4l2_dv_timings *timings)
1032 {
1033         struct vpfe_video_device *video = video_drvdata(file);
1034         struct vpfe_device *vpfe_dev = video->vpfe_dev;
1035
1036         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_dv_timings\n");
1037
1038         video->stdid = V4L2_STD_UNKNOWN;
1039         return v4l2_device_call_until_err(&vpfe_dev->v4l2_dev,
1040                                           video->current_ext_subdev->grp_id,
1041                                           video, s_dv_timings, timings);
1042 }
1043
1044 /*
1045  * vpfe_g_dv_timings() - get dv_timings which is set on external subdev
1046  * @file: file pointer
1047  * @priv: void pointer
1048  * @timings: pointer to v4l2_dv_timings structure
1049  *
1050  * get dv_timings which is set on external subdev through
1051  * v4l2_subdev_call
1052  *
1053  * Return 0 on success, error code otherwise
1054  */
1055 static int
1056 vpfe_g_dv_timings(struct file *file, void *fh,
1057               struct v4l2_dv_timings *timings)
1058 {
1059         struct vpfe_video_device *video = video_drvdata(file);
1060         struct vpfe_device *vpfe_dev = video->vpfe_dev;
1061         struct v4l2_subdev *subdev = video->current_ext_subdev->subdev;
1062
1063         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_g_dv_timings\n");
1064         return v4l2_subdev_call(subdev, video, g_dv_timings, timings);
1065 }
1066
1067 /*
1068  *  Videobuf operations
1069  */
1070 /*
1071  * vpfe_buffer_queue_setup : Callback function for buffer setup.
1072  * @vq: vb2_queue ptr
1073  * @fmt: v4l2 format
1074  * @nbuffers: ptr to number of buffers requested by application
1075  * @nplanes:: contains number of distinct video planes needed to hold a frame
1076  * @sizes[]: contains the size (in bytes) of each plane.
1077  * @alloc_ctxs: ptr to allocation context
1078  *
1079  * This callback function is called when reqbuf() is called to adjust
1080  * the buffer nbuffers and buffer size
1081  */
1082 static int
1083 vpfe_buffer_queue_setup(struct vb2_queue *vq, const struct v4l2_format *fmt,
1084                         unsigned int *nbuffers, unsigned int *nplanes,
1085                         unsigned int sizes[], void *alloc_ctxs[])
1086 {
1087         struct vpfe_fh *fh = vb2_get_drv_priv(vq);
1088         struct vpfe_video_device *video = fh->video;
1089         struct vpfe_device *vpfe_dev = video->vpfe_dev;
1090         struct vpfe_pipeline *pipe = &video->pipe;
1091         unsigned long size;
1092
1093         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_buffer_queue_setup\n");
1094         size = video->fmt.fmt.pix.sizeimage;
1095
1096         if (vpfe_dev->video_limit) {
1097                 while (size * *nbuffers > vpfe_dev->video_limit)
1098                         (*nbuffers)--;
1099         }
1100         if (pipe->state == VPFE_PIPELINE_STREAM_CONTINUOUS) {
1101                 if (*nbuffers < MIN_NUM_BUFFERS)
1102                         *nbuffers = MIN_NUM_BUFFERS;
1103         }
1104         *nplanes = 1;
1105         sizes[0] = size;
1106         alloc_ctxs[0] = video->alloc_ctx;
1107         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev,
1108                  "nbuffers=%d, size=%lu\n", *nbuffers, size);
1109         return 0;
1110 }
1111
1112 /*
1113  * vpfe_buffer_prepare : callback function for buffer prepare
1114  * @vb: ptr to vb2_buffer
1115  *
1116  * This is the callback function for buffer prepare when vb2_qbuf()
1117  * function is called. The buffer is prepared and user space virtual address
1118  * or user address is converted into  physical address
1119  */
1120 static int vpfe_buffer_prepare(struct vb2_buffer *vb)
1121 {
1122         struct vpfe_fh *fh = vb2_get_drv_priv(vb->vb2_queue);
1123         struct vpfe_video_device *video = fh->video;
1124         struct vpfe_device *vpfe_dev = video->vpfe_dev;
1125         unsigned long addr;
1126
1127         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_buffer_prepare\n");
1128
1129         if (vb->state != VB2_BUF_STATE_ACTIVE &&
1130             vb->state != VB2_BUF_STATE_PREPARED)
1131                 return 0;
1132
1133         /* Initialize buffer */
1134         vb2_set_plane_payload(vb, 0, video->fmt.fmt.pix.sizeimage);
1135         if (vb2_plane_vaddr(vb, 0) &&
1136                 vb2_get_plane_payload(vb, 0) > vb2_plane_size(vb, 0))
1137                         return -EINVAL;
1138
1139         addr = vb2_dma_contig_plane_dma_addr(vb, 0);
1140         /* Make sure user addresses are aligned to 32 bytes */
1141         if (!ALIGN(addr, 32))
1142                 return -EINVAL;
1143
1144         return 0;
1145 }
1146
1147 static void vpfe_buffer_queue(struct vb2_buffer *vb)
1148 {
1149         /* Get the file handle object and device object */
1150         struct vpfe_fh *fh = vb2_get_drv_priv(vb->vb2_queue);
1151         struct vpfe_video_device *video = fh->video;
1152         struct vpfe_device *vpfe_dev = video->vpfe_dev;
1153         struct vpfe_pipeline *pipe = &video->pipe;
1154         struct vpfe_cap_buffer *buf = container_of(vb,
1155                                 struct vpfe_cap_buffer, vb);
1156         unsigned long flags;
1157         unsigned long empty;
1158         unsigned long addr;
1159
1160         spin_lock_irqsave(&video->dma_queue_lock, flags);
1161         empty = list_empty(&video->dma_queue);
1162         /* add the buffer to the DMA queue */
1163         list_add_tail(&buf->list, &video->dma_queue);
1164         spin_unlock_irqrestore(&video->dma_queue_lock, flags);
1165         /* this case happens in case of single shot */
1166         if (empty && video->started && pipe->state ==
1167                 VPFE_PIPELINE_STREAM_SINGLESHOT &&
1168                 video->state == VPFE_VIDEO_BUFFER_NOT_QUEUED) {
1169                 spin_lock(&video->dma_queue_lock);
1170                 addr = vpfe_video_get_next_buffer(video);
1171                 video->ops->queue(vpfe_dev, addr);
1172
1173                 video->state = VPFE_VIDEO_BUFFER_QUEUED;
1174                 spin_unlock(&video->dma_queue_lock);
1175
1176                 /* enable h/w each time in single shot */
1177                 if (vpfe_video_is_pipe_ready(pipe))
1178                         vpfe_pipeline_set_stream(pipe,
1179                                         VPFE_PIPELINE_STREAM_SINGLESHOT);
1180         }
1181 }
1182
1183 /* vpfe_start_capture() - start streaming on all the subdevs */
1184 static int vpfe_start_capture(struct vpfe_video_device *video)
1185 {
1186         struct vpfe_pipeline *pipe = &video->pipe;
1187         int ret = 0;
1188
1189         video->started = 1;
1190         if (vpfe_video_is_pipe_ready(pipe))
1191                 ret = vpfe_pipeline_set_stream(pipe, pipe->state);
1192
1193         return ret;
1194 }
1195
1196 static int vpfe_start_streaming(struct vb2_queue *vq, unsigned int count)
1197 {
1198         struct vpfe_fh *fh = vb2_get_drv_priv(vq);
1199         struct vpfe_video_device *video = fh->video;
1200         struct vpfe_device *vpfe_dev = video->vpfe_dev;
1201         unsigned long addr;
1202         int ret;
1203
1204         ret = mutex_lock_interruptible(&video->lock);
1205         if (ret)
1206                 goto streamoff;
1207
1208         /* Get the next frame from the buffer queue */
1209         video->cur_frm = video->next_frm =
1210                 list_entry(video->dma_queue.next, struct vpfe_cap_buffer, list);
1211         /* Remove buffer from the buffer queue */
1212         list_del(&video->cur_frm->list);
1213         /* Mark state of the current frame to active */
1214         video->cur_frm->vb.state = VB2_BUF_STATE_ACTIVE;
1215         /* Initialize field_id and started member */
1216         video->field_id = 0;
1217         addr = vb2_dma_contig_plane_dma_addr(&video->cur_frm->vb, 0);
1218         video->ops->queue(vpfe_dev, addr);
1219         video->state = VPFE_VIDEO_BUFFER_QUEUED;
1220
1221         ret = vpfe_start_capture(video);
1222         if (ret)
1223                 goto unlock_out;
1224
1225         mutex_unlock(&video->lock);
1226
1227         return ret;
1228 unlock_out:
1229         mutex_unlock(&video->lock);
1230 streamoff:
1231         ret = vb2_streamoff(&video->buffer_queue, video->buffer_queue.type);
1232         return 0;
1233 }
1234
1235 static int vpfe_buffer_init(struct vb2_buffer *vb)
1236 {
1237         struct vpfe_cap_buffer *buf = container_of(vb,
1238                                                    struct vpfe_cap_buffer, vb);
1239
1240         INIT_LIST_HEAD(&buf->list);
1241         return 0;
1242 }
1243
1244 /* abort streaming and wait for last buffer */
1245 static int vpfe_stop_streaming(struct vb2_queue *vq)
1246 {
1247         struct vpfe_fh *fh = vb2_get_drv_priv(vq);
1248         struct vpfe_video_device *video = fh->video;
1249
1250         if (!vb2_is_streaming(vq))
1251                 return 0;
1252         /* release all active buffers */
1253         while (!list_empty(&video->dma_queue)) {
1254                 video->next_frm = list_entry(video->dma_queue.next,
1255                                                 struct vpfe_cap_buffer, list);
1256                 list_del(&video->next_frm->list);
1257                 vb2_buffer_done(&video->next_frm->vb, VB2_BUF_STATE_ERROR);
1258         }
1259         return 0;
1260 }
1261
1262 static void vpfe_buf_cleanup(struct vb2_buffer *vb)
1263 {
1264         struct vpfe_fh *fh = vb2_get_drv_priv(vb->vb2_queue);
1265         struct vpfe_video_device *video = fh->video;
1266         struct vpfe_device *vpfe_dev = video->vpfe_dev;
1267         struct vpfe_cap_buffer *buf = container_of(vb,
1268                                         struct vpfe_cap_buffer, vb);
1269
1270         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_buf_cleanup\n");
1271         if (vb->state == VB2_BUF_STATE_ACTIVE)
1272                 list_del_init(&buf->list);
1273 }
1274
1275 static struct vb2_ops video_qops = {
1276         .queue_setup            = vpfe_buffer_queue_setup,
1277         .buf_init               = vpfe_buffer_init,
1278         .buf_prepare            = vpfe_buffer_prepare,
1279         .start_streaming        = vpfe_start_streaming,
1280         .stop_streaming         = vpfe_stop_streaming,
1281         .buf_cleanup            = vpfe_buf_cleanup,
1282         .buf_queue              = vpfe_buffer_queue,
1283 };
1284
1285 /*
1286  * vpfe_reqbufs() - supported REQBUF only once opening
1287  * the device.
1288  */
1289 static int vpfe_reqbufs(struct file *file, void *priv,
1290                         struct v4l2_requestbuffers *req_buf)
1291 {
1292         struct vpfe_video_device *video = video_drvdata(file);
1293         struct vpfe_device *vpfe_dev = video->vpfe_dev;
1294         struct vpfe_fh *fh = file->private_data;
1295         struct vb2_queue *q;
1296         int ret;
1297
1298         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_reqbufs\n");
1299
1300         if (V4L2_BUF_TYPE_VIDEO_CAPTURE != req_buf->type &&
1301             V4L2_BUF_TYPE_VIDEO_OUTPUT != req_buf->type) {
1302                 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buffer type\n");
1303                 return -EINVAL;
1304         }
1305
1306         ret = mutex_lock_interruptible(&video->lock);
1307         if (ret)
1308                 return ret;
1309
1310         if (video->io_usrs != 0) {
1311                 v4l2_err(&vpfe_dev->v4l2_dev, "Only one IO user allowed\n");
1312                 ret = -EBUSY;
1313                 goto unlock_out;
1314         }
1315         video->memory = req_buf->memory;
1316
1317         /* Initialize videobuf2 queue as per the buffer type */
1318         video->alloc_ctx = vb2_dma_contig_init_ctx(vpfe_dev->pdev);
1319         if (IS_ERR(video->alloc_ctx)) {
1320                 v4l2_err(&vpfe_dev->v4l2_dev, "Failed to get the context\n");
1321                 return PTR_ERR(video->alloc_ctx);
1322         }
1323
1324         q = &video->buffer_queue;
1325         q->type = req_buf->type;
1326         q->io_modes = VB2_MMAP | VB2_USERPTR;
1327         q->drv_priv = fh;
1328         q->min_buffers_needed = 1;
1329         q->ops = &video_qops;
1330         q->mem_ops = &vb2_dma_contig_memops;
1331         q->buf_struct_size = sizeof(struct vpfe_cap_buffer);
1332
1333         ret = vb2_queue_init(q);
1334         if (ret) {
1335                 v4l2_err(&vpfe_dev->v4l2_dev, "vb2_queue_init() failed\n");
1336                 vb2_dma_contig_cleanup_ctx(vpfe_dev->pdev);
1337                 return ret;
1338         }
1339
1340         fh->io_allowed = 1;
1341         video->io_usrs = 1;
1342         INIT_LIST_HEAD(&video->dma_queue);
1343         ret = vb2_reqbufs(&video->buffer_queue, req_buf);
1344
1345 unlock_out:
1346         mutex_unlock(&video->lock);
1347         return ret;
1348 }
1349
1350 /*
1351  * vpfe_querybuf() - query buffers for exchange
1352  */
1353 static int vpfe_querybuf(struct file *file, void *priv,
1354                          struct v4l2_buffer *buf)
1355 {
1356         struct vpfe_video_device *video = video_drvdata(file);
1357         struct vpfe_device *vpfe_dev = video->vpfe_dev;
1358
1359         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_querybuf\n");
1360
1361         if (V4L2_BUF_TYPE_VIDEO_CAPTURE != buf->type &&
1362             V4L2_BUF_TYPE_VIDEO_OUTPUT != buf->type) {
1363                 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n");
1364                 return  -EINVAL;
1365         }
1366
1367         if (video->memory != V4L2_MEMORY_MMAP) {
1368                 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid memory\n");
1369                 return -EINVAL;
1370         }
1371
1372         /* Call vb2_querybuf to get information */
1373         return vb2_querybuf(&video->buffer_queue, buf);
1374 }
1375
1376 /*
1377  * vpfe_qbuf() - queue buffers for capture or processing
1378  */
1379 static int vpfe_qbuf(struct file *file, void *priv,
1380                      struct v4l2_buffer *p)
1381 {
1382         struct vpfe_video_device *video = video_drvdata(file);
1383         struct vpfe_device *vpfe_dev = video->vpfe_dev;
1384         struct vpfe_fh *fh = file->private_data;
1385
1386         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_qbuf\n");
1387
1388         if (V4L2_BUF_TYPE_VIDEO_CAPTURE != p->type &&
1389             V4L2_BUF_TYPE_VIDEO_OUTPUT != p->type) {
1390                 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n");
1391                 return -EINVAL;
1392         }
1393         /*
1394          * If this file handle is not allowed to do IO,
1395          * return error
1396          */
1397         if (!fh->io_allowed) {
1398                 v4l2_err(&vpfe_dev->v4l2_dev, "fh->io_allowed\n");
1399                 return -EACCES;
1400         }
1401
1402         return vb2_qbuf(&video->buffer_queue, p);
1403 }
1404
1405 /*
1406  * vpfe_dqbuf() - deque buffer which is done with processing
1407  */
1408 static int vpfe_dqbuf(struct file *file, void *priv,
1409                       struct v4l2_buffer *buf)
1410 {
1411         struct vpfe_video_device *video = video_drvdata(file);
1412         struct vpfe_device *vpfe_dev = video->vpfe_dev;
1413
1414         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_dqbuf\n");
1415
1416         if (V4L2_BUF_TYPE_VIDEO_CAPTURE != buf->type &&
1417             V4L2_BUF_TYPE_VIDEO_OUTPUT != buf->type) {
1418                 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n");
1419                 return -EINVAL;
1420         }
1421
1422         return vb2_dqbuf(&video->buffer_queue,
1423                          buf, (file->f_flags & O_NONBLOCK));
1424 }
1425
1426 /*
1427  * vpfe_streamon() - start streaming
1428  * @file: file pointer
1429  * @priv: void pointer
1430  * @buf_type: enum v4l2_buf_type
1431  *
1432  * queue buffer onto hardware for capture/processing and
1433  * start all the subdevs which are in media chain
1434  *
1435  * Return 0 on success, error code otherwise
1436  */
1437 static int vpfe_streamon(struct file *file, void *priv,
1438                          enum v4l2_buf_type buf_type)
1439 {
1440         struct vpfe_video_device *video = video_drvdata(file);
1441         struct vpfe_device *vpfe_dev = video->vpfe_dev;
1442         struct vpfe_pipeline *pipe = &video->pipe;
1443         struct vpfe_fh *fh = file->private_data;
1444         struct vpfe_ext_subdev_info *sdinfo;
1445         int ret = -EINVAL;
1446
1447         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_streamon\n");
1448
1449         if (V4L2_BUF_TYPE_VIDEO_CAPTURE != buf_type &&
1450             V4L2_BUF_TYPE_VIDEO_OUTPUT != buf_type) {
1451                 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n");
1452                 return ret;
1453         }
1454         /* If file handle is not allowed IO, return error */
1455         if (!fh->io_allowed) {
1456                 v4l2_err(&vpfe_dev->v4l2_dev, "fh->io_allowed\n");
1457                 return -EACCES;
1458         }
1459         sdinfo = video->current_ext_subdev;
1460         /* If buffer queue is empty, return error */
1461         if (list_empty(&video->buffer_queue.queued_list)) {
1462                 v4l2_err(&vpfe_dev->v4l2_dev, "buffer queue is empty\n");
1463                 return -EIO;
1464         }
1465         /* Validate the pipeline */
1466         if (V4L2_BUF_TYPE_VIDEO_CAPTURE == buf_type) {
1467                 ret = vpfe_video_validate_pipeline(pipe);
1468                 if (ret < 0)
1469                         return ret;
1470         }
1471         /* Call vb2_streamon to start streaming */
1472         return vb2_streamon(&video->buffer_queue, buf_type);
1473 }
1474
1475 /*
1476  * vpfe_streamoff() - stop streaming
1477  * @file: file pointer
1478  * @priv: void pointer
1479  * @buf_type: enum v4l2_buf_type
1480  *
1481  * stop all the subdevs which are in media chain
1482  *
1483  * Return 0 on success, error code otherwise
1484  */
1485 static int vpfe_streamoff(struct file *file, void *priv,
1486                           enum v4l2_buf_type buf_type)
1487 {
1488         struct vpfe_video_device *video = video_drvdata(file);
1489         struct vpfe_device *vpfe_dev = video->vpfe_dev;
1490         struct vpfe_fh *fh = file->private_data;
1491         int ret = 0;
1492
1493         v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_streamoff\n");
1494
1495         if (buf_type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1496             buf_type != V4L2_BUF_TYPE_VIDEO_OUTPUT) {
1497                 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "Invalid buf type\n");
1498                 return -EINVAL;
1499         }
1500
1501         /* If io is allowed for this file handle, return error */
1502         if (!fh->io_allowed) {
1503                 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "fh->io_allowed\n");
1504                 return -EACCES;
1505         }
1506
1507         /* If streaming is not started, return error */
1508         if (!video->started) {
1509                 v4l2_err(&vpfe_dev->v4l2_dev, "device is not started\n");
1510                 return -EINVAL;
1511         }
1512
1513         ret = mutex_lock_interruptible(&video->lock);
1514         if (ret)
1515                 return ret;
1516
1517         vpfe_stop_capture(video);
1518         ret = vb2_streamoff(&video->buffer_queue, buf_type);
1519         mutex_unlock(&video->lock);
1520
1521         return ret;
1522 }
1523
1524 /* vpfe capture ioctl operations */
1525 static const struct v4l2_ioctl_ops vpfe_ioctl_ops = {
1526         .vidioc_querycap         = vpfe_querycap,
1527         .vidioc_g_fmt_vid_cap    = vpfe_g_fmt,
1528         .vidioc_s_fmt_vid_cap    = vpfe_s_fmt,
1529         .vidioc_try_fmt_vid_cap  = vpfe_try_fmt,
1530         .vidioc_enum_fmt_vid_cap = vpfe_enum_fmt,
1531         .vidioc_g_fmt_vid_out    = vpfe_g_fmt,
1532         .vidioc_s_fmt_vid_out    = vpfe_s_fmt,
1533         .vidioc_try_fmt_vid_out  = vpfe_try_fmt,
1534         .vidioc_enum_fmt_vid_out = vpfe_enum_fmt,
1535         .vidioc_enum_input       = vpfe_enum_input,
1536         .vidioc_g_input          = vpfe_g_input,
1537         .vidioc_s_input          = vpfe_s_input,
1538         .vidioc_querystd         = vpfe_querystd,
1539         .vidioc_s_std            = vpfe_s_std,
1540         .vidioc_g_std            = vpfe_g_std,
1541         .vidioc_enum_dv_timings  = vpfe_enum_dv_timings,
1542         .vidioc_query_dv_timings = vpfe_query_dv_timings,
1543         .vidioc_s_dv_timings     = vpfe_s_dv_timings,
1544         .vidioc_g_dv_timings     = vpfe_g_dv_timings,
1545         .vidioc_reqbufs          = vpfe_reqbufs,
1546         .vidioc_querybuf         = vpfe_querybuf,
1547         .vidioc_qbuf             = vpfe_qbuf,
1548         .vidioc_dqbuf            = vpfe_dqbuf,
1549         .vidioc_streamon         = vpfe_streamon,
1550         .vidioc_streamoff        = vpfe_streamoff,
1551 };
1552
1553 /* VPFE video init function */
1554 int vpfe_video_init(struct vpfe_video_device *video, const char *name)
1555 {
1556         const char *direction;
1557         int ret;
1558
1559         switch (video->type) {
1560         case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1561                 direction = "output";
1562                 video->pad.flags = MEDIA_PAD_FL_SINK;
1563                 video->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1564                 break;
1565
1566         case V4L2_BUF_TYPE_VIDEO_OUTPUT:
1567                 direction = "input";
1568                 video->pad.flags = MEDIA_PAD_FL_SOURCE;
1569                 video->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
1570                 break;
1571
1572         default:
1573                 return -EINVAL;
1574         }
1575         /* Initialize field of video device */
1576         video->video_dev.release = video_device_release;
1577         video->video_dev.fops = &vpfe_fops;
1578         video->video_dev.ioctl_ops = &vpfe_ioctl_ops;
1579         video->video_dev.minor = -1;
1580         video->video_dev.tvnorms = 0;
1581         snprintf(video->video_dev.name, sizeof(video->video_dev.name),
1582                  "DAVINCI VIDEO %s %s", name, direction);
1583
1584         /* Initialize prio member of device object */
1585         v4l2_prio_init(&video->prio);
1586         spin_lock_init(&video->irqlock);
1587         spin_lock_init(&video->dma_queue_lock);
1588         mutex_init(&video->lock);
1589         ret = media_entity_init(&video->video_dev.entity,
1590                                 1, &video->pad, 0);
1591         if (ret < 0)
1592                 return ret;
1593
1594         video_set_drvdata(&video->video_dev, video);
1595
1596         return 0;
1597 }
1598
1599 /* vpfe video device register function */
1600 int vpfe_video_register(struct vpfe_video_device *video,
1601                         struct v4l2_device *vdev)
1602 {
1603         int ret;
1604
1605         video->video_dev.v4l2_dev = vdev;
1606
1607         ret = video_register_device(&video->video_dev, VFL_TYPE_GRABBER, -1);
1608         if (ret < 0)
1609                 pr_err("%s: could not register video device (%d)\n",
1610                        __func__, ret);
1611         return ret;
1612 }
1613
1614 /* vpfe video device unregister function */
1615 void vpfe_video_unregister(struct vpfe_video_device *video)
1616 {
1617         if (video_is_registered(&video->video_dev)) {
1618                 video_unregister_device(&video->video_dev);
1619                 media_entity_cleanup(&video->video_dev.entity);
1620         }
1621 }