linux/drivers/media/platform/davinci/vpfe_capture.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2008-2009 Texas Instruments Inc
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License as published by
   6 * the Free Software Foundation; either version 2 of the License, or
   7 * (at your option) any later version.
   8 *
   9 * This program is distributed in the hope that it will be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write to the Free Software
  16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  17 *
  18 * Driver name : VPFE Capture driver
  19 *    VPFE Capture driver allows applications to capture and stream video
  20 *    frames on DaVinci SoCs (DM6446, DM355 etc) from a YUV source such as
  21 *    TVP5146 or  Raw Bayer RGB image data from an image sensor
  22 *    such as Microns' MT9T001, MT9T031 etc.
  23 *
  24 *    These SoCs have, in common, a Video Processing Subsystem (VPSS) that
  25 *    consists of a Video Processing Front End (VPFE) for capturing
  26 *    video/raw image data and Video Processing Back End (VPBE) for displaying
  27 *    YUV data through an in-built analog encoder or Digital LCD port. This
  28 *    driver is for capture through VPFE. A typical EVM using these SoCs have
  29 *    following high level configuration.
  30 *
  31 *
  32 *    decoder(TVP5146/          YUV/
  33 *           MT9T001)   -->  Raw Bayer RGB ---> MUX -> VPFE (CCDC/ISIF)
  34 *                              data input              |      |
  35 *                                                      V      |
  36 *                                                    SDRAM    |
  37 *                                                             V
  38 *                                                         Image Processor
  39 *                                                             |
  40 *                                                             V
  41 *                                                           SDRAM
  42 *    The data flow happens from a decoder connected to the VPFE over a
  43 *    YUV embedded (BT.656/BT.1120) or separate sync or raw bayer rgb interface
  44 *    and to the input of VPFE through an optional MUX (if more inputs are
  45 *    to be interfaced on the EVM). The input data is first passed through
  46 *    CCDC (CCD Controller, a.k.a Image Sensor Interface, ISIF). The CCDC
  47 *    does very little or no processing on YUV data and does pre-process Raw
  48 *    Bayer RGB data through modules such as Defect Pixel Correction (DFC)
  49 *    Color Space Conversion (CSC), data gain/offset etc. After this, data
  50 *    can be written to SDRAM or can be connected to the image processing
  51 *    block such as IPIPE (on DM355 only).
  52 *
  53 *    Features supported
  54 *              - MMAP IO
  55 *              - Capture using TVP5146 over BT.656
  56 *              - support for interfacing decoders using sub device model
  57 *              - Work with DM355 or DM6446 CCDC to do Raw Bayer RGB/YUV
  58 *                data capture to SDRAM.
  59 *    TODO list
  60 *              - Support multiple REQBUF after open
  61 *              - Support for de-allocating buffers through REQBUF
  62 *              - Support for Raw Bayer RGB capture
  63 *              - Support for chaining Image Processor
  64 *              - Support for static allocation of buffers
  65 *              - Support for USERPTR IO
  66 *              - Support for STREAMON before QBUF
  67 *              - Support for control ioctls
  68 */
  69#include <linux/module.h>
  70#include <linux/slab.h>
  71#include <linux/init.h>
  72#include <linux/platform_device.h>
  73#include <linux/interrupt.h>
  74#include <media/v4l2-common.h>
  75#include <linux/io.h>
  76#include <media/davinci/vpfe_capture.h>
  77#include "ccdc_hw_device.h"
  78
  79static int debug;
  80static u32 numbuffers = 3;
  81static u32 bufsize = (720 * 576 * 2);
  82
  83module_param(numbuffers, uint, S_IRUGO);
  84module_param(bufsize, uint, S_IRUGO);
  85module_param(debug, int, 0644);
  86
  87MODULE_PARM_DESC(numbuffers, "buffer count (default:3)");
  88MODULE_PARM_DESC(bufsize, "buffer size in bytes (default:720 x 576 x 2)");
  89MODULE_PARM_DESC(debug, "Debug level 0-1");
  90
  91MODULE_DESCRIPTION("VPFE Video for Linux Capture Driver");
  92MODULE_LICENSE("GPL");
  93MODULE_AUTHOR("Texas Instruments");
  94
  95/* standard information */
  96struct vpfe_standard {
  97        v4l2_std_id std_id;
  98        unsigned int width;
  99        unsigned int height;
 100        struct v4l2_fract pixelaspect;
 101        /* 0 - progressive, 1 - interlaced */
 102        int frame_format;
 103};
 104
 105/* ccdc configuration */
 106struct ccdc_config {
 107        /* This make sure vpfe is probed and ready to go */
 108        int vpfe_probed;
 109        /* name of ccdc device */
 110        char name[32];
 111};
 112
 113/* data structures */
 114static struct vpfe_config_params config_params = {
 115        .min_numbuffers = 3,
 116        .numbuffers = 3,
 117        .min_bufsize = 720 * 480 * 2,
 118        .device_bufsize = 720 * 576 * 2,
 119};
 120
 121/* ccdc device registered */
 122static struct ccdc_hw_device *ccdc_dev;
 123/* lock for accessing ccdc information */
 124static DEFINE_MUTEX(ccdc_lock);
 125/* ccdc configuration */
 126static struct ccdc_config *ccdc_cfg;
 127
 128static const struct vpfe_standard vpfe_standards[] = {
 129        {V4L2_STD_525_60, 720, 480, {11, 10}, 1},
 130        {V4L2_STD_625_50, 720, 576, {54, 59}, 1},
 131};
 132
 133/* Used when raw Bayer image from ccdc is directly captured to SDRAM */
 134static const struct vpfe_pixel_format vpfe_pix_fmts[] = {
 135        {
 136                .fmtdesc = {
 137                        .index = 0,
 138                        .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
 139                        .description = "Bayer GrRBGb 8bit A-Law compr.",
 140                        .pixelformat = V4L2_PIX_FMT_SBGGR8,
 141                },
 142                .bpp = 1,
 143        },
 144        {
 145                .fmtdesc = {
 146                        .index = 1,
 147                        .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
 148                        .description = "Bayer GrRBGb - 16bit",
 149                        .pixelformat = V4L2_PIX_FMT_SBGGR16,
 150                },
 151                .bpp = 2,
 152        },
 153        {
 154                .fmtdesc = {
 155                        .index = 2,
 156                        .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
 157                        .description = "Bayer GrRBGb 8bit DPCM compr.",
 158                        .pixelformat = V4L2_PIX_FMT_SGRBG10DPCM8,
 159                },
 160                .bpp = 1,
 161        },
 162        {
 163                .fmtdesc = {
 164                        .index = 3,
 165                        .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
 166                        .description = "YCbCr 4:2:2 Interleaved UYVY",
 167                        .pixelformat = V4L2_PIX_FMT_UYVY,
 168                },
 169                .bpp = 2,
 170        },
 171        {
 172                .fmtdesc = {
 173                        .index = 4,
 174                        .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
 175                        .description = "YCbCr 4:2:2 Interleaved YUYV",
 176                        .pixelformat = V4L2_PIX_FMT_YUYV,
 177                },
 178                .bpp = 2,
 179        },
 180        {
 181                .fmtdesc = {
 182                        .index = 5,
 183                        .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
 184                        .description = "Y/CbCr 4:2:0 - Semi planar",
 185                        .pixelformat = V4L2_PIX_FMT_NV12,
 186                },
 187                .bpp = 1,
 188        },
 189};
 190
 191/*
 192 * vpfe_lookup_pix_format()
 193 * lookup an entry in the vpfe pix format table based on pix_format
 194 */
 195static const struct vpfe_pixel_format *vpfe_lookup_pix_format(u32 pix_format)
 196{
 197        int i;
 198
 199        for (i = 0; i < ARRAY_SIZE(vpfe_pix_fmts); i++) {
 200                if (pix_format == vpfe_pix_fmts[i].fmtdesc.pixelformat)
 201                        return &vpfe_pix_fmts[i];
 202        }
 203        return NULL;
 204}
 205
 206/*
 207 * vpfe_register_ccdc_device. CCDC module calls this to
 208 * register with vpfe capture
 209 */
 210int vpfe_register_ccdc_device(struct ccdc_hw_device *dev)
 211{
 212        int ret = 0;
 213        printk(KERN_NOTICE "vpfe_register_ccdc_device: %s\n", dev->name);
 214
 215        BUG_ON(!dev->hw_ops.open);
 216        BUG_ON(!dev->hw_ops.enable);
 217        BUG_ON(!dev->hw_ops.set_hw_if_params);
 218        BUG_ON(!dev->hw_ops.configure);
 219        BUG_ON(!dev->hw_ops.set_buftype);
 220        BUG_ON(!dev->hw_ops.get_buftype);
 221        BUG_ON(!dev->hw_ops.enum_pix);
 222        BUG_ON(!dev->hw_ops.set_frame_format);
 223        BUG_ON(!dev->hw_ops.get_frame_format);
 224        BUG_ON(!dev->hw_ops.get_pixel_format);
 225        BUG_ON(!dev->hw_ops.set_pixel_format);
 226        BUG_ON(!dev->hw_ops.set_image_window);
 227        BUG_ON(!dev->hw_ops.get_image_window);
 228        BUG_ON(!dev->hw_ops.get_line_length);
 229        BUG_ON(!dev->hw_ops.getfid);
 230
 231        mutex_lock(&ccdc_lock);
 232        if (NULL == ccdc_cfg) {
 233                /*
 234                 * TODO. Will this ever happen? if so, we need to fix it.
 235                 * Proabably we need to add the request to a linked list and
 236                 * walk through it during vpfe probe
 237                 */
 238                printk(KERN_ERR "vpfe capture not initialized\n");
 239                ret = -EFAULT;
 240                goto unlock;
 241        }
 242
 243        if (strcmp(dev->name, ccdc_cfg->name)) {
 244                /* ignore this ccdc */
 245                ret = -EINVAL;
 246                goto unlock;
 247        }
 248
 249        if (ccdc_dev) {
 250                printk(KERN_ERR "ccdc already registered\n");
 251                ret = -EINVAL;
 252                goto unlock;
 253        }
 254
 255        ccdc_dev = dev;
 256unlock:
 257        mutex_unlock(&ccdc_lock);
 258        return ret;
 259}
 260EXPORT_SYMBOL(vpfe_register_ccdc_device);
 261
 262/*
 263 * vpfe_unregister_ccdc_device. CCDC module calls this to
 264 * unregister with vpfe capture
 265 */
 266void vpfe_unregister_ccdc_device(struct ccdc_hw_device *dev)
 267{
 268        if (NULL == dev) {
 269                printk(KERN_ERR "invalid ccdc device ptr\n");
 270                return;
 271        }
 272
 273        printk(KERN_NOTICE "vpfe_unregister_ccdc_device, dev->name = %s\n",
 274                dev->name);
 275
 276        if (strcmp(dev->name, ccdc_cfg->name)) {
 277                /* ignore this ccdc */
 278                return;
 279        }
 280
 281        mutex_lock(&ccdc_lock);
 282        ccdc_dev = NULL;
 283        mutex_unlock(&ccdc_lock);
 284        return;
 285}
 286EXPORT_SYMBOL(vpfe_unregister_ccdc_device);
 287
 288/*
 289 * vpfe_get_ccdc_image_format - Get image parameters based on CCDC settings
 290 */
 291static int vpfe_get_ccdc_image_format(struct vpfe_device *vpfe_dev,
 292                                 struct v4l2_format *f)
 293{
 294        struct v4l2_rect image_win;
 295        enum ccdc_buftype buf_type;
 296        enum ccdc_frmfmt frm_fmt;
 297
 298        memset(f, 0, sizeof(*f));
 299        f->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
 300        ccdc_dev->hw_ops.get_image_window(&image_win);
 301        f->fmt.pix.width = image_win.width;
 302        f->fmt.pix.height = image_win.height;
 303        f->fmt.pix.bytesperline = ccdc_dev->hw_ops.get_line_length();
 304        f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
 305                                f->fmt.pix.height;
 306        buf_type = ccdc_dev->hw_ops.get_buftype();
 307        f->fmt.pix.pixelformat = ccdc_dev->hw_ops.get_pixel_format();
 308        frm_fmt = ccdc_dev->hw_ops.get_frame_format();
 309        if (frm_fmt == CCDC_FRMFMT_PROGRESSIVE)
 310                f->fmt.pix.field = V4L2_FIELD_NONE;
 311        else if (frm_fmt == CCDC_FRMFMT_INTERLACED) {
 312                if (buf_type == CCDC_BUFTYPE_FLD_INTERLEAVED)
 313                        f->fmt.pix.field = V4L2_FIELD_INTERLACED;
 314                else if (buf_type == CCDC_BUFTYPE_FLD_SEPARATED)
 315                        f->fmt.pix.field = V4L2_FIELD_SEQ_TB;
 316                else {
 317                        v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf_type\n");
 318                        return -EINVAL;
 319                }
 320        } else {
 321                v4l2_err(&vpfe_dev->v4l2_dev, "Invalid frm_fmt\n");
 322                return -EINVAL;
 323        }
 324        return 0;
 325}
 326
 327/*
 328 * vpfe_config_ccdc_image_format()
 329 * For a pix format, configure ccdc to setup the capture
 330 */
 331static int vpfe_config_ccdc_image_format(struct vpfe_device *vpfe_dev)
 332{
 333        enum ccdc_frmfmt frm_fmt = CCDC_FRMFMT_INTERLACED;
 334        int ret = 0;
 335
 336        if (ccdc_dev->hw_ops.set_pixel_format(
 337                        vpfe_dev->fmt.fmt.pix.pixelformat) < 0) {
 338                v4l2_err(&vpfe_dev->v4l2_dev,
 339                        "couldn't set pix format in ccdc\n");
 340                return -EINVAL;
 341        }
 342        /* configure the image window */
 343        ccdc_dev->hw_ops.set_image_window(&vpfe_dev->crop);
 344
 345        switch (vpfe_dev->fmt.fmt.pix.field) {
 346        case V4L2_FIELD_INTERLACED:
 347                /* do nothing, since it is default */
 348                ret = ccdc_dev->hw_ops.set_buftype(
 349                                CCDC_BUFTYPE_FLD_INTERLEAVED);
 350                break;
 351        case V4L2_FIELD_NONE:
 352                frm_fmt = CCDC_FRMFMT_PROGRESSIVE;
 353                /* buffer type only applicable for interlaced scan */
 354                break;
 355        case V4L2_FIELD_SEQ_TB:
 356                ret = ccdc_dev->hw_ops.set_buftype(
 357                                CCDC_BUFTYPE_FLD_SEPARATED);
 358                break;
 359        default:
 360                return -EINVAL;
 361        }
 362
 363        /* set the frame format */
 364        if (!ret)
 365                ret = ccdc_dev->hw_ops.set_frame_format(frm_fmt);
 366        return ret;
 367}
 368/*
 369 * vpfe_config_image_format()
 370 * For a given standard, this functions sets up the default
 371 * pix format & crop values in the vpfe device and ccdc.  It first
 372 * starts with defaults based values from the standard table.
 373 * It then checks if sub device supports get_fmt and then override the
 374 * values based on that.Sets crop values to match with scan resolution
 375 * starting at 0,0. It calls vpfe_config_ccdc_image_format() set the
 376 * values in ccdc
 377 */
 378static int vpfe_config_image_format(struct vpfe_device *vpfe_dev,
 379                                    v4l2_std_id std_id)
 380{
 381        struct vpfe_subdev_info *sdinfo = vpfe_dev->current_subdev;
 382        struct v4l2_subdev_format fmt = {
 383                .which = V4L2_SUBDEV_FORMAT_ACTIVE,
 384        };
 385        struct v4l2_mbus_framefmt *mbus_fmt = &fmt.format;
 386        struct v4l2_pix_format *pix = &vpfe_dev->fmt.fmt.pix;
 387        int i, ret = 0;
 388
 389        for (i = 0; i < ARRAY_SIZE(vpfe_standards); i++) {
 390                if (vpfe_standards[i].std_id & std_id) {
 391                        vpfe_dev->std_info.active_pixels =
 392                                        vpfe_standards[i].width;
 393                        vpfe_dev->std_info.active_lines =
 394                                        vpfe_standards[i].height;
 395                        vpfe_dev->std_info.frame_format =
 396                                        vpfe_standards[i].frame_format;
 397                        vpfe_dev->std_index = i;
 398                        break;
 399                }
 400        }
 401
 402        if (i ==  ARRAY_SIZE(vpfe_standards)) {
 403                v4l2_err(&vpfe_dev->v4l2_dev, "standard not supported\n");
 404                return -EINVAL;
 405        }
 406
 407        vpfe_dev->crop.top = 0;
 408        vpfe_dev->crop.left = 0;
 409        vpfe_dev->crop.width = vpfe_dev->std_info.active_pixels;
 410        vpfe_dev->crop.height = vpfe_dev->std_info.active_lines;
 411        pix->width = vpfe_dev->crop.width;
 412        pix->height = vpfe_dev->crop.height;
 413
 414        /* first field and frame format based on standard frame format */
 415        if (vpfe_dev->std_info.frame_format) {
 416                pix->field = V4L2_FIELD_INTERLACED;
 417                /* assume V4L2_PIX_FMT_UYVY as default */
 418                pix->pixelformat = V4L2_PIX_FMT_UYVY;
 419                v4l2_fill_mbus_format(mbus_fmt, pix,
 420                                MEDIA_BUS_FMT_YUYV10_2X10);
 421        } else {
 422                pix->field = V4L2_FIELD_NONE;
 423                /* assume V4L2_PIX_FMT_SBGGR8 */
 424                pix->pixelformat = V4L2_PIX_FMT_SBGGR8;
 425                v4l2_fill_mbus_format(mbus_fmt, pix,
 426                                MEDIA_BUS_FMT_SBGGR8_1X8);
 427        }
 428
 429        /* if sub device supports get_fmt, override the defaults */
 430        ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev,
 431                        sdinfo->grp_id, pad, get_fmt, NULL, &fmt);
 432
 433        if (ret && ret != -ENOIOCTLCMD) {
 434                v4l2_err(&vpfe_dev->v4l2_dev,
 435                        "error in getting get_fmt from sub device\n");
 436                return ret;
 437        }
 438        v4l2_fill_pix_format(pix, mbus_fmt);
 439        pix->bytesperline = pix->width * 2;
 440        pix->sizeimage = pix->bytesperline * pix->height;
 441
 442        /* Sets the values in CCDC */
 443        ret = vpfe_config_ccdc_image_format(vpfe_dev);
 444        if (ret)
 445                return ret;
 446
 447        /* Update the values of sizeimage and bytesperline */
 448        pix->bytesperline = ccdc_dev->hw_ops.get_line_length();
 449        pix->sizeimage = pix->bytesperline * pix->height;
 450
 451        return 0;
 452}
 453
 454static int vpfe_initialize_device(struct vpfe_device *vpfe_dev)
 455{
 456        int ret = 0;
 457
 458        /* set first input of current subdevice as the current input */
 459        vpfe_dev->current_input = 0;
 460
 461        /* set default standard */
 462        vpfe_dev->std_index = 0;
 463
 464        /* Configure the default format information */
 465        ret = vpfe_config_image_format(vpfe_dev,
 466                                vpfe_standards[vpfe_dev->std_index].std_id);
 467        if (ret)
 468                return ret;
 469
 470        /* now open the ccdc device to initialize it */
 471        mutex_lock(&ccdc_lock);
 472        if (NULL == ccdc_dev) {
 473                v4l2_err(&vpfe_dev->v4l2_dev, "ccdc device not registered\n");
 474                ret = -ENODEV;
 475                goto unlock;
 476        }
 477
 478        if (!try_module_get(ccdc_dev->owner)) {
 479                v4l2_err(&vpfe_dev->v4l2_dev, "Couldn't lock ccdc module\n");
 480                ret = -ENODEV;
 481                goto unlock;
 482        }
 483        ret = ccdc_dev->hw_ops.open(vpfe_dev->pdev);
 484        if (!ret)
 485                vpfe_dev->initialized = 1;
 486
 487        /* Clear all VPFE/CCDC interrupts */
 488        if (vpfe_dev->cfg->clr_intr)
 489                vpfe_dev->cfg->clr_intr(-1);
 490
 491unlock:
 492        mutex_unlock(&ccdc_lock);
 493        return ret;
 494}
 495
 496/*
 497 * vpfe_open : It creates object of file handle structure and
 498 * stores it in private_data  member of filepointer
 499 */
 500static int vpfe_open(struct file *file)
 501{
 502        struct vpfe_device *vpfe_dev = video_drvdata(file);
 503        struct video_device *vdev = video_devdata(file);
 504        struct vpfe_fh *fh;
 505
 506        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_open\n");
 507
 508        if (!vpfe_dev->cfg->num_subdevs) {
 509                v4l2_err(&vpfe_dev->v4l2_dev, "No decoder registered\n");
 510                return -ENODEV;
 511        }
 512
 513        /* Allocate memory for the file handle object */
 514        fh = kmalloc(sizeof(struct vpfe_fh), GFP_KERNEL);
 515        if (NULL == fh) {
 516                v4l2_err(&vpfe_dev->v4l2_dev,
 517                        "unable to allocate memory for file handle object\n");
 518                return -ENOMEM;
 519        }
 520        /* store pointer to fh in private_data member of file */
 521        file->private_data = fh;
 522        fh->vpfe_dev = vpfe_dev;
 523        v4l2_fh_init(&fh->fh, vdev);
 524        mutex_lock(&vpfe_dev->lock);
 525        /* If decoder is not initialized. initialize it */
 526        if (!vpfe_dev->initialized) {
 527                if (vpfe_initialize_device(vpfe_dev)) {
 528                        mutex_unlock(&vpfe_dev->lock);
 529                        return -ENODEV;
 530                }
 531        }
 532        /* Increment device usrs counter */
 533        vpfe_dev->usrs++;
 534        /* Set io_allowed member to false */
 535        fh->io_allowed = 0;
 536        v4l2_fh_add(&fh->fh);
 537        mutex_unlock(&vpfe_dev->lock);
 538        return 0;
 539}
 540
 541static void vpfe_schedule_next_buffer(struct vpfe_device *vpfe_dev)
 542{
 543        unsigned long addr;
 544
 545        vpfe_dev->next_frm = list_entry(vpfe_dev->dma_queue.next,
 546                                        struct videobuf_buffer, queue);
 547        list_del(&vpfe_dev->next_frm->queue);
 548        vpfe_dev->next_frm->state = VIDEOBUF_ACTIVE;
 549        addr = videobuf_to_dma_contig(vpfe_dev->next_frm);
 550
 551        ccdc_dev->hw_ops.setfbaddr(addr);
 552}
 553
 554static void vpfe_schedule_bottom_field(struct vpfe_device *vpfe_dev)
 555{
 556        unsigned long addr;
 557
 558        addr = videobuf_to_dma_contig(vpfe_dev->cur_frm);
 559        addr += vpfe_dev->field_off;
 560        ccdc_dev->hw_ops.setfbaddr(addr);
 561}
 562
 563static void vpfe_process_buffer_complete(struct vpfe_device *vpfe_dev)
 564{
 565        v4l2_get_timestamp(&vpfe_dev->cur_frm->ts);
 566        vpfe_dev->cur_frm->state = VIDEOBUF_DONE;
 567        vpfe_dev->cur_frm->size = vpfe_dev->fmt.fmt.pix.sizeimage;
 568        wake_up_interruptible(&vpfe_dev->cur_frm->done);
 569        vpfe_dev->cur_frm = vpfe_dev->next_frm;
 570}
 571
 572/* ISR for VINT0*/
 573static irqreturn_t vpfe_isr(int irq, void *dev_id)
 574{
 575        struct vpfe_device *vpfe_dev = dev_id;
 576        enum v4l2_field field;
 577        int fid;
 578
 579        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "\nStarting vpfe_isr...\n");
 580        field = vpfe_dev->fmt.fmt.pix.field;
 581
 582        /* if streaming not started, don't do anything */
 583        if (!vpfe_dev->started)
 584                goto clear_intr;
 585
 586        /* only for 6446 this will be applicable */
 587        if (NULL != ccdc_dev->hw_ops.reset)
 588                ccdc_dev->hw_ops.reset();
 589
 590        if (field == V4L2_FIELD_NONE) {
 591                /* handle progressive frame capture */
 592                v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev,
 593                        "frame format is progressive...\n");
 594                if (vpfe_dev->cur_frm != vpfe_dev->next_frm)
 595                        vpfe_process_buffer_complete(vpfe_dev);
 596                goto clear_intr;
 597        }
 598
 599        /* interlaced or TB capture check which field we are in hardware */
 600        fid = ccdc_dev->hw_ops.getfid();
 601
 602        /* switch the software maintained field id */
 603        vpfe_dev->field_id ^= 1;
 604        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "field id = %x:%x.\n",
 605                fid, vpfe_dev->field_id);
 606        if (fid == vpfe_dev->field_id) {
 607                /* we are in-sync here,continue */
 608                if (fid == 0) {
 609                        /*
 610                         * One frame is just being captured. If the next frame
 611                         * is available, release the current frame and move on
 612                         */
 613                        if (vpfe_dev->cur_frm != vpfe_dev->next_frm)
 614                                vpfe_process_buffer_complete(vpfe_dev);
 615                        /*
 616                         * based on whether the two fields are stored
 617                         * interleavely or separately in memory, reconfigure
 618                         * the CCDC memory address
 619                         */
 620                        if (field == V4L2_FIELD_SEQ_TB) {
 621                                vpfe_schedule_bottom_field(vpfe_dev);
 622                        }
 623                        goto clear_intr;
 624                }
 625                /*
 626                 * if one field is just being captured configure
 627                 * the next frame get the next frame from the empty
 628                 * queue if no frame is available hold on to the
 629                 * current buffer
 630                 */
 631                spin_lock(&vpfe_dev->dma_queue_lock);
 632                if (!list_empty(&vpfe_dev->dma_queue) &&
 633                    vpfe_dev->cur_frm == vpfe_dev->next_frm)
 634                        vpfe_schedule_next_buffer(vpfe_dev);
 635                spin_unlock(&vpfe_dev->dma_queue_lock);
 636        } else if (fid == 0) {
 637                /*
 638                 * out of sync. Recover from any hardware out-of-sync.
 639                 * May loose one frame
 640                 */
 641                vpfe_dev->field_id = fid;
 642        }
 643clear_intr:
 644        if (vpfe_dev->cfg->clr_intr)
 645                vpfe_dev->cfg->clr_intr(irq);
 646
 647        return IRQ_HANDLED;
 648}
 649
 650/* vdint1_isr - isr handler for VINT1 interrupt */
 651static irqreturn_t vdint1_isr(int irq, void *dev_id)
 652{
 653        struct vpfe_device *vpfe_dev = dev_id;
 654
 655        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "\nInside vdint1_isr...\n");
 656
 657        /* if streaming not started, don't do anything */
 658        if (!vpfe_dev->started) {
 659                if (vpfe_dev->cfg->clr_intr)
 660                        vpfe_dev->cfg->clr_intr(irq);
 661                return IRQ_HANDLED;
 662        }
 663
 664        spin_lock(&vpfe_dev->dma_queue_lock);
 665        if ((vpfe_dev->fmt.fmt.pix.field == V4L2_FIELD_NONE) &&
 666            !list_empty(&vpfe_dev->dma_queue) &&
 667            vpfe_dev->cur_frm == vpfe_dev->next_frm)
 668                vpfe_schedule_next_buffer(vpfe_dev);
 669        spin_unlock(&vpfe_dev->dma_queue_lock);
 670
 671        if (vpfe_dev->cfg->clr_intr)
 672                vpfe_dev->cfg->clr_intr(irq);
 673
 674        return IRQ_HANDLED;
 675}
 676
 677static void vpfe_detach_irq(struct vpfe_device *vpfe_dev)
 678{
 679        enum ccdc_frmfmt frame_format;
 680
 681        frame_format = ccdc_dev->hw_ops.get_frame_format();
 682        if (frame_format == CCDC_FRMFMT_PROGRESSIVE)
 683                free_irq(vpfe_dev->ccdc_irq1, vpfe_dev);
 684}
 685
 686static int vpfe_attach_irq(struct vpfe_device *vpfe_dev)
 687{
 688        enum ccdc_frmfmt frame_format;
 689
 690        frame_format = ccdc_dev->hw_ops.get_frame_format();
 691        if (frame_format == CCDC_FRMFMT_PROGRESSIVE) {
 692                return request_irq(vpfe_dev->ccdc_irq1, vdint1_isr,
 693                                    0, "vpfe_capture1",
 694                                    vpfe_dev);
 695        }
 696        return 0;
 697}
 698
 699/* vpfe_stop_ccdc_capture: stop streaming in ccdc/isif */
 700static void vpfe_stop_ccdc_capture(struct vpfe_device *vpfe_dev)
 701{
 702        vpfe_dev->started = 0;
 703        ccdc_dev->hw_ops.enable(0);
 704        if (ccdc_dev->hw_ops.enable_out_to_sdram)
 705                ccdc_dev->hw_ops.enable_out_to_sdram(0);
 706}
 707
 708/*
 709 * vpfe_release : This function deletes buffer queue, frees the
 710 * buffers and the vpfe file  handle
 711 */
 712static int vpfe_release(struct file *file)
 713{
 714        struct vpfe_device *vpfe_dev = video_drvdata(file);
 715        struct vpfe_fh *fh = file->private_data;
 716        struct vpfe_subdev_info *sdinfo;
 717        int ret;
 718
 719        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_release\n");
 720
 721        /* Get the device lock */
 722        mutex_lock(&vpfe_dev->lock);
 723        /* if this instance is doing IO */
 724        if (fh->io_allowed) {
 725                if (vpfe_dev->started) {
 726                        sdinfo = vpfe_dev->current_subdev;
 727                        ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev,
 728                                                         sdinfo->grp_id,
 729                                                         video, s_stream, 0);
 730                        if (ret && (ret != -ENOIOCTLCMD))
 731                                v4l2_err(&vpfe_dev->v4l2_dev,
 732                                "stream off failed in subdev\n");
 733                        vpfe_stop_ccdc_capture(vpfe_dev);
 734                        vpfe_detach_irq(vpfe_dev);
 735                        videobuf_streamoff(&vpfe_dev->buffer_queue);
 736                }
 737                vpfe_dev->io_usrs = 0;
 738                vpfe_dev->numbuffers = config_params.numbuffers;
 739                videobuf_stop(&vpfe_dev->buffer_queue);
 740                videobuf_mmap_free(&vpfe_dev->buffer_queue);
 741        }
 742
 743        /* Decrement device usrs counter */
 744        vpfe_dev->usrs--;
 745        v4l2_fh_del(&fh->fh);
 746        v4l2_fh_exit(&fh->fh);
 747        /* If this is the last file handle */
 748        if (!vpfe_dev->usrs) {
 749                vpfe_dev->initialized = 0;
 750                if (ccdc_dev->hw_ops.close)
 751                        ccdc_dev->hw_ops.close(vpfe_dev->pdev);
 752                module_put(ccdc_dev->owner);
 753        }
 754        mutex_unlock(&vpfe_dev->lock);
 755        file->private_data = NULL;
 756        /* Free memory allocated to file handle object */
 757        kfree(fh);
 758        return 0;
 759}
 760
 761/*
 762 * vpfe_mmap : It is used to map kernel space buffers
 763 * into user spaces
 764 */
 765static int vpfe_mmap(struct file *file, struct vm_area_struct *vma)
 766{
 767        /* Get the device object and file handle object */
 768        struct vpfe_device *vpfe_dev = video_drvdata(file);
 769
 770        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_mmap\n");
 771
 772        return videobuf_mmap_mapper(&vpfe_dev->buffer_queue, vma);
 773}
 774
 775/*
 776 * vpfe_poll: It is used for select/poll system call
 777 */
 778static unsigned int vpfe_poll(struct file *file, poll_table *wait)
 779{
 780        struct vpfe_device *vpfe_dev = video_drvdata(file);
 781
 782        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_poll\n");
 783
 784        if (vpfe_dev->started)
 785                return videobuf_poll_stream(file,
 786                                            &vpfe_dev->buffer_queue, wait);
 787        return 0;
 788}
 789
 790/* vpfe capture driver file operations */
 791static const struct v4l2_file_operations vpfe_fops = {
 792        .owner = THIS_MODULE,
 793        .open = vpfe_open,
 794        .release = vpfe_release,
 795        .unlocked_ioctl = video_ioctl2,
 796        .mmap = vpfe_mmap,
 797        .poll = vpfe_poll
 798};
 799
 800/*
 801 * vpfe_check_format()
 802 * This function adjust the input pixel format as per hardware
 803 * capabilities and update the same in pixfmt.
 804 * Following algorithm used :-
 805 *
 806 *      If given pixformat is not in the vpfe list of pix formats or not
 807 *      supported by the hardware, current value of pixformat in the device
 808 *      is used
 809 *      If given field is not supported, then current field is used. If field
 810 *      is different from current, then it is matched with that from sub device.
 811 *      Minimum height is 2 lines for interlaced or tb field and 1 line for
 812 *      progressive. Maximum height is clamped to active active lines of scan
 813 *      Minimum width is 32 bytes in memory and width is clamped to active
 814 *      pixels of scan.
 815 *      bytesperline is a multiple of 32.
 816 */
 817static const struct vpfe_pixel_format *
 818        vpfe_check_format(struct vpfe_device *vpfe_dev,
 819                          struct v4l2_pix_format *pixfmt)
 820{
 821        u32 min_height = 1, min_width = 32, max_width, max_height;
 822        const struct vpfe_pixel_format *vpfe_pix_fmt;
 823        u32 pix;
 824        int temp, found;
 825
 826        vpfe_pix_fmt = vpfe_lookup_pix_format(pixfmt->pixelformat);
 827        if (NULL == vpfe_pix_fmt) {
 828                /*
 829                 * use current pixel format in the vpfe device. We
 830                 * will find this pix format in the table
 831                 */
 832                pixfmt->pixelformat = vpfe_dev->fmt.fmt.pix.pixelformat;
 833                vpfe_pix_fmt = vpfe_lookup_pix_format(pixfmt->pixelformat);
 834        }
 835
 836        /* check if hw supports it */
 837        temp = 0;
 838        found = 0;
 839        while (ccdc_dev->hw_ops.enum_pix(&pix, temp) >= 0) {
 840                if (vpfe_pix_fmt->fmtdesc.pixelformat == pix) {
 841                        found = 1;
 842                        break;
 843                }
 844                temp++;
 845        }
 846
 847        if (!found) {
 848                /* use current pixel format */
 849                pixfmt->pixelformat = vpfe_dev->fmt.fmt.pix.pixelformat;
 850                /*
 851                 * Since this is currently used in the vpfe device, we
 852                 * will find this pix format in the table
 853                 */
 854                vpfe_pix_fmt = vpfe_lookup_pix_format(pixfmt->pixelformat);
 855        }
 856
 857        /* check what field format is supported */
 858        if (pixfmt->field == V4L2_FIELD_ANY) {
 859                /* if field is any, use current value as default */
 860                pixfmt->field = vpfe_dev->fmt.fmt.pix.field;
 861        }
 862
 863        /*
 864         * if field is not same as current field in the vpfe device
 865         * try matching the field with the sub device field
 866         */
 867        if (vpfe_dev->fmt.fmt.pix.field != pixfmt->field) {
 868                /*
 869                 * If field value is not in the supported fields, use current
 870                 * field used in the device as default
 871                 */
 872                switch (pixfmt->field) {
 873                case V4L2_FIELD_INTERLACED:
 874                case V4L2_FIELD_SEQ_TB:
 875                        /* if sub device is supporting progressive, use that */
 876                        if (!vpfe_dev->std_info.frame_format)
 877                                pixfmt->field = V4L2_FIELD_NONE;
 878                        break;
 879                case V4L2_FIELD_NONE:
 880                        if (vpfe_dev->std_info.frame_format)
 881                                pixfmt->field = V4L2_FIELD_INTERLACED;
 882                        break;
 883
 884                default:
 885                        /* use current field as default */
 886                        pixfmt->field = vpfe_dev->fmt.fmt.pix.field;
 887                        break;
 888                }
 889        }
 890
 891        /* Now adjust image resolutions supported */
 892        if (pixfmt->field == V4L2_FIELD_INTERLACED ||
 893            pixfmt->field == V4L2_FIELD_SEQ_TB)
 894                min_height = 2;
 895
 896        max_width = vpfe_dev->std_info.active_pixels;
 897        max_height = vpfe_dev->std_info.active_lines;
 898        min_width /= vpfe_pix_fmt->bpp;
 899
 900        v4l2_info(&vpfe_dev->v4l2_dev, "width = %d, height = %d, bpp = %d\n",
 901                  pixfmt->width, pixfmt->height, vpfe_pix_fmt->bpp);
 902
 903        pixfmt->width = clamp((pixfmt->width), min_width, max_width);
 904        pixfmt->height = clamp((pixfmt->height), min_height, max_height);
 905
 906        /* If interlaced, adjust height to be a multiple of 2 */
 907        if (pixfmt->field == V4L2_FIELD_INTERLACED)
 908                pixfmt->height &= (~1);
 909        /*
 910         * recalculate bytesperline and sizeimage since width
 911         * and height might have changed
 912         */
 913        pixfmt->bytesperline = (((pixfmt->width * vpfe_pix_fmt->bpp) + 31)
 914                                & ~31);
 915        if (pixfmt->pixelformat == V4L2_PIX_FMT_NV12)
 916                pixfmt->sizeimage =
 917                        pixfmt->bytesperline * pixfmt->height +
 918                        ((pixfmt->bytesperline * pixfmt->height) >> 1);
 919        else
 920                pixfmt->sizeimage = pixfmt->bytesperline * pixfmt->height;
 921
 922        v4l2_info(&vpfe_dev->v4l2_dev, "adjusted width = %d, height ="
 923                 " %d, bpp = %d, bytesperline = %d, sizeimage = %d\n",
 924                 pixfmt->width, pixfmt->height, vpfe_pix_fmt->bpp,
 925                 pixfmt->bytesperline, pixfmt->sizeimage);
 926        return vpfe_pix_fmt;
 927}
 928
 929static int vpfe_querycap(struct file *file, void  *priv,
 930                               struct v4l2_capability *cap)
 931{
 932        struct vpfe_device *vpfe_dev = video_drvdata(file);
 933
 934        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_querycap\n");
 935
 936        cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
 937        cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
 938        strlcpy(cap->driver, CAPTURE_DRV_NAME, sizeof(cap->driver));
 939        strlcpy(cap->bus_info, "VPFE", sizeof(cap->bus_info));
 940        strlcpy(cap->card, vpfe_dev->cfg->card_name, sizeof(cap->card));
 941        return 0;
 942}
 943
 944static int vpfe_g_fmt_vid_cap(struct file *file, void *priv,
 945                                struct v4l2_format *fmt)
 946{
 947        struct vpfe_device *vpfe_dev = video_drvdata(file);
 948
 949        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_g_fmt_vid_cap\n");
 950        /* Fill in the information about format */
 951        *fmt = vpfe_dev->fmt;
 952        return 0;
 953}
 954
 955static int vpfe_enum_fmt_vid_cap(struct file *file, void  *priv,
 956                                   struct v4l2_fmtdesc *fmt)
 957{
 958        struct vpfe_device *vpfe_dev = video_drvdata(file);
 959        const struct vpfe_pixel_format *pix_fmt;
 960        int temp_index;
 961        u32 pix;
 962
 963        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_enum_fmt_vid_cap\n");
 964
 965        if (ccdc_dev->hw_ops.enum_pix(&pix, fmt->index) < 0)
 966                return -EINVAL;
 967
 968        /* Fill in the information about format */
 969        pix_fmt = vpfe_lookup_pix_format(pix);
 970        if (NULL != pix_fmt) {
 971                temp_index = fmt->index;
 972                *fmt = pix_fmt->fmtdesc;
 973                fmt->index = temp_index;
 974                return 0;
 975        }
 976        return -EINVAL;
 977}
 978
 979static int vpfe_s_fmt_vid_cap(struct file *file, void *priv,
 980                                struct v4l2_format *fmt)
 981{
 982        struct vpfe_device *vpfe_dev = video_drvdata(file);
 983        const struct vpfe_pixel_format *pix_fmts;
 984        int ret = 0;
 985
 986        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_fmt_vid_cap\n");
 987
 988        /* If streaming is started, return error */
 989        if (vpfe_dev->started) {
 990                v4l2_err(&vpfe_dev->v4l2_dev, "Streaming is started\n");
 991                return -EBUSY;
 992        }
 993
 994        /* Check for valid frame format */
 995        pix_fmts = vpfe_check_format(vpfe_dev, &fmt->fmt.pix);
 996
 997        if (NULL == pix_fmts)
 998                return -EINVAL;
 999
1000        /* store the pixel format in the device  object */
1001        ret = mutex_lock_interruptible(&vpfe_dev->lock);
1002        if (ret)
1003                return ret;
1004
1005        /* First detach any IRQ if currently attached */
1006        vpfe_detach_irq(vpfe_dev);
1007        vpfe_dev->fmt = *fmt;
1008        /* set image capture parameters in the ccdc */
1009        ret = vpfe_config_ccdc_image_format(vpfe_dev);
1010        mutex_unlock(&vpfe_dev->lock);
1011        return ret;
1012}
1013
1014static int vpfe_try_fmt_vid_cap(struct file *file, void *priv,
1015                                  struct v4l2_format *f)
1016{
1017        struct vpfe_device *vpfe_dev = video_drvdata(file);
1018        const struct vpfe_pixel_format *pix_fmts;
1019
1020        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_try_fmt_vid_cap\n");
1021
1022        pix_fmts = vpfe_check_format(vpfe_dev, &f->fmt.pix);
1023        if (NULL == pix_fmts)
1024                return -EINVAL;
1025        return 0;
1026}
1027
1028/*
1029 * vpfe_get_subdev_input_index - Get subdev index and subdev input index for a
1030 * given app input index
1031 */
1032static int vpfe_get_subdev_input_index(struct vpfe_device *vpfe_dev,
1033                                        int *subdev_index,
1034                                        int *subdev_input_index,
1035                                        int app_input_index)
1036{
1037        struct vpfe_config *cfg = vpfe_dev->cfg;
1038        struct vpfe_subdev_info *sdinfo;
1039        int i, j = 0;
1040
1041        for (i = 0; i < cfg->num_subdevs; i++) {
1042                sdinfo = &cfg->sub_devs[i];
1043                if (app_input_index < (j + sdinfo->num_inputs)) {
1044                        *subdev_index = i;
1045                        *subdev_input_index = app_input_index - j;
1046                        return 0;
1047                }
1048                j += sdinfo->num_inputs;
1049        }
1050        return -EINVAL;
1051}
1052
1053/*
1054 * vpfe_get_app_input - Get app input index for a given subdev input index
1055 * driver stores the input index of the current sub device and translate it
1056 * when application request the current input
1057 */
1058static int vpfe_get_app_input_index(struct vpfe_device *vpfe_dev,
1059                                    int *app_input_index)
1060{
1061        struct vpfe_config *cfg = vpfe_dev->cfg;
1062        struct vpfe_subdev_info *sdinfo;
1063        int i, j = 0;
1064
1065        for (i = 0; i < cfg->num_subdevs; i++) {
1066                sdinfo = &cfg->sub_devs[i];
1067                if (!strcmp(sdinfo->name, vpfe_dev->current_subdev->name)) {
1068                        if (vpfe_dev->current_input >= sdinfo->num_inputs)
1069                                return -1;
1070                        *app_input_index = j + vpfe_dev->current_input;
1071                        return 0;
1072                }
1073                j += sdinfo->num_inputs;
1074        }
1075        return -EINVAL;
1076}
1077
1078static int vpfe_enum_input(struct file *file, void *priv,
1079                                 struct v4l2_input *inp)
1080{
1081        struct vpfe_device *vpfe_dev = video_drvdata(file);
1082        struct vpfe_subdev_info *sdinfo;
1083        int subdev, index ;
1084
1085        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_enum_input\n");
1086
1087        if (vpfe_get_subdev_input_index(vpfe_dev,
1088                                        &subdev,
1089                                        &index,
1090                                        inp->index) < 0) {
1091                v4l2_err(&vpfe_dev->v4l2_dev, "input information not found"
1092                         " for the subdev\n");
1093                return -EINVAL;
1094        }
1095        sdinfo = &vpfe_dev->cfg->sub_devs[subdev];
1096        memcpy(inp, &sdinfo->inputs[index], sizeof(struct v4l2_input));
1097        return 0;
1098}
1099
1100static int vpfe_g_input(struct file *file, void *priv, unsigned int *index)
1101{
1102        struct vpfe_device *vpfe_dev = video_drvdata(file);
1103
1104        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_g_input\n");
1105
1106        return vpfe_get_app_input_index(vpfe_dev, index);
1107}
1108
1109
1110static int vpfe_s_input(struct file *file, void *priv, unsigned int index)
1111{
1112        struct vpfe_device *vpfe_dev = video_drvdata(file);
1113        struct v4l2_subdev *sd;
1114        struct vpfe_subdev_info *sdinfo;
1115        int subdev_index, inp_index;
1116        struct vpfe_route *route;
1117        u32 input = 0, output = 0;
1118        int ret = -EINVAL;
1119
1120        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_input\n");
1121
1122        ret = mutex_lock_interruptible(&vpfe_dev->lock);
1123        if (ret)
1124                return ret;
1125
1126        /*
1127         * If streaming is started return device busy
1128         * error
1129         */
1130        if (vpfe_dev->started) {
1131                v4l2_err(&vpfe_dev->v4l2_dev, "Streaming is on\n");
1132                ret = -EBUSY;
1133                goto unlock_out;
1134        }
1135        ret = vpfe_get_subdev_input_index(vpfe_dev,
1136                                          &subdev_index,
1137                                          &inp_index,
1138                                          index);
1139        if (ret < 0) {
1140                v4l2_err(&vpfe_dev->v4l2_dev, "invalid input index\n");
1141                goto unlock_out;
1142        }
1143
1144        sdinfo = &vpfe_dev->cfg->sub_devs[subdev_index];
1145        sd = vpfe_dev->sd[subdev_index];
1146        route = &sdinfo->routes[inp_index];
1147        if (route && sdinfo->can_route) {
1148                input = route->input;
1149                output = route->output;
1150        }
1151
1152        if (sd)
1153                ret = v4l2_subdev_call(sd, video, s_routing, input, output, 0);
1154
1155        if (ret) {
1156                v4l2_err(&vpfe_dev->v4l2_dev,
1157                        "vpfe_doioctl:error in setting input in decoder\n");
1158                ret = -EINVAL;
1159                goto unlock_out;
1160        }
1161        vpfe_dev->current_subdev = sdinfo;
1162        if (sd)
1163                vpfe_dev->v4l2_dev.ctrl_handler = sd->ctrl_handler;
1164        vpfe_dev->current_input = index;
1165        vpfe_dev->std_index = 0;
1166
1167        /* set the bus/interface parameter for the sub device in ccdc */
1168        ret = ccdc_dev->hw_ops.set_hw_if_params(&sdinfo->ccdc_if_params);
1169        if (ret)
1170                goto unlock_out;
1171
1172        /* set the default image parameters in the device */
1173        ret = vpfe_config_image_format(vpfe_dev,
1174                                vpfe_standards[vpfe_dev->std_index].std_id);
1175unlock_out:
1176        mutex_unlock(&vpfe_dev->lock);
1177        return ret;
1178}
1179
1180static int vpfe_querystd(struct file *file, void *priv, v4l2_std_id *std_id)
1181{
1182        struct vpfe_device *vpfe_dev = video_drvdata(file);
1183        struct vpfe_subdev_info *sdinfo;
1184        int ret = 0;
1185
1186        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_querystd\n");
1187
1188        ret = mutex_lock_interruptible(&vpfe_dev->lock);
1189        sdinfo = vpfe_dev->current_subdev;
1190        if (ret)
1191                return ret;
1192        /* Call querystd function of decoder device */
1193        ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, sdinfo->grp_id,
1194                                         video, querystd, std_id);
1195        mutex_unlock(&vpfe_dev->lock);
1196        return ret;
1197}
1198
1199static int vpfe_s_std(struct file *file, void *priv, v4l2_std_id std_id)
1200{
1201        struct vpfe_device *vpfe_dev = video_drvdata(file);
1202        struct vpfe_subdev_info *sdinfo;
1203        int ret = 0;
1204
1205        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_std\n");
1206
1207        /* Call decoder driver function to set the standard */
1208        ret = mutex_lock_interruptible(&vpfe_dev->lock);
1209        if (ret)
1210                return ret;
1211
1212        sdinfo = vpfe_dev->current_subdev;
1213        /* If streaming is started, return device busy error */
1214        if (vpfe_dev->started) {
1215                v4l2_err(&vpfe_dev->v4l2_dev, "streaming is started\n");
1216                ret = -EBUSY;
1217                goto unlock_out;
1218        }
1219
1220        ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, sdinfo->grp_id,
1221                                         video, s_std, std_id);
1222        if (ret < 0) {
1223                v4l2_err(&vpfe_dev->v4l2_dev, "Failed to set standard\n");
1224                goto unlock_out;
1225        }
1226        ret = vpfe_config_image_format(vpfe_dev, std_id);
1227
1228unlock_out:
1229        mutex_unlock(&vpfe_dev->lock);
1230        return ret;
1231}
1232
1233static int vpfe_g_std(struct file *file, void *priv, v4l2_std_id *std_id)
1234{
1235        struct vpfe_device *vpfe_dev = video_drvdata(file);
1236
1237        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_g_std\n");
1238
1239        *std_id = vpfe_standards[vpfe_dev->std_index].std_id;
1240        return 0;
1241}
1242/*
1243 *  Videobuf operations
1244 */
1245static int vpfe_videobuf_setup(struct videobuf_queue *vq,
1246                                unsigned int *count,
1247                                unsigned int *size)
1248{
1249        struct vpfe_fh *fh = vq->priv_data;
1250        struct vpfe_device *vpfe_dev = fh->vpfe_dev;
1251
1252        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_buffer_setup\n");
1253        *size = vpfe_dev->fmt.fmt.pix.sizeimage;
1254        if (vpfe_dev->memory == V4L2_MEMORY_MMAP &&
1255                vpfe_dev->fmt.fmt.pix.sizeimage > config_params.device_bufsize)
1256                *size = config_params.device_bufsize;
1257
1258        if (*count < config_params.min_numbuffers)
1259                *count = config_params.min_numbuffers;
1260        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev,
1261                "count=%d, size=%d\n", *count, *size);
1262        return 0;
1263}
1264
1265static int vpfe_videobuf_prepare(struct videobuf_queue *vq,
1266                                struct videobuf_buffer *vb,
1267                                enum v4l2_field field)
1268{
1269        struct vpfe_fh *fh = vq->priv_data;
1270        struct vpfe_device *vpfe_dev = fh->vpfe_dev;
1271        unsigned long addr;
1272        int ret;
1273
1274        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_buffer_prepare\n");
1275
1276        /* If buffer is not initialized, initialize it */
1277        if (VIDEOBUF_NEEDS_INIT == vb->state) {
1278                vb->width = vpfe_dev->fmt.fmt.pix.width;
1279                vb->height = vpfe_dev->fmt.fmt.pix.height;
1280                vb->size = vpfe_dev->fmt.fmt.pix.sizeimage;
1281                vb->field = field;
1282
1283                ret = videobuf_iolock(vq, vb, NULL);
1284                if (ret < 0)
1285                        return ret;
1286
1287                addr = videobuf_to_dma_contig(vb);
1288                /* Make sure user addresses are aligned to 32 bytes */
1289                if (!ALIGN(addr, 32))
1290                        return -EINVAL;
1291
1292                vb->state = VIDEOBUF_PREPARED;
1293        }
1294        return 0;
1295}
1296
1297static void vpfe_videobuf_queue(struct videobuf_queue *vq,
1298                                struct videobuf_buffer *vb)
1299{
1300        /* Get the file handle object and device object */
1301        struct vpfe_fh *fh = vq->priv_data;
1302        struct vpfe_device *vpfe_dev = fh->vpfe_dev;
1303        unsigned long flags;
1304
1305        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_buffer_queue\n");
1306
1307        /* add the buffer to the DMA queue */
1308        spin_lock_irqsave(&vpfe_dev->dma_queue_lock, flags);
1309        list_add_tail(&vb->queue, &vpfe_dev->dma_queue);
1310        spin_unlock_irqrestore(&vpfe_dev->dma_queue_lock, flags);
1311
1312        /* Change state of the buffer */
1313        vb->state = VIDEOBUF_QUEUED;
1314}
1315
1316static void vpfe_videobuf_release(struct videobuf_queue *vq,
1317                                  struct videobuf_buffer *vb)
1318{
1319        struct vpfe_fh *fh = vq->priv_data;
1320        struct vpfe_device *vpfe_dev = fh->vpfe_dev;
1321        unsigned long flags;
1322
1323        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_videobuf_release\n");
1324
1325        /*
1326         * We need to flush the buffer from the dma queue since
1327         * they are de-allocated
1328         */
1329        spin_lock_irqsave(&vpfe_dev->dma_queue_lock, flags);
1330        INIT_LIST_HEAD(&vpfe_dev->dma_queue);
1331        spin_unlock_irqrestore(&vpfe_dev->dma_queue_lock, flags);
1332        videobuf_dma_contig_free(vq, vb);
1333        vb->state = VIDEOBUF_NEEDS_INIT;
1334}
1335
1336static struct videobuf_queue_ops vpfe_videobuf_qops = {
1337        .buf_setup      = vpfe_videobuf_setup,
1338        .buf_prepare    = vpfe_videobuf_prepare,
1339        .buf_queue      = vpfe_videobuf_queue,
1340        .buf_release    = vpfe_videobuf_release,
1341};
1342
1343/*
1344 * vpfe_reqbufs. currently support REQBUF only once opening
1345 * the device.
1346 */
1347static int vpfe_reqbufs(struct file *file, void *priv,
1348                        struct v4l2_requestbuffers *req_buf)
1349{
1350        struct vpfe_device *vpfe_dev = video_drvdata(file);
1351        struct vpfe_fh *fh = file->private_data;
1352        int ret = 0;
1353
1354        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_reqbufs\n");
1355
1356        if (V4L2_BUF_TYPE_VIDEO_CAPTURE != req_buf->type) {
1357                v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buffer type\n");
1358                return -EINVAL;
1359        }
1360
1361        ret = mutex_lock_interruptible(&vpfe_dev->lock);
1362        if (ret)
1363                return ret;
1364
1365        if (vpfe_dev->io_usrs != 0) {
1366                v4l2_err(&vpfe_dev->v4l2_dev, "Only one IO user allowed\n");
1367                ret = -EBUSY;
1368                goto unlock_out;
1369        }
1370
1371        vpfe_dev->memory = req_buf->memory;
1372        videobuf_queue_dma_contig_init(&vpfe_dev->buffer_queue,
1373                                &vpfe_videobuf_qops,
1374                                vpfe_dev->pdev,
1375                                &vpfe_dev->irqlock,
1376                                req_buf->type,
1377                                vpfe_dev->fmt.fmt.pix.field,
1378                                sizeof(struct videobuf_buffer),
1379                                fh, NULL);
1380
1381        fh->io_allowed = 1;
1382        vpfe_dev->io_usrs = 1;
1383        INIT_LIST_HEAD(&vpfe_dev->dma_queue);
1384        ret = videobuf_reqbufs(&vpfe_dev->buffer_queue, req_buf);
1385unlock_out:
1386        mutex_unlock(&vpfe_dev->lock);
1387        return ret;
1388}
1389
1390static int vpfe_querybuf(struct file *file, void *priv,
1391                         struct v4l2_buffer *buf)
1392{
1393        struct vpfe_device *vpfe_dev = video_drvdata(file);
1394
1395        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_querybuf\n");
1396
1397        if (V4L2_BUF_TYPE_VIDEO_CAPTURE != buf->type) {
1398                v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n");
1399                return  -EINVAL;
1400        }
1401
1402        if (vpfe_dev->memory != V4L2_MEMORY_MMAP) {
1403                v4l2_err(&vpfe_dev->v4l2_dev, "Invalid memory\n");
1404                return -EINVAL;
1405        }
1406        /* Call videobuf_querybuf to get information */
1407        return videobuf_querybuf(&vpfe_dev->buffer_queue, buf);
1408}
1409
1410static int vpfe_qbuf(struct file *file, void *priv,
1411                     struct v4l2_buffer *p)
1412{
1413        struct vpfe_device *vpfe_dev = video_drvdata(file);
1414        struct vpfe_fh *fh = file->private_data;
1415
1416        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_qbuf\n");
1417
1418        if (V4L2_BUF_TYPE_VIDEO_CAPTURE != p->type) {
1419                v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n");
1420                return -EINVAL;
1421        }
1422
1423        /*
1424         * If this file handle is not allowed to do IO,
1425         * return error
1426         */
1427        if (!fh->io_allowed) {
1428                v4l2_err(&vpfe_dev->v4l2_dev, "fh->io_allowed\n");
1429                return -EACCES;
1430        }
1431        return videobuf_qbuf(&vpfe_dev->buffer_queue, p);
1432}
1433
1434static int vpfe_dqbuf(struct file *file, void *priv,
1435                      struct v4l2_buffer *buf)
1436{
1437        struct vpfe_device *vpfe_dev = video_drvdata(file);
1438
1439        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_dqbuf\n");
1440
1441        if (V4L2_BUF_TYPE_VIDEO_CAPTURE != buf->type) {
1442                v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n");
1443                return -EINVAL;
1444        }
1445        return videobuf_dqbuf(&vpfe_dev->buffer_queue,
1446                                      buf, file->f_flags & O_NONBLOCK);
1447}
1448
1449/*
1450 * vpfe_calculate_offsets : This function calculates buffers offset
1451 * for top and bottom field
1452 */
1453static void vpfe_calculate_offsets(struct vpfe_device *vpfe_dev)
1454{
1455        struct v4l2_rect image_win;
1456
1457        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_calculate_offsets\n");
1458
1459        ccdc_dev->hw_ops.get_image_window(&image_win);
1460        vpfe_dev->field_off = image_win.height * image_win.width;
1461}
1462
1463/* vpfe_start_ccdc_capture: start streaming in ccdc/isif */
1464static void vpfe_start_ccdc_capture(struct vpfe_device *vpfe_dev)
1465{
1466        ccdc_dev->hw_ops.enable(1);
1467        if (ccdc_dev->hw_ops.enable_out_to_sdram)
1468                ccdc_dev->hw_ops.enable_out_to_sdram(1);
1469        vpfe_dev->started = 1;
1470}
1471
1472/*
1473 * vpfe_streamon. Assume the DMA queue is not empty.
1474 * application is expected to call QBUF before calling
1475 * this ioctl. If not, driver returns error
1476 */
1477static int vpfe_streamon(struct file *file, void *priv,
1478                         enum v4l2_buf_type buf_type)
1479{
1480        struct vpfe_device *vpfe_dev = video_drvdata(file);
1481        struct vpfe_fh *fh = file->private_data;
1482        struct vpfe_subdev_info *sdinfo;
1483        unsigned long addr;
1484        int ret = 0;
1485
1486        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_streamon\n");
1487
1488        if (V4L2_BUF_TYPE_VIDEO_CAPTURE != buf_type) {
1489                v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n");
1490                return -EINVAL;
1491        }
1492
1493        /* If file handle is not allowed IO, return error */
1494        if (!fh->io_allowed) {
1495                v4l2_err(&vpfe_dev->v4l2_dev, "fh->io_allowed\n");
1496                return -EACCES;
1497        }
1498
1499        sdinfo = vpfe_dev->current_subdev;
1500        ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, sdinfo->grp_id,
1501                                        video, s_stream, 1);
1502
1503        if (ret && (ret != -ENOIOCTLCMD)) {
1504                v4l2_err(&vpfe_dev->v4l2_dev, "stream on failed in subdev\n");
1505                return -EINVAL;
1506        }
1507
1508        /* If buffer queue is empty, return error */
1509        if (list_empty(&vpfe_dev->buffer_queue.stream)) {
1510                v4l2_err(&vpfe_dev->v4l2_dev, "buffer queue is empty\n");
1511                return -EIO;
1512        }
1513
1514        /* Call videobuf_streamon to start streaming * in videobuf */
1515        ret = videobuf_streamon(&vpfe_dev->buffer_queue);
1516        if (ret)
1517                return ret;
1518
1519
1520        ret = mutex_lock_interruptible(&vpfe_dev->lock);
1521        if (ret)
1522                goto streamoff;
1523        /* Get the next frame from the buffer queue */
1524        vpfe_dev->next_frm = list_entry(vpfe_dev->dma_queue.next,
1525                                        struct videobuf_buffer, queue);
1526        vpfe_dev->cur_frm = vpfe_dev->next_frm;
1527        /* Remove buffer from the buffer queue */
1528        list_del(&vpfe_dev->cur_frm->queue);
1529        /* Mark state of the current frame to active */
1530        vpfe_dev->cur_frm->state = VIDEOBUF_ACTIVE;
1531        /* Initialize field_id and started member */
1532        vpfe_dev->field_id = 0;
1533        addr = videobuf_to_dma_contig(vpfe_dev->cur_frm);
1534
1535        /* Calculate field offset */
1536        vpfe_calculate_offsets(vpfe_dev);
1537
1538        if (vpfe_attach_irq(vpfe_dev) < 0) {
1539                v4l2_err(&vpfe_dev->v4l2_dev,
1540                         "Error in attaching interrupt handle\n");
1541                ret = -EFAULT;
1542                goto unlock_out;
1543        }
1544        if (ccdc_dev->hw_ops.configure() < 0) {
1545                v4l2_err(&vpfe_dev->v4l2_dev,
1546                         "Error in configuring ccdc\n");
1547                ret = -EINVAL;
1548                goto unlock_out;
1549        }
1550        ccdc_dev->hw_ops.setfbaddr((unsigned long)(addr));
1551        vpfe_start_ccdc_capture(vpfe_dev);
1552        mutex_unlock(&vpfe_dev->lock);
1553        return ret;
1554unlock_out:
1555        mutex_unlock(&vpfe_dev->lock);
1556streamoff:
1557        ret = videobuf_streamoff(&vpfe_dev->buffer_queue);
1558        return ret;
1559}
1560
1561static int vpfe_streamoff(struct file *file, void *priv,
1562                          enum v4l2_buf_type buf_type)
1563{
1564        struct vpfe_device *vpfe_dev = video_drvdata(file);
1565        struct vpfe_fh *fh = file->private_data;
1566        struct vpfe_subdev_info *sdinfo;
1567        int ret = 0;
1568
1569        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_streamoff\n");
1570
1571        if (V4L2_BUF_TYPE_VIDEO_CAPTURE != buf_type) {
1572                v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n");
1573                return -EINVAL;
1574        }
1575
1576        /* If io is allowed for this file handle, return error */
1577        if (!fh->io_allowed) {
1578                v4l2_err(&vpfe_dev->v4l2_dev, "fh->io_allowed\n");
1579                return -EACCES;
1580        }
1581
1582        /* If streaming is not started, return error */
1583        if (!vpfe_dev->started) {
1584                v4l2_err(&vpfe_dev->v4l2_dev, "device started\n");
1585                return -EINVAL;
1586        }
1587
1588        ret = mutex_lock_interruptible(&vpfe_dev->lock);
1589        if (ret)
1590                return ret;
1591
1592        vpfe_stop_ccdc_capture(vpfe_dev);
1593        vpfe_detach_irq(vpfe_dev);
1594
1595        sdinfo = vpfe_dev->current_subdev;
1596        ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, sdinfo->grp_id,
1597                                        video, s_stream, 0);
1598
1599        if (ret && (ret != -ENOIOCTLCMD))
1600                v4l2_err(&vpfe_dev->v4l2_dev, "stream off failed in subdev\n");
1601        ret = videobuf_streamoff(&vpfe_dev->buffer_queue);
1602        mutex_unlock(&vpfe_dev->lock);
1603        return ret;
1604}
1605
1606static int vpfe_cropcap(struct file *file, void *priv,
1607                              struct v4l2_cropcap *crop)
1608{
1609        struct vpfe_device *vpfe_dev = video_drvdata(file);
1610
1611        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_cropcap\n");
1612
1613        if (vpfe_dev->std_index >= ARRAY_SIZE(vpfe_standards))
1614                return -EINVAL;
1615
1616        memset(crop, 0, sizeof(struct v4l2_cropcap));
1617        crop->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1618        crop->bounds.width = crop->defrect.width =
1619                vpfe_standards[vpfe_dev->std_index].width;
1620        crop->bounds.height = crop->defrect.height =
1621                vpfe_standards[vpfe_dev->std_index].height;
1622        crop->pixelaspect = vpfe_standards[vpfe_dev->std_index].pixelaspect;
1623        return 0;
1624}
1625
1626static int vpfe_g_crop(struct file *file, void *priv,
1627                             struct v4l2_crop *crop)
1628{
1629        struct vpfe_device *vpfe_dev = video_drvdata(file);
1630
1631        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_g_crop\n");
1632
1633        crop->c = vpfe_dev->crop;
1634        return 0;
1635}
1636
1637static int vpfe_s_crop(struct file *file, void *priv,
1638                             const struct v4l2_crop *crop)
1639{
1640        struct vpfe_device *vpfe_dev = video_drvdata(file);
1641        struct v4l2_rect rect = crop->c;
1642        int ret = 0;
1643
1644        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_crop\n");
1645
1646        if (vpfe_dev->started) {
1647                /* make sure streaming is not started */
1648                v4l2_err(&vpfe_dev->v4l2_dev,
1649                        "Cannot change crop when streaming is ON\n");
1650                return -EBUSY;
1651        }
1652
1653        ret = mutex_lock_interruptible(&vpfe_dev->lock);
1654        if (ret)
1655                return ret;
1656
1657        if (rect.top < 0 || rect.left < 0) {
1658                v4l2_err(&vpfe_dev->v4l2_dev,
1659                        "doesn't support negative values for top & left\n");
1660                ret = -EINVAL;
1661                goto unlock_out;
1662        }
1663
1664        /* adjust the width to 16 pixel boundary */
1665        rect.width = ((rect.width + 15) & ~0xf);
1666
1667        /* make sure parameters are valid */
1668        if ((rect.left + rect.width >
1669                vpfe_dev->std_info.active_pixels) ||
1670            (rect.top + rect.height >
1671                vpfe_dev->std_info.active_lines)) {
1672                v4l2_err(&vpfe_dev->v4l2_dev, "Error in S_CROP params\n");
1673                ret = -EINVAL;
1674                goto unlock_out;
1675        }
1676        ccdc_dev->hw_ops.set_image_window(&rect);
1677        vpfe_dev->fmt.fmt.pix.width = rect.width;
1678        vpfe_dev->fmt.fmt.pix.height = rect.height;
1679        vpfe_dev->fmt.fmt.pix.bytesperline =
1680                ccdc_dev->hw_ops.get_line_length();
1681        vpfe_dev->fmt.fmt.pix.sizeimage =
1682                vpfe_dev->fmt.fmt.pix.bytesperline *
1683                vpfe_dev->fmt.fmt.pix.height;
1684        vpfe_dev->crop = rect;
1685unlock_out:
1686        mutex_unlock(&vpfe_dev->lock);
1687        return ret;
1688}
1689
1690
1691static long vpfe_param_handler(struct file *file, void *priv,
1692                bool valid_prio, unsigned int cmd, void *param)
1693{
1694        struct vpfe_device *vpfe_dev = video_drvdata(file);
1695        int ret = 0;
1696
1697        v4l2_dbg(2, debug, &vpfe_dev->v4l2_dev, "vpfe_param_handler\n");
1698
1699        if (vpfe_dev->started) {
1700                /* only allowed if streaming is not started */
1701                v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev,
1702                        "device already started\n");
1703                return -EBUSY;
1704        }
1705
1706        ret = mutex_lock_interruptible(&vpfe_dev->lock);
1707        if (ret)
1708                return ret;
1709
1710        switch (cmd) {
1711        case VPFE_CMD_S_CCDC_RAW_PARAMS:
1712                v4l2_warn(&vpfe_dev->v4l2_dev,
1713                          "VPFE_CMD_S_CCDC_RAW_PARAMS: experimental ioctl\n");
1714                if (ccdc_dev->hw_ops.set_params) {
1715                        ret = ccdc_dev->hw_ops.set_params(param);
1716                        if (ret) {
1717                                v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev,
1718                                        "Error setting parameters in CCDC\n");
1719                                goto unlock_out;
1720                        }
1721                        ret = vpfe_get_ccdc_image_format(vpfe_dev,
1722                                                         &vpfe_dev->fmt);
1723                        if (ret < 0) {
1724                                v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev,
1725                                        "Invalid image format at CCDC\n");
1726                                goto unlock_out;
1727                        }
1728                } else {
1729                        ret = -EINVAL;
1730                        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev,
1731                                "VPFE_CMD_S_CCDC_RAW_PARAMS not supported\n");
1732                }
1733                break;
1734        default:
1735                ret = -ENOTTY;
1736        }
1737unlock_out:
1738        mutex_unlock(&vpfe_dev->lock);
1739        return ret;
1740}
1741
1742
1743/* vpfe capture ioctl operations */
1744static const struct v4l2_ioctl_ops vpfe_ioctl_ops = {
1745        .vidioc_querycap         = vpfe_querycap,
1746        .vidioc_g_fmt_vid_cap    = vpfe_g_fmt_vid_cap,
1747        .vidioc_enum_fmt_vid_cap = vpfe_enum_fmt_vid_cap,
1748        .vidioc_s_fmt_vid_cap    = vpfe_s_fmt_vid_cap,
1749        .vidioc_try_fmt_vid_cap  = vpfe_try_fmt_vid_cap,
1750        .vidioc_enum_input       = vpfe_enum_input,
1751        .vidioc_g_input          = vpfe_g_input,
1752        .vidioc_s_input          = vpfe_s_input,
1753        .vidioc_querystd         = vpfe_querystd,
1754        .vidioc_s_std            = vpfe_s_std,
1755        .vidioc_g_std            = vpfe_g_std,
1756        .vidioc_reqbufs          = vpfe_reqbufs,
1757        .vidioc_querybuf         = vpfe_querybuf,
1758        .vidioc_qbuf             = vpfe_qbuf,
1759        .vidioc_dqbuf            = vpfe_dqbuf,
1760        .vidioc_streamon         = vpfe_streamon,
1761        .vidioc_streamoff        = vpfe_streamoff,
1762        .vidioc_cropcap          = vpfe_cropcap,
1763        .vidioc_g_crop           = vpfe_g_crop,
1764        .vidioc_s_crop           = vpfe_s_crop,
1765        .vidioc_default          = vpfe_param_handler,
1766};
1767
1768static struct vpfe_device *vpfe_initialize(void)
1769{
1770        struct vpfe_device *vpfe_dev;
1771
1772        /* Default number of buffers should be 3 */
1773        if ((numbuffers > 0) &&
1774            (numbuffers < config_params.min_numbuffers))
1775                numbuffers = config_params.min_numbuffers;
1776
1777        /*
1778         * Set buffer size to min buffers size if invalid buffer size is
1779         * given
1780         */
1781        if (bufsize < config_params.min_bufsize)
1782                bufsize = config_params.min_bufsize;
1783
1784        config_params.numbuffers = numbuffers;
1785
1786        if (numbuffers)
1787                config_params.device_bufsize = bufsize;
1788
1789        /* Allocate memory for device objects */
1790        vpfe_dev = kzalloc(sizeof(*vpfe_dev), GFP_KERNEL);
1791
1792        return vpfe_dev;
1793}
1794
1795/*
1796 * vpfe_probe : This function creates device entries by register
1797 * itself to the V4L2 driver and initializes fields of each
1798 * device objects
1799 */
1800static int vpfe_probe(struct platform_device *pdev)
1801{
1802        struct vpfe_subdev_info *sdinfo;
1803        struct vpfe_config *vpfe_cfg;
1804        struct resource *res1;
1805        struct vpfe_device *vpfe_dev;
1806        struct i2c_adapter *i2c_adap;
1807        struct video_device *vfd;
1808        int ret = -ENOMEM, i, j;
1809        int num_subdevs = 0;
1810
1811        /* Get the pointer to the device object */
1812        vpfe_dev = vpfe_initialize();
1813
1814        if (!vpfe_dev) {
1815                v4l2_err(pdev->dev.driver,
1816                        "Failed to allocate memory for vpfe_dev\n");
1817                return ret;
1818        }
1819
1820        vpfe_dev->pdev = &pdev->dev;
1821
1822        if (NULL == pdev->dev.platform_data) {
1823                v4l2_err(pdev->dev.driver, "Unable to get vpfe config\n");
1824                ret = -ENODEV;
1825                goto probe_free_dev_mem;
1826        }
1827
1828        vpfe_cfg = pdev->dev.platform_data;
1829        vpfe_dev->cfg = vpfe_cfg;
1830        if (NULL == vpfe_cfg->ccdc ||
1831            NULL == vpfe_cfg->card_name ||
1832            NULL == vpfe_cfg->sub_devs) {
1833                v4l2_err(pdev->dev.driver, "null ptr in vpfe_cfg\n");
1834                ret = -ENOENT;
1835                goto probe_free_dev_mem;
1836        }
1837
1838        /* Allocate memory for ccdc configuration */
1839        ccdc_cfg = kmalloc(sizeof(struct ccdc_config), GFP_KERNEL);
1840        if (NULL == ccdc_cfg) {
1841                v4l2_err(pdev->dev.driver,
1842                         "Memory allocation failed for ccdc_cfg\n");
1843                goto probe_free_dev_mem;
1844        }
1845
1846        mutex_lock(&ccdc_lock);
1847
1848        strncpy(ccdc_cfg->name, vpfe_cfg->ccdc, 32);
1849        /* Get VINT0 irq resource */
1850        res1 = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
1851        if (!res1) {
1852                v4l2_err(pdev->dev.driver,
1853                         "Unable to get interrupt for VINT0\n");
1854                ret = -ENODEV;
1855                goto probe_free_ccdc_cfg_mem;
1856        }
1857        vpfe_dev->ccdc_irq0 = res1->start;
1858
1859        /* Get VINT1 irq resource */
1860        res1 = platform_get_resource(pdev, IORESOURCE_IRQ, 1);
1861        if (!res1) {
1862                v4l2_err(pdev->dev.driver,
1863                         "Unable to get interrupt for VINT1\n");
1864                ret = -ENODEV;
1865                goto probe_free_ccdc_cfg_mem;
1866        }
1867        vpfe_dev->ccdc_irq1 = res1->start;
1868
1869        ret = request_irq(vpfe_dev->ccdc_irq0, vpfe_isr, 0,
1870                          "vpfe_capture0", vpfe_dev);
1871
1872        if (0 != ret) {
1873                v4l2_err(pdev->dev.driver, "Unable to request interrupt\n");
1874                goto probe_free_ccdc_cfg_mem;
1875        }
1876
1877        vfd = &vpfe_dev->video_dev;
1878        /* Initialize field of video device */
1879        vfd->release            = video_device_release_empty;
1880        vfd->fops               = &vpfe_fops;
1881        vfd->ioctl_ops          = &vpfe_ioctl_ops;
1882        vfd->tvnorms            = 0;
1883        vfd->v4l2_dev           = &vpfe_dev->v4l2_dev;
1884        snprintf(vfd->name, sizeof(vfd->name),
1885                 "%s_V%d.%d.%d",
1886                 CAPTURE_DRV_NAME,
1887                 (VPFE_CAPTURE_VERSION_CODE >> 16) & 0xff,
1888                 (VPFE_CAPTURE_VERSION_CODE >> 8) & 0xff,
1889                 (VPFE_CAPTURE_VERSION_CODE) & 0xff);
1890
1891        ret = v4l2_device_register(&pdev->dev, &vpfe_dev->v4l2_dev);
1892        if (ret) {
1893                v4l2_err(pdev->dev.driver,
1894                        "Unable to register v4l2 device.\n");
1895                goto probe_out_release_irq;
1896        }
1897        v4l2_info(&vpfe_dev->v4l2_dev, "v4l2 device registered\n");
1898        spin_lock_init(&vpfe_dev->irqlock);
1899        spin_lock_init(&vpfe_dev->dma_queue_lock);
1900        mutex_init(&vpfe_dev->lock);
1901
1902        /* Initialize field of the device objects */
1903        vpfe_dev->numbuffers = config_params.numbuffers;
1904
1905        /* register video device */
1906        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev,
1907                "trying to register vpfe device.\n");
1908        v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev,
1909                "video_dev=%p\n", &vpfe_dev->video_dev);
1910        vpfe_dev->fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1911        ret = video_register_device(&vpfe_dev->video_dev,
1912                                    VFL_TYPE_GRABBER, -1);
1913
1914        if (ret) {
1915                v4l2_err(pdev->dev.driver,
1916                        "Unable to register video device.\n");
1917                goto probe_out_v4l2_unregister;
1918        }
1919
1920        v4l2_info(&vpfe_dev->v4l2_dev, "video device registered\n");
1921        /* set the driver data in platform device */
1922        platform_set_drvdata(pdev, vpfe_dev);
1923        /* set driver private data */
1924        video_set_drvdata(&vpfe_dev->video_dev, vpfe_dev);
1925        i2c_adap = i2c_get_adapter(vpfe_cfg->i2c_adapter_id);
1926        num_subdevs = vpfe_cfg->num_subdevs;
1927        vpfe_dev->sd = kmalloc(sizeof(struct v4l2_subdev *) * num_subdevs,
1928                                GFP_KERNEL);
1929        if (NULL == vpfe_dev->sd) {
1930                v4l2_err(&vpfe_dev->v4l2_dev,
1931                        "unable to allocate memory for subdevice pointers\n");
1932                ret = -ENOMEM;
1933                goto probe_out_video_unregister;
1934        }
1935
1936        for (i = 0; i < num_subdevs; i++) {
1937                struct v4l2_input *inps;
1938
1939                sdinfo = &vpfe_cfg->sub_devs[i];
1940
1941                /* Load up the subdevice */
1942                vpfe_dev->sd[i] =
1943                        v4l2_i2c_new_subdev_board(&vpfe_dev->v4l2_dev,
1944                                                  i2c_adap,
1945                                                  &sdinfo->board_info,
1946                                                  NULL);
1947                if (vpfe_dev->sd[i]) {
1948                        v4l2_info(&vpfe_dev->v4l2_dev,
1949                                  "v4l2 sub device %s registered\n",
1950                                  sdinfo->name);
1951                        vpfe_dev->sd[i]->grp_id = sdinfo->grp_id;
1952                        /* update tvnorms from the sub devices */
1953                        for (j = 0; j < sdinfo->num_inputs; j++) {
1954                                inps = &sdinfo->inputs[j];
1955                                vfd->tvnorms |= inps->std;
1956                        }
1957                } else {
1958                        v4l2_info(&vpfe_dev->v4l2_dev,
1959                                  "v4l2 sub device %s register fails\n",
1960                                  sdinfo->name);
1961                        goto probe_sd_out;
1962                }
1963        }
1964
1965        /* set first sub device as current one */
1966        vpfe_dev->current_subdev = &vpfe_cfg->sub_devs[0];
1967        vpfe_dev->v4l2_dev.ctrl_handler = vpfe_dev->sd[0]->ctrl_handler;
1968
1969        /* We have at least one sub device to work with */
1970        mutex_unlock(&ccdc_lock);
1971        return 0;
1972
1973probe_sd_out:
1974        kfree(vpfe_dev->sd);
1975probe_out_video_unregister:
1976        video_unregister_device(&vpfe_dev->video_dev);
1977probe_out_v4l2_unregister:
1978        v4l2_device_unregister(&vpfe_dev->v4l2_dev);
1979probe_out_release_irq:
1980        free_irq(vpfe_dev->ccdc_irq0, vpfe_dev);
1981probe_free_ccdc_cfg_mem:
1982        kfree(ccdc_cfg);
1983        mutex_unlock(&ccdc_lock);
1984probe_free_dev_mem:
1985        kfree(vpfe_dev);
1986        return ret;
1987}
1988
1989/*
1990 * vpfe_remove : It un-register device from V4L2 driver
1991 */
1992static int vpfe_remove(struct platform_device *pdev)
1993{
1994        struct vpfe_device *vpfe_dev = platform_get_drvdata(pdev);
1995
1996        v4l2_info(pdev->dev.driver, "vpfe_remove\n");
1997
1998        free_irq(vpfe_dev->ccdc_irq0, vpfe_dev);
1999        kfree(vpfe_dev->sd);
2000        v4l2_device_unregister(&vpfe_dev->v4l2_dev);
2001        video_unregister_device(&vpfe_dev->video_dev);
2002        kfree(vpfe_dev);
2003        kfree(ccdc_cfg);
2004        return 0;
2005}
2006
2007static int vpfe_suspend(struct device *dev)
2008{
2009        return 0;
2010}
2011
2012static int vpfe_resume(struct device *dev)
2013{
2014        return 0;
2015}
2016
2017static const struct dev_pm_ops vpfe_dev_pm_ops = {
2018        .suspend = vpfe_suspend,
2019        .resume = vpfe_resume,
2020};
2021
2022static struct platform_driver vpfe_driver = {
2023        .driver = {
2024                .name = CAPTURE_DRV_NAME,
2025                .pm = &vpfe_dev_pm_ops,
2026        },
2027        .probe = vpfe_probe,
2028        .remove = vpfe_remove,
2029};
2030
2031module_platform_driver(vpfe_driver);
2032