Showing error 800

User: Jiri Slaby
Error type: Memory Leak
Error type description: There the code omits to free some allocated memory
File location: drivers/media/video/vivi.c
Line in file: 1058
Project: Linux Kernel
Project version: 2.6.28
Tools: Stanse (1.2)
Entered: 2011-11-07 22:26:27 UTC


Source:

   1/*
   2 * Virtual Video driver - This code emulates a real video device with v4l2 api
   3 *
   4 * Copyright (c) 2006 by:
   5 *      Mauro Carvalho Chehab <mchehab--a.t--infradead.org>
   6 *      Ted Walther <ted--a.t--enumera.com>
   7 *      John Sokol <sokol--a.t--videotechnology.com>
   8 *      http://v4l.videotechnology.com/
   9 *
  10 * This program is free software; you can redistribute it and/or modify
  11 * it under the terms of the BSD Licence, GNU General Public License
  12 * as published by the Free Software Foundation; either version 2 of the
  13 * License, or (at your option) any later version
  14 */
  15#include <linux/module.h>
  16#include <linux/delay.h>
  17#include <linux/errno.h>
  18#include <linux/fs.h>
  19#include <linux/kernel.h>
  20#include <linux/slab.h>
  21#include <linux/mm.h>
  22#include <linux/ioport.h>
  23#include <linux/init.h>
  24#include <linux/sched.h>
  25#include <linux/pci.h>
  26#include <linux/random.h>
  27#include <linux/version.h>
  28#include <linux/mutex.h>
  29#include <linux/videodev2.h>
  30#include <linux/dma-mapping.h>
  31#ifdef CONFIG_VIDEO_V4L1_COMPAT
  32/* Include V4L1 specific functions. Should be removed soon */
  33#include <linux/videodev.h>
  34#endif
  35#include <linux/interrupt.h>
  36#include <media/videobuf-vmalloc.h>
  37#include <media/v4l2-common.h>
  38#include <media/v4l2-ioctl.h>
  39#include <linux/kthread.h>
  40#include <linux/highmem.h>
  41#include <linux/freezer.h>
  42
  43#define VIVI_MODULE_NAME "vivi"
  44
  45/* Wake up at about 30 fps */
  46#define WAKE_NUMERATOR 30
  47#define WAKE_DENOMINATOR 1001
  48#define BUFFER_TIMEOUT     msecs_to_jiffies(500)  /* 0.5 seconds */
  49
  50#include "font.h"
  51
  52#define VIVI_MAJOR_VERSION 0
  53#define VIVI_MINOR_VERSION 5
  54#define VIVI_RELEASE 0
  55#define VIVI_VERSION \
  56        KERNEL_VERSION(VIVI_MAJOR_VERSION, VIVI_MINOR_VERSION, VIVI_RELEASE)
  57
  58/* Declare static vars that will be used as parameters */
  59static unsigned int vid_limit = 16;        /* Video memory limit, in Mb */
  60static int video_nr = -1;                /* /dev/videoN, -1 for autodetect */
  61static int n_devs = 1;                        /* Number of virtual devices */
  62
  63/* supported controls */
  64static struct v4l2_queryctrl vivi_qctrl[] = {
  65        {
  66                .id            = V4L2_CID_AUDIO_VOLUME,
  67                .name          = "Volume",
  68                .minimum       = 0,
  69                .maximum       = 65535,
  70                .step          = 65535/100,
  71                .default_value = 65535,
  72                .flags         = 0,
  73                .type          = V4L2_CTRL_TYPE_INTEGER,
  74        }, {
  75                .id            = V4L2_CID_BRIGHTNESS,
  76                .type          = V4L2_CTRL_TYPE_INTEGER,
  77                .name          = "Brightness",
  78                .minimum       = 0,
  79                .maximum       = 255,
  80                .step          = 1,
  81                .default_value = 127,
  82                .flags         = 0,
  83        }, {
  84                .id            = V4L2_CID_CONTRAST,
  85                .type          = V4L2_CTRL_TYPE_INTEGER,
  86                .name          = "Contrast",
  87                .minimum       = 0,
  88                .maximum       = 255,
  89                .step          = 0x1,
  90                .default_value = 0x10,
  91                .flags         = 0,
  92        }, {
  93                .id            = V4L2_CID_SATURATION,
  94                .type          = V4L2_CTRL_TYPE_INTEGER,
  95                .name          = "Saturation",
  96                .minimum       = 0,
  97                .maximum       = 255,
  98                .step          = 0x1,
  99                .default_value = 127,
 100                .flags         = 0,
 101        }, {
 102                .id            = V4L2_CID_HUE,
 103                .type          = V4L2_CTRL_TYPE_INTEGER,
 104                .name          = "Hue",
 105                .minimum       = -128,
 106                .maximum       = 127,
 107                .step          = 0x1,
 108                .default_value = 0,
 109                .flags         = 0,
 110        }
 111};
 112
 113static int qctl_regs[ARRAY_SIZE(vivi_qctrl)];
 114
 115#define dprintk(dev, level, fmt, arg...)                                \
 116        do {                                                                \
 117                if (dev->vfd->debug >= (level))                                \
 118                        printk(KERN_DEBUG "vivi: " fmt , ## arg);        \
 119        } while (0)
 120
 121/* ------------------------------------------------------------------
 122        Basic structures
 123   ------------------------------------------------------------------*/
 124
 125struct vivi_fmt {
 126        char  *name;
 127        u32   fourcc;          /* v4l2 format id */
 128        int   depth;
 129};
 130
 131static struct vivi_fmt formats[] = {
 132        {
 133                .name     = "4:2:2, packed, YUYV",
 134                .fourcc   = V4L2_PIX_FMT_YUYV,
 135                .depth    = 16,
 136        },
 137        {
 138                .name     = "4:2:2, packed, UYVY",
 139                .fourcc   = V4L2_PIX_FMT_UYVY,
 140                .depth    = 16,
 141        },
 142        {
 143                .name     = "RGB565 (LE)",
 144                .fourcc   = V4L2_PIX_FMT_RGB565, /* gggbbbbb rrrrrggg */
 145                .depth    = 16,
 146        },
 147        {
 148                .name     = "RGB565 (BE)",
 149                .fourcc   = V4L2_PIX_FMT_RGB565X, /* rrrrrggg gggbbbbb */
 150                .depth    = 16,
 151        },
 152        {
 153                .name     = "RGB555 (LE)",
 154                .fourcc   = V4L2_PIX_FMT_RGB555, /* gggbbbbb arrrrrgg */
 155                .depth    = 16,
 156        },
 157        {
 158                .name     = "RGB555 (BE)",
 159                .fourcc   = V4L2_PIX_FMT_RGB555X, /* arrrrrgg gggbbbbb */
 160                .depth    = 16,
 161        },
 162};
 163
 164static struct vivi_fmt *get_format(struct v4l2_format *f)
 165{
 166        struct vivi_fmt *fmt;
 167        unsigned int k;
 168
 169        for (k = 0; k < ARRAY_SIZE(formats); k++) {
 170                fmt = &formats[k];
 171                if (fmt->fourcc == f->fmt.pix.pixelformat)
 172                        break;
 173        }
 174
 175        if (k == ARRAY_SIZE(formats))
 176                return NULL;
 177
 178        return &formats[k];
 179}
 180
 181struct sg_to_addr {
 182        int pos;
 183        struct scatterlist *sg;
 184};
 185
 186/* buffer for one video frame */
 187struct vivi_buffer {
 188        /* common v4l buffer stuff -- must be first */
 189        struct videobuf_buffer vb;
 190
 191        struct vivi_fmt        *fmt;
 192};
 193
 194struct vivi_dmaqueue {
 195        struct list_head       active;
 196
 197        /* thread for generating video stream*/
 198        struct task_struct         *kthread;
 199        wait_queue_head_t          wq;
 200        /* Counters to control fps rate */
 201        int                        frame;
 202        int                        ini_jiffies;
 203};
 204
 205static LIST_HEAD(vivi_devlist);
 206
 207struct vivi_dev {
 208        struct list_head           vivi_devlist;
 209
 210        spinlock_t                 slock;
 211        struct mutex                   mutex;
 212
 213        int                        users;
 214
 215        /* various device info */
 216        struct video_device        *vfd;
 217
 218        struct vivi_dmaqueue       vidq;
 219
 220        /* Several counters */
 221        int                        h, m, s, ms;
 222        unsigned long              jiffies;
 223        char                       timestr[13];
 224
 225        int                           mv_count;        /* Controls bars movement */
 226};
 227
 228struct vivi_fh {
 229        struct vivi_dev            *dev;
 230
 231        /* video capture */
 232        struct vivi_fmt            *fmt;
 233        unsigned int               width, height;
 234        struct videobuf_queue      vb_vidq;
 235
 236        enum v4l2_buf_type         type;
 237        unsigned char              bars[8][3];
 238};
 239
 240/* ------------------------------------------------------------------
 241        DMA and thread functions
 242   ------------------------------------------------------------------*/
 243
 244/* Bars and Colors should match positions */
 245
 246enum colors {
 247        WHITE,
 248        AMBAR,
 249        CYAN,
 250        GREEN,
 251        MAGENTA,
 252        RED,
 253        BLUE,
 254        BLACK,
 255};
 256
 257static u8 bars[8][3] = {
 258        /* R   G   B */
 259        {204, 204, 204},  /* white */
 260        {208, 208,   0},  /* ambar */
 261        {  0, 206, 206},  /* cyan */
 262        {  0, 239,   0},  /* green */
 263        {239,   0, 239},  /* magenta */
 264        {205,   0,   0},  /* red */
 265        {  0,   0, 255},  /* blue */
 266        {  0,   0,   0},  /* black */
 267};
 268
 269#define TO_Y(r, g, b) \
 270        (((16829 * r + 33039 * g + 6416 * b  + 32768) >> 16) + 16)
 271/* RGB to  V(Cr) Color transform */
 272#define TO_V(r, g, b) \
 273        (((28784 * r - 24103 * g - 4681 * b  + 32768) >> 16) + 128)
 274/* RGB to  U(Cb) Color transform */
 275#define TO_U(r, g, b) \
 276        (((-9714 * r - 19070 * g + 28784 * b + 32768) >> 16) + 128)
 277
 278#define TSTAMP_MIN_Y 24
 279#define TSTAMP_MAX_Y TSTAMP_MIN_Y+15
 280#define TSTAMP_MIN_X 64
 281
 282static void gen_twopix(struct vivi_fh *fh, unsigned char *buf, int colorpos)
 283{
 284        unsigned char r_y, g_u, b_v;
 285        unsigned char *p;
 286        int color;
 287
 288        r_y = fh->bars[colorpos][0]; /* R or precalculated Y */
 289        g_u = fh->bars[colorpos][1]; /* G or precalculated U */
 290        b_v = fh->bars[colorpos][2]; /* B or precalculated V */
 291
 292        for (color = 0; color < 4; color++) {
 293                p = buf + color;
 294
 295                switch (fh->fmt->fourcc) {
 296                case V4L2_PIX_FMT_YUYV:
 297                        switch (color) {
 298                        case 0:
 299                        case 2:
 300                                *p = r_y;
 301                                break;
 302                        case 1:
 303                                *p = g_u;
 304                                break;
 305                        case 3:
 306                                *p = b_v;
 307                                break;
 308                        }
 309                        break;
 310                case V4L2_PIX_FMT_UYVY:
 311                        switch (color) {
 312                        case 1:
 313                        case 3:
 314                                *p = r_y;
 315                                break;
 316                        case 0:
 317                                *p = g_u;
 318                                break;
 319                        case 2:
 320                                *p = b_v;
 321                                break;
 322                        }
 323                        break;
 324                case V4L2_PIX_FMT_RGB565:
 325                        switch (color) {
 326                        case 0:
 327                        case 2:
 328                                *p = (g_u << 5) | b_v;
 329                                break;
 330                        case 1:
 331                        case 3:
 332                                *p = (r_y << 3) | (g_u >> 3);
 333                                break;
 334                        }
 335                        break;
 336                case V4L2_PIX_FMT_RGB565X:
 337                        switch (color) {
 338                        case 0:
 339                        case 2:
 340                                *p = (r_y << 3) | (g_u >> 3);
 341                                break;
 342                        case 1:
 343                        case 3:
 344                                *p = (g_u << 5) | b_v;
 345                                break;
 346                        }
 347                        break;
 348                case V4L2_PIX_FMT_RGB555:
 349                        switch (color) {
 350                        case 0:
 351                        case 2:
 352                                *p = (g_u << 5) | b_v;
 353                                break;
 354                        case 1:
 355                        case 3:
 356                                *p = (r_y << 2) | (g_u >> 3);
 357                                break;
 358                        }
 359                        break;
 360                case V4L2_PIX_FMT_RGB555X:
 361                        switch (color) {
 362                        case 0:
 363                        case 2:
 364                                *p = (r_y << 2) | (g_u >> 3);
 365                                break;
 366                        case 1:
 367                        case 3:
 368                                *p = (g_u << 5) | b_v;
 369                                break;
 370                        }
 371                        break;
 372                }
 373        }
 374}
 375
 376static void gen_line(struct vivi_fh *fh, char *basep, int inipos, int wmax,
 377                int hmax, int line, int count, char *timestr)
 378{
 379        int  w, i, j;
 380        int pos = inipos;
 381        char *s;
 382        u8 chr;
 383
 384        /* We will just duplicate the second pixel at the packet */
 385        wmax /= 2;
 386
 387        /* Generate a standard color bar pattern */
 388        for (w = 0; w < wmax; w++) {
 389                int colorpos = ((w + count) * 8/(wmax + 1)) % 8;
 390
 391                gen_twopix(fh, basep + pos, colorpos);
 392                pos += 4; /* only 16 bpp supported for now */
 393        }
 394
 395        /* Checks if it is possible to show timestamp */
 396        if (TSTAMP_MAX_Y >= hmax)
 397                goto end;
 398        if (TSTAMP_MIN_X + strlen(timestr) >= wmax)
 399                goto end;
 400
 401        /* Print stream time */
 402        if (line >= TSTAMP_MIN_Y && line <= TSTAMP_MAX_Y) {
 403                j = TSTAMP_MIN_X;
 404                for (s = timestr; *s; s++) {
 405                        chr = rom8x16_bits[(*s-0x30)*16+line-TSTAMP_MIN_Y];
 406                        for (i = 0; i < 7; i++) {
 407                                pos = inipos + j * 2;
 408                                /* Draw white font on black background */
 409                                if (chr & 1 << (7 - i))
 410                                        gen_twopix(fh, basep + pos, WHITE);
 411                                else
 412                                        gen_twopix(fh, basep + pos, BLACK);
 413                                j++;
 414                        }
 415                }
 416        }
 417
 418end:
 419        return;
 420}
 421
 422static void vivi_fillbuff(struct vivi_fh *fh, struct vivi_buffer *buf)
 423{
 424        struct vivi_dev *dev = fh->dev;
 425        int h , pos = 0;
 426        int hmax  = buf->vb.height;
 427        int wmax  = buf->vb.width;
 428        struct timeval ts;
 429        char *tmpbuf;
 430        void *vbuf = videobuf_to_vmalloc(&buf->vb);
 431
 432        if (!vbuf)
 433                return;
 434
 435        tmpbuf = kmalloc(wmax * 2, GFP_ATOMIC);
 436        if (!tmpbuf)
 437                return;
 438
 439        for (h = 0; h < hmax; h++) {
 440                gen_line(fh, tmpbuf, 0, wmax, hmax, h, dev->mv_count,
 441                         dev->timestr);
 442                memcpy(vbuf + pos, tmpbuf, wmax * 2);
 443                pos += wmax*2;
 444        }
 445
 446        dev->mv_count++;
 447
 448        kfree(tmpbuf);
 449
 450        /* Updates stream time */
 451
 452        dev->ms += jiffies_to_msecs(jiffies-dev->jiffies);
 453        dev->jiffies = jiffies;
 454        if (dev->ms >= 1000) {
 455                dev->ms -= 1000;
 456                dev->s++;
 457                if (dev->s >= 60) {
 458                        dev->s -= 60;
 459                        dev->m++;
 460                        if (dev->m > 60) {
 461                                dev->m -= 60;
 462                                dev->h++;
 463                                if (dev->h > 24)
 464                                        dev->h -= 24;
 465                        }
 466                }
 467        }
 468        sprintf(dev->timestr, "%02d:%02d:%02d:%03d",
 469                        dev->h, dev->m, dev->s, dev->ms);
 470
 471        dprintk(dev, 2, "vivifill at %s: Buffer 0x%08lx size= %d\n",
 472                        dev->timestr, (unsigned long)tmpbuf, pos);
 473
 474        /* Advice that buffer was filled */
 475        buf->vb.field_count++;
 476        do_gettimeofday(&ts);
 477        buf->vb.ts = ts;
 478        buf->vb.state = VIDEOBUF_DONE;
 479}
 480
 481static void vivi_thread_tick(struct vivi_fh *fh)
 482{
 483        struct vivi_buffer *buf;
 484        struct vivi_dev *dev = fh->dev;
 485        struct vivi_dmaqueue *dma_q = &dev->vidq;
 486
 487        unsigned long flags = 0;
 488
 489        dprintk(dev, 1, "Thread tick\n");
 490
 491        spin_lock_irqsave(&dev->slock, flags);
 492        if (list_empty(&dma_q->active)) {
 493                dprintk(dev, 1, "No active queue to serve\n");
 494                goto unlock;
 495        }
 496
 497        buf = list_entry(dma_q->active.next,
 498                         struct vivi_buffer, vb.queue);
 499
 500        /* Nobody is waiting on this buffer, return */
 501        if (!waitqueue_active(&buf->vb.done))
 502                goto unlock;
 503
 504        list_del(&buf->vb.queue);
 505
 506        do_gettimeofday(&buf->vb.ts);
 507
 508        /* Fill buffer */
 509        vivi_fillbuff(fh, buf);
 510        dprintk(dev, 1, "filled buffer %p\n", buf);
 511
 512        wake_up(&buf->vb.done);
 513        dprintk(dev, 2, "[%p/%d] wakeup\n", buf, buf->vb. i);
 514unlock:
 515        spin_unlock_irqrestore(&dev->slock, flags);
 516        return;
 517}
 518
 519#define frames_to_ms(frames)                                        \
 520        ((frames * WAKE_NUMERATOR * 1000) / WAKE_DENOMINATOR)
 521
 522static void vivi_sleep(struct vivi_fh *fh)
 523{
 524        struct vivi_dev *dev = fh->dev;
 525        struct vivi_dmaqueue *dma_q = &dev->vidq;
 526        int timeout;
 527        DECLARE_WAITQUEUE(wait, current);
 528
 529        dprintk(dev, 1, "%s dma_q=0x%08lx\n", __func__,
 530                (unsigned long)dma_q);
 531
 532        add_wait_queue(&dma_q->wq, &wait);
 533        if (kthread_should_stop())
 534                goto stop_task;
 535
 536        /* Calculate time to wake up */
 537        timeout = msecs_to_jiffies(frames_to_ms(1));
 538
 539        vivi_thread_tick(fh);
 540
 541        schedule_timeout_interruptible(timeout);
 542
 543stop_task:
 544        remove_wait_queue(&dma_q->wq, &wait);
 545        try_to_freeze();
 546}
 547
 548static int vivi_thread(void *data)
 549{
 550        struct vivi_fh  *fh = data;
 551        struct vivi_dev *dev = fh->dev;
 552
 553        dprintk(dev, 1, "thread started\n");
 554
 555        set_freezable();
 556
 557        for (;;) {
 558                vivi_sleep(fh);
 559
 560                if (kthread_should_stop())
 561                        break;
 562        }
 563        dprintk(dev, 1, "thread: exit\n");
 564        return 0;
 565}
 566
 567static int vivi_start_thread(struct vivi_fh *fh)
 568{
 569        struct vivi_dev *dev = fh->dev;
 570        struct vivi_dmaqueue *dma_q = &dev->vidq;
 571
 572        dma_q->frame = 0;
 573        dma_q->ini_jiffies = jiffies;
 574
 575        dprintk(dev, 1, "%s\n", __func__);
 576
 577        dma_q->kthread = kthread_run(vivi_thread, fh, "vivi");
 578
 579        if (IS_ERR(dma_q->kthread)) {
 580                printk(KERN_ERR "vivi: kernel_thread() failed\n");
 581                return PTR_ERR(dma_q->kthread);
 582        }
 583        /* Wakes thread */
 584        wake_up_interruptible(&dma_q->wq);
 585
 586        dprintk(dev, 1, "returning from %s\n", __func__);
 587        return 0;
 588}
 589
 590static void vivi_stop_thread(struct vivi_dmaqueue  *dma_q)
 591{
 592        struct vivi_dev *dev = container_of(dma_q, struct vivi_dev, vidq);
 593
 594        dprintk(dev, 1, "%s\n", __func__);
 595        /* shutdown control thread */
 596        if (dma_q->kthread) {
 597                kthread_stop(dma_q->kthread);
 598                dma_q->kthread = NULL;
 599        }
 600}
 601
 602/* ------------------------------------------------------------------
 603        Videobuf operations
 604   ------------------------------------------------------------------*/
 605static int
 606buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
 607{
 608        struct vivi_fh  *fh = vq->priv_data;
 609        struct vivi_dev *dev  = fh->dev;
 610
 611        *size = fh->width*fh->height*2;
 612
 613        if (0 == *count)
 614                *count = 32;
 615
 616        while (*size * *count > vid_limit * 1024 * 1024)
 617                (*count)--;
 618
 619        dprintk(dev, 1, "%s, count=%d, size=%d\n", __func__,
 620                *count, *size);
 621
 622        return 0;
 623}
 624
 625static void free_buffer(struct videobuf_queue *vq, struct vivi_buffer *buf)
 626{
 627        struct vivi_fh  *fh = vq->priv_data;
 628        struct vivi_dev *dev  = fh->dev;
 629
 630        dprintk(dev, 1, "%s, state: %i\n", __func__, buf->vb.state);
 631
 632        if (in_interrupt())
 633                BUG();
 634
 635        videobuf_vmalloc_free(&buf->vb);
 636        dprintk(dev, 1, "free_buffer: freed\n");
 637        buf->vb.state = VIDEOBUF_NEEDS_INIT;
 638}
 639
 640#define norm_maxw() 1024
 641#define norm_maxh() 768
 642static int
 643buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
 644                                                enum v4l2_field field)
 645{
 646        struct vivi_fh     *fh  = vq->priv_data;
 647        struct vivi_dev    *dev = fh->dev;
 648        struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
 649        int rc;
 650
 651        dprintk(dev, 1, "%s, field=%d\n", __func__, field);
 652
 653        BUG_ON(NULL == fh->fmt);
 654
 655        if (fh->width  < 48 || fh->width  > norm_maxw() ||
 656            fh->height < 32 || fh->height > norm_maxh())
 657                return -EINVAL;
 658
 659        buf->vb.size = fh->width*fh->height*2;
 660        if (0 != buf->vb.baddr  &&  buf->vb.bsize < buf->vb.size)
 661                return -EINVAL;
 662
 663        /* These properties only change when queue is idle, see s_fmt */
 664        buf->fmt       = fh->fmt;
 665        buf->vb.width  = fh->width;
 666        buf->vb.height = fh->height;
 667        buf->vb.field  = field;
 668
 669        if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
 670                rc = videobuf_iolock(vq, &buf->vb, NULL);
 671                if (rc < 0)
 672                        goto fail;
 673        }
 674
 675        buf->vb.state = VIDEOBUF_PREPARED;
 676
 677        return 0;
 678
 679fail:
 680        free_buffer(vq, buf);
 681        return rc;
 682}
 683
 684static void
 685buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
 686{
 687        struct vivi_buffer    *buf  = container_of(vb, struct vivi_buffer, vb);
 688        struct vivi_fh        *fh   = vq->priv_data;
 689        struct vivi_dev       *dev  = fh->dev;
 690        struct vivi_dmaqueue *vidq = &dev->vidq;
 691
 692        dprintk(dev, 1, "%s\n", __func__);
 693
 694        buf->vb.state = VIDEOBUF_QUEUED;
 695        list_add_tail(&buf->vb.queue, &vidq->active);
 696}
 697
 698static void buffer_release(struct videobuf_queue *vq,
 699                           struct videobuf_buffer *vb)
 700{
 701        struct vivi_buffer   *buf  = container_of(vb, struct vivi_buffer, vb);
 702        struct vivi_fh       *fh   = vq->priv_data;
 703        struct vivi_dev      *dev  = (struct vivi_dev *)fh->dev;
 704
 705        dprintk(dev, 1, "%s\n", __func__);
 706
 707        free_buffer(vq, buf);
 708}
 709
 710static struct videobuf_queue_ops vivi_video_qops = {
 711        .buf_setup      = buffer_setup,
 712        .buf_prepare    = buffer_prepare,
 713        .buf_queue      = buffer_queue,
 714        .buf_release    = buffer_release,
 715};
 716
 717/* ------------------------------------------------------------------
 718        IOCTL vidioc handling
 719   ------------------------------------------------------------------*/
 720static int vidioc_querycap(struct file *file, void  *priv,
 721                                        struct v4l2_capability *cap)
 722{
 723        strcpy(cap->driver, "vivi");
 724        strcpy(cap->card, "vivi");
 725        cap->version = VIVI_VERSION;
 726        cap->capabilities =        V4L2_CAP_VIDEO_CAPTURE |
 727                                V4L2_CAP_STREAMING     |
 728                                V4L2_CAP_READWRITE;
 729        return 0;
 730}
 731
 732static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
 733                                        struct v4l2_fmtdesc *f)
 734{
 735        struct vivi_fmt *fmt;
 736
 737        if (f->index >= ARRAY_SIZE(formats))
 738                return -EINVAL;
 739
 740        fmt = &formats[f->index];
 741
 742        strlcpy(f->description, fmt->name, sizeof(f->description));
 743        f->pixelformat = fmt->fourcc;
 744        return 0;
 745}
 746
 747static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
 748                                        struct v4l2_format *f)
 749{
 750        struct vivi_fh *fh = priv;
 751
 752        f->fmt.pix.width        = fh->width;
 753        f->fmt.pix.height       = fh->height;
 754        f->fmt.pix.field        = fh->vb_vidq.field;
 755        f->fmt.pix.pixelformat  = fh->fmt->fourcc;
 756        f->fmt.pix.bytesperline =
 757                (f->fmt.pix.width * fh->fmt->depth) >> 3;
 758        f->fmt.pix.sizeimage =
 759                f->fmt.pix.height * f->fmt.pix.bytesperline;
 760
 761        return (0);
 762}
 763
 764static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
 765                        struct v4l2_format *f)
 766{
 767        struct vivi_fh  *fh  = priv;
 768        struct vivi_dev *dev = fh->dev;
 769        struct vivi_fmt *fmt;
 770        enum v4l2_field field;
 771        unsigned int maxw, maxh;
 772
 773        fmt = get_format(f);
 774        if (!fmt) {
 775                dprintk(dev, 1, "Fourcc format (0x%08x) invalid.\n",
 776                        f->fmt.pix.pixelformat);
 777                return -EINVAL;
 778        }
 779
 780        field = f->fmt.pix.field;
 781
 782        if (field == V4L2_FIELD_ANY) {
 783                field = V4L2_FIELD_INTERLACED;
 784        } else if (V4L2_FIELD_INTERLACED != field) {
 785                dprintk(dev, 1, "Field type invalid.\n");
 786                return -EINVAL;
 787        }
 788
 789        maxw  = norm_maxw();
 790        maxh  = norm_maxh();
 791
 792        f->fmt.pix.field = field;
 793        if (f->fmt.pix.height < 32)
 794                f->fmt.pix.height = 32;
 795        if (f->fmt.pix.height > maxh)
 796                f->fmt.pix.height = maxh;
 797        if (f->fmt.pix.width < 48)
 798                f->fmt.pix.width = 48;
 799        if (f->fmt.pix.width > maxw)
 800                f->fmt.pix.width = maxw;
 801        f->fmt.pix.width &= ~0x03;
 802        f->fmt.pix.bytesperline =
 803                (f->fmt.pix.width * fmt->depth) >> 3;
 804        f->fmt.pix.sizeimage =
 805                f->fmt.pix.height * f->fmt.pix.bytesperline;
 806
 807        return 0;
 808}
 809
 810/*FIXME: This seems to be generic enough to be at videodev2 */
 811static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
 812                                        struct v4l2_format *f)
 813{
 814        struct vivi_fh  *fh = priv;
 815        struct videobuf_queue *q = &fh->vb_vidq;
 816        unsigned char r, g, b;
 817        int k, is_yuv;
 818
 819        int ret = vidioc_try_fmt_vid_cap(file, fh, f);
 820        if (ret < 0)
 821                return (ret);
 822
 823        mutex_lock(&q->vb_lock);
 824
 825        if (videobuf_queue_is_busy(&fh->vb_vidq)) {
 826                dprintk(fh->dev, 1, "%s queue busy\n", __func__);
 827                ret = -EBUSY;
 828                goto out;
 829        }
 830
 831        fh->fmt           = get_format(f);
 832        fh->width         = f->fmt.pix.width;
 833        fh->height        = f->fmt.pix.height;
 834        fh->vb_vidq.field = f->fmt.pix.field;
 835        fh->type          = f->type;
 836
 837        /* precalculate color bar values to speed up rendering */
 838        for (k = 0; k < 8; k++) {
 839                r = bars[k][0];
 840                g = bars[k][1];
 841                b = bars[k][2];
 842                is_yuv = 0;
 843
 844                switch (fh->fmt->fourcc) {
 845                case V4L2_PIX_FMT_YUYV:
 846                case V4L2_PIX_FMT_UYVY:
 847                        is_yuv = 1;
 848                        break;
 849                case V4L2_PIX_FMT_RGB565:
 850                case V4L2_PIX_FMT_RGB565X:
 851                        r >>= 3;
 852                        g >>= 2;
 853                        b >>= 3;
 854                        break;
 855                case V4L2_PIX_FMT_RGB555:
 856                case V4L2_PIX_FMT_RGB555X:
 857                        r >>= 3;
 858                        g >>= 3;
 859                        b >>= 3;
 860                        break;
 861                }
 862
 863                if (is_yuv) {
 864                        fh->bars[k][0] = TO_Y(r, g, b);        /* Luma */
 865                        fh->bars[k][1] = TO_U(r, g, b);        /* Cb */
 866                        fh->bars[k][2] = TO_V(r, g, b);        /* Cr */
 867                } else {
 868                        fh->bars[k][0] = r;
 869                        fh->bars[k][1] = g;
 870                        fh->bars[k][2] = b;
 871                }
 872        }
 873
 874        ret = 0;
 875out:
 876        mutex_unlock(&q->vb_lock);
 877
 878        return (ret);
 879}
 880
 881static int vidioc_reqbufs(struct file *file, void *priv,
 882                          struct v4l2_requestbuffers *p)
 883{
 884        struct vivi_fh  *fh = priv;
 885
 886        return (videobuf_reqbufs(&fh->vb_vidq, p));
 887}
 888
 889static int vidioc_querybuf(struct file *file, void *priv, struct v4l2_buffer *p)
 890{
 891        struct vivi_fh  *fh = priv;
 892
 893        return (videobuf_querybuf(&fh->vb_vidq, p));
 894}
 895
 896static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *p)
 897{
 898        struct vivi_fh *fh = priv;
 899
 900        return (videobuf_qbuf(&fh->vb_vidq, p));
 901}
 902
 903static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *p)
 904{
 905        struct vivi_fh  *fh = priv;
 906
 907        return (videobuf_dqbuf(&fh->vb_vidq, p,
 908                                file->f_flags & O_NONBLOCK));
 909}
 910
 911#ifdef CONFIG_VIDEO_V4L1_COMPAT
 912static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
 913{
 914        struct vivi_fh  *fh = priv;
 915
 916        return videobuf_cgmbuf(&fh->vb_vidq, mbuf, 8);
 917}
 918#endif
 919
 920static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
 921{
 922        struct vivi_fh  *fh = priv;
 923
 924        if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
 925                return -EINVAL;
 926        if (i != fh->type)
 927                return -EINVAL;
 928
 929        return videobuf_streamon(&fh->vb_vidq);
 930}
 931
 932static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
 933{
 934        struct vivi_fh  *fh = priv;
 935
 936        if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
 937                return -EINVAL;
 938        if (i != fh->type)
 939                return -EINVAL;
 940
 941        return videobuf_streamoff(&fh->vb_vidq);
 942}
 943
 944static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *i)
 945{
 946        return 0;
 947}
 948
 949/* only one input in this sample driver */
 950static int vidioc_enum_input(struct file *file, void *priv,
 951                                struct v4l2_input *inp)
 952{
 953        if (inp->index != 0)
 954                return -EINVAL;
 955
 956        inp->type = V4L2_INPUT_TYPE_CAMERA;
 957        inp->std = V4L2_STD_525_60;
 958        strcpy(inp->name, "Camera");
 959
 960        return (0);
 961}
 962
 963static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
 964{
 965        *i = 0;
 966
 967        return (0);
 968}
 969static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
 970{
 971        if (i > 0)
 972                return -EINVAL;
 973
 974        return (0);
 975}
 976
 977        /* --- controls ---------------------------------------------- */
 978static int vidioc_queryctrl(struct file *file, void *priv,
 979                            struct v4l2_queryctrl *qc)
 980{
 981        int i;
 982
 983        for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
 984                if (qc->id && qc->id == vivi_qctrl[i].id) {
 985                        memcpy(qc, &(vivi_qctrl[i]),
 986                                sizeof(*qc));
 987                        return (0);
 988                }
 989
 990        return -EINVAL;
 991}
 992
 993static int vidioc_g_ctrl(struct file *file, void *priv,
 994                         struct v4l2_control *ctrl)
 995{
 996        int i;
 997
 998        for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
 999                if (ctrl->id == vivi_qctrl[i].id) {
1000                        ctrl->value = qctl_regs[i];
1001                        return (0);
1002                }
1003
1004        return -EINVAL;
1005}
1006static int vidioc_s_ctrl(struct file *file, void *priv,
1007                                struct v4l2_control *ctrl)
1008{
1009        int i;
1010
1011        for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
1012                if (ctrl->id == vivi_qctrl[i].id) {
1013                        if (ctrl->value < vivi_qctrl[i].minimum
1014                            || ctrl->value > vivi_qctrl[i].maximum) {
1015                                        return (-ERANGE);
1016                                }
1017                        qctl_regs[i] = ctrl->value;
1018                        return (0);
1019                }
1020        return -EINVAL;
1021}
1022
1023/* ------------------------------------------------------------------
1024        File operations for the device
1025   ------------------------------------------------------------------*/
1026
1027static int vivi_open(struct inode *inode, struct file *file)
1028{
1029        int minor = iminor(inode);
1030        struct vivi_dev *dev;
1031        struct vivi_fh *fh = NULL;
1032        int i;
1033        int retval = 0;
1034
1035        printk(KERN_DEBUG "vivi: open called (minor=%d)\n", minor);
1036
1037        lock_kernel();
1038        list_for_each_entry(dev, &vivi_devlist, vivi_devlist)
1039                if (dev->vfd->minor == minor)
1040                        goto found;
1041        unlock_kernel();
1042        return -ENODEV;
1043
1044found:
1045        mutex_lock(&dev->mutex);
1046        dev->users++;
1047
1048        if (dev->users > 1) {
1049                dev->users--;
1050                retval = -EBUSY;
1051                goto unlock;
1052        }
1053
1054        dprintk(dev, 1, "open minor=%d type=%s users=%d\n", minor,
1055                v4l2_type_names[V4L2_BUF_TYPE_VIDEO_CAPTURE], dev->users);
1056
1057        /* allocate + initialize per filehandle data */
1058        fh = kzalloc(sizeof(*fh), GFP_KERNEL);
1059        if (NULL == fh) {
1060                dev->users--;
1061                retval = -ENOMEM;
1062                goto unlock;
1063        }
1064unlock:
1065        mutex_unlock(&dev->mutex);
1066        if (retval) {
1067                unlock_kernel();
1068                return retval;
1069        }
1070
1071        file->private_data = fh;
1072        fh->dev      = dev;
1073
1074        fh->type     = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1075        fh->fmt      = &formats[0];
1076        fh->width    = 640;
1077        fh->height   = 480;
1078
1079        /* Put all controls at a sane state */
1080        for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
1081                qctl_regs[i] = vivi_qctrl[i].default_value;
1082
1083        /* Resets frame counters */
1084        dev->h = 0;
1085        dev->m = 0;
1086        dev->s = 0;
1087        dev->ms = 0;
1088        dev->mv_count = 0;
1089        dev->jiffies = jiffies;
1090        sprintf(dev->timestr, "%02d:%02d:%02d:%03d",
1091                        dev->h, dev->m, dev->s, dev->ms);
1092
1093        videobuf_queue_vmalloc_init(&fh->vb_vidq, &vivi_video_qops,
1094                        NULL, &dev->slock, fh->type, V4L2_FIELD_INTERLACED,
1095                        sizeof(struct vivi_buffer), fh);
1096
1097        vivi_start_thread(fh);
1098        unlock_kernel();
1099
1100        return 0;
1101}
1102
1103static ssize_t
1104vivi_read(struct file *file, char __user *data, size_t count, loff_t *ppos)
1105{
1106        struct vivi_fh *fh = file->private_data;
1107
1108        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1109                return videobuf_read_stream(&fh->vb_vidq, data, count, ppos, 0,
1110                                        file->f_flags & O_NONBLOCK);
1111        }
1112        return 0;
1113}
1114
1115static unsigned int
1116vivi_poll(struct file *file, struct poll_table_struct *wait)
1117{
1118        struct vivi_fh        *fh = file->private_data;
1119        struct vivi_dev       *dev = fh->dev;
1120        struct videobuf_queue *q = &fh->vb_vidq;
1121
1122        dprintk(dev, 1, "%s\n", __func__);
1123
1124        if (V4L2_BUF_TYPE_VIDEO_CAPTURE != fh->type)
1125                return POLLERR;
1126
1127        return videobuf_poll_stream(file, q, wait);
1128}
1129
1130static int vivi_close(struct inode *inode, struct file *file)
1131{
1132        struct vivi_fh         *fh = file->private_data;
1133        struct vivi_dev *dev       = fh->dev;
1134        struct vivi_dmaqueue *vidq = &dev->vidq;
1135
1136        int minor = iminor(inode);
1137
1138        vivi_stop_thread(vidq);
1139        videobuf_stop(&fh->vb_vidq);
1140        videobuf_mmap_free(&fh->vb_vidq);
1141
1142        kfree(fh);
1143
1144        mutex_lock(&dev->mutex);
1145        dev->users--;
1146        mutex_unlock(&dev->mutex);
1147
1148        dprintk(dev, 1, "close called (minor=%d, users=%d)\n",
1149                minor, dev->users);
1150
1151        return 0;
1152}
1153
1154static int vivi_release(void)
1155{
1156        struct vivi_dev *dev;
1157        struct list_head *list;
1158
1159        while (!list_empty(&vivi_devlist)) {
1160                list = vivi_devlist.next;
1161                list_del(list);
1162                dev = list_entry(list, struct vivi_dev, vivi_devlist);
1163
1164                if (-1 != dev->vfd->minor) {
1165                        printk(KERN_INFO "%s: unregistering /dev/video%d\n",
1166                                VIVI_MODULE_NAME, dev->vfd->num);
1167                        video_unregister_device(dev->vfd);
1168                } else {
1169                        printk(KERN_INFO "%s: releasing /dev/video%d\n",
1170                                VIVI_MODULE_NAME, dev->vfd->num);
1171                        video_device_release(dev->vfd);
1172                }
1173
1174                kfree(dev);
1175        }
1176
1177        return 0;
1178}
1179
1180static int vivi_mmap(struct file *file, struct vm_area_struct *vma)
1181{
1182        struct vivi_fh  *fh = file->private_data;
1183        struct vivi_dev *dev = fh->dev;
1184        int ret;
1185
1186        dprintk(dev, 1, "mmap called, vma=0x%08lx\n", (unsigned long)vma);
1187
1188        ret = videobuf_mmap_mapper(&fh->vb_vidq, vma);
1189
1190        dprintk(dev, 1, "vma start=0x%08lx, size=%ld, ret=%d\n",
1191                (unsigned long)vma->vm_start,
1192                (unsigned long)vma->vm_end-(unsigned long)vma->vm_start,
1193                ret);
1194
1195        return ret;
1196}
1197
1198static const struct file_operations vivi_fops = {
1199        .owner                = THIS_MODULE,
1200        .open           = vivi_open,
1201        .release        = vivi_close,
1202        .read           = vivi_read,
1203        .poll                = vivi_poll,
1204        .ioctl          = video_ioctl2, /* V4L2 ioctl handler */
1205        .compat_ioctl   = v4l_compat_ioctl32,
1206        .mmap           = vivi_mmap,
1207        .llseek         = no_llseek,
1208};
1209
1210static const struct v4l2_ioctl_ops vivi_ioctl_ops = {
1211        .vidioc_querycap      = vidioc_querycap,
1212        .vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,
1213        .vidioc_g_fmt_vid_cap     = vidioc_g_fmt_vid_cap,
1214        .vidioc_try_fmt_vid_cap   = vidioc_try_fmt_vid_cap,
1215        .vidioc_s_fmt_vid_cap     = vidioc_s_fmt_vid_cap,
1216        .vidioc_reqbufs       = vidioc_reqbufs,
1217        .vidioc_querybuf      = vidioc_querybuf,
1218        .vidioc_qbuf          = vidioc_qbuf,
1219        .vidioc_dqbuf         = vidioc_dqbuf,
1220        .vidioc_s_std         = vidioc_s_std,
1221        .vidioc_enum_input    = vidioc_enum_input,
1222        .vidioc_g_input       = vidioc_g_input,
1223        .vidioc_s_input       = vidioc_s_input,
1224        .vidioc_queryctrl     = vidioc_queryctrl,
1225        .vidioc_g_ctrl        = vidioc_g_ctrl,
1226        .vidioc_s_ctrl        = vidioc_s_ctrl,
1227        .vidioc_streamon      = vidioc_streamon,
1228        .vidioc_streamoff     = vidioc_streamoff,
1229#ifdef CONFIG_VIDEO_V4L1_COMPAT
1230        .vidiocgmbuf          = vidiocgmbuf,
1231#endif
1232};
1233
1234static struct video_device vivi_template = {
1235        .name                = "vivi",
1236        .fops           = &vivi_fops,
1237        .ioctl_ops         = &vivi_ioctl_ops,
1238        .minor                = -1,
1239        .release        = video_device_release,
1240
1241        .tvnorms              = V4L2_STD_525_60,
1242        .current_norm         = V4L2_STD_NTSC_M,
1243};
1244/* -----------------------------------------------------------------
1245        Initialization and module stuff
1246   ------------------------------------------------------------------*/
1247
1248/* This routine allocates from 1 to n_devs virtual drivers.
1249
1250   The real maximum number of virtual drivers will depend on how many drivers
1251   will succeed. This is limited to the maximum number of devices that
1252   videodev supports. Since there are 64 minors for video grabbers, this is
1253   currently the theoretical maximum limit. However, a further limit does
1254   exist at videodev that forbids any driver to register more than 32 video
1255   grabbers.
1256 */
1257static int __init vivi_init(void)
1258{
1259        int ret = -ENOMEM, i;
1260        struct vivi_dev *dev;
1261        struct video_device *vfd;
1262
1263        if (n_devs <= 0)
1264                n_devs = 1;
1265
1266        for (i = 0; i < n_devs; i++) {
1267                dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1268                if (!dev)
1269                        break;
1270
1271                /* init video dma queues */
1272                INIT_LIST_HEAD(&dev->vidq.active);
1273                init_waitqueue_head(&dev->vidq.wq);
1274
1275                /* initialize locks */
1276                spin_lock_init(&dev->slock);
1277                mutex_init(&dev->mutex);
1278
1279                vfd = video_device_alloc();
1280                if (!vfd) {
1281                        kfree(dev);
1282                        break;
1283                }
1284
1285                *vfd = vivi_template;
1286
1287                ret = video_register_device(vfd, VFL_TYPE_GRABBER, video_nr);
1288                if (ret < 0) {
1289                        video_device_release(vfd);
1290                        kfree(dev);
1291
1292                        /* If some registers succeeded, keep driver */
1293                        if (i)
1294                                ret = 0;
1295
1296                        break;
1297                }
1298
1299                /* Now that everything is fine, let's add it to device list */
1300                list_add_tail(&dev->vivi_devlist, &vivi_devlist);
1301
1302                snprintf(vfd->name, sizeof(vfd->name), "%s (%i)",
1303                         vivi_template.name, vfd->minor);
1304
1305                if (video_nr >= 0)
1306                        video_nr++;
1307
1308                dev->vfd = vfd;
1309                printk(KERN_INFO "%s: V4L2 device registered as /dev/video%d\n",
1310                        VIVI_MODULE_NAME, vfd->num);
1311        }
1312
1313        if (ret < 0) {
1314                vivi_release();
1315                printk(KERN_INFO "Error %d while loading vivi driver\n", ret);
1316        } else {
1317                printk(KERN_INFO "Video Technology Magazine Virtual Video "
1318                        "Capture Board ver %u.%u.%u successfully loaded.\n",
1319                        (VIVI_VERSION >> 16) & 0xFF, (VIVI_VERSION >> 8) & 0xFF,
1320                        VIVI_VERSION & 0xFF);
1321
1322                /* n_devs will reflect the actual number of allocated devices */
1323                n_devs = i;
1324        }
1325
1326        return ret;
1327}
1328
1329static void __exit vivi_exit(void)
1330{
1331        vivi_release();
1332}
1333
1334module_init(vivi_init);
1335module_exit(vivi_exit);
1336
1337MODULE_DESCRIPTION("Video Technology Magazine Virtual Video Capture Board");
1338MODULE_AUTHOR("Mauro Carvalho Chehab, Ted Walther and John Sokol");
1339MODULE_LICENSE("Dual BSD/GPL");
1340
1341module_param(video_nr, uint, 0444);
1342MODULE_PARM_DESC(video_nr, "video iminor start number");
1343
1344module_param(n_devs, uint, 0444);
1345MODULE_PARM_DESC(n_devs, "number of video devices to create");
1346
1347module_param_named(debug, vivi_template.debug, int, 0444);
1348MODULE_PARM_DESC(debug, "activates debug info");
1349
1350module_param(vid_limit, int, 0644);
1351MODULE_PARM_DESC(vid_limit, "capture memory limit in megabytes");