linux/drivers/media/usb/usbvision/usbvision-video.c
<<
>>
Prefs
   1/*
   2 * USB USBVISION Video device driver 0.9.10
   3 *
   4 *
   5 *
   6 * Copyright (c) 1999-2005 Joerg Heckenbach <joerg@heckenbach-aw.de>
   7 *
   8 * This module is part of usbvision driver project.
   9 *
  10 * This program is free software; you can redistribute it and/or modify
  11 * it under the terms of the GNU General Public License as published by
  12 * the Free Software Foundation; either version 2 of the License, or
  13 * (at your option) any later version.
  14 *
  15 * This program is distributed in the hope that it will be useful,
  16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18 * GNU General Public License for more details.
  19 *
  20 * You should have received a copy of the GNU General Public License
  21 * along with this program; if not, write to the Free Software
  22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  23 *
  24 * Let's call the version 0.... until compression decoding is completely
  25 * implemented.
  26 *
  27 * This driver is written by Jose Ignacio Gijon and Joerg Heckenbach.
  28 * It was based on USB CPiA driver written by Peter Pregler,
  29 * Scott J. Bertin and Johannes Erdfelt
  30 * Ideas are taken from bttv driver by Ralph Metzler, Marcus Metzler &
  31 * Gerd Knorr and zoran 36120/36125 driver by Pauline Middelink
  32 * Updates to driver completed by Dwaine P. Garden
  33 *
  34 *
  35 * TODO:
  36 *     - use submit_urb for all setup packets
  37 *     - Fix memory settings for nt1004. It is 4 times as big as the
  38 *       nt1003 memory.
  39 *     - Add audio on endpoint 3 for nt1004 chip.
  40 *         Seems impossible, needs a codec interface.  Which one?
  41 *     - Clean up the driver.
  42 *     - optimization for performance.
  43 *     - Add Videotext capability (VBI).  Working on it.....
  44 *     - Check audio for other devices
  45 *
  46 */
  47
  48#include <linux/kernel.h>
  49#include <linux/list.h>
  50#include <linux/timer.h>
  51#include <linux/slab.h>
  52#include <linux/mm.h>
  53#include <linux/highmem.h>
  54#include <linux/vmalloc.h>
  55#include <linux/module.h>
  56#include <linux/init.h>
  57#include <linux/spinlock.h>
  58#include <linux/io.h>
  59#include <linux/videodev2.h>
  60#include <linux/i2c.h>
  61
  62#include <media/saa7115.h>
  63#include <media/v4l2-common.h>
  64#include <media/v4l2-ioctl.h>
  65#include <media/tuner.h>
  66
  67#include <linux/workqueue.h>
  68
  69#include "usbvision.h"
  70#include "usbvision-cards.h"
  71
  72#define DRIVER_AUTHOR                                   \
  73        "Joerg Heckenbach <joerg@heckenbach-aw.de>, "   \
  74        "Dwaine Garden <DwaineGarden@rogers.com>"
  75#define DRIVER_NAME "usbvision"
  76#define DRIVER_ALIAS "USBVision"
  77#define DRIVER_DESC "USBVision USB Video Device Driver for Linux"
  78#define DRIVER_LICENSE "GPL"
  79#define USBVISION_VERSION_STRING "0.9.11"
  80
  81#define ENABLE_HEXDUMP  0       /* Enable if you need it */
  82
  83
  84#ifdef USBVISION_DEBUG
  85        #define PDEBUG(level, fmt, args...) { \
  86                if (video_debug & (level)) \
  87                        printk(KERN_INFO KBUILD_MODNAME ":[%s:%d] " fmt, \
  88                                __func__, __LINE__ , ## args); \
  89        }
  90#else
  91        #define PDEBUG(level, fmt, args...) do {} while (0)
  92#endif
  93
  94#define DBG_IO          (1 << 1)
  95#define DBG_PROBE       (1 << 2)
  96#define DBG_MMAP        (1 << 3)
  97
  98/* String operations */
  99#define rmspace(str)    while (*str == ' ') str++;
 100#define goto2next(str)  while (*str != ' ') str++; while (*str == ' ') str++;
 101
 102
 103/* sequential number of usbvision device */
 104static int usbvision_nr;
 105
 106static struct usbvision_v4l2_format_st usbvision_v4l2_format[] = {
 107        { 1, 1,  8, V4L2_PIX_FMT_GREY    , "GREY" },
 108        { 1, 2, 16, V4L2_PIX_FMT_RGB565  , "RGB565" },
 109        { 1, 3, 24, V4L2_PIX_FMT_RGB24   , "RGB24" },
 110        { 1, 4, 32, V4L2_PIX_FMT_RGB32   , "RGB32" },
 111        { 1, 2, 16, V4L2_PIX_FMT_RGB555  , "RGB555" },
 112        { 1, 2, 16, V4L2_PIX_FMT_YUYV    , "YUV422" },
 113        { 1, 2, 12, V4L2_PIX_FMT_YVU420  , "YUV420P" }, /* 1.5 ! */
 114        { 1, 2, 16, V4L2_PIX_FMT_YUV422P , "YUV422P" }
 115};
 116
 117/* Function prototypes */
 118static void usbvision_release(struct usb_usbvision *usbvision);
 119
 120/* Default initialization of device driver parameters */
 121/* Set the default format for ISOC endpoint */
 122static int isoc_mode = ISOC_MODE_COMPRESS;
 123/* Set the default Debug Mode of the device driver */
 124static int video_debug;
 125/* Set the default device to power on at startup */
 126static int power_on_at_open = 1;
 127/* Sequential Number of Video Device */
 128static int video_nr = -1;
 129/* Sequential Number of Radio Device */
 130static int radio_nr = -1;
 131
 132/* Grab parameters for the device driver */
 133
 134/* Showing parameters under SYSFS */
 135module_param(isoc_mode, int, 0444);
 136module_param(video_debug, int, 0444);
 137module_param(power_on_at_open, int, 0444);
 138module_param(video_nr, int, 0444);
 139module_param(radio_nr, int, 0444);
 140
 141MODULE_PARM_DESC(isoc_mode, " Set the default format for ISOC endpoint.  Default: 0x60 (Compression On)");
 142MODULE_PARM_DESC(video_debug, " Set the default Debug Mode of the device driver.  Default: 0 (Off)");
 143MODULE_PARM_DESC(power_on_at_open, " Set the default device to power on when device is opened.  Default: 1 (On)");
 144MODULE_PARM_DESC(video_nr, "Set video device number (/dev/videoX).  Default: -1 (autodetect)");
 145MODULE_PARM_DESC(radio_nr, "Set radio device number (/dev/radioX).  Default: -1 (autodetect)");
 146
 147
 148/* Misc stuff */
 149MODULE_AUTHOR(DRIVER_AUTHOR);
 150MODULE_DESCRIPTION(DRIVER_DESC);
 151MODULE_LICENSE(DRIVER_LICENSE);
 152MODULE_VERSION(USBVISION_VERSION_STRING);
 153MODULE_ALIAS(DRIVER_ALIAS);
 154
 155
 156/*****************************************************************************/
 157/* SYSFS Code - Copied from the stv680.c usb module.                         */
 158/* Device information is located at /sys/class/video4linux/video0            */
 159/* Device parameters information is located at /sys/module/usbvision         */
 160/* Device USB Information is located at                                      */
 161/*   /sys/bus/usb/drivers/USBVision Video Grabber                            */
 162/*****************************************************************************/
 163
 164#define YES_NO(x) ((x) ? "Yes" : "No")
 165
 166static inline struct usb_usbvision *cd_to_usbvision(struct device *cd)
 167{
 168        struct video_device *vdev =
 169                container_of(cd, struct video_device, dev);
 170        return video_get_drvdata(vdev);
 171}
 172
 173static ssize_t show_version(struct device *cd,
 174                            struct device_attribute *attr, char *buf)
 175{
 176        return sprintf(buf, "%s\n", USBVISION_VERSION_STRING);
 177}
 178static DEVICE_ATTR(version, S_IRUGO, show_version, NULL);
 179
 180static ssize_t show_model(struct device *cd,
 181                          struct device_attribute *attr, char *buf)
 182{
 183        struct video_device *vdev =
 184                container_of(cd, struct video_device, dev);
 185        struct usb_usbvision *usbvision = video_get_drvdata(vdev);
 186        return sprintf(buf, "%s\n",
 187                       usbvision_device_data[usbvision->dev_model].model_string);
 188}
 189static DEVICE_ATTR(model, S_IRUGO, show_model, NULL);
 190
 191static ssize_t show_hue(struct device *cd,
 192                        struct device_attribute *attr, char *buf)
 193{
 194        struct video_device *vdev =
 195                container_of(cd, struct video_device, dev);
 196        struct usb_usbvision *usbvision = video_get_drvdata(vdev);
 197        struct v4l2_control ctrl;
 198        ctrl.id = V4L2_CID_HUE;
 199        ctrl.value = 0;
 200        if (usbvision->user)
 201                call_all(usbvision, core, g_ctrl, &ctrl);
 202        return sprintf(buf, "%d\n", ctrl.value);
 203}
 204static DEVICE_ATTR(hue, S_IRUGO, show_hue, NULL);
 205
 206static ssize_t show_contrast(struct device *cd,
 207                             struct device_attribute *attr, char *buf)
 208{
 209        struct video_device *vdev =
 210                container_of(cd, struct video_device, dev);
 211        struct usb_usbvision *usbvision = video_get_drvdata(vdev);
 212        struct v4l2_control ctrl;
 213        ctrl.id = V4L2_CID_CONTRAST;
 214        ctrl.value = 0;
 215        if (usbvision->user)
 216                call_all(usbvision, core, g_ctrl, &ctrl);
 217        return sprintf(buf, "%d\n", ctrl.value);
 218}
 219static DEVICE_ATTR(contrast, S_IRUGO, show_contrast, NULL);
 220
 221static ssize_t show_brightness(struct device *cd,
 222                               struct device_attribute *attr, char *buf)
 223{
 224        struct video_device *vdev =
 225                container_of(cd, struct video_device, dev);
 226        struct usb_usbvision *usbvision = video_get_drvdata(vdev);
 227        struct v4l2_control ctrl;
 228        ctrl.id = V4L2_CID_BRIGHTNESS;
 229        ctrl.value = 0;
 230        if (usbvision->user)
 231                call_all(usbvision, core, g_ctrl, &ctrl);
 232        return sprintf(buf, "%d\n", ctrl.value);
 233}
 234static DEVICE_ATTR(brightness, S_IRUGO, show_brightness, NULL);
 235
 236static ssize_t show_saturation(struct device *cd,
 237                               struct device_attribute *attr, char *buf)
 238{
 239        struct video_device *vdev =
 240                container_of(cd, struct video_device, dev);
 241        struct usb_usbvision *usbvision = video_get_drvdata(vdev);
 242        struct v4l2_control ctrl;
 243        ctrl.id = V4L2_CID_SATURATION;
 244        ctrl.value = 0;
 245        if (usbvision->user)
 246                call_all(usbvision, core, g_ctrl, &ctrl);
 247        return sprintf(buf, "%d\n", ctrl.value);
 248}
 249static DEVICE_ATTR(saturation, S_IRUGO, show_saturation, NULL);
 250
 251static ssize_t show_streaming(struct device *cd,
 252                              struct device_attribute *attr, char *buf)
 253{
 254        struct video_device *vdev =
 255                container_of(cd, struct video_device, dev);
 256        struct usb_usbvision *usbvision = video_get_drvdata(vdev);
 257        return sprintf(buf, "%s\n",
 258                       YES_NO(usbvision->streaming == stream_on ? 1 : 0));
 259}
 260static DEVICE_ATTR(streaming, S_IRUGO, show_streaming, NULL);
 261
 262static ssize_t show_compression(struct device *cd,
 263                                struct device_attribute *attr, char *buf)
 264{
 265        struct video_device *vdev =
 266                container_of(cd, struct video_device, dev);
 267        struct usb_usbvision *usbvision = video_get_drvdata(vdev);
 268        return sprintf(buf, "%s\n",
 269                       YES_NO(usbvision->isoc_mode == ISOC_MODE_COMPRESS));
 270}
 271static DEVICE_ATTR(compression, S_IRUGO, show_compression, NULL);
 272
 273static ssize_t show_device_bridge(struct device *cd,
 274                                  struct device_attribute *attr, char *buf)
 275{
 276        struct video_device *vdev =
 277                container_of(cd, struct video_device, dev);
 278        struct usb_usbvision *usbvision = video_get_drvdata(vdev);
 279        return sprintf(buf, "%d\n", usbvision->bridge_type);
 280}
 281static DEVICE_ATTR(bridge, S_IRUGO, show_device_bridge, NULL);
 282
 283static void usbvision_create_sysfs(struct video_device *vdev)
 284{
 285        int res;
 286
 287        if (!vdev)
 288                return;
 289        do {
 290                res = device_create_file(&vdev->dev, &dev_attr_version);
 291                if (res < 0)
 292                        break;
 293                res = device_create_file(&vdev->dev, &dev_attr_model);
 294                if (res < 0)
 295                        break;
 296                res = device_create_file(&vdev->dev, &dev_attr_hue);
 297                if (res < 0)
 298                        break;
 299                res = device_create_file(&vdev->dev, &dev_attr_contrast);
 300                if (res < 0)
 301                        break;
 302                res = device_create_file(&vdev->dev, &dev_attr_brightness);
 303                if (res < 0)
 304                        break;
 305                res = device_create_file(&vdev->dev, &dev_attr_saturation);
 306                if (res < 0)
 307                        break;
 308                res = device_create_file(&vdev->dev, &dev_attr_streaming);
 309                if (res < 0)
 310                        break;
 311                res = device_create_file(&vdev->dev, &dev_attr_compression);
 312                if (res < 0)
 313                        break;
 314                res = device_create_file(&vdev->dev, &dev_attr_bridge);
 315                if (res >= 0)
 316                        return;
 317        } while (0);
 318
 319        dev_err(&vdev->dev, "%s error: %d\n", __func__, res);
 320}
 321
 322static void usbvision_remove_sysfs(struct video_device *vdev)
 323{
 324        if (vdev) {
 325                device_remove_file(&vdev->dev, &dev_attr_version);
 326                device_remove_file(&vdev->dev, &dev_attr_model);
 327                device_remove_file(&vdev->dev, &dev_attr_hue);
 328                device_remove_file(&vdev->dev, &dev_attr_contrast);
 329                device_remove_file(&vdev->dev, &dev_attr_brightness);
 330                device_remove_file(&vdev->dev, &dev_attr_saturation);
 331                device_remove_file(&vdev->dev, &dev_attr_streaming);
 332                device_remove_file(&vdev->dev, &dev_attr_compression);
 333                device_remove_file(&vdev->dev, &dev_attr_bridge);
 334        }
 335}
 336
 337/*
 338 * usbvision_open()
 339 *
 340 * This is part of Video 4 Linux API. The driver can be opened by one
 341 * client only (checks internal counter 'usbvision->user'). The procedure
 342 * then allocates buffers needed for video processing.
 343 *
 344 */
 345static int usbvision_v4l2_open(struct file *file)
 346{
 347        struct usb_usbvision *usbvision = video_drvdata(file);
 348        int err_code = 0;
 349
 350        PDEBUG(DBG_IO, "open");
 351
 352        if (mutex_lock_interruptible(&usbvision->v4l2_lock))
 353                return -ERESTARTSYS;
 354        usbvision_reset_power_off_timer(usbvision);
 355
 356        if (usbvision->user)
 357                err_code = -EBUSY;
 358        else {
 359                /* Allocate memory for the scratch ring buffer */
 360                err_code = usbvision_scratch_alloc(usbvision);
 361                if (isoc_mode == ISOC_MODE_COMPRESS) {
 362                        /* Allocate intermediate decompression buffers
 363                           only if needed */
 364                        err_code = usbvision_decompress_alloc(usbvision);
 365                }
 366                if (err_code) {
 367                        /* Deallocate all buffers if trouble */
 368                        usbvision_scratch_free(usbvision);
 369                        usbvision_decompress_free(usbvision);
 370                }
 371        }
 372
 373        /* If so far no errors then we shall start the camera */
 374        if (!err_code) {
 375                if (usbvision->power == 0) {
 376                        usbvision_power_on(usbvision);
 377                        usbvision_i2c_register(usbvision);
 378                }
 379
 380                /* Send init sequence only once, it's large! */
 381                if (!usbvision->initialized) {
 382                        int setup_ok = 0;
 383                        setup_ok = usbvision_setup(usbvision, isoc_mode);
 384                        if (setup_ok)
 385                                usbvision->initialized = 1;
 386                        else
 387                                err_code = -EBUSY;
 388                }
 389
 390                if (!err_code) {
 391                        usbvision_begin_streaming(usbvision);
 392                        err_code = usbvision_init_isoc(usbvision);
 393                        /* device must be initialized before isoc transfer */
 394                        usbvision_muxsel(usbvision, 0);
 395                        usbvision->user++;
 396                } else {
 397                        if (power_on_at_open) {
 398                                usbvision_i2c_unregister(usbvision);
 399                                usbvision_power_off(usbvision);
 400                                usbvision->initialized = 0;
 401                        }
 402                }
 403        }
 404
 405        /* prepare queues */
 406        usbvision_empty_framequeues(usbvision);
 407        mutex_unlock(&usbvision->v4l2_lock);
 408
 409        PDEBUG(DBG_IO, "success");
 410        return err_code;
 411}
 412
 413/*
 414 * usbvision_v4l2_close()
 415 *
 416 * This is part of Video 4 Linux API. The procedure
 417 * stops streaming and deallocates all buffers that were earlier
 418 * allocated in usbvision_v4l2_open().
 419 *
 420 */
 421static int usbvision_v4l2_close(struct file *file)
 422{
 423        struct usb_usbvision *usbvision = video_drvdata(file);
 424
 425        PDEBUG(DBG_IO, "close");
 426
 427        mutex_lock(&usbvision->v4l2_lock);
 428        usbvision_audio_off(usbvision);
 429        usbvision_restart_isoc(usbvision);
 430        usbvision_stop_isoc(usbvision);
 431
 432        usbvision_decompress_free(usbvision);
 433        usbvision_frames_free(usbvision);
 434        usbvision_empty_framequeues(usbvision);
 435        usbvision_scratch_free(usbvision);
 436
 437        usbvision->user--;
 438
 439        if (power_on_at_open) {
 440                /* power off in a little while
 441                   to avoid off/on every close/open short sequences */
 442                usbvision_set_power_off_timer(usbvision);
 443                usbvision->initialized = 0;
 444        }
 445
 446        if (usbvision->remove_pending) {
 447                printk(KERN_INFO "%s: Final disconnect\n", __func__);
 448                usbvision_release(usbvision);
 449        }
 450        mutex_unlock(&usbvision->v4l2_lock);
 451
 452        PDEBUG(DBG_IO, "success");
 453        return 0;
 454}
 455
 456
 457/*
 458 * usbvision_ioctl()
 459 *
 460 * This is part of Video 4 Linux API. The procedure handles ioctl() calls.
 461 *
 462 */
 463#ifdef CONFIG_VIDEO_ADV_DEBUG
 464static int vidioc_g_register(struct file *file, void *priv,
 465                                struct v4l2_dbg_register *reg)
 466{
 467        struct usb_usbvision *usbvision = video_drvdata(file);
 468        int err_code;
 469
 470        /* NT100x has a 8-bit register space */
 471        err_code = usbvision_read_reg(usbvision, reg->reg&0xff);
 472        if (err_code < 0) {
 473                dev_err(&usbvision->vdev->dev,
 474                        "%s: VIDIOC_DBG_G_REGISTER failed: error %d\n",
 475                                __func__, err_code);
 476                return err_code;
 477        }
 478        reg->val = err_code;
 479        reg->size = 1;
 480        return 0;
 481}
 482
 483static int vidioc_s_register(struct file *file, void *priv,
 484                                const struct v4l2_dbg_register *reg)
 485{
 486        struct usb_usbvision *usbvision = video_drvdata(file);
 487        int err_code;
 488
 489        /* NT100x has a 8-bit register space */
 490        err_code = usbvision_write_reg(usbvision, reg->reg & 0xff, reg->val);
 491        if (err_code < 0) {
 492                dev_err(&usbvision->vdev->dev,
 493                        "%s: VIDIOC_DBG_S_REGISTER failed: error %d\n",
 494                                __func__, err_code);
 495                return err_code;
 496        }
 497        return 0;
 498}
 499#endif
 500
 501static int vidioc_querycap(struct file *file, void  *priv,
 502                                        struct v4l2_capability *vc)
 503{
 504        struct usb_usbvision *usbvision = video_drvdata(file);
 505
 506        strlcpy(vc->driver, "USBVision", sizeof(vc->driver));
 507        strlcpy(vc->card,
 508                usbvision_device_data[usbvision->dev_model].model_string,
 509                sizeof(vc->card));
 510        usb_make_path(usbvision->dev, vc->bus_info, sizeof(vc->bus_info));
 511        vc->capabilities = V4L2_CAP_VIDEO_CAPTURE |
 512                V4L2_CAP_AUDIO |
 513                V4L2_CAP_READWRITE |
 514                V4L2_CAP_STREAMING |
 515                (usbvision->have_tuner ? V4L2_CAP_TUNER : 0);
 516        return 0;
 517}
 518
 519static int vidioc_enum_input(struct file *file, void *priv,
 520                                struct v4l2_input *vi)
 521{
 522        struct usb_usbvision *usbvision = video_drvdata(file);
 523        int chan;
 524
 525        if (vi->index >= usbvision->video_inputs)
 526                return -EINVAL;
 527        if (usbvision->have_tuner)
 528                chan = vi->index;
 529        else
 530                chan = vi->index + 1; /* skip Television string*/
 531
 532        /* Determine the requested input characteristics
 533           specific for each usbvision card model */
 534        switch (chan) {
 535        case 0:
 536                if (usbvision_device_data[usbvision->dev_model].video_channels == 4) {
 537                        strcpy(vi->name, "White Video Input");
 538                } else {
 539                        strcpy(vi->name, "Television");
 540                        vi->type = V4L2_INPUT_TYPE_TUNER;
 541                        vi->audioset = 1;
 542                        vi->tuner = chan;
 543                        vi->std = USBVISION_NORMS;
 544                }
 545                break;
 546        case 1:
 547                vi->type = V4L2_INPUT_TYPE_CAMERA;
 548                if (usbvision_device_data[usbvision->dev_model].video_channels == 4)
 549                        strcpy(vi->name, "Green Video Input");
 550                else
 551                        strcpy(vi->name, "Composite Video Input");
 552                vi->std = V4L2_STD_PAL;
 553                break;
 554        case 2:
 555                vi->type = V4L2_INPUT_TYPE_CAMERA;
 556                if (usbvision_device_data[usbvision->dev_model].video_channels == 4)
 557                        strcpy(vi->name, "Yellow Video Input");
 558                else
 559                        strcpy(vi->name, "S-Video Input");
 560                vi->std = V4L2_STD_PAL;
 561                break;
 562        case 3:
 563                vi->type = V4L2_INPUT_TYPE_CAMERA;
 564                strcpy(vi->name, "Red Video Input");
 565                vi->std = V4L2_STD_PAL;
 566                break;
 567        }
 568        return 0;
 569}
 570
 571static int vidioc_g_input(struct file *file, void *priv, unsigned int *input)
 572{
 573        struct usb_usbvision *usbvision = video_drvdata(file);
 574
 575        *input = usbvision->ctl_input;
 576        return 0;
 577}
 578
 579static int vidioc_s_input(struct file *file, void *priv, unsigned int input)
 580{
 581        struct usb_usbvision *usbvision = video_drvdata(file);
 582
 583        if (input >= usbvision->video_inputs)
 584                return -EINVAL;
 585
 586        usbvision_muxsel(usbvision, input);
 587        usbvision_set_input(usbvision);
 588        usbvision_set_output(usbvision,
 589                             usbvision->curwidth,
 590                             usbvision->curheight);
 591        return 0;
 592}
 593
 594static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id id)
 595{
 596        struct usb_usbvision *usbvision = video_drvdata(file);
 597
 598        usbvision->tvnorm_id = id;
 599
 600        call_all(usbvision, core, s_std, usbvision->tvnorm_id);
 601        /* propagate the change to the decoder */
 602        usbvision_muxsel(usbvision, usbvision->ctl_input);
 603
 604        return 0;
 605}
 606
 607static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *id)
 608{
 609        struct usb_usbvision *usbvision = video_drvdata(file);
 610
 611        *id = usbvision->tvnorm_id;
 612        return 0;
 613}
 614
 615static int vidioc_g_tuner(struct file *file, void *priv,
 616                                struct v4l2_tuner *vt)
 617{
 618        struct usb_usbvision *usbvision = video_drvdata(file);
 619
 620        if (!usbvision->have_tuner || vt->index)        /* Only tuner 0 */
 621                return -EINVAL;
 622        if (usbvision->radio) {
 623                strcpy(vt->name, "Radio");
 624                vt->type = V4L2_TUNER_RADIO;
 625        } else {
 626                strcpy(vt->name, "Television");
 627        }
 628        /* Let clients fill in the remainder of this struct */
 629        call_all(usbvision, tuner, g_tuner, vt);
 630
 631        return 0;
 632}
 633
 634static int vidioc_s_tuner(struct file *file, void *priv,
 635                                const struct v4l2_tuner *vt)
 636{
 637        struct usb_usbvision *usbvision = video_drvdata(file);
 638
 639        /* Only no or one tuner for now */
 640        if (!usbvision->have_tuner || vt->index)
 641                return -EINVAL;
 642        /* let clients handle this */
 643        call_all(usbvision, tuner, s_tuner, vt);
 644
 645        return 0;
 646}
 647
 648static int vidioc_g_frequency(struct file *file, void *priv,
 649                                struct v4l2_frequency *freq)
 650{
 651        struct usb_usbvision *usbvision = video_drvdata(file);
 652
 653        freq->tuner = 0; /* Only one tuner */
 654        if (usbvision->radio)
 655                freq->type = V4L2_TUNER_RADIO;
 656        else
 657                freq->type = V4L2_TUNER_ANALOG_TV;
 658        freq->frequency = usbvision->freq;
 659
 660        return 0;
 661}
 662
 663static int vidioc_s_frequency(struct file *file, void *priv,
 664                                const struct v4l2_frequency *freq)
 665{
 666        struct usb_usbvision *usbvision = video_drvdata(file);
 667
 668        /* Only no or one tuner for now */
 669        if (!usbvision->have_tuner || freq->tuner)
 670                return -EINVAL;
 671
 672        usbvision->freq = freq->frequency;
 673        call_all(usbvision, tuner, s_frequency, freq);
 674
 675        return 0;
 676}
 677
 678static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
 679{
 680        struct usb_usbvision *usbvision = video_drvdata(file);
 681
 682        if (usbvision->radio)
 683                strcpy(a->name, "Radio");
 684        else
 685                strcpy(a->name, "TV");
 686
 687        return 0;
 688}
 689
 690static int vidioc_s_audio(struct file *file, void *fh,
 691                          const struct v4l2_audio *a)
 692{
 693        if (a->index)
 694                return -EINVAL;
 695        return 0;
 696}
 697
 698static int vidioc_queryctrl(struct file *file, void *priv,
 699                            struct v4l2_queryctrl *ctrl)
 700{
 701        struct usb_usbvision *usbvision = video_drvdata(file);
 702
 703        call_all(usbvision, core, queryctrl, ctrl);
 704
 705        if (!ctrl->type)
 706                return -EINVAL;
 707
 708        return 0;
 709}
 710
 711static int vidioc_g_ctrl(struct file *file, void *priv,
 712                                struct v4l2_control *ctrl)
 713{
 714        struct usb_usbvision *usbvision = video_drvdata(file);
 715
 716        call_all(usbvision, core, g_ctrl, ctrl);
 717        return 0;
 718}
 719
 720static int vidioc_s_ctrl(struct file *file, void *priv,
 721                                struct v4l2_control *ctrl)
 722{
 723        struct usb_usbvision *usbvision = video_drvdata(file);
 724
 725        call_all(usbvision, core, s_ctrl, ctrl);
 726        return 0;
 727}
 728
 729static int vidioc_reqbufs(struct file *file,
 730                           void *priv, struct v4l2_requestbuffers *vr)
 731{
 732        struct usb_usbvision *usbvision = video_drvdata(file);
 733        int ret;
 734
 735        RESTRICT_TO_RANGE(vr->count, 1, USBVISION_NUMFRAMES);
 736
 737        /* Check input validity:
 738           the user must do a VIDEO CAPTURE and MMAP method. */
 739        if (vr->memory != V4L2_MEMORY_MMAP)
 740                return -EINVAL;
 741
 742        if (usbvision->streaming == stream_on) {
 743                ret = usbvision_stream_interrupt(usbvision);
 744                if (ret)
 745                        return ret;
 746        }
 747
 748        usbvision_frames_free(usbvision);
 749        usbvision_empty_framequeues(usbvision);
 750        vr->count = usbvision_frames_alloc(usbvision, vr->count);
 751
 752        usbvision->cur_frame = NULL;
 753
 754        return 0;
 755}
 756
 757static int vidioc_querybuf(struct file *file,
 758                            void *priv, struct v4l2_buffer *vb)
 759{
 760        struct usb_usbvision *usbvision = video_drvdata(file);
 761        struct usbvision_frame *frame;
 762
 763        /* FIXME : must control
 764           that buffers are mapped (VIDIOC_REQBUFS has been called) */
 765        if (vb->index >= usbvision->num_frames)
 766                return -EINVAL;
 767        /* Updating the corresponding frame state */
 768        vb->flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 769        frame = &usbvision->frame[vb->index];
 770        if (frame->grabstate >= frame_state_ready)
 771                vb->flags |= V4L2_BUF_FLAG_QUEUED;
 772        if (frame->grabstate >= frame_state_done)
 773                vb->flags |= V4L2_BUF_FLAG_DONE;
 774        if (frame->grabstate == frame_state_unused)
 775                vb->flags |= V4L2_BUF_FLAG_MAPPED;
 776        vb->memory = V4L2_MEMORY_MMAP;
 777
 778        vb->m.offset = vb->index * PAGE_ALIGN(usbvision->max_frame_size);
 779
 780        vb->memory = V4L2_MEMORY_MMAP;
 781        vb->field = V4L2_FIELD_NONE;
 782        vb->length = usbvision->curwidth *
 783                usbvision->curheight *
 784                usbvision->palette.bytes_per_pixel;
 785        vb->timestamp = usbvision->frame[vb->index].timestamp;
 786        vb->sequence = usbvision->frame[vb->index].sequence;
 787        return 0;
 788}
 789
 790static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *vb)
 791{
 792        struct usb_usbvision *usbvision = video_drvdata(file);
 793        struct usbvision_frame *frame;
 794        unsigned long lock_flags;
 795
 796        /* FIXME : works only on VIDEO_CAPTURE MODE, MMAP. */
 797        if (vb->index >= usbvision->num_frames)
 798                return -EINVAL;
 799
 800        frame = &usbvision->frame[vb->index];
 801
 802        if (frame->grabstate != frame_state_unused)
 803                return -EAGAIN;
 804
 805        /* Mark it as ready and enqueue frame */
 806        frame->grabstate = frame_state_ready;
 807        frame->scanstate = scan_state_scanning;
 808        frame->scanlength = 0;  /* Accumulated in usbvision_parse_data() */
 809
 810        vb->flags &= ~V4L2_BUF_FLAG_DONE;
 811
 812        /* set v4l2_format index */
 813        frame->v4l2_format = usbvision->palette;
 814
 815        spin_lock_irqsave(&usbvision->queue_lock, lock_flags);
 816        list_add_tail(&usbvision->frame[vb->index].frame, &usbvision->inqueue);
 817        spin_unlock_irqrestore(&usbvision->queue_lock, lock_flags);
 818
 819        return 0;
 820}
 821
 822static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *vb)
 823{
 824        struct usb_usbvision *usbvision = video_drvdata(file);
 825        int ret;
 826        struct usbvision_frame *f;
 827        unsigned long lock_flags;
 828
 829        if (list_empty(&(usbvision->outqueue))) {
 830                if (usbvision->streaming == stream_idle)
 831                        return -EINVAL;
 832                ret = wait_event_interruptible
 833                        (usbvision->wait_frame,
 834                         !list_empty(&(usbvision->outqueue)));
 835                if (ret)
 836                        return ret;
 837        }
 838
 839        spin_lock_irqsave(&usbvision->queue_lock, lock_flags);
 840        f = list_entry(usbvision->outqueue.next,
 841                       struct usbvision_frame, frame);
 842        list_del(usbvision->outqueue.next);
 843        spin_unlock_irqrestore(&usbvision->queue_lock, lock_flags);
 844
 845        f->grabstate = frame_state_unused;
 846
 847        vb->memory = V4L2_MEMORY_MMAP;
 848        vb->flags = V4L2_BUF_FLAG_MAPPED |
 849                V4L2_BUF_FLAG_QUEUED |
 850                V4L2_BUF_FLAG_DONE |
 851                V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 852        vb->index = f->index;
 853        vb->sequence = f->sequence;
 854        vb->timestamp = f->timestamp;
 855        vb->field = V4L2_FIELD_NONE;
 856        vb->bytesused = f->scanlength;
 857
 858        return 0;
 859}
 860
 861static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
 862{
 863        struct usb_usbvision *usbvision = video_drvdata(file);
 864
 865        usbvision->streaming = stream_on;
 866        call_all(usbvision, video, s_stream, 1);
 867
 868        return 0;
 869}
 870
 871static int vidioc_streamoff(struct file *file,
 872                            void *priv, enum v4l2_buf_type type)
 873{
 874        struct usb_usbvision *usbvision = video_drvdata(file);
 875
 876        if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
 877                return -EINVAL;
 878
 879        if (usbvision->streaming == stream_on) {
 880                usbvision_stream_interrupt(usbvision);
 881                /* Stop all video streamings */
 882                call_all(usbvision, video, s_stream, 0);
 883        }
 884        usbvision_empty_framequeues(usbvision);
 885
 886        return 0;
 887}
 888
 889static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
 890                                        struct v4l2_fmtdesc *vfd)
 891{
 892        if (vfd->index >= USBVISION_SUPPORTED_PALETTES - 1)
 893                return -EINVAL;
 894        strcpy(vfd->description, usbvision_v4l2_format[vfd->index].desc);
 895        vfd->pixelformat = usbvision_v4l2_format[vfd->index].format;
 896        return 0;
 897}
 898
 899static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
 900                                        struct v4l2_format *vf)
 901{
 902        struct usb_usbvision *usbvision = video_drvdata(file);
 903        vf->fmt.pix.width = usbvision->curwidth;
 904        vf->fmt.pix.height = usbvision->curheight;
 905        vf->fmt.pix.pixelformat = usbvision->palette.format;
 906        vf->fmt.pix.bytesperline =
 907                usbvision->curwidth * usbvision->palette.bytes_per_pixel;
 908        vf->fmt.pix.sizeimage = vf->fmt.pix.bytesperline * usbvision->curheight;
 909        vf->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
 910        vf->fmt.pix.field = V4L2_FIELD_NONE; /* Always progressive image */
 911
 912        return 0;
 913}
 914
 915static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
 916                               struct v4l2_format *vf)
 917{
 918        struct usb_usbvision *usbvision = video_drvdata(file);
 919        int format_idx;
 920
 921        /* Find requested format in available ones */
 922        for (format_idx = 0; format_idx < USBVISION_SUPPORTED_PALETTES; format_idx++) {
 923                if (vf->fmt.pix.pixelformat ==
 924                   usbvision_v4l2_format[format_idx].format) {
 925                        usbvision->palette = usbvision_v4l2_format[format_idx];
 926                        break;
 927                }
 928        }
 929        /* robustness */
 930        if (format_idx == USBVISION_SUPPORTED_PALETTES)
 931                return -EINVAL;
 932        RESTRICT_TO_RANGE(vf->fmt.pix.width, MIN_FRAME_WIDTH, MAX_FRAME_WIDTH);
 933        RESTRICT_TO_RANGE(vf->fmt.pix.height, MIN_FRAME_HEIGHT, MAX_FRAME_HEIGHT);
 934
 935        vf->fmt.pix.bytesperline = vf->fmt.pix.width*
 936                usbvision->palette.bytes_per_pixel;
 937        vf->fmt.pix.sizeimage = vf->fmt.pix.bytesperline*vf->fmt.pix.height;
 938
 939        return 0;
 940}
 941
 942static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
 943                               struct v4l2_format *vf)
 944{
 945        struct usb_usbvision *usbvision = video_drvdata(file);
 946        int ret;
 947
 948        ret = vidioc_try_fmt_vid_cap(file, priv, vf);
 949        if (ret)
 950                return ret;
 951
 952        /* stop io in case it is already in progress */
 953        if (usbvision->streaming == stream_on) {
 954                ret = usbvision_stream_interrupt(usbvision);
 955                if (ret)
 956                        return ret;
 957        }
 958        usbvision_frames_free(usbvision);
 959        usbvision_empty_framequeues(usbvision);
 960
 961        usbvision->cur_frame = NULL;
 962
 963        /* by now we are committed to the new data... */
 964        usbvision_set_output(usbvision, vf->fmt.pix.width, vf->fmt.pix.height);
 965
 966        return 0;
 967}
 968
 969static ssize_t usbvision_read(struct file *file, char __user *buf,
 970                      size_t count, loff_t *ppos)
 971{
 972        struct usb_usbvision *usbvision = video_drvdata(file);
 973        int noblock = file->f_flags & O_NONBLOCK;
 974        unsigned long lock_flags;
 975        int ret, i;
 976        struct usbvision_frame *frame;
 977
 978        PDEBUG(DBG_IO, "%s: %ld bytes, noblock=%d", __func__,
 979               (unsigned long)count, noblock);
 980
 981        if (!USBVISION_IS_OPERATIONAL(usbvision) || (buf == NULL))
 982                return -EFAULT;
 983
 984        /* This entry point is compatible with the mmap routines
 985           so that a user can do either VIDIOC_QBUF/VIDIOC_DQBUF
 986           to get frames or call read on the device. */
 987        if (!usbvision->num_frames) {
 988                /* First, allocate some frames to work with
 989                   if this has not been done with VIDIOC_REQBUF */
 990                usbvision_frames_free(usbvision);
 991                usbvision_empty_framequeues(usbvision);
 992                usbvision_frames_alloc(usbvision, USBVISION_NUMFRAMES);
 993        }
 994
 995        if (usbvision->streaming != stream_on) {
 996                /* no stream is running, make it running ! */
 997                usbvision->streaming = stream_on;
 998                call_all(usbvision, video, s_stream, 1);
 999        }
1000
1001        /* Then, enqueue as many frames as possible
1002           (like a user of VIDIOC_QBUF would do) */
1003        for (i = 0; i < usbvision->num_frames; i++) {
1004                frame = &usbvision->frame[i];
1005                if (frame->grabstate == frame_state_unused) {
1006                        /* Mark it as ready and enqueue frame */
1007                        frame->grabstate = frame_state_ready;
1008                        frame->scanstate = scan_state_scanning;
1009                        /* Accumulated in usbvision_parse_data() */
1010                        frame->scanlength = 0;
1011
1012                        /* set v4l2_format index */
1013                        frame->v4l2_format = usbvision->palette;
1014
1015                        spin_lock_irqsave(&usbvision->queue_lock, lock_flags);
1016                        list_add_tail(&frame->frame, &usbvision->inqueue);
1017                        spin_unlock_irqrestore(&usbvision->queue_lock,
1018                                               lock_flags);
1019                }
1020        }
1021
1022        /* Then try to steal a frame (like a VIDIOC_DQBUF would do) */
1023        if (list_empty(&(usbvision->outqueue))) {
1024                if (noblock)
1025                        return -EAGAIN;
1026
1027                ret = wait_event_interruptible
1028                        (usbvision->wait_frame,
1029                         !list_empty(&(usbvision->outqueue)));
1030                if (ret)
1031                        return ret;
1032        }
1033
1034        spin_lock_irqsave(&usbvision->queue_lock, lock_flags);
1035        frame = list_entry(usbvision->outqueue.next,
1036                           struct usbvision_frame, frame);
1037        list_del(usbvision->outqueue.next);
1038        spin_unlock_irqrestore(&usbvision->queue_lock, lock_flags);
1039
1040        /* An error returns an empty frame */
1041        if (frame->grabstate == frame_state_error) {
1042                frame->bytes_read = 0;
1043                return 0;
1044        }
1045
1046        PDEBUG(DBG_IO, "%s: frmx=%d, bytes_read=%ld, scanlength=%ld",
1047               __func__,
1048               frame->index, frame->bytes_read, frame->scanlength);
1049
1050        /* copy bytes to user space; we allow for partials reads */
1051        if ((count + frame->bytes_read) > (unsigned long)frame->scanlength)
1052                count = frame->scanlength - frame->bytes_read;
1053
1054        if (copy_to_user(buf, frame->data + frame->bytes_read, count))
1055                return -EFAULT;
1056
1057        frame->bytes_read += count;
1058        PDEBUG(DBG_IO, "%s: {copy} count used=%ld, new bytes_read=%ld",
1059               __func__,
1060               (unsigned long)count, frame->bytes_read);
1061
1062        /* For now, forget the frame if it has not been read in one shot. */
1063/*      if (frame->bytes_read >= frame->scanlength) {*/ /* All data has been read */
1064                frame->bytes_read = 0;
1065
1066                /* Mark it as available to be used again. */
1067                frame->grabstate = frame_state_unused;
1068/*      } */
1069
1070        return count;
1071}
1072
1073static ssize_t usbvision_v4l2_read(struct file *file, char __user *buf,
1074                      size_t count, loff_t *ppos)
1075{
1076        struct usb_usbvision *usbvision = video_drvdata(file);
1077        int res;
1078
1079        if (mutex_lock_interruptible(&usbvision->v4l2_lock))
1080                return -ERESTARTSYS;
1081        res = usbvision_read(file, buf, count, ppos);
1082        mutex_unlock(&usbvision->v4l2_lock);
1083        return res;
1084}
1085
1086static int usbvision_mmap(struct file *file, struct vm_area_struct *vma)
1087{
1088        unsigned long size = vma->vm_end - vma->vm_start,
1089                start = vma->vm_start;
1090        void *pos;
1091        u32 i;
1092        struct usb_usbvision *usbvision = video_drvdata(file);
1093
1094        PDEBUG(DBG_MMAP, "mmap");
1095
1096        if (!USBVISION_IS_OPERATIONAL(usbvision))
1097                return -EFAULT;
1098
1099        if (!(vma->vm_flags & VM_WRITE) ||
1100            size != PAGE_ALIGN(usbvision->max_frame_size)) {
1101                return -EINVAL;
1102        }
1103
1104        for (i = 0; i < usbvision->num_frames; i++) {
1105                if (((PAGE_ALIGN(usbvision->max_frame_size)*i) >> PAGE_SHIFT) ==
1106                    vma->vm_pgoff)
1107                        break;
1108        }
1109        if (i == usbvision->num_frames) {
1110                PDEBUG(DBG_MMAP,
1111                       "mmap: user supplied mapping address is out of range");
1112                return -EINVAL;
1113        }
1114
1115        /* VM_IO is eventually going to replace PageReserved altogether */
1116        vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP;
1117
1118        pos = usbvision->frame[i].data;
1119        while (size > 0) {
1120                if (vm_insert_page(vma, start, vmalloc_to_page(pos))) {
1121                        PDEBUG(DBG_MMAP, "mmap: vm_insert_page failed");
1122                        return -EAGAIN;
1123                }
1124                start += PAGE_SIZE;
1125                pos += PAGE_SIZE;
1126                size -= PAGE_SIZE;
1127        }
1128
1129        return 0;
1130}
1131
1132static int usbvision_v4l2_mmap(struct file *file, struct vm_area_struct *vma)
1133{
1134        struct usb_usbvision *usbvision = video_drvdata(file);
1135        int res;
1136
1137        if (mutex_lock_interruptible(&usbvision->v4l2_lock))
1138                return -ERESTARTSYS;
1139        res = usbvision_mmap(file, vma);
1140        mutex_unlock(&usbvision->v4l2_lock);
1141        return res;
1142}
1143
1144/*
1145 * Here comes the stuff for radio on usbvision based devices
1146 *
1147 */
1148static int usbvision_radio_open(struct file *file)
1149{
1150        struct usb_usbvision *usbvision = video_drvdata(file);
1151        int err_code = 0;
1152
1153        PDEBUG(DBG_IO, "%s:", __func__);
1154
1155        if (mutex_lock_interruptible(&usbvision->v4l2_lock))
1156                return -ERESTARTSYS;
1157        if (usbvision->user) {
1158                dev_err(&usbvision->rdev->dev,
1159                        "%s: Someone tried to open an already opened USBVision Radio!\n",
1160                                __func__);
1161                err_code = -EBUSY;
1162        } else {
1163                if (power_on_at_open) {
1164                        usbvision_reset_power_off_timer(usbvision);
1165                        if (usbvision->power == 0) {
1166                                usbvision_power_on(usbvision);
1167                                usbvision_i2c_register(usbvision);
1168                        }
1169                }
1170
1171                /* Alternate interface 1 is is the biggest frame size */
1172                err_code = usbvision_set_alternate(usbvision);
1173                if (err_code < 0) {
1174                        usbvision->last_error = err_code;
1175                        err_code = -EBUSY;
1176                        goto out;
1177                }
1178
1179                /* If so far no errors then we shall start the radio */
1180                usbvision->radio = 1;
1181                call_all(usbvision, tuner, s_radio);
1182                usbvision_set_audio(usbvision, USBVISION_AUDIO_RADIO);
1183                usbvision->user++;
1184        }
1185
1186        if (err_code) {
1187                if (power_on_at_open) {
1188                        usbvision_i2c_unregister(usbvision);
1189                        usbvision_power_off(usbvision);
1190                        usbvision->initialized = 0;
1191                }
1192        }
1193out:
1194        mutex_unlock(&usbvision->v4l2_lock);
1195        return err_code;
1196}
1197
1198
1199static int usbvision_radio_close(struct file *file)
1200{
1201        struct usb_usbvision *usbvision = video_drvdata(file);
1202        int err_code = 0;
1203
1204        PDEBUG(DBG_IO, "");
1205
1206        mutex_lock(&usbvision->v4l2_lock);
1207        /* Set packet size to 0 */
1208        usbvision->iface_alt = 0;
1209        err_code = usb_set_interface(usbvision->dev, usbvision->iface,
1210                                    usbvision->iface_alt);
1211
1212        usbvision_audio_off(usbvision);
1213        usbvision->radio = 0;
1214        usbvision->user--;
1215
1216        if (power_on_at_open) {
1217                usbvision_set_power_off_timer(usbvision);
1218                usbvision->initialized = 0;
1219        }
1220
1221        if (usbvision->remove_pending) {
1222                printk(KERN_INFO "%s: Final disconnect\n", __func__);
1223                usbvision_release(usbvision);
1224        }
1225
1226        mutex_unlock(&usbvision->v4l2_lock);
1227        PDEBUG(DBG_IO, "success");
1228        return err_code;
1229}
1230
1231/* Video registration stuff */
1232
1233/* Video template */
1234static const struct v4l2_file_operations usbvision_fops = {
1235        .owner             = THIS_MODULE,
1236        .open           = usbvision_v4l2_open,
1237        .release        = usbvision_v4l2_close,
1238        .read           = usbvision_v4l2_read,
1239        .mmap           = usbvision_v4l2_mmap,
1240        .unlocked_ioctl = video_ioctl2,
1241/*      .poll           = video_poll, */
1242};
1243
1244static const struct v4l2_ioctl_ops usbvision_ioctl_ops = {
1245        .vidioc_querycap      = vidioc_querycap,
1246        .vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,
1247        .vidioc_g_fmt_vid_cap     = vidioc_g_fmt_vid_cap,
1248        .vidioc_try_fmt_vid_cap   = vidioc_try_fmt_vid_cap,
1249        .vidioc_s_fmt_vid_cap     = vidioc_s_fmt_vid_cap,
1250        .vidioc_reqbufs       = vidioc_reqbufs,
1251        .vidioc_querybuf      = vidioc_querybuf,
1252        .vidioc_qbuf          = vidioc_qbuf,
1253        .vidioc_dqbuf         = vidioc_dqbuf,
1254        .vidioc_s_std         = vidioc_s_std,
1255        .vidioc_g_std         = vidioc_g_std,
1256        .vidioc_enum_input    = vidioc_enum_input,
1257        .vidioc_g_input       = vidioc_g_input,
1258        .vidioc_s_input       = vidioc_s_input,
1259        .vidioc_queryctrl     = vidioc_queryctrl,
1260        .vidioc_g_audio       = vidioc_g_audio,
1261        .vidioc_s_audio       = vidioc_s_audio,
1262        .vidioc_g_ctrl        = vidioc_g_ctrl,
1263        .vidioc_s_ctrl        = vidioc_s_ctrl,
1264        .vidioc_streamon      = vidioc_streamon,
1265        .vidioc_streamoff     = vidioc_streamoff,
1266        .vidioc_g_tuner       = vidioc_g_tuner,
1267        .vidioc_s_tuner       = vidioc_s_tuner,
1268        .vidioc_g_frequency   = vidioc_g_frequency,
1269        .vidioc_s_frequency   = vidioc_s_frequency,
1270#ifdef CONFIG_VIDEO_ADV_DEBUG
1271        .vidioc_g_register    = vidioc_g_register,
1272        .vidioc_s_register    = vidioc_s_register,
1273#endif
1274};
1275
1276static struct video_device usbvision_video_template = {
1277        .fops           = &usbvision_fops,
1278        .ioctl_ops      = &usbvision_ioctl_ops,
1279        .name           = "usbvision-video",
1280        .release        = video_device_release,
1281        .tvnorms        = USBVISION_NORMS,
1282};
1283
1284
1285/* Radio template */
1286static const struct v4l2_file_operations usbvision_radio_fops = {
1287        .owner             = THIS_MODULE,
1288        .open           = usbvision_radio_open,
1289        .release        = usbvision_radio_close,
1290        .unlocked_ioctl = video_ioctl2,
1291};
1292
1293static const struct v4l2_ioctl_ops usbvision_radio_ioctl_ops = {
1294        .vidioc_querycap      = vidioc_querycap,
1295        .vidioc_enum_input    = vidioc_enum_input,
1296        .vidioc_g_input       = vidioc_g_input,
1297        .vidioc_s_input       = vidioc_s_input,
1298        .vidioc_queryctrl     = vidioc_queryctrl,
1299        .vidioc_g_audio       = vidioc_g_audio,
1300        .vidioc_s_audio       = vidioc_s_audio,
1301        .vidioc_g_ctrl        = vidioc_g_ctrl,
1302        .vidioc_s_ctrl        = vidioc_s_ctrl,
1303        .vidioc_g_tuner       = vidioc_g_tuner,
1304        .vidioc_s_tuner       = vidioc_s_tuner,
1305        .vidioc_g_frequency   = vidioc_g_frequency,
1306        .vidioc_s_frequency   = vidioc_s_frequency,
1307};
1308
1309static struct video_device usbvision_radio_template = {
1310        .fops           = &usbvision_radio_fops,
1311        .name           = "usbvision-radio",
1312        .release        = video_device_release,
1313        .ioctl_ops      = &usbvision_radio_ioctl_ops,
1314};
1315
1316
1317static struct video_device *usbvision_vdev_init(struct usb_usbvision *usbvision,
1318                                        struct video_device *vdev_template,
1319                                        char *name)
1320{
1321        struct usb_device *usb_dev = usbvision->dev;
1322        struct video_device *vdev;
1323
1324        if (usb_dev == NULL) {
1325                dev_err(&usbvision->dev->dev,
1326                        "%s: usbvision->dev is not set\n", __func__);
1327                return NULL;
1328        }
1329
1330        vdev = video_device_alloc();
1331        if (NULL == vdev)
1332                return NULL;
1333        *vdev = *vdev_template;
1334        vdev->lock = &usbvision->v4l2_lock;
1335        vdev->v4l2_dev = &usbvision->v4l2_dev;
1336        snprintf(vdev->name, sizeof(vdev->name), "%s", name);
1337        video_set_drvdata(vdev, usbvision);
1338        return vdev;
1339}
1340
1341/* unregister video4linux devices */
1342static void usbvision_unregister_video(struct usb_usbvision *usbvision)
1343{
1344        /* Radio Device: */
1345        if (usbvision->rdev) {
1346                PDEBUG(DBG_PROBE, "unregister %s [v4l2]",
1347                       video_device_node_name(usbvision->rdev));
1348                if (video_is_registered(usbvision->rdev))
1349                        video_unregister_device(usbvision->rdev);
1350                else
1351                        video_device_release(usbvision->rdev);
1352                usbvision->rdev = NULL;
1353        }
1354
1355        /* Video Device: */
1356        if (usbvision->vdev) {
1357                PDEBUG(DBG_PROBE, "unregister %s [v4l2]",
1358                       video_device_node_name(usbvision->vdev));
1359                if (video_is_registered(usbvision->vdev))
1360                        video_unregister_device(usbvision->vdev);
1361                else
1362                        video_device_release(usbvision->vdev);
1363                usbvision->vdev = NULL;
1364        }
1365}
1366
1367/* register video4linux devices */
1368static int usbvision_register_video(struct usb_usbvision *usbvision)
1369{
1370        /* Video Device: */
1371        usbvision->vdev = usbvision_vdev_init(usbvision,
1372                                              &usbvision_video_template,
1373                                              "USBVision Video");
1374        if (usbvision->vdev == NULL)
1375                goto err_exit;
1376        if (video_register_device(usbvision->vdev, VFL_TYPE_GRABBER, video_nr) < 0)
1377                goto err_exit;
1378        printk(KERN_INFO "USBVision[%d]: registered USBVision Video device %s [v4l2]\n",
1379               usbvision->nr, video_device_node_name(usbvision->vdev));
1380
1381        /* Radio Device: */
1382        if (usbvision_device_data[usbvision->dev_model].radio) {
1383                /* usbvision has radio */
1384                usbvision->rdev = usbvision_vdev_init(usbvision,
1385                                                      &usbvision_radio_template,
1386                                                      "USBVision Radio");
1387                if (usbvision->rdev == NULL)
1388                        goto err_exit;
1389                if (video_register_device(usbvision->rdev, VFL_TYPE_RADIO, radio_nr) < 0)
1390                        goto err_exit;
1391                printk(KERN_INFO "USBVision[%d]: registered USBVision Radio device %s [v4l2]\n",
1392                       usbvision->nr, video_device_node_name(usbvision->rdev));
1393        }
1394        /* all done */
1395        return 0;
1396
1397 err_exit:
1398        dev_err(&usbvision->dev->dev,
1399                "USBVision[%d]: video_register_device() failed\n",
1400                        usbvision->nr);
1401        usbvision_unregister_video(usbvision);
1402        return -1;
1403}
1404
1405/*
1406 * usbvision_alloc()
1407 *
1408 * This code allocates the struct usb_usbvision.
1409 * It is filled with default values.
1410 *
1411 * Returns NULL on error, a pointer to usb_usbvision else.
1412 *
1413 */
1414static struct usb_usbvision *usbvision_alloc(struct usb_device *dev,
1415                                             struct usb_interface *intf)
1416{
1417        struct usb_usbvision *usbvision;
1418
1419        usbvision = kzalloc(sizeof(struct usb_usbvision), GFP_KERNEL);
1420        if (usbvision == NULL)
1421                return NULL;
1422
1423        usbvision->dev = dev;
1424        if (v4l2_device_register(&intf->dev, &usbvision->v4l2_dev))
1425                goto err_free;
1426
1427        mutex_init(&usbvision->v4l2_lock);
1428
1429        /* prepare control urb for control messages during interrupts */
1430        usbvision->ctrl_urb = usb_alloc_urb(USBVISION_URB_FRAMES, GFP_KERNEL);
1431        if (usbvision->ctrl_urb == NULL)
1432                goto err_unreg;
1433        init_waitqueue_head(&usbvision->ctrl_urb_wq);
1434
1435        usbvision_init_power_off_timer(usbvision);
1436
1437        return usbvision;
1438
1439err_unreg:
1440        v4l2_device_unregister(&usbvision->v4l2_dev);
1441err_free:
1442        kfree(usbvision);
1443        return NULL;
1444}
1445
1446/*
1447 * usbvision_release()
1448 *
1449 * This code does final release of struct usb_usbvision. This happens
1450 * after the device is disconnected -and- all clients closed their files.
1451 *
1452 */
1453static void usbvision_release(struct usb_usbvision *usbvision)
1454{
1455        PDEBUG(DBG_PROBE, "");
1456
1457        usbvision_reset_power_off_timer(usbvision);
1458
1459        usbvision->initialized = 0;
1460
1461        usbvision_remove_sysfs(usbvision->vdev);
1462        usbvision_unregister_video(usbvision);
1463        kfree(usbvision->alt_max_pkt_size);
1464
1465        usb_free_urb(usbvision->ctrl_urb);
1466
1467        v4l2_device_unregister(&usbvision->v4l2_dev);
1468        kfree(usbvision);
1469
1470        PDEBUG(DBG_PROBE, "success");
1471}
1472
1473
1474/*********************** usb interface **********************************/
1475
1476static void usbvision_configure_video(struct usb_usbvision *usbvision)
1477{
1478        int model;
1479
1480        if (usbvision == NULL)
1481                return;
1482
1483        model = usbvision->dev_model;
1484        usbvision->palette = usbvision_v4l2_format[2]; /* V4L2_PIX_FMT_RGB24; */
1485
1486        if (usbvision_device_data[usbvision->dev_model].vin_reg2_override) {
1487                usbvision->vin_reg2_preset =
1488                        usbvision_device_data[usbvision->dev_model].vin_reg2;
1489        } else {
1490                usbvision->vin_reg2_preset = 0;
1491        }
1492
1493        usbvision->tvnorm_id = usbvision_device_data[model].video_norm;
1494
1495        usbvision->video_inputs = usbvision_device_data[model].video_channels;
1496        usbvision->ctl_input = 0;
1497
1498        /* This should be here to make i2c clients to be able to register */
1499        /* first switch off audio */
1500        if (usbvision_device_data[model].audio_channels > 0)
1501                usbvision_audio_off(usbvision);
1502        if (!power_on_at_open) {
1503                /* and then power up the noisy tuner */
1504                usbvision_power_on(usbvision);
1505                usbvision_i2c_register(usbvision);
1506        }
1507}
1508
1509/*
1510 * usbvision_probe()
1511 *
1512 * This procedure queries device descriptor and accepts the interface
1513 * if it looks like USBVISION video device
1514 *
1515 */
1516static int usbvision_probe(struct usb_interface *intf,
1517                           const struct usb_device_id *devid)
1518{
1519        struct usb_device *dev = usb_get_dev(interface_to_usbdev(intf));
1520        struct usb_interface *uif;
1521        __u8 ifnum = intf->altsetting->desc.bInterfaceNumber;
1522        const struct usb_host_interface *interface;
1523        struct usb_usbvision *usbvision = NULL;
1524        const struct usb_endpoint_descriptor *endpoint;
1525        int model, i;
1526
1527        PDEBUG(DBG_PROBE, "VID=%#04x, PID=%#04x, ifnum=%u",
1528                                dev->descriptor.idVendor,
1529                                dev->descriptor.idProduct, ifnum);
1530
1531        model = devid->driver_info;
1532        if (model < 0 || model >= usbvision_device_data_size) {
1533                PDEBUG(DBG_PROBE, "model out of bounds %d", model);
1534                return -ENODEV;
1535        }
1536        printk(KERN_INFO "%s: %s found\n", __func__,
1537                                usbvision_device_data[model].model_string);
1538
1539        if (usbvision_device_data[model].interface >= 0)
1540                interface = &dev->actconfig->interface[usbvision_device_data[model].interface]->altsetting[0];
1541        else
1542                interface = &dev->actconfig->interface[ifnum]->altsetting[0];
1543        endpoint = &interface->endpoint[1].desc;
1544        if (!usb_endpoint_xfer_isoc(endpoint)) {
1545                dev_err(&intf->dev, "%s: interface %d. has non-ISO endpoint!\n",
1546                    __func__, ifnum);
1547                dev_err(&intf->dev, "%s: Endpoint attributes %d",
1548                    __func__, endpoint->bmAttributes);
1549                return -ENODEV;
1550        }
1551        if (usb_endpoint_dir_out(endpoint)) {
1552                dev_err(&intf->dev, "%s: interface %d. has ISO OUT endpoint!\n",
1553                    __func__, ifnum);
1554                return -ENODEV;
1555        }
1556
1557        usbvision = usbvision_alloc(dev, intf);
1558        if (usbvision == NULL) {
1559                dev_err(&intf->dev, "%s: couldn't allocate USBVision struct\n", __func__);
1560                return -ENOMEM;
1561        }
1562
1563        if (dev->descriptor.bNumConfigurations > 1)
1564                usbvision->bridge_type = BRIDGE_NT1004;
1565        else if (model == DAZZLE_DVC_90_REV_1_SECAM)
1566                usbvision->bridge_type = BRIDGE_NT1005;
1567        else
1568                usbvision->bridge_type = BRIDGE_NT1003;
1569        PDEBUG(DBG_PROBE, "bridge_type %d", usbvision->bridge_type);
1570
1571        /* compute alternate max packet sizes */
1572        uif = dev->actconfig->interface[0];
1573
1574        usbvision->num_alt = uif->num_altsetting;
1575        PDEBUG(DBG_PROBE, "Alternate settings: %i", usbvision->num_alt);
1576        usbvision->alt_max_pkt_size = kmalloc(32 * usbvision->num_alt, GFP_KERNEL);
1577        if (usbvision->alt_max_pkt_size == NULL) {
1578                dev_err(&intf->dev, "usbvision: out of memory!\n");
1579                usbvision_release(usbvision);
1580                return -ENOMEM;
1581        }
1582
1583        for (i = 0; i < usbvision->num_alt; i++) {
1584                u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[1].desc.
1585                                      wMaxPacketSize);
1586                usbvision->alt_max_pkt_size[i] =
1587                        (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1588                PDEBUG(DBG_PROBE, "Alternate setting %i, max size= %i", i,
1589                       usbvision->alt_max_pkt_size[i]);
1590        }
1591
1592
1593        usbvision->nr = usbvision_nr++;
1594
1595        usbvision->have_tuner = usbvision_device_data[model].tuner;
1596        if (usbvision->have_tuner)
1597                usbvision->tuner_type = usbvision_device_data[model].tuner_type;
1598
1599        usbvision->dev_model = model;
1600        usbvision->remove_pending = 0;
1601        usbvision->iface = ifnum;
1602        usbvision->iface_alt = 0;
1603        usbvision->video_endp = endpoint->bEndpointAddress;
1604        usbvision->isoc_packet_size = 0;
1605        usbvision->usb_bandwidth = 0;
1606        usbvision->user = 0;
1607        usbvision->streaming = stream_off;
1608        usbvision_configure_video(usbvision);
1609        usbvision_register_video(usbvision);
1610
1611        usbvision_create_sysfs(usbvision->vdev);
1612
1613        PDEBUG(DBG_PROBE, "success");
1614        return 0;
1615}
1616
1617
1618/*
1619 * usbvision_disconnect()
1620 *
1621 * This procedure stops all driver activity, deallocates interface-private
1622 * structure (pointed by 'ptr') and after that driver should be removable
1623 * with no ill consequences.
1624 *
1625 */
1626static void usbvision_disconnect(struct usb_interface *intf)
1627{
1628        struct usb_usbvision *usbvision = to_usbvision(usb_get_intfdata(intf));
1629
1630        PDEBUG(DBG_PROBE, "");
1631
1632        if (usbvision == NULL) {
1633                pr_err("%s: usb_get_intfdata() failed\n", __func__);
1634                return;
1635        }
1636
1637        mutex_lock(&usbvision->v4l2_lock);
1638
1639        /* At this time we ask to cancel outstanding URBs */
1640        usbvision_stop_isoc(usbvision);
1641
1642        v4l2_device_disconnect(&usbvision->v4l2_dev);
1643
1644        if (usbvision->power) {
1645                usbvision_i2c_unregister(usbvision);
1646                usbvision_power_off(usbvision);
1647        }
1648        usbvision->remove_pending = 1;  /* Now all ISO data will be ignored */
1649
1650        usb_put_dev(usbvision->dev);
1651        usbvision->dev = NULL;  /* USB device is no more */
1652
1653        mutex_unlock(&usbvision->v4l2_lock);
1654
1655        if (usbvision->user) {
1656                printk(KERN_INFO "%s: In use, disconnect pending\n",
1657                       __func__);
1658                wake_up_interruptible(&usbvision->wait_frame);
1659                wake_up_interruptible(&usbvision->wait_stream);
1660        } else {
1661                usbvision_release(usbvision);
1662        }
1663
1664        PDEBUG(DBG_PROBE, "success");
1665}
1666
1667static struct usb_driver usbvision_driver = {
1668        .name           = "usbvision",
1669        .id_table       = usbvision_table,
1670        .probe          = usbvision_probe,
1671        .disconnect     = usbvision_disconnect,
1672};
1673
1674/*
1675 * usbvision_init()
1676 *
1677 * This code is run to initialize the driver.
1678 *
1679 */
1680static int __init usbvision_init(void)
1681{
1682        int err_code;
1683
1684        PDEBUG(DBG_PROBE, "");
1685
1686        PDEBUG(DBG_IO,  "IO      debugging is enabled [video]");
1687        PDEBUG(DBG_PROBE, "PROBE   debugging is enabled [video]");
1688        PDEBUG(DBG_MMAP, "MMAP    debugging is enabled [video]");
1689
1690        /* disable planar mode support unless compression enabled */
1691        if (isoc_mode != ISOC_MODE_COMPRESS) {
1692                /* FIXME : not the right way to set supported flag */
1693                usbvision_v4l2_format[6].supported = 0; /* V4L2_PIX_FMT_YVU420 */
1694                usbvision_v4l2_format[7].supported = 0; /* V4L2_PIX_FMT_YUV422P */
1695        }
1696
1697        err_code = usb_register(&usbvision_driver);
1698
1699        if (err_code == 0) {
1700                printk(KERN_INFO DRIVER_DESC " : " USBVISION_VERSION_STRING "\n");
1701                PDEBUG(DBG_PROBE, "success");
1702        }
1703        return err_code;
1704}
1705
1706static void __exit usbvision_exit(void)
1707{
1708        PDEBUG(DBG_PROBE, "");
1709
1710        usb_deregister(&usbvision_driver);
1711        PDEBUG(DBG_PROBE, "success");
1712}
1713
1714module_init(usbvision_init);
1715module_exit(usbvision_exit);
1716
1717/*
1718 * Overrides for Emacs so that we follow Linus's tabbing style.
1719 * ---------------------------------------------------------------------------
1720 * Local variables:
1721 * c-basic-offset: 8
1722 * End:
1723 */
1724