linux/samples/v4l/v4l2-pci-skeleton.c
<<
>>
Prefs
   1/*
   2 * This is a V4L2 PCI Skeleton Driver. It gives an initial skeleton source
   3 * for use with other PCI drivers.
   4 *
   5 * This skeleton PCI driver assumes that the card has an S-Video connector as
   6 * input 0 and an HDMI connector as input 1.
   7 *
   8 * Copyright 2014 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
   9 *
  10 * This program is free software; you may redistribute it and/or modify
  11 * it under the terms of the GNU General Public License as published by
  12 * the Free Software Foundation; version 2 of the License.
  13 *
  14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  15 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  17 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  18 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  19 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  20 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  21 * SOFTWARE.
  22 */
  23
  24#include <linux/types.h>
  25#include <linux/kernel.h>
  26#include <linux/module.h>
  27#include <linux/init.h>
  28#include <linux/kmod.h>
  29#include <linux/mutex.h>
  30#include <linux/pci.h>
  31#include <linux/interrupt.h>
  32#include <linux/videodev2.h>
  33#include <linux/v4l2-dv-timings.h>
  34#include <media/v4l2-device.h>
  35#include <media/v4l2-dev.h>
  36#include <media/v4l2-ioctl.h>
  37#include <media/v4l2-dv-timings.h>
  38#include <media/v4l2-ctrls.h>
  39#include <media/v4l2-event.h>
  40#include <media/videobuf2-v4l2.h>
  41#include <media/videobuf2-dma-contig.h>
  42
  43MODULE_DESCRIPTION("V4L2 PCI Skeleton Driver");
  44MODULE_AUTHOR("Hans Verkuil");
  45MODULE_LICENSE("GPL v2");
  46
  47/**
  48 * struct skeleton - All internal data for one instance of device
  49 * @pdev: PCI device
  50 * @v4l2_dev: top-level v4l2 device struct
  51 * @vdev: video node structure
  52 * @ctrl_handler: control handler structure
  53 * @lock: ioctl serialization mutex
  54 * @std: current SDTV standard
  55 * @timings: current HDTV timings
  56 * @format: current pix format
  57 * @input: current video input (0 = SDTV, 1 = HDTV)
  58 * @queue: vb2 video capture queue
  59 * @qlock: spinlock controlling access to buf_list and sequence
  60 * @buf_list: list of buffers queued for DMA
  61 * @field: the field (TOP/BOTTOM/other) of the current buffer
  62 * @sequence: frame sequence counter
  63 */
  64struct skeleton {
  65        struct pci_dev *pdev;
  66        struct v4l2_device v4l2_dev;
  67        struct video_device vdev;
  68        struct v4l2_ctrl_handler ctrl_handler;
  69        struct mutex lock;
  70        v4l2_std_id std;
  71        struct v4l2_dv_timings timings;
  72        struct v4l2_pix_format format;
  73        unsigned input;
  74
  75        struct vb2_queue queue;
  76
  77        spinlock_t qlock;
  78        struct list_head buf_list;
  79        unsigned field;
  80        unsigned sequence;
  81};
  82
  83struct skel_buffer {
  84        struct vb2_v4l2_buffer vb;
  85        struct list_head list;
  86};
  87
  88static inline struct skel_buffer *to_skel_buffer(struct vb2_v4l2_buffer *vbuf)
  89{
  90        return container_of(vbuf, struct skel_buffer, vb);
  91}
  92
  93static const struct pci_device_id skeleton_pci_tbl[] = {
  94        /* { PCI_DEVICE(PCI_VENDOR_ID_, PCI_DEVICE_ID_) }, */
  95        { 0, }
  96};
  97MODULE_DEVICE_TABLE(pci, skeleton_pci_tbl);
  98
  99/*
 100 * HDTV: this structure has the capabilities of the HDTV receiver.
 101 * It is used to constrain the huge list of possible formats based
 102 * upon the hardware capabilities.
 103 */
 104static const struct v4l2_dv_timings_cap skel_timings_cap = {
 105        .type = V4L2_DV_BT_656_1120,
 106        /* keep this initialization for compatibility with GCC < 4.4.6 */
 107        .reserved = { 0 },
 108        V4L2_INIT_BT_TIMINGS(
 109                720, 1920,              /* min/max width */
 110                480, 1080,              /* min/max height */
 111                27000000, 74250000,     /* min/max pixelclock*/
 112                V4L2_DV_BT_STD_CEA861,  /* Supported standards */
 113                /* capabilities */
 114                V4L2_DV_BT_CAP_INTERLACED | V4L2_DV_BT_CAP_PROGRESSIVE
 115        )
 116};
 117
 118/*
 119 * Supported SDTV standards. This does the same job as skel_timings_cap, but
 120 * for standard TV formats.
 121 */
 122#define SKEL_TVNORMS V4L2_STD_ALL
 123
 124/*
 125 * Interrupt handler: typically interrupts happen after a new frame has been
 126 * captured. It is the job of the handler to remove the new frame from the
 127 * internal list and give it back to the vb2 framework, updating the sequence
 128 * counter, field and timestamp at the same time.
 129 */
 130static irqreturn_t skeleton_irq(int irq, void *dev_id)
 131{
 132#ifdef TODO
 133        struct skeleton *skel = dev_id;
 134
 135        /* handle interrupt */
 136
 137        /* Once a new frame has been captured, mark it as done like this: */
 138        if (captured_new_frame) {
 139                ...
 140                spin_lock(&skel->qlock);
 141                list_del(&new_buf->list);
 142                spin_unlock(&skel->qlock);
 143                new_buf->vb.vb2_buf.timestamp = ktime_get_ns();
 144                new_buf->vb.sequence = skel->sequence++;
 145                new_buf->vb.field = skel->field;
 146                if (skel->format.field == V4L2_FIELD_ALTERNATE) {
 147                        if (skel->field == V4L2_FIELD_BOTTOM)
 148                                skel->field = V4L2_FIELD_TOP;
 149                        else if (skel->field == V4L2_FIELD_TOP)
 150                                skel->field = V4L2_FIELD_BOTTOM;
 151                }
 152                vb2_buffer_done(&new_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
 153        }
 154#endif
 155        return IRQ_HANDLED;
 156}
 157
 158/*
 159 * Setup the constraints of the queue: besides setting the number of planes
 160 * per buffer and the size and allocation context of each plane, it also
 161 * checks if sufficient buffers have been allocated. Usually 3 is a good
 162 * minimum number: many DMA engines need a minimum of 2 buffers in the
 163 * queue and you need to have another available for userspace processing.
 164 */
 165static int queue_setup(struct vb2_queue *vq,
 166                       unsigned int *nbuffers, unsigned int *nplanes,
 167                       unsigned int sizes[], struct device *alloc_devs[])
 168{
 169        struct skeleton *skel = vb2_get_drv_priv(vq);
 170
 171        skel->field = skel->format.field;
 172        if (skel->field == V4L2_FIELD_ALTERNATE) {
 173                /*
 174                 * You cannot use read() with FIELD_ALTERNATE since the field
 175                 * information (TOP/BOTTOM) cannot be passed back to the user.
 176                 */
 177                if (vb2_fileio_is_active(vq))
 178                        return -EINVAL;
 179                skel->field = V4L2_FIELD_TOP;
 180        }
 181
 182        if (vq->num_buffers + *nbuffers < 3)
 183                *nbuffers = 3 - vq->num_buffers;
 184
 185        if (*nplanes)
 186                return sizes[0] < skel->format.sizeimage ? -EINVAL : 0;
 187        *nplanes = 1;
 188        sizes[0] = skel->format.sizeimage;
 189        return 0;
 190}
 191
 192/*
 193 * Prepare the buffer for queueing to the DMA engine: check and set the
 194 * payload size.
 195 */
 196static int buffer_prepare(struct vb2_buffer *vb)
 197{
 198        struct skeleton *skel = vb2_get_drv_priv(vb->vb2_queue);
 199        unsigned long size = skel->format.sizeimage;
 200
 201        if (vb2_plane_size(vb, 0) < size) {
 202                dev_err(&skel->pdev->dev, "buffer too small (%lu < %lu)\n",
 203                         vb2_plane_size(vb, 0), size);
 204                return -EINVAL;
 205        }
 206
 207        vb2_set_plane_payload(vb, 0, size);
 208        return 0;
 209}
 210
 211/*
 212 * Queue this buffer to the DMA engine.
 213 */
 214static void buffer_queue(struct vb2_buffer *vb)
 215{
 216        struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
 217        struct skeleton *skel = vb2_get_drv_priv(vb->vb2_queue);
 218        struct skel_buffer *buf = to_skel_buffer(vbuf);
 219        unsigned long flags;
 220
 221        spin_lock_irqsave(&skel->qlock, flags);
 222        list_add_tail(&buf->list, &skel->buf_list);
 223
 224        /* TODO: Update any DMA pointers if necessary */
 225
 226        spin_unlock_irqrestore(&skel->qlock, flags);
 227}
 228
 229static void return_all_buffers(struct skeleton *skel,
 230                               enum vb2_buffer_state state)
 231{
 232        struct skel_buffer *buf, *node;
 233        unsigned long flags;
 234
 235        spin_lock_irqsave(&skel->qlock, flags);
 236        list_for_each_entry_safe(buf, node, &skel->buf_list, list) {
 237                vb2_buffer_done(&buf->vb.vb2_buf, state);
 238                list_del(&buf->list);
 239        }
 240        spin_unlock_irqrestore(&skel->qlock, flags);
 241}
 242
 243/*
 244 * Start streaming. First check if the minimum number of buffers have been
 245 * queued. If not, then return -ENOBUFS and the vb2 framework will call
 246 * this function again the next time a buffer has been queued until enough
 247 * buffers are available to actually start the DMA engine.
 248 */
 249static int start_streaming(struct vb2_queue *vq, unsigned int count)
 250{
 251        struct skeleton *skel = vb2_get_drv_priv(vq);
 252        int ret = 0;
 253
 254        skel->sequence = 0;
 255
 256        /* TODO: start DMA */
 257
 258        if (ret) {
 259                /*
 260                 * In case of an error, return all active buffers to the
 261                 * QUEUED state
 262                 */
 263                return_all_buffers(skel, VB2_BUF_STATE_QUEUED);
 264        }
 265        return ret;
 266}
 267
 268/*
 269 * Stop the DMA engine. Any remaining buffers in the DMA queue are dequeued
 270 * and passed on to the vb2 framework marked as STATE_ERROR.
 271 */
 272static void stop_streaming(struct vb2_queue *vq)
 273{
 274        struct skeleton *skel = vb2_get_drv_priv(vq);
 275
 276        /* TODO: stop DMA */
 277
 278        /* Release all active buffers */
 279        return_all_buffers(skel, VB2_BUF_STATE_ERROR);
 280}
 281
 282/*
 283 * The vb2 queue ops. Note that since q->lock is set we can use the standard
 284 * vb2_ops_wait_prepare/finish helper functions. If q->lock would be NULL,
 285 * then this driver would have to provide these ops.
 286 */
 287static const struct vb2_ops skel_qops = {
 288        .queue_setup            = queue_setup,
 289        .buf_prepare            = buffer_prepare,
 290        .buf_queue              = buffer_queue,
 291        .start_streaming        = start_streaming,
 292        .stop_streaming         = stop_streaming,
 293        .wait_prepare           = vb2_ops_wait_prepare,
 294        .wait_finish            = vb2_ops_wait_finish,
 295};
 296
 297/*
 298 * Required ioctl querycap. Note that the version field is prefilled with
 299 * the version of the kernel.
 300 */
 301static int skeleton_querycap(struct file *file, void *priv,
 302                             struct v4l2_capability *cap)
 303{
 304        struct skeleton *skel = video_drvdata(file);
 305
 306        strlcpy(cap->driver, KBUILD_MODNAME, sizeof(cap->driver));
 307        strlcpy(cap->card, "V4L2 PCI Skeleton", sizeof(cap->card));
 308        snprintf(cap->bus_info, sizeof(cap->bus_info), "PCI:%s",
 309                 pci_name(skel->pdev));
 310        return 0;
 311}
 312
 313/*
 314 * Helper function to check and correct struct v4l2_pix_format. It's used
 315 * not only in VIDIOC_TRY/S_FMT, but also elsewhere if changes to the SDTV
 316 * standard, HDTV timings or the video input would require updating the
 317 * current format.
 318 */
 319static void skeleton_fill_pix_format(struct skeleton *skel,
 320                                     struct v4l2_pix_format *pix)
 321{
 322        pix->pixelformat = V4L2_PIX_FMT_YUYV;
 323        if (skel->input == 0) {
 324                /* S-Video input */
 325                pix->width = 720;
 326                pix->height = (skel->std & V4L2_STD_525_60) ? 480 : 576;
 327                pix->field = V4L2_FIELD_INTERLACED;
 328                pix->colorspace = V4L2_COLORSPACE_SMPTE170M;
 329        } else {
 330                /* HDMI input */
 331                pix->width = skel->timings.bt.width;
 332                pix->height = skel->timings.bt.height;
 333                if (skel->timings.bt.interlaced) {
 334                        pix->field = V4L2_FIELD_ALTERNATE;
 335                        pix->height /= 2;
 336                } else {
 337                        pix->field = V4L2_FIELD_NONE;
 338                }
 339                pix->colorspace = V4L2_COLORSPACE_REC709;
 340        }
 341
 342        /*
 343         * The YUYV format is four bytes for every two pixels, so bytesperline
 344         * is width * 2.
 345         */
 346        pix->bytesperline = pix->width * 2;
 347        pix->sizeimage = pix->bytesperline * pix->height;
 348        pix->priv = 0;
 349}
 350
 351static int skeleton_try_fmt_vid_cap(struct file *file, void *priv,
 352                                    struct v4l2_format *f)
 353{
 354        struct skeleton *skel = video_drvdata(file);
 355        struct v4l2_pix_format *pix = &f->fmt.pix;
 356
 357        /*
 358         * Due to historical reasons providing try_fmt with an unsupported
 359         * pixelformat will return -EINVAL for video receivers. Webcam drivers,
 360         * however, will silently correct the pixelformat. Some video capture
 361         * applications rely on this behavior...
 362         */
 363        if (pix->pixelformat != V4L2_PIX_FMT_YUYV)
 364                return -EINVAL;
 365        skeleton_fill_pix_format(skel, pix);
 366        return 0;
 367}
 368
 369static int skeleton_s_fmt_vid_cap(struct file *file, void *priv,
 370                                  struct v4l2_format *f)
 371{
 372        struct skeleton *skel = video_drvdata(file);
 373        int ret;
 374
 375        ret = skeleton_try_fmt_vid_cap(file, priv, f);
 376        if (ret)
 377                return ret;
 378
 379        /*
 380         * It is not allowed to change the format while buffers for use with
 381         * streaming have already been allocated.
 382         */
 383        if (vb2_is_busy(&skel->queue))
 384                return -EBUSY;
 385
 386        /* TODO: change format */
 387        skel->format = f->fmt.pix;
 388        return 0;
 389}
 390
 391static int skeleton_g_fmt_vid_cap(struct file *file, void *priv,
 392                                  struct v4l2_format *f)
 393{
 394        struct skeleton *skel = video_drvdata(file);
 395
 396        f->fmt.pix = skel->format;
 397        return 0;
 398}
 399
 400static int skeleton_enum_fmt_vid_cap(struct file *file, void *priv,
 401                                     struct v4l2_fmtdesc *f)
 402{
 403        if (f->index != 0)
 404                return -EINVAL;
 405
 406        f->pixelformat = V4L2_PIX_FMT_YUYV;
 407        return 0;
 408}
 409
 410static int skeleton_s_std(struct file *file, void *priv, v4l2_std_id std)
 411{
 412        struct skeleton *skel = video_drvdata(file);
 413
 414        /* S_STD is not supported on the HDMI input */
 415        if (skel->input)
 416                return -ENODATA;
 417
 418        /*
 419         * No change, so just return. Some applications call S_STD again after
 420         * the buffers for streaming have been set up, so we have to allow for
 421         * this behavior.
 422         */
 423        if (std == skel->std)
 424                return 0;
 425
 426        /*
 427         * Changing the standard implies a format change, which is not allowed
 428         * while buffers for use with streaming have already been allocated.
 429         */
 430        if (vb2_is_busy(&skel->queue))
 431                return -EBUSY;
 432
 433        /* TODO: handle changing std */
 434
 435        skel->std = std;
 436
 437        /* Update the internal format */
 438        skeleton_fill_pix_format(skel, &skel->format);
 439        return 0;
 440}
 441
 442static int skeleton_g_std(struct file *file, void *priv, v4l2_std_id *std)
 443{
 444        struct skeleton *skel = video_drvdata(file);
 445
 446        /* G_STD is not supported on the HDMI input */
 447        if (skel->input)
 448                return -ENODATA;
 449
 450        *std = skel->std;
 451        return 0;
 452}
 453
 454/*
 455 * Query the current standard as seen by the hardware. This function shall
 456 * never actually change the standard, it just detects and reports.
 457 * The framework will initially set *std to tvnorms (i.e. the set of
 458 * supported standards by this input), and this function should just AND
 459 * this value. If there is no signal, then *std should be set to 0.
 460 */
 461static int skeleton_querystd(struct file *file, void *priv, v4l2_std_id *std)
 462{
 463        struct skeleton *skel = video_drvdata(file);
 464
 465        /* QUERY_STD is not supported on the HDMI input */
 466        if (skel->input)
 467                return -ENODATA;
 468
 469#ifdef TODO
 470        /*
 471         * Query currently seen standard. Initial value of *std is
 472         * V4L2_STD_ALL. This function should look something like this:
 473         */
 474        get_signal_info();
 475        if (no_signal) {
 476                *std = 0;
 477                return 0;
 478        }
 479        /* Use signal information to reduce the number of possible standards */
 480        if (signal_has_525_lines)
 481                *std &= V4L2_STD_525_60;
 482        else
 483                *std &= V4L2_STD_625_50;
 484#endif
 485        return 0;
 486}
 487
 488static int skeleton_s_dv_timings(struct file *file, void *_fh,
 489                                 struct v4l2_dv_timings *timings)
 490{
 491        struct skeleton *skel = video_drvdata(file);
 492
 493        /* S_DV_TIMINGS is not supported on the S-Video input */
 494        if (skel->input == 0)
 495                return -ENODATA;
 496
 497        /* Quick sanity check */
 498        if (!v4l2_valid_dv_timings(timings, &skel_timings_cap, NULL, NULL))
 499                return -EINVAL;
 500
 501        /* Check if the timings are part of the CEA-861 timings. */
 502        if (!v4l2_find_dv_timings_cap(timings, &skel_timings_cap,
 503                                      0, NULL, NULL))
 504                return -EINVAL;
 505
 506        /* Return 0 if the new timings are the same as the current timings. */
 507        if (v4l2_match_dv_timings(timings, &skel->timings, 0, false))
 508                return 0;
 509
 510        /*
 511         * Changing the timings implies a format change, which is not allowed
 512         * while buffers for use with streaming have already been allocated.
 513         */
 514        if (vb2_is_busy(&skel->queue))
 515                return -EBUSY;
 516
 517        /* TODO: Configure new timings */
 518
 519        /* Save timings */
 520        skel->timings = *timings;
 521
 522        /* Update the internal format */
 523        skeleton_fill_pix_format(skel, &skel->format);
 524        return 0;
 525}
 526
 527static int skeleton_g_dv_timings(struct file *file, void *_fh,
 528                                 struct v4l2_dv_timings *timings)
 529{
 530        struct skeleton *skel = video_drvdata(file);
 531
 532        /* G_DV_TIMINGS is not supported on the S-Video input */
 533        if (skel->input == 0)
 534                return -ENODATA;
 535
 536        *timings = skel->timings;
 537        return 0;
 538}
 539
 540static int skeleton_enum_dv_timings(struct file *file, void *_fh,
 541                                    struct v4l2_enum_dv_timings *timings)
 542{
 543        struct skeleton *skel = video_drvdata(file);
 544
 545        /* ENUM_DV_TIMINGS is not supported on the S-Video input */
 546        if (skel->input == 0)
 547                return -ENODATA;
 548
 549        return v4l2_enum_dv_timings_cap(timings, &skel_timings_cap,
 550                                        NULL, NULL);
 551}
 552
 553/*
 554 * Query the current timings as seen by the hardware. This function shall
 555 * never actually change the timings, it just detects and reports.
 556 * If no signal is detected, then return -ENOLINK. If the hardware cannot
 557 * lock to the signal, then return -ENOLCK. If the signal is out of range
 558 * of the capabilities of the system (e.g., it is possible that the receiver
 559 * can lock but that the DMA engine it is connected to cannot handle
 560 * pixelclocks above a certain frequency), then -ERANGE is returned.
 561 */
 562static int skeleton_query_dv_timings(struct file *file, void *_fh,
 563                                     struct v4l2_dv_timings *timings)
 564{
 565        struct skeleton *skel = video_drvdata(file);
 566
 567        /* QUERY_DV_TIMINGS is not supported on the S-Video input */
 568        if (skel->input == 0)
 569                return -ENODATA;
 570
 571#ifdef TODO
 572        /*
 573         * Query currently seen timings. This function should look
 574         * something like this:
 575         */
 576        detect_timings();
 577        if (no_signal)
 578                return -ENOLINK;
 579        if (cannot_lock_to_signal)
 580                return -ENOLCK;
 581        if (signal_out_of_range_of_capabilities)
 582                return -ERANGE;
 583
 584        /* Useful for debugging */
 585        v4l2_print_dv_timings(skel->v4l2_dev.name, "query_dv_timings:",
 586                        timings, true);
 587#endif
 588        return 0;
 589}
 590
 591static int skeleton_dv_timings_cap(struct file *file, void *fh,
 592                                   struct v4l2_dv_timings_cap *cap)
 593{
 594        struct skeleton *skel = video_drvdata(file);
 595
 596        /* DV_TIMINGS_CAP is not supported on the S-Video input */
 597        if (skel->input == 0)
 598                return -ENODATA;
 599        *cap = skel_timings_cap;
 600        return 0;
 601}
 602
 603static int skeleton_enum_input(struct file *file, void *priv,
 604                               struct v4l2_input *i)
 605{
 606        if (i->index > 1)
 607                return -EINVAL;
 608
 609        i->type = V4L2_INPUT_TYPE_CAMERA;
 610        if (i->index == 0) {
 611                i->std = SKEL_TVNORMS;
 612                strlcpy(i->name, "S-Video", sizeof(i->name));
 613                i->capabilities = V4L2_IN_CAP_STD;
 614        } else {
 615                i->std = 0;
 616                strlcpy(i->name, "HDMI", sizeof(i->name));
 617                i->capabilities = V4L2_IN_CAP_DV_TIMINGS;
 618        }
 619        return 0;
 620}
 621
 622static int skeleton_s_input(struct file *file, void *priv, unsigned int i)
 623{
 624        struct skeleton *skel = video_drvdata(file);
 625
 626        if (i > 1)
 627                return -EINVAL;
 628
 629        /*
 630         * Changing the input implies a format change, which is not allowed
 631         * while buffers for use with streaming have already been allocated.
 632         */
 633        if (vb2_is_busy(&skel->queue))
 634                return -EBUSY;
 635
 636        skel->input = i;
 637        /*
 638         * Update tvnorms. The tvnorms value is used by the core to implement
 639         * VIDIOC_ENUMSTD so it has to be correct. If tvnorms == 0, then
 640         * ENUMSTD will return -ENODATA.
 641         */
 642        skel->vdev.tvnorms = i ? 0 : SKEL_TVNORMS;
 643
 644        /* Update the internal format */
 645        skeleton_fill_pix_format(skel, &skel->format);
 646        return 0;
 647}
 648
 649static int skeleton_g_input(struct file *file, void *priv, unsigned int *i)
 650{
 651        struct skeleton *skel = video_drvdata(file);
 652
 653        *i = skel->input;
 654        return 0;
 655}
 656
 657/* The control handler. */
 658static int skeleton_s_ctrl(struct v4l2_ctrl *ctrl)
 659{
 660        /*struct skeleton *skel =
 661                container_of(ctrl->handler, struct skeleton, ctrl_handler);*/
 662
 663        switch (ctrl->id) {
 664        case V4L2_CID_BRIGHTNESS:
 665                /* TODO: set brightness to ctrl->val */
 666                break;
 667        case V4L2_CID_CONTRAST:
 668                /* TODO: set contrast to ctrl->val */
 669                break;
 670        case V4L2_CID_SATURATION:
 671                /* TODO: set saturation to ctrl->val */
 672                break;
 673        case V4L2_CID_HUE:
 674                /* TODO: set hue to ctrl->val */
 675                break;
 676        default:
 677                return -EINVAL;
 678        }
 679        return 0;
 680}
 681
 682/* ------------------------------------------------------------------
 683        File operations for the device
 684   ------------------------------------------------------------------*/
 685
 686static const struct v4l2_ctrl_ops skel_ctrl_ops = {
 687        .s_ctrl = skeleton_s_ctrl,
 688};
 689
 690/*
 691 * The set of all supported ioctls. Note that all the streaming ioctls
 692 * use the vb2 helper functions that take care of all the locking and
 693 * that also do ownership tracking (i.e. only the filehandle that requested
 694 * the buffers can call the streaming ioctls, all other filehandles will
 695 * receive -EBUSY if they attempt to call the same streaming ioctls).
 696 *
 697 * The last three ioctls also use standard helper functions: these implement
 698 * standard behavior for drivers with controls.
 699 */
 700static const struct v4l2_ioctl_ops skel_ioctl_ops = {
 701        .vidioc_querycap = skeleton_querycap,
 702        .vidioc_try_fmt_vid_cap = skeleton_try_fmt_vid_cap,
 703        .vidioc_s_fmt_vid_cap = skeleton_s_fmt_vid_cap,
 704        .vidioc_g_fmt_vid_cap = skeleton_g_fmt_vid_cap,
 705        .vidioc_enum_fmt_vid_cap = skeleton_enum_fmt_vid_cap,
 706
 707        .vidioc_g_std = skeleton_g_std,
 708        .vidioc_s_std = skeleton_s_std,
 709        .vidioc_querystd = skeleton_querystd,
 710
 711        .vidioc_s_dv_timings = skeleton_s_dv_timings,
 712        .vidioc_g_dv_timings = skeleton_g_dv_timings,
 713        .vidioc_enum_dv_timings = skeleton_enum_dv_timings,
 714        .vidioc_query_dv_timings = skeleton_query_dv_timings,
 715        .vidioc_dv_timings_cap = skeleton_dv_timings_cap,
 716
 717        .vidioc_enum_input = skeleton_enum_input,
 718        .vidioc_g_input = skeleton_g_input,
 719        .vidioc_s_input = skeleton_s_input,
 720
 721        .vidioc_reqbufs = vb2_ioctl_reqbufs,
 722        .vidioc_create_bufs = vb2_ioctl_create_bufs,
 723        .vidioc_querybuf = vb2_ioctl_querybuf,
 724        .vidioc_qbuf = vb2_ioctl_qbuf,
 725        .vidioc_dqbuf = vb2_ioctl_dqbuf,
 726        .vidioc_expbuf = vb2_ioctl_expbuf,
 727        .vidioc_streamon = vb2_ioctl_streamon,
 728        .vidioc_streamoff = vb2_ioctl_streamoff,
 729
 730        .vidioc_log_status = v4l2_ctrl_log_status,
 731        .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
 732        .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
 733};
 734
 735/*
 736 * The set of file operations. Note that all these ops are standard core
 737 * helper functions.
 738 */
 739static const struct v4l2_file_operations skel_fops = {
 740        .owner = THIS_MODULE,
 741        .open = v4l2_fh_open,
 742        .release = vb2_fop_release,
 743        .unlocked_ioctl = video_ioctl2,
 744        .read = vb2_fop_read,
 745        .mmap = vb2_fop_mmap,
 746        .poll = vb2_fop_poll,
 747};
 748
 749/*
 750 * The initial setup of this device instance. Note that the initial state of
 751 * the driver should be complete. So the initial format, standard, timings
 752 * and video input should all be initialized to some reasonable value.
 753 */
 754static int skeleton_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 755{
 756        /* The initial timings are chosen to be 720p60. */
 757        static const struct v4l2_dv_timings timings_def =
 758                V4L2_DV_BT_CEA_1280X720P60;
 759        struct skeleton *skel;
 760        struct video_device *vdev;
 761        struct v4l2_ctrl_handler *hdl;
 762        struct vb2_queue *q;
 763        int ret;
 764
 765        /* Enable PCI */
 766        ret = pci_enable_device(pdev);
 767        if (ret)
 768                return ret;
 769        ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
 770        if (ret) {
 771                dev_err(&pdev->dev, "no suitable DMA available.\n");
 772                goto disable_pci;
 773        }
 774
 775        /* Allocate a new instance */
 776        skel = devm_kzalloc(&pdev->dev, sizeof(struct skeleton), GFP_KERNEL);
 777        if (!skel) {
 778                ret = -ENOMEM;
 779                goto disable_pci;
 780        }
 781
 782        /* Allocate the interrupt */
 783        ret = devm_request_irq(&pdev->dev, pdev->irq,
 784                               skeleton_irq, 0, KBUILD_MODNAME, skel);
 785        if (ret) {
 786                dev_err(&pdev->dev, "request_irq failed\n");
 787                goto disable_pci;
 788        }
 789        skel->pdev = pdev;
 790
 791        /* Fill in the initial format-related settings */
 792        skel->timings = timings_def;
 793        skel->std = V4L2_STD_625_50;
 794        skeleton_fill_pix_format(skel, &skel->format);
 795
 796        /* Initialize the top-level structure */
 797        ret = v4l2_device_register(&pdev->dev, &skel->v4l2_dev);
 798        if (ret)
 799                goto disable_pci;
 800
 801        mutex_init(&skel->lock);
 802
 803        /* Add the controls */
 804        hdl = &skel->ctrl_handler;
 805        v4l2_ctrl_handler_init(hdl, 4);
 806        v4l2_ctrl_new_std(hdl, &skel_ctrl_ops,
 807                          V4L2_CID_BRIGHTNESS, 0, 255, 1, 127);
 808        v4l2_ctrl_new_std(hdl, &skel_ctrl_ops,
 809                          V4L2_CID_CONTRAST, 0, 255, 1, 16);
 810        v4l2_ctrl_new_std(hdl, &skel_ctrl_ops,
 811                          V4L2_CID_SATURATION, 0, 255, 1, 127);
 812        v4l2_ctrl_new_std(hdl, &skel_ctrl_ops,
 813                          V4L2_CID_HUE, -128, 127, 1, 0);
 814        if (hdl->error) {
 815                ret = hdl->error;
 816                goto free_hdl;
 817        }
 818        skel->v4l2_dev.ctrl_handler = hdl;
 819
 820        /* Initialize the vb2 queue */
 821        q = &skel->queue;
 822        q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 823        q->io_modes = VB2_MMAP | VB2_DMABUF | VB2_READ;
 824        q->dev = &pdev->dev;
 825        q->drv_priv = skel;
 826        q->buf_struct_size = sizeof(struct skel_buffer);
 827        q->ops = &skel_qops;
 828        q->mem_ops = &vb2_dma_contig_memops;
 829        q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 830        /*
 831         * Assume that this DMA engine needs to have at least two buffers
 832         * available before it can be started. The start_streaming() op
 833         * won't be called until at least this many buffers are queued up.
 834         */
 835        q->min_buffers_needed = 2;
 836        /*
 837         * The serialization lock for the streaming ioctls. This is the same
 838         * as the main serialization lock, but if some of the non-streaming
 839         * ioctls could take a long time to execute, then you might want to
 840         * have a different lock here to prevent VIDIOC_DQBUF from being
 841         * blocked while waiting for another action to finish. This is
 842         * generally not needed for PCI devices, but USB devices usually do
 843         * want a separate lock here.
 844         */
 845        q->lock = &skel->lock;
 846        /*
 847         * Since this driver can only do 32-bit DMA we must make sure that
 848         * the vb2 core will allocate the buffers in 32-bit DMA memory.
 849         */
 850        q->gfp_flags = GFP_DMA32;
 851        ret = vb2_queue_init(q);
 852        if (ret)
 853                goto free_hdl;
 854
 855        INIT_LIST_HEAD(&skel->buf_list);
 856        spin_lock_init(&skel->qlock);
 857
 858        /* Initialize the video_device structure */
 859        vdev = &skel->vdev;
 860        strlcpy(vdev->name, KBUILD_MODNAME, sizeof(vdev->name));
 861        /*
 862         * There is nothing to clean up, so release is set to an empty release
 863         * function. The release callback must be non-NULL.
 864         */
 865        vdev->release = video_device_release_empty;
 866        vdev->fops = &skel_fops,
 867        vdev->ioctl_ops = &skel_ioctl_ops,
 868        vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
 869                            V4L2_CAP_STREAMING;
 870        /*
 871         * The main serialization lock. All ioctls are serialized by this
 872         * lock. Exception: if q->lock is set, then the streaming ioctls
 873         * are serialized by that separate lock.
 874         */
 875        vdev->lock = &skel->lock;
 876        vdev->queue = q;
 877        vdev->v4l2_dev = &skel->v4l2_dev;
 878        /* Supported SDTV standards, if any */
 879        vdev->tvnorms = SKEL_TVNORMS;
 880        video_set_drvdata(vdev, skel);
 881
 882        ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
 883        if (ret)
 884                goto free_hdl;
 885
 886        dev_info(&pdev->dev, "V4L2 PCI Skeleton Driver loaded\n");
 887        return 0;
 888
 889free_hdl:
 890        v4l2_ctrl_handler_free(&skel->ctrl_handler);
 891        v4l2_device_unregister(&skel->v4l2_dev);
 892disable_pci:
 893        pci_disable_device(pdev);
 894        return ret;
 895}
 896
 897static void skeleton_remove(struct pci_dev *pdev)
 898{
 899        struct v4l2_device *v4l2_dev = pci_get_drvdata(pdev);
 900        struct skeleton *skel = container_of(v4l2_dev, struct skeleton, v4l2_dev);
 901
 902        video_unregister_device(&skel->vdev);
 903        v4l2_ctrl_handler_free(&skel->ctrl_handler);
 904        v4l2_device_unregister(&skel->v4l2_dev);
 905        pci_disable_device(skel->pdev);
 906}
 907
 908static struct pci_driver skeleton_driver = {
 909        .name = KBUILD_MODNAME,
 910        .probe = skeleton_probe,
 911        .remove = skeleton_remove,
 912        .id_table = skeleton_pci_tbl,
 913};
 914
 915module_pci_driver(skeleton_driver);
 916