linux/drivers/media/platform/blackfin/bfin_capture.c
<<
>>
Prefs
   1/*
   2 * Analog Devices video capture driver
   3 *
   4 * Copyright (c) 2011 Analog Devices Inc.
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it will be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 */
  15
  16#include <linux/completion.h>
  17#include <linux/delay.h>
  18#include <linux/errno.h>
  19#include <linux/fs.h>
  20#include <linux/i2c.h>
  21#include <linux/init.h>
  22#include <linux/interrupt.h>
  23#include <linux/io.h>
  24#include <linux/mm.h>
  25#include <linux/module.h>
  26#include <linux/platform_device.h>
  27#include <linux/slab.h>
  28#include <linux/time.h>
  29#include <linux/types.h>
  30
  31#include <media/v4l2-common.h>
  32#include <media/v4l2-ctrls.h>
  33#include <media/v4l2-device.h>
  34#include <media/v4l2-ioctl.h>
  35#include <media/videobuf2-dma-contig.h>
  36
  37#include <asm/dma.h>
  38
  39#include <media/blackfin/bfin_capture.h>
  40#include <media/blackfin/ppi.h>
  41
  42#define CAPTURE_DRV_NAME        "bfin_capture"
  43
  44struct bcap_format {
  45        char *desc;
  46        u32 pixelformat;
  47        u32 mbus_code;
  48        int bpp; /* bits per pixel */
  49        int dlen; /* data length for ppi in bits */
  50};
  51
  52struct bcap_buffer {
  53        struct vb2_v4l2_buffer vb;
  54        struct list_head list;
  55};
  56
  57struct bcap_device {
  58        /* capture device instance */
  59        struct v4l2_device v4l2_dev;
  60        /* v4l2 control handler */
  61        struct v4l2_ctrl_handler ctrl_handler;
  62        /* device node data */
  63        struct video_device video_dev;
  64        /* sub device instance */
  65        struct v4l2_subdev *sd;
  66        /* capture config */
  67        struct bfin_capture_config *cfg;
  68        /* ppi interface */
  69        struct ppi_if *ppi;
  70        /* current input */
  71        unsigned int cur_input;
  72        /* current selected standard */
  73        v4l2_std_id std;
  74        /* current selected dv_timings */
  75        struct v4l2_dv_timings dv_timings;
  76        /* used to store pixel format */
  77        struct v4l2_pix_format fmt;
  78        /* bits per pixel*/
  79        int bpp;
  80        /* data length for ppi in bits */
  81        int dlen;
  82        /* used to store sensor supported format */
  83        struct bcap_format *sensor_formats;
  84        /* number of sensor formats array */
  85        int num_sensor_formats;
  86        /* pointing to current video buffer */
  87        struct bcap_buffer *cur_frm;
  88        /* buffer queue used in videobuf2 */
  89        struct vb2_queue buffer_queue;
  90        /* queue of filled frames */
  91        struct list_head dma_queue;
  92        /* used in videobuf2 callback */
  93        spinlock_t lock;
  94        /* used to access capture device */
  95        struct mutex mutex;
  96        /* used to wait ppi to complete one transfer */
  97        struct completion comp;
  98        /* prepare to stop */
  99        bool stop;
 100        /* vb2 buffer sequence counter */
 101        unsigned sequence;
 102};
 103
 104static const struct bcap_format bcap_formats[] = {
 105        {
 106                .desc        = "YCbCr 4:2:2 Interleaved UYVY",
 107                .pixelformat = V4L2_PIX_FMT_UYVY,
 108                .mbus_code   = MEDIA_BUS_FMT_UYVY8_2X8,
 109                .bpp         = 16,
 110                .dlen        = 8,
 111        },
 112        {
 113                .desc        = "YCbCr 4:2:2 Interleaved YUYV",
 114                .pixelformat = V4L2_PIX_FMT_YUYV,
 115                .mbus_code   = MEDIA_BUS_FMT_YUYV8_2X8,
 116                .bpp         = 16,
 117                .dlen        = 8,
 118        },
 119        {
 120                .desc        = "YCbCr 4:2:2 Interleaved UYVY",
 121                .pixelformat = V4L2_PIX_FMT_UYVY,
 122                .mbus_code   = MEDIA_BUS_FMT_UYVY8_1X16,
 123                .bpp         = 16,
 124                .dlen        = 16,
 125        },
 126        {
 127                .desc        = "RGB 565",
 128                .pixelformat = V4L2_PIX_FMT_RGB565,
 129                .mbus_code   = MEDIA_BUS_FMT_RGB565_2X8_LE,
 130                .bpp         = 16,
 131                .dlen        = 8,
 132        },
 133        {
 134                .desc        = "RGB 444",
 135                .pixelformat = V4L2_PIX_FMT_RGB444,
 136                .mbus_code   = MEDIA_BUS_FMT_RGB444_2X8_PADHI_LE,
 137                .bpp         = 16,
 138                .dlen        = 8,
 139        },
 140
 141};
 142#define BCAP_MAX_FMTS ARRAY_SIZE(bcap_formats)
 143
 144static irqreturn_t bcap_isr(int irq, void *dev_id);
 145
 146static struct bcap_buffer *to_bcap_vb(struct vb2_v4l2_buffer *vb)
 147{
 148        return container_of(vb, struct bcap_buffer, vb);
 149}
 150
 151static int bcap_init_sensor_formats(struct bcap_device *bcap_dev)
 152{
 153        struct v4l2_subdev_mbus_code_enum code = {
 154                .which = V4L2_SUBDEV_FORMAT_ACTIVE,
 155        };
 156        struct bcap_format *sf;
 157        unsigned int num_formats = 0;
 158        int i, j;
 159
 160        while (!v4l2_subdev_call(bcap_dev->sd, pad,
 161                                enum_mbus_code, NULL, &code)) {
 162                num_formats++;
 163                code.index++;
 164        }
 165        if (!num_formats)
 166                return -ENXIO;
 167
 168        sf = kcalloc(num_formats, sizeof(*sf), GFP_KERNEL);
 169        if (!sf)
 170                return -ENOMEM;
 171
 172        for (i = 0; i < num_formats; i++) {
 173                code.index = i;
 174                v4l2_subdev_call(bcap_dev->sd, pad,
 175                                enum_mbus_code, NULL, &code);
 176                for (j = 0; j < BCAP_MAX_FMTS; j++)
 177                        if (code.code == bcap_formats[j].mbus_code)
 178                                break;
 179                if (j == BCAP_MAX_FMTS) {
 180                        /* we don't allow this sensor working with our bridge */
 181                        kfree(sf);
 182                        return -EINVAL;
 183                }
 184                sf[i] = bcap_formats[j];
 185        }
 186        bcap_dev->sensor_formats = sf;
 187        bcap_dev->num_sensor_formats = num_formats;
 188        return 0;
 189}
 190
 191static void bcap_free_sensor_formats(struct bcap_device *bcap_dev)
 192{
 193        bcap_dev->num_sensor_formats = 0;
 194        kfree(bcap_dev->sensor_formats);
 195        bcap_dev->sensor_formats = NULL;
 196}
 197
 198static int bcap_queue_setup(struct vb2_queue *vq,
 199                                unsigned int *nbuffers, unsigned int *nplanes,
 200                                unsigned int sizes[], struct device *alloc_devs[])
 201{
 202        struct bcap_device *bcap_dev = vb2_get_drv_priv(vq);
 203
 204        if (vq->num_buffers + *nbuffers < 2)
 205                *nbuffers = 2;
 206
 207        if (*nplanes)
 208                return sizes[0] < bcap_dev->fmt.sizeimage ? -EINVAL : 0;
 209
 210        *nplanes = 1;
 211        sizes[0] = bcap_dev->fmt.sizeimage;
 212
 213        return 0;
 214}
 215
 216static int bcap_buffer_prepare(struct vb2_buffer *vb)
 217{
 218        struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
 219        struct bcap_device *bcap_dev = vb2_get_drv_priv(vb->vb2_queue);
 220        unsigned long size = bcap_dev->fmt.sizeimage;
 221
 222        if (vb2_plane_size(vb, 0) < size) {
 223                v4l2_err(&bcap_dev->v4l2_dev, "buffer too small (%lu < %lu)\n",
 224                                vb2_plane_size(vb, 0), size);
 225                return -EINVAL;
 226        }
 227        vb2_set_plane_payload(vb, 0, size);
 228
 229        vbuf->field = bcap_dev->fmt.field;
 230
 231        return 0;
 232}
 233
 234static void bcap_buffer_queue(struct vb2_buffer *vb)
 235{
 236        struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
 237        struct bcap_device *bcap_dev = vb2_get_drv_priv(vb->vb2_queue);
 238        struct bcap_buffer *buf = to_bcap_vb(vbuf);
 239        unsigned long flags;
 240
 241        spin_lock_irqsave(&bcap_dev->lock, flags);
 242        list_add_tail(&buf->list, &bcap_dev->dma_queue);
 243        spin_unlock_irqrestore(&bcap_dev->lock, flags);
 244}
 245
 246static void bcap_buffer_cleanup(struct vb2_buffer *vb)
 247{
 248        struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
 249        struct bcap_device *bcap_dev = vb2_get_drv_priv(vb->vb2_queue);
 250        struct bcap_buffer *buf = to_bcap_vb(vbuf);
 251        unsigned long flags;
 252
 253        spin_lock_irqsave(&bcap_dev->lock, flags);
 254        list_del_init(&buf->list);
 255        spin_unlock_irqrestore(&bcap_dev->lock, flags);
 256}
 257
 258static int bcap_start_streaming(struct vb2_queue *vq, unsigned int count)
 259{
 260        struct bcap_device *bcap_dev = vb2_get_drv_priv(vq);
 261        struct ppi_if *ppi = bcap_dev->ppi;
 262        struct bcap_buffer *buf, *tmp;
 263        struct ppi_params params;
 264        dma_addr_t addr;
 265        int ret;
 266
 267        /* enable streamon on the sub device */
 268        ret = v4l2_subdev_call(bcap_dev->sd, video, s_stream, 1);
 269        if (ret && (ret != -ENOIOCTLCMD)) {
 270                v4l2_err(&bcap_dev->v4l2_dev, "stream on failed in subdev\n");
 271                goto err;
 272        }
 273
 274        /* set ppi params */
 275        params.width = bcap_dev->fmt.width;
 276        params.height = bcap_dev->fmt.height;
 277        params.bpp = bcap_dev->bpp;
 278        params.dlen = bcap_dev->dlen;
 279        params.ppi_control = bcap_dev->cfg->ppi_control;
 280        params.int_mask = bcap_dev->cfg->int_mask;
 281        if (bcap_dev->cfg->inputs[bcap_dev->cur_input].capabilities
 282                        & V4L2_IN_CAP_DV_TIMINGS) {
 283                struct v4l2_bt_timings *bt = &bcap_dev->dv_timings.bt;
 284
 285                params.hdelay = bt->hsync + bt->hbackporch;
 286                params.vdelay = bt->vsync + bt->vbackporch;
 287                params.line = V4L2_DV_BT_FRAME_WIDTH(bt);
 288                params.frame = V4L2_DV_BT_FRAME_HEIGHT(bt);
 289        } else if (bcap_dev->cfg->inputs[bcap_dev->cur_input].capabilities
 290                        & V4L2_IN_CAP_STD) {
 291                params.hdelay = 0;
 292                params.vdelay = 0;
 293                if (bcap_dev->std & V4L2_STD_525_60) {
 294                        params.line = 858;
 295                        params.frame = 525;
 296                } else {
 297                        params.line = 864;
 298                        params.frame = 625;
 299                }
 300        } else {
 301                params.hdelay = 0;
 302                params.vdelay = 0;
 303                params.line = params.width + bcap_dev->cfg->blank_pixels;
 304                params.frame = params.height;
 305        }
 306        ret = ppi->ops->set_params(ppi, &params);
 307        if (ret < 0) {
 308                v4l2_err(&bcap_dev->v4l2_dev,
 309                                "Error in setting ppi params\n");
 310                goto err;
 311        }
 312
 313        /* attach ppi DMA irq handler */
 314        ret = ppi->ops->attach_irq(ppi, bcap_isr);
 315        if (ret < 0) {
 316                v4l2_err(&bcap_dev->v4l2_dev,
 317                                "Error in attaching interrupt handler\n");
 318                goto err;
 319        }
 320
 321        bcap_dev->sequence = 0;
 322
 323        reinit_completion(&bcap_dev->comp);
 324        bcap_dev->stop = false;
 325
 326        /* get the next frame from the dma queue */
 327        bcap_dev->cur_frm = list_entry(bcap_dev->dma_queue.next,
 328                                        struct bcap_buffer, list);
 329        /* remove buffer from the dma queue */
 330        list_del_init(&bcap_dev->cur_frm->list);
 331        addr = vb2_dma_contig_plane_dma_addr(&bcap_dev->cur_frm->vb.vb2_buf,
 332                                                0);
 333        /* update DMA address */
 334        ppi->ops->update_addr(ppi, (unsigned long)addr);
 335        /* enable ppi */
 336        ppi->ops->start(ppi);
 337
 338        return 0;
 339
 340err:
 341        list_for_each_entry_safe(buf, tmp, &bcap_dev->dma_queue, list) {
 342                list_del(&buf->list);
 343                vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_QUEUED);
 344        }
 345
 346        return ret;
 347}
 348
 349static void bcap_stop_streaming(struct vb2_queue *vq)
 350{
 351        struct bcap_device *bcap_dev = vb2_get_drv_priv(vq);
 352        struct ppi_if *ppi = bcap_dev->ppi;
 353        int ret;
 354
 355        bcap_dev->stop = true;
 356        wait_for_completion(&bcap_dev->comp);
 357        ppi->ops->stop(ppi);
 358        ppi->ops->detach_irq(ppi);
 359        ret = v4l2_subdev_call(bcap_dev->sd, video, s_stream, 0);
 360        if (ret && (ret != -ENOIOCTLCMD))
 361                v4l2_err(&bcap_dev->v4l2_dev,
 362                                "stream off failed in subdev\n");
 363
 364        /* release all active buffers */
 365        if (bcap_dev->cur_frm)
 366                vb2_buffer_done(&bcap_dev->cur_frm->vb.vb2_buf,
 367                                VB2_BUF_STATE_ERROR);
 368
 369        while (!list_empty(&bcap_dev->dma_queue)) {
 370                bcap_dev->cur_frm = list_entry(bcap_dev->dma_queue.next,
 371                                                struct bcap_buffer, list);
 372                list_del_init(&bcap_dev->cur_frm->list);
 373                vb2_buffer_done(&bcap_dev->cur_frm->vb.vb2_buf,
 374                                VB2_BUF_STATE_ERROR);
 375        }
 376}
 377
 378static struct vb2_ops bcap_video_qops = {
 379        .queue_setup            = bcap_queue_setup,
 380        .buf_prepare            = bcap_buffer_prepare,
 381        .buf_cleanup            = bcap_buffer_cleanup,
 382        .buf_queue              = bcap_buffer_queue,
 383        .wait_prepare           = vb2_ops_wait_prepare,
 384        .wait_finish            = vb2_ops_wait_finish,
 385        .start_streaming        = bcap_start_streaming,
 386        .stop_streaming         = bcap_stop_streaming,
 387};
 388
 389static irqreturn_t bcap_isr(int irq, void *dev_id)
 390{
 391        struct ppi_if *ppi = dev_id;
 392        struct bcap_device *bcap_dev = ppi->priv;
 393        struct vb2_v4l2_buffer *vbuf = &bcap_dev->cur_frm->vb;
 394        struct vb2_buffer *vb = &vbuf->vb2_buf;
 395        dma_addr_t addr;
 396
 397        spin_lock(&bcap_dev->lock);
 398
 399        if (!list_empty(&bcap_dev->dma_queue)) {
 400                vb->timestamp = ktime_get_ns();
 401                if (ppi->err) {
 402                        vb2_buffer_done(vb, VB2_BUF_STATE_ERROR);
 403                        ppi->err = false;
 404                } else {
 405                        vbuf->sequence = bcap_dev->sequence++;
 406                        vb2_buffer_done(vb, VB2_BUF_STATE_DONE);
 407                }
 408                bcap_dev->cur_frm = list_entry(bcap_dev->dma_queue.next,
 409                                struct bcap_buffer, list);
 410                list_del_init(&bcap_dev->cur_frm->list);
 411        } else {
 412                /* clear error flag, we will get a new frame */
 413                if (ppi->err)
 414                        ppi->err = false;
 415        }
 416
 417        ppi->ops->stop(ppi);
 418
 419        if (bcap_dev->stop) {
 420                complete(&bcap_dev->comp);
 421        } else {
 422                addr = vb2_dma_contig_plane_dma_addr(
 423                                &bcap_dev->cur_frm->vb.vb2_buf, 0);
 424                ppi->ops->update_addr(ppi, (unsigned long)addr);
 425                ppi->ops->start(ppi);
 426        }
 427
 428        spin_unlock(&bcap_dev->lock);
 429
 430        return IRQ_HANDLED;
 431}
 432
 433static int bcap_querystd(struct file *file, void *priv, v4l2_std_id *std)
 434{
 435        struct bcap_device *bcap_dev = video_drvdata(file);
 436        struct v4l2_input input;
 437
 438        input = bcap_dev->cfg->inputs[bcap_dev->cur_input];
 439        if (!(input.capabilities & V4L2_IN_CAP_STD))
 440                return -ENODATA;
 441
 442        return v4l2_subdev_call(bcap_dev->sd, video, querystd, std);
 443}
 444
 445static int bcap_g_std(struct file *file, void *priv, v4l2_std_id *std)
 446{
 447        struct bcap_device *bcap_dev = video_drvdata(file);
 448        struct v4l2_input input;
 449
 450        input = bcap_dev->cfg->inputs[bcap_dev->cur_input];
 451        if (!(input.capabilities & V4L2_IN_CAP_STD))
 452                return -ENODATA;
 453
 454        *std = bcap_dev->std;
 455        return 0;
 456}
 457
 458static int bcap_s_std(struct file *file, void *priv, v4l2_std_id std)
 459{
 460        struct bcap_device *bcap_dev = video_drvdata(file);
 461        struct v4l2_input input;
 462        int ret;
 463
 464        input = bcap_dev->cfg->inputs[bcap_dev->cur_input];
 465        if (!(input.capabilities & V4L2_IN_CAP_STD))
 466                return -ENODATA;
 467
 468        if (vb2_is_busy(&bcap_dev->buffer_queue))
 469                return -EBUSY;
 470
 471        ret = v4l2_subdev_call(bcap_dev->sd, video, s_std, std);
 472        if (ret < 0)
 473                return ret;
 474
 475        bcap_dev->std = std;
 476        return 0;
 477}
 478
 479static int bcap_enum_dv_timings(struct file *file, void *priv,
 480                                struct v4l2_enum_dv_timings *timings)
 481{
 482        struct bcap_device *bcap_dev = video_drvdata(file);
 483        struct v4l2_input input;
 484
 485        input = bcap_dev->cfg->inputs[bcap_dev->cur_input];
 486        if (!(input.capabilities & V4L2_IN_CAP_DV_TIMINGS))
 487                return -ENODATA;
 488
 489        timings->pad = 0;
 490
 491        return v4l2_subdev_call(bcap_dev->sd, pad,
 492                        enum_dv_timings, timings);
 493}
 494
 495static int bcap_query_dv_timings(struct file *file, void *priv,
 496                                struct v4l2_dv_timings *timings)
 497{
 498        struct bcap_device *bcap_dev = video_drvdata(file);
 499        struct v4l2_input input;
 500
 501        input = bcap_dev->cfg->inputs[bcap_dev->cur_input];
 502        if (!(input.capabilities & V4L2_IN_CAP_DV_TIMINGS))
 503                return -ENODATA;
 504
 505        return v4l2_subdev_call(bcap_dev->sd, video,
 506                                query_dv_timings, timings);
 507}
 508
 509static int bcap_g_dv_timings(struct file *file, void *priv,
 510                                struct v4l2_dv_timings *timings)
 511{
 512        struct bcap_device *bcap_dev = video_drvdata(file);
 513        struct v4l2_input input;
 514
 515        input = bcap_dev->cfg->inputs[bcap_dev->cur_input];
 516        if (!(input.capabilities & V4L2_IN_CAP_DV_TIMINGS))
 517                return -ENODATA;
 518
 519        *timings = bcap_dev->dv_timings;
 520        return 0;
 521}
 522
 523static int bcap_s_dv_timings(struct file *file, void *priv,
 524                                struct v4l2_dv_timings *timings)
 525{
 526        struct bcap_device *bcap_dev = video_drvdata(file);
 527        struct v4l2_input input;
 528        int ret;
 529
 530        input = bcap_dev->cfg->inputs[bcap_dev->cur_input];
 531        if (!(input.capabilities & V4L2_IN_CAP_DV_TIMINGS))
 532                return -ENODATA;
 533
 534        if (vb2_is_busy(&bcap_dev->buffer_queue))
 535                return -EBUSY;
 536
 537        ret = v4l2_subdev_call(bcap_dev->sd, video, s_dv_timings, timings);
 538        if (ret < 0)
 539                return ret;
 540
 541        bcap_dev->dv_timings = *timings;
 542        return 0;
 543}
 544
 545static int bcap_enum_input(struct file *file, void *priv,
 546                                struct v4l2_input *input)
 547{
 548        struct bcap_device *bcap_dev = video_drvdata(file);
 549        struct bfin_capture_config *config = bcap_dev->cfg;
 550        int ret;
 551        u32 status;
 552
 553        if (input->index >= config->num_inputs)
 554                return -EINVAL;
 555
 556        *input = config->inputs[input->index];
 557        /* get input status */
 558        ret = v4l2_subdev_call(bcap_dev->sd, video, g_input_status, &status);
 559        if (!ret)
 560                input->status = status;
 561        return 0;
 562}
 563
 564static int bcap_g_input(struct file *file, void *priv, unsigned int *index)
 565{
 566        struct bcap_device *bcap_dev = video_drvdata(file);
 567
 568        *index = bcap_dev->cur_input;
 569        return 0;
 570}
 571
 572static int bcap_s_input(struct file *file, void *priv, unsigned int index)
 573{
 574        struct bcap_device *bcap_dev = video_drvdata(file);
 575        struct bfin_capture_config *config = bcap_dev->cfg;
 576        struct bcap_route *route;
 577        int ret;
 578
 579        if (vb2_is_busy(&bcap_dev->buffer_queue))
 580                return -EBUSY;
 581
 582        if (index >= config->num_inputs)
 583                return -EINVAL;
 584
 585        route = &config->routes[index];
 586        ret = v4l2_subdev_call(bcap_dev->sd, video, s_routing,
 587                                route->input, route->output, 0);
 588        if ((ret < 0) && (ret != -ENOIOCTLCMD)) {
 589                v4l2_err(&bcap_dev->v4l2_dev, "Failed to set input\n");
 590                return ret;
 591        }
 592        bcap_dev->cur_input = index;
 593        /* if this route has specific config, update ppi control */
 594        if (route->ppi_control)
 595                config->ppi_control = route->ppi_control;
 596        return 0;
 597}
 598
 599static int bcap_try_format(struct bcap_device *bcap,
 600                                struct v4l2_pix_format *pixfmt,
 601                                struct bcap_format *bcap_fmt)
 602{
 603        struct bcap_format *sf = bcap->sensor_formats;
 604        struct bcap_format *fmt = NULL;
 605        struct v4l2_subdev_pad_config pad_cfg;
 606        struct v4l2_subdev_format format = {
 607                .which = V4L2_SUBDEV_FORMAT_TRY,
 608        };
 609        int ret, i;
 610
 611        for (i = 0; i < bcap->num_sensor_formats; i++) {
 612                fmt = &sf[i];
 613                if (pixfmt->pixelformat == fmt->pixelformat)
 614                        break;
 615        }
 616        if (i == bcap->num_sensor_formats)
 617                fmt = &sf[0];
 618
 619        v4l2_fill_mbus_format(&format.format, pixfmt, fmt->mbus_code);
 620        ret = v4l2_subdev_call(bcap->sd, pad, set_fmt, &pad_cfg,
 621                                &format);
 622        if (ret < 0)
 623                return ret;
 624        v4l2_fill_pix_format(pixfmt, &format.format);
 625        if (bcap_fmt) {
 626                for (i = 0; i < bcap->num_sensor_formats; i++) {
 627                        fmt = &sf[i];
 628                        if (format.format.code == fmt->mbus_code)
 629                                break;
 630                }
 631                *bcap_fmt = *fmt;
 632        }
 633        pixfmt->bytesperline = pixfmt->width * fmt->bpp / 8;
 634        pixfmt->sizeimage = pixfmt->bytesperline * pixfmt->height;
 635        return 0;
 636}
 637
 638static int bcap_enum_fmt_vid_cap(struct file *file, void  *priv,
 639                                        struct v4l2_fmtdesc *fmt)
 640{
 641        struct bcap_device *bcap_dev = video_drvdata(file);
 642        struct bcap_format *sf = bcap_dev->sensor_formats;
 643
 644        if (fmt->index >= bcap_dev->num_sensor_formats)
 645                return -EINVAL;
 646
 647        fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 648        strlcpy(fmt->description,
 649                sf[fmt->index].desc,
 650                sizeof(fmt->description));
 651        fmt->pixelformat = sf[fmt->index].pixelformat;
 652        return 0;
 653}
 654
 655static int bcap_try_fmt_vid_cap(struct file *file, void *priv,
 656                                        struct v4l2_format *fmt)
 657{
 658        struct bcap_device *bcap_dev = video_drvdata(file);
 659        struct v4l2_pix_format *pixfmt = &fmt->fmt.pix;
 660
 661        return bcap_try_format(bcap_dev, pixfmt, NULL);
 662}
 663
 664static int bcap_g_fmt_vid_cap(struct file *file, void *priv,
 665                                struct v4l2_format *fmt)
 666{
 667        struct bcap_device *bcap_dev = video_drvdata(file);
 668
 669        fmt->fmt.pix = bcap_dev->fmt;
 670        return 0;
 671}
 672
 673static int bcap_s_fmt_vid_cap(struct file *file, void *priv,
 674                                struct v4l2_format *fmt)
 675{
 676        struct bcap_device *bcap_dev = video_drvdata(file);
 677        struct v4l2_subdev_format format = {
 678                .which = V4L2_SUBDEV_FORMAT_ACTIVE,
 679        };
 680        struct bcap_format bcap_fmt;
 681        struct v4l2_pix_format *pixfmt = &fmt->fmt.pix;
 682        int ret;
 683
 684        if (vb2_is_busy(&bcap_dev->buffer_queue))
 685                return -EBUSY;
 686
 687        /* see if format works */
 688        ret = bcap_try_format(bcap_dev, pixfmt, &bcap_fmt);
 689        if (ret < 0)
 690                return ret;
 691
 692        v4l2_fill_mbus_format(&format.format, pixfmt, bcap_fmt.mbus_code);
 693        ret = v4l2_subdev_call(bcap_dev->sd, pad, set_fmt, NULL, &format);
 694        if (ret < 0)
 695                return ret;
 696        bcap_dev->fmt = *pixfmt;
 697        bcap_dev->bpp = bcap_fmt.bpp;
 698        bcap_dev->dlen = bcap_fmt.dlen;
 699        return 0;
 700}
 701
 702static int bcap_querycap(struct file *file, void  *priv,
 703                                struct v4l2_capability *cap)
 704{
 705        struct bcap_device *bcap_dev = video_drvdata(file);
 706
 707        cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
 708        cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
 709        strlcpy(cap->driver, CAPTURE_DRV_NAME, sizeof(cap->driver));
 710        strlcpy(cap->bus_info, "Blackfin Platform", sizeof(cap->bus_info));
 711        strlcpy(cap->card, bcap_dev->cfg->card_name, sizeof(cap->card));
 712        return 0;
 713}
 714
 715static int bcap_g_parm(struct file *file, void *fh,
 716                                struct v4l2_streamparm *a)
 717{
 718        struct bcap_device *bcap_dev = video_drvdata(file);
 719
 720        if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
 721                return -EINVAL;
 722        return v4l2_subdev_call(bcap_dev->sd, video, g_parm, a);
 723}
 724
 725static int bcap_s_parm(struct file *file, void *fh,
 726                                struct v4l2_streamparm *a)
 727{
 728        struct bcap_device *bcap_dev = video_drvdata(file);
 729
 730        if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
 731                return -EINVAL;
 732        return v4l2_subdev_call(bcap_dev->sd, video, s_parm, a);
 733}
 734
 735static int bcap_log_status(struct file *file, void *priv)
 736{
 737        struct bcap_device *bcap_dev = video_drvdata(file);
 738        /* status for sub devices */
 739        v4l2_device_call_all(&bcap_dev->v4l2_dev, 0, core, log_status);
 740        return 0;
 741}
 742
 743static const struct v4l2_ioctl_ops bcap_ioctl_ops = {
 744        .vidioc_querycap         = bcap_querycap,
 745        .vidioc_g_fmt_vid_cap    = bcap_g_fmt_vid_cap,
 746        .vidioc_enum_fmt_vid_cap = bcap_enum_fmt_vid_cap,
 747        .vidioc_s_fmt_vid_cap    = bcap_s_fmt_vid_cap,
 748        .vidioc_try_fmt_vid_cap  = bcap_try_fmt_vid_cap,
 749        .vidioc_enum_input       = bcap_enum_input,
 750        .vidioc_g_input          = bcap_g_input,
 751        .vidioc_s_input          = bcap_s_input,
 752        .vidioc_querystd         = bcap_querystd,
 753        .vidioc_s_std            = bcap_s_std,
 754        .vidioc_g_std            = bcap_g_std,
 755        .vidioc_s_dv_timings     = bcap_s_dv_timings,
 756        .vidioc_g_dv_timings     = bcap_g_dv_timings,
 757        .vidioc_query_dv_timings = bcap_query_dv_timings,
 758        .vidioc_enum_dv_timings  = bcap_enum_dv_timings,
 759        .vidioc_reqbufs          = vb2_ioctl_reqbufs,
 760        .vidioc_create_bufs      = vb2_ioctl_create_bufs,
 761        .vidioc_querybuf         = vb2_ioctl_querybuf,
 762        .vidioc_qbuf             = vb2_ioctl_qbuf,
 763        .vidioc_dqbuf            = vb2_ioctl_dqbuf,
 764        .vidioc_expbuf           = vb2_ioctl_expbuf,
 765        .vidioc_streamon         = vb2_ioctl_streamon,
 766        .vidioc_streamoff        = vb2_ioctl_streamoff,
 767        .vidioc_g_parm           = bcap_g_parm,
 768        .vidioc_s_parm           = bcap_s_parm,
 769        .vidioc_log_status       = bcap_log_status,
 770};
 771
 772static struct v4l2_file_operations bcap_fops = {
 773        .owner = THIS_MODULE,
 774        .open = v4l2_fh_open,
 775        .release = vb2_fop_release,
 776        .unlocked_ioctl = video_ioctl2,
 777        .mmap = vb2_fop_mmap,
 778#ifndef CONFIG_MMU
 779        .get_unmapped_area = vb2_fop_get_unmapped_area,
 780#endif
 781        .poll = vb2_fop_poll
 782};
 783
 784static int bcap_probe(struct platform_device *pdev)
 785{
 786        struct bcap_device *bcap_dev;
 787        struct video_device *vfd;
 788        struct i2c_adapter *i2c_adap;
 789        struct bfin_capture_config *config;
 790        struct vb2_queue *q;
 791        struct bcap_route *route;
 792        int ret;
 793
 794        config = pdev->dev.platform_data;
 795        if (!config || !config->num_inputs) {
 796                v4l2_err(pdev->dev.driver, "Unable to get board config\n");
 797                return -ENODEV;
 798        }
 799
 800        bcap_dev = kzalloc(sizeof(*bcap_dev), GFP_KERNEL);
 801        if (!bcap_dev)
 802                return -ENOMEM;
 803
 804        bcap_dev->cfg = config;
 805
 806        bcap_dev->ppi = ppi_create_instance(pdev, config->ppi_info);
 807        if (!bcap_dev->ppi) {
 808                v4l2_err(pdev->dev.driver, "Unable to create ppi\n");
 809                ret = -ENODEV;
 810                goto err_free_dev;
 811        }
 812        bcap_dev->ppi->priv = bcap_dev;
 813
 814        vfd = &bcap_dev->video_dev;
 815        /* initialize field of video device */
 816        vfd->release            = video_device_release_empty;
 817        vfd->fops               = &bcap_fops;
 818        vfd->ioctl_ops          = &bcap_ioctl_ops;
 819        vfd->tvnorms            = 0;
 820        vfd->v4l2_dev           = &bcap_dev->v4l2_dev;
 821        strncpy(vfd->name, CAPTURE_DRV_NAME, sizeof(vfd->name));
 822
 823        ret = v4l2_device_register(&pdev->dev, &bcap_dev->v4l2_dev);
 824        if (ret) {
 825                v4l2_err(pdev->dev.driver,
 826                                "Unable to register v4l2 device\n");
 827                goto err_free_ppi;
 828        }
 829        v4l2_info(&bcap_dev->v4l2_dev, "v4l2 device registered\n");
 830
 831        bcap_dev->v4l2_dev.ctrl_handler = &bcap_dev->ctrl_handler;
 832        ret = v4l2_ctrl_handler_init(&bcap_dev->ctrl_handler, 0);
 833        if (ret) {
 834                v4l2_err(&bcap_dev->v4l2_dev,
 835                                "Unable to init control handler\n");
 836                goto err_unreg_v4l2;
 837        }
 838
 839        spin_lock_init(&bcap_dev->lock);
 840        /* initialize queue */
 841        q = &bcap_dev->buffer_queue;
 842        q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 843        q->io_modes = VB2_MMAP | VB2_DMABUF;
 844        q->drv_priv = bcap_dev;
 845        q->buf_struct_size = sizeof(struct bcap_buffer);
 846        q->ops = &bcap_video_qops;
 847        q->mem_ops = &vb2_dma_contig_memops;
 848        q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 849        q->lock = &bcap_dev->mutex;
 850        q->min_buffers_needed = 1;
 851        q->dev = &pdev->dev;
 852
 853        ret = vb2_queue_init(q);
 854        if (ret)
 855                goto err_free_handler;
 856
 857        mutex_init(&bcap_dev->mutex);
 858        init_completion(&bcap_dev->comp);
 859
 860        /* init video dma queues */
 861        INIT_LIST_HEAD(&bcap_dev->dma_queue);
 862
 863        vfd->lock = &bcap_dev->mutex;
 864        vfd->queue = q;
 865
 866        /* register video device */
 867        ret = video_register_device(&bcap_dev->video_dev, VFL_TYPE_GRABBER, -1);
 868        if (ret) {
 869                v4l2_err(&bcap_dev->v4l2_dev,
 870                                "Unable to register video device\n");
 871                goto err_free_handler;
 872        }
 873        video_set_drvdata(&bcap_dev->video_dev, bcap_dev);
 874        v4l2_info(&bcap_dev->v4l2_dev, "video device registered as: %s\n",
 875                        video_device_node_name(vfd));
 876
 877        /* load up the subdevice */
 878        i2c_adap = i2c_get_adapter(config->i2c_adapter_id);
 879        if (!i2c_adap) {
 880                v4l2_err(&bcap_dev->v4l2_dev,
 881                                "Unable to find i2c adapter\n");
 882                ret = -ENODEV;
 883                goto err_unreg_vdev;
 884
 885        }
 886        bcap_dev->sd = v4l2_i2c_new_subdev_board(&bcap_dev->v4l2_dev,
 887                                                 i2c_adap,
 888                                                 &config->board_info,
 889                                                 NULL);
 890        if (bcap_dev->sd) {
 891                int i;
 892
 893                /* update tvnorms from the sub devices */
 894                for (i = 0; i < config->num_inputs; i++)
 895                        vfd->tvnorms |= config->inputs[i].std;
 896        } else {
 897                v4l2_err(&bcap_dev->v4l2_dev,
 898                                "Unable to register sub device\n");
 899                ret = -ENODEV;
 900                goto err_unreg_vdev;
 901        }
 902
 903        v4l2_info(&bcap_dev->v4l2_dev, "v4l2 sub device registered\n");
 904
 905        /*
 906         * explicitly set input, otherwise some boards
 907         * may not work at the state as we expected
 908         */
 909        route = &config->routes[0];
 910        ret = v4l2_subdev_call(bcap_dev->sd, video, s_routing,
 911                                route->input, route->output, 0);
 912        if ((ret < 0) && (ret != -ENOIOCTLCMD)) {
 913                v4l2_err(&bcap_dev->v4l2_dev, "Failed to set input\n");
 914                goto err_unreg_vdev;
 915        }
 916        bcap_dev->cur_input = 0;
 917        /* if this route has specific config, update ppi control */
 918        if (route->ppi_control)
 919                config->ppi_control = route->ppi_control;
 920
 921        /* now we can probe the default state */
 922        if (config->inputs[0].capabilities & V4L2_IN_CAP_STD) {
 923                v4l2_std_id std;
 924                ret = v4l2_subdev_call(bcap_dev->sd, video, g_std, &std);
 925                if (ret) {
 926                        v4l2_err(&bcap_dev->v4l2_dev,
 927                                        "Unable to get std\n");
 928                        goto err_unreg_vdev;
 929                }
 930                bcap_dev->std = std;
 931        }
 932        if (config->inputs[0].capabilities & V4L2_IN_CAP_DV_TIMINGS) {
 933                struct v4l2_dv_timings dv_timings;
 934                ret = v4l2_subdev_call(bcap_dev->sd, video,
 935                                g_dv_timings, &dv_timings);
 936                if (ret) {
 937                        v4l2_err(&bcap_dev->v4l2_dev,
 938                                        "Unable to get dv timings\n");
 939                        goto err_unreg_vdev;
 940                }
 941                bcap_dev->dv_timings = dv_timings;
 942        }
 943        ret = bcap_init_sensor_formats(bcap_dev);
 944        if (ret) {
 945                v4l2_err(&bcap_dev->v4l2_dev,
 946                                "Unable to create sensor formats table\n");
 947                goto err_unreg_vdev;
 948        }
 949        return 0;
 950err_unreg_vdev:
 951        video_unregister_device(&bcap_dev->video_dev);
 952err_free_handler:
 953        v4l2_ctrl_handler_free(&bcap_dev->ctrl_handler);
 954err_unreg_v4l2:
 955        v4l2_device_unregister(&bcap_dev->v4l2_dev);
 956err_free_ppi:
 957        ppi_delete_instance(bcap_dev->ppi);
 958err_free_dev:
 959        kfree(bcap_dev);
 960        return ret;
 961}
 962
 963static int bcap_remove(struct platform_device *pdev)
 964{
 965        struct v4l2_device *v4l2_dev = platform_get_drvdata(pdev);
 966        struct bcap_device *bcap_dev = container_of(v4l2_dev,
 967                                                struct bcap_device, v4l2_dev);
 968
 969        bcap_free_sensor_formats(bcap_dev);
 970        video_unregister_device(&bcap_dev->video_dev);
 971        v4l2_ctrl_handler_free(&bcap_dev->ctrl_handler);
 972        v4l2_device_unregister(v4l2_dev);
 973        ppi_delete_instance(bcap_dev->ppi);
 974        kfree(bcap_dev);
 975        return 0;
 976}
 977
 978static struct platform_driver bcap_driver = {
 979        .driver = {
 980                .name  = CAPTURE_DRV_NAME,
 981        },
 982        .probe = bcap_probe,
 983        .remove = bcap_remove,
 984};
 985module_platform_driver(bcap_driver);
 986
 987MODULE_DESCRIPTION("Analog Devices blackfin video capture driver");
 988MODULE_AUTHOR("Scott Jiang <Scott.Jiang.Linux@gmail.com>");
 989MODULE_LICENSE("GPL v2");
 990