linux/drivers/staging/media/davinci_vpfe/vpfe_video.c
<<
>>
Prefs
   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
  33static int debug;
  34
  35/* get v4l2 subdev pointer to external subdev which is active */
  36static 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 */
  51static 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 */
  89static struct v4l2_subdev *
  90vpfe_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 */
 102static 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 */
 133static 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 */
 166static 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 */
 193int 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 */
 215static 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 */
 281static 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 */
 321static 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 == 0) ? ret : -ETIMEDOUT ;
 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 */
 363static 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
 372static 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 */
 394static 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 */
 427static unsigned long
 428vpfe_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 */
 440void 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 */
 462void 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 */
 473void 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 */
 484static 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 */
 505static 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 */
 552static 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 */
 564static 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 */
 576static 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 */
 595static 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 */
 626static 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 */
 649static 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 */
 711static 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 */
 745static 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 */
 774static 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 */
 799static 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 */
 820static 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;
 880unlock_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 */
 896static 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 */
 927static 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;
 955unlock_out:
 956        mutex_unlock(&video->lock);
 957        return ret;
 958}
 959
 960static 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 */
 982static int
 983vpfe_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 */
1006static int
1007vpfe_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 */
1029static int
1030vpfe_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 */
1055static int
1056vpfe_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 */
1082static int
1083vpfe_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 */
1120static 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
1147static 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 */
1184static 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
1196static 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;
1228unlock_out:
1229        mutex_unlock(&video->lock);
1230streamoff:
1231        ret = vb2_streamoff(&video->buffer_queue, video->buffer_queue.type);
1232        return 0;
1233}
1234
1235static 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 */
1245static 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
1262static 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
1275static 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 */
1289static 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->ops = &video_qops;
1329        q->mem_ops = &vb2_dma_contig_memops;
1330        q->buf_struct_size = sizeof(struct vpfe_cap_buffer);
1331
1332        ret = vb2_queue_init(q);
1333        if (ret) {
1334                v4l2_err(&vpfe_dev->v4l2_dev, "vb2_queue_init() failed\n");
1335                vb2_dma_contig_cleanup_ctx(vpfe_dev->pdev);
1336                return ret;
1337        }
1338
1339        fh->io_allowed = 1;
1340        video->io_usrs = 1;
1341        INIT_LIST_HEAD(&video->dma_queue);
1342        ret = vb2_reqbufs(&video->buffer_queue, req_buf);
1343
1344unlock_out:
1345        mutex_unlock(&video->lock);
1346        return ret;
1347}
1348
1349/*
1350 * vpfe_querybuf() - query buffers for exchange
1351 */
1352static int vpfe_querybuf(struct file *file, void *priv,
1353                         struct v4l2_buffer *buf)
1354{
1355        struct vpfe_video_device *video = video_drvdata(file);
1356        struct vpfe_device *vpfe_dev = video->vpfe_dev;
1357
1358        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_querybuf\n");
1359
1360        if (V4L2_BUF_TYPE_VIDEO_CAPTURE != buf->type &&
1361            V4L2_BUF_TYPE_VIDEO_OUTPUT != buf->type) {
1362                v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n");
1363                return  -EINVAL;
1364        }
1365
1366        if (video->memory != V4L2_MEMORY_MMAP) {
1367                v4l2_err(&vpfe_dev->v4l2_dev, "Invalid memory\n");
1368                return -EINVAL;
1369        }
1370
1371        /* Call vb2_querybuf to get information */
1372        return vb2_querybuf(&video->buffer_queue, buf);
1373}
1374
1375/*
1376 * vpfe_qbuf() - queue buffers for capture or processing
1377 */
1378static int vpfe_qbuf(struct file *file, void *priv,
1379                     struct v4l2_buffer *p)
1380{
1381        struct vpfe_video_device *video = video_drvdata(file);
1382        struct vpfe_device *vpfe_dev = video->vpfe_dev;
1383        struct vpfe_fh *fh = file->private_data;
1384
1385        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_qbuf\n");
1386
1387        if (V4L2_BUF_TYPE_VIDEO_CAPTURE != p->type &&
1388            V4L2_BUF_TYPE_VIDEO_OUTPUT != p->type) {
1389                v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n");
1390                return -EINVAL;
1391        }
1392        /*
1393         * If this file handle is not allowed to do IO,
1394         * return error
1395         */
1396        if (!fh->io_allowed) {
1397                v4l2_err(&vpfe_dev->v4l2_dev, "fh->io_allowed\n");
1398                return -EACCES;
1399        }
1400
1401        return vb2_qbuf(&video->buffer_queue, p);
1402}
1403
1404/*
1405 * vpfe_dqbuf() - deque buffer which is done with processing
1406 */
1407static int vpfe_dqbuf(struct file *file, void *priv,
1408                      struct v4l2_buffer *buf)
1409{
1410        struct vpfe_video_device *video = video_drvdata(file);
1411        struct vpfe_device *vpfe_dev = video->vpfe_dev;
1412
1413        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_dqbuf\n");
1414
1415        if (V4L2_BUF_TYPE_VIDEO_CAPTURE != buf->type &&
1416            V4L2_BUF_TYPE_VIDEO_OUTPUT != buf->type) {
1417                v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n");
1418                return -EINVAL;
1419        }
1420
1421        return vb2_dqbuf(&video->buffer_queue,
1422                         buf, (file->f_flags & O_NONBLOCK));
1423}
1424
1425/*
1426 * vpfe_streamon() - start streaming
1427 * @file: file pointer
1428 * @priv: void pointer
1429 * @buf_type: enum v4l2_buf_type
1430 *
1431 * queue buffer onto hardware for capture/processing and
1432 * start all the subdevs which are in media chain
1433 *
1434 * Return 0 on success, error code otherwise
1435 */
1436static int vpfe_streamon(struct file *file, void *priv,
1437                         enum v4l2_buf_type buf_type)
1438{
1439        struct vpfe_video_device *video = video_drvdata(file);
1440        struct vpfe_device *vpfe_dev = video->vpfe_dev;
1441        struct vpfe_pipeline *pipe = &video->pipe;
1442        struct vpfe_fh *fh = file->private_data;
1443        struct vpfe_ext_subdev_info *sdinfo;
1444        int ret = -EINVAL;
1445
1446        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_streamon\n");
1447
1448        if (V4L2_BUF_TYPE_VIDEO_CAPTURE != buf_type &&
1449            V4L2_BUF_TYPE_VIDEO_OUTPUT != buf_type) {
1450                v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n");
1451                return ret;
1452        }
1453        /* If file handle is not allowed IO, return error */
1454        if (!fh->io_allowed) {
1455                v4l2_err(&vpfe_dev->v4l2_dev, "fh->io_allowed\n");
1456                return -EACCES;
1457        }
1458        sdinfo = video->current_ext_subdev;
1459        /* If buffer queue is empty, return error */
1460        if (list_empty(&video->buffer_queue.queued_list)) {
1461                v4l2_err(&vpfe_dev->v4l2_dev, "buffer queue is empty\n");
1462                return -EIO;
1463        }
1464        /* Validate the pipeline */
1465        if (V4L2_BUF_TYPE_VIDEO_CAPTURE == buf_type) {
1466                ret = vpfe_video_validate_pipeline(pipe);
1467                if (ret < 0)
1468                        return ret;
1469        }
1470        /* Call vb2_streamon to start streaming */
1471        return vb2_streamon(&video->buffer_queue, buf_type);
1472}
1473
1474/*
1475 * vpfe_streamoff() - stop streaming
1476 * @file: file pointer
1477 * @priv: void pointer
1478 * @buf_type: enum v4l2_buf_type
1479 *
1480 * stop all the subdevs which are in media chain
1481 *
1482 * Return 0 on success, error code otherwise
1483 */
1484static int vpfe_streamoff(struct file *file, void *priv,
1485                          enum v4l2_buf_type buf_type)
1486{
1487        struct vpfe_video_device *video = video_drvdata(file);
1488        struct vpfe_device *vpfe_dev = video->vpfe_dev;
1489        struct vpfe_fh *fh = file->private_data;
1490        int ret = 0;
1491
1492        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_streamoff\n");
1493
1494        if (buf_type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1495            buf_type != V4L2_BUF_TYPE_VIDEO_OUTPUT) {
1496                v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "Invalid buf type\n");
1497                return -EINVAL;
1498        }
1499
1500        /* If io is allowed for this file handle, return error */
1501        if (!fh->io_allowed) {
1502                v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "fh->io_allowed\n");
1503                return -EACCES;
1504        }
1505
1506        /* If streaming is not started, return error */
1507        if (!video->started) {
1508                v4l2_err(&vpfe_dev->v4l2_dev, "device is not started\n");
1509                return -EINVAL;
1510        }
1511
1512        ret = mutex_lock_interruptible(&video->lock);
1513        if (ret)
1514                return ret;
1515
1516        vpfe_stop_capture(video);
1517        ret = vb2_streamoff(&video->buffer_queue, buf_type);
1518        mutex_unlock(&video->lock);
1519
1520        return ret;
1521}
1522
1523/* vpfe capture ioctl operations */
1524static const struct v4l2_ioctl_ops vpfe_ioctl_ops = {
1525        .vidioc_querycap         = vpfe_querycap,
1526        .vidioc_g_fmt_vid_cap    = vpfe_g_fmt,
1527        .vidioc_s_fmt_vid_cap    = vpfe_s_fmt,
1528        .vidioc_try_fmt_vid_cap  = vpfe_try_fmt,
1529        .vidioc_enum_fmt_vid_cap = vpfe_enum_fmt,
1530        .vidioc_g_fmt_vid_out    = vpfe_g_fmt,
1531        .vidioc_s_fmt_vid_out    = vpfe_s_fmt,
1532        .vidioc_try_fmt_vid_out  = vpfe_try_fmt,
1533        .vidioc_enum_fmt_vid_out = vpfe_enum_fmt,
1534        .vidioc_enum_input       = vpfe_enum_input,
1535        .vidioc_g_input          = vpfe_g_input,
1536        .vidioc_s_input          = vpfe_s_input,
1537        .vidioc_querystd         = vpfe_querystd,
1538        .vidioc_s_std            = vpfe_s_std,
1539        .vidioc_g_std            = vpfe_g_std,
1540        .vidioc_enum_dv_timings  = vpfe_enum_dv_timings,
1541        .vidioc_query_dv_timings = vpfe_query_dv_timings,
1542        .vidioc_s_dv_timings     = vpfe_s_dv_timings,
1543        .vidioc_g_dv_timings     = vpfe_g_dv_timings,
1544        .vidioc_reqbufs          = vpfe_reqbufs,
1545        .vidioc_querybuf         = vpfe_querybuf,
1546        .vidioc_qbuf             = vpfe_qbuf,
1547        .vidioc_dqbuf            = vpfe_dqbuf,
1548        .vidioc_streamon         = vpfe_streamon,
1549        .vidioc_streamoff        = vpfe_streamoff,
1550};
1551
1552/* VPFE video init function */
1553int vpfe_video_init(struct vpfe_video_device *video, const char *name)
1554{
1555        const char *direction;
1556        int ret;
1557
1558        switch (video->type) {
1559        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1560                direction = "output";
1561                video->pad.flags = MEDIA_PAD_FL_SINK;
1562                video->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1563                break;
1564
1565        case V4L2_BUF_TYPE_VIDEO_OUTPUT:
1566                direction = "input";
1567                video->pad.flags = MEDIA_PAD_FL_SOURCE;
1568                video->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
1569                break;
1570
1571        default:
1572                return -EINVAL;
1573        }
1574        /* Initialize field of video device */
1575        video->video_dev.release = video_device_release;
1576        video->video_dev.fops = &vpfe_fops;
1577        video->video_dev.ioctl_ops = &vpfe_ioctl_ops;
1578        video->video_dev.minor = -1;
1579        video->video_dev.tvnorms = 0;
1580        snprintf(video->video_dev.name, sizeof(video->video_dev.name),
1581                 "DAVINCI VIDEO %s %s", name, direction);
1582
1583        /* Initialize prio member of device object */
1584        v4l2_prio_init(&video->prio);
1585        spin_lock_init(&video->irqlock);
1586        spin_lock_init(&video->dma_queue_lock);
1587        mutex_init(&video->lock);
1588        ret = media_entity_init(&video->video_dev.entity,
1589                                1, &video->pad, 0);
1590        if (ret < 0)
1591                return ret;
1592
1593        video_set_drvdata(&video->video_dev, video);
1594
1595        return 0;
1596}
1597
1598/* vpfe video device register function */
1599int vpfe_video_register(struct vpfe_video_device *video,
1600                        struct v4l2_device *vdev)
1601{
1602        int ret;
1603
1604        video->video_dev.v4l2_dev = vdev;
1605
1606        ret = video_register_device(&video->video_dev, VFL_TYPE_GRABBER, -1);
1607        if (ret < 0)
1608                pr_err("%s: could not register video device (%d)\n",
1609                       __func__, ret);
1610        return ret;
1611}
1612
1613/* vpfe video device unregister function */
1614void vpfe_video_unregister(struct vpfe_video_device *video)
1615{
1616        if (video_is_registered(&video->video_dev)) {
1617                video_unregister_device(&video->video_dev);
1618                media_entity_cleanup(&video->video_dev.entity);
1619        }
1620}
1621