linux/drivers/media/usb/usbvision/usbvision-core.c
<<
>>
Prefs
   1/*
   2 * usbvision-core.c - driver for NT100x USB video capture devices
   3 *
   4 *
   5 * Copyright (c) 1999-2005 Joerg Heckenbach <joerg@heckenbach-aw.de>
   6 *                         Dwaine Garden <dwainegarden@rogers.com>
   7 *
   8 * This module is part of usbvision driver project.
   9 * Updates to driver completed by Dwaine P. Garden
  10 *
  11 * This program is free software; you can redistribute it and/or modify
  12 * it under the terms of the GNU General Public License as published by
  13 * the Free Software Foundation; either version 2 of the License, or
  14 * (at your option) any later version.
  15 *
  16 * This program is distributed in the hope that it will be useful,
  17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19 * GNU General Public License for more details.
  20 */
  21
  22#include <linux/kernel.h>
  23#include <linux/list.h>
  24#include <linux/timer.h>
  25#include <linux/gfp.h>
  26#include <linux/mm.h>
  27#include <linux/highmem.h>
  28#include <linux/vmalloc.h>
  29#include <linux/module.h>
  30#include <linux/init.h>
  31#include <linux/spinlock.h>
  32#include <linux/io.h>
  33#include <linux/videodev2.h>
  34#include <linux/i2c.h>
  35
  36#include <media/i2c/saa7115.h>
  37#include <media/v4l2-common.h>
  38#include <media/tuner.h>
  39
  40#include <linux/workqueue.h>
  41
  42#include "usbvision.h"
  43
  44static unsigned int core_debug;
  45module_param(core_debug, int, 0644);
  46MODULE_PARM_DESC(core_debug, "enable debug messages [core]");
  47
  48static int adjust_compression = 1;      /* Set the compression to be adaptive */
  49module_param(adjust_compression, int, 0444);
  50MODULE_PARM_DESC(adjust_compression, " Set the ADPCM compression for the device.  Default: 1 (On)");
  51
  52/* To help people with Black and White output with using s-video input.
  53 * Some cables and input device are wired differently. */
  54static int switch_svideo_input;
  55module_param(switch_svideo_input, int, 0444);
  56MODULE_PARM_DESC(switch_svideo_input, " Set the S-Video input.  Some cables and input device are wired differently. Default: 0 (Off)");
  57
  58static unsigned int adjust_x_offset = -1;
  59module_param(adjust_x_offset, int, 0644);
  60MODULE_PARM_DESC(adjust_x_offset, "adjust X offset display [core]");
  61
  62static unsigned int adjust_y_offset = -1;
  63module_param(adjust_y_offset, int, 0644);
  64MODULE_PARM_DESC(adjust_y_offset, "adjust Y offset display [core]");
  65
  66
  67#define ENABLE_HEXDUMP  0       /* Enable if you need it */
  68
  69
  70#ifdef USBVISION_DEBUG
  71        #define PDEBUG(level, fmt, args...) { \
  72                if (core_debug & (level)) \
  73                        printk(KERN_INFO KBUILD_MODNAME ":[%s:%d] " fmt, \
  74                                __func__, __LINE__ , ## args); \
  75        }
  76#else
  77        #define PDEBUG(level, fmt, args...) do {} while (0)
  78#endif
  79
  80#define DBG_HEADER      (1 << 0)
  81#define DBG_IRQ         (1 << 1)
  82#define DBG_ISOC        (1 << 2)
  83#define DBG_PARSE       (1 << 3)
  84#define DBG_SCRATCH     (1 << 4)
  85#define DBG_FUNC        (1 << 5)
  86
  87/* The value of 'scratch_buf_size' affects quality of the picture
  88 * in many ways. Shorter buffers may cause loss of data when client
  89 * is too slow. Larger buffers are memory-consuming and take longer
  90 * to work with. This setting can be adjusted, but the default value
  91 * should be OK for most desktop users.
  92 */
  93#define DEFAULT_SCRATCH_BUF_SIZE        (0x20000)               /* 128kB memory scratch buffer */
  94static const int scratch_buf_size = DEFAULT_SCRATCH_BUF_SIZE;
  95
  96/* Function prototypes */
  97static int usbvision_request_intra(struct usb_usbvision *usbvision);
  98static int usbvision_unrequest_intra(struct usb_usbvision *usbvision);
  99static int usbvision_adjust_compression(struct usb_usbvision *usbvision);
 100static int usbvision_measure_bandwidth(struct usb_usbvision *usbvision);
 101
 102/*******************************/
 103/* Memory management functions */
 104/*******************************/
 105
 106/*
 107 * Here we want the physical address of the memory.
 108 * This is used when initializing the contents of the area.
 109 */
 110
 111static void *usbvision_rvmalloc(unsigned long size)
 112{
 113        void *mem;
 114        unsigned long adr;
 115
 116        size = PAGE_ALIGN(size);
 117        mem = vmalloc_32(size);
 118        if (!mem)
 119                return NULL;
 120
 121        memset(mem, 0, size); /* Clear the ram out, no junk to the user */
 122        adr = (unsigned long) mem;
 123        while (size > 0) {
 124                SetPageReserved(vmalloc_to_page((void *)adr));
 125                adr += PAGE_SIZE;
 126                size -= PAGE_SIZE;
 127        }
 128
 129        return mem;
 130}
 131
 132static void usbvision_rvfree(void *mem, unsigned long size)
 133{
 134        unsigned long adr;
 135
 136        if (!mem)
 137                return;
 138
 139        size = PAGE_ALIGN(size);
 140
 141        adr = (unsigned long) mem;
 142        while ((long) size > 0) {
 143                ClearPageReserved(vmalloc_to_page((void *)adr));
 144                adr += PAGE_SIZE;
 145                size -= PAGE_SIZE;
 146        }
 147
 148        vfree(mem);
 149}
 150
 151
 152#if ENABLE_HEXDUMP
 153static void usbvision_hexdump(const unsigned char *data, int len)
 154{
 155        char tmp[80];
 156        int i, k;
 157
 158        for (i = k = 0; len > 0; i++, len--) {
 159                if (i > 0 && (i % 16 == 0)) {
 160                        printk("%s\n", tmp);
 161                        k = 0;
 162                }
 163                k += sprintf(&tmp[k], "%02x ", data[i]);
 164        }
 165        if (k > 0)
 166                printk(KERN_CONT "%s\n", tmp);
 167}
 168#endif
 169
 170/********************************
 171 * scratch ring buffer handling
 172 ********************************/
 173static int scratch_len(struct usb_usbvision *usbvision)    /* This returns the amount of data actually in the buffer */
 174{
 175        int len = usbvision->scratch_write_ptr - usbvision->scratch_read_ptr;
 176
 177        if (len < 0)
 178                len += scratch_buf_size;
 179        PDEBUG(DBG_SCRATCH, "scratch_len() = %d\n", len);
 180
 181        return len;
 182}
 183
 184
 185/* This returns the free space left in the buffer */
 186static int scratch_free(struct usb_usbvision *usbvision)
 187{
 188        int free = usbvision->scratch_read_ptr - usbvision->scratch_write_ptr;
 189        if (free <= 0)
 190                free += scratch_buf_size;
 191        if (free) {
 192                free -= 1;                                                      /* at least one byte in the buffer must */
 193                                                                                /* left blank, otherwise there is no chance to differ between full and empty */
 194        }
 195        PDEBUG(DBG_SCRATCH, "return %d\n", free);
 196
 197        return free;
 198}
 199
 200
 201/* This puts data into the buffer */
 202static int scratch_put(struct usb_usbvision *usbvision, unsigned char *data,
 203                       int len)
 204{
 205        int len_part;
 206
 207        if (usbvision->scratch_write_ptr + len < scratch_buf_size) {
 208                memcpy(usbvision->scratch + usbvision->scratch_write_ptr, data, len);
 209                usbvision->scratch_write_ptr += len;
 210        } else {
 211                len_part = scratch_buf_size - usbvision->scratch_write_ptr;
 212                memcpy(usbvision->scratch + usbvision->scratch_write_ptr, data, len_part);
 213                if (len == len_part) {
 214                        usbvision->scratch_write_ptr = 0;                       /* just set write_ptr to zero */
 215                } else {
 216                        memcpy(usbvision->scratch, data + len_part, len - len_part);
 217                        usbvision->scratch_write_ptr = len - len_part;
 218                }
 219        }
 220
 221        PDEBUG(DBG_SCRATCH, "len=%d, new write_ptr=%d\n", len, usbvision->scratch_write_ptr);
 222
 223        return len;
 224}
 225
 226/* This marks the write_ptr as position of new frame header */
 227static void scratch_mark_header(struct usb_usbvision *usbvision)
 228{
 229        PDEBUG(DBG_SCRATCH, "header at write_ptr=%d\n", usbvision->scratch_headermarker_write_ptr);
 230
 231        usbvision->scratch_headermarker[usbvision->scratch_headermarker_write_ptr] =
 232                                usbvision->scratch_write_ptr;
 233        usbvision->scratch_headermarker_write_ptr += 1;
 234        usbvision->scratch_headermarker_write_ptr %= USBVISION_NUM_HEADERMARKER;
 235}
 236
 237/* This gets data from the buffer at the given "ptr" position */
 238static int scratch_get_extra(struct usb_usbvision *usbvision,
 239                             unsigned char *data, int *ptr, int len)
 240{
 241        int len_part;
 242
 243        if (*ptr + len < scratch_buf_size) {
 244                memcpy(data, usbvision->scratch + *ptr, len);
 245                *ptr += len;
 246        } else {
 247                len_part = scratch_buf_size - *ptr;
 248                memcpy(data, usbvision->scratch + *ptr, len_part);
 249                if (len == len_part) {
 250                        *ptr = 0;                                                       /* just set the y_ptr to zero */
 251                } else {
 252                        memcpy(data + len_part, usbvision->scratch, len - len_part);
 253                        *ptr = len - len_part;
 254                }
 255        }
 256
 257        PDEBUG(DBG_SCRATCH, "len=%d, new ptr=%d\n", len, *ptr);
 258
 259        return len;
 260}
 261
 262
 263/* This sets the scratch extra read pointer */
 264static void scratch_set_extra_ptr(struct usb_usbvision *usbvision, int *ptr,
 265                                  int len)
 266{
 267        *ptr = (usbvision->scratch_read_ptr + len) % scratch_buf_size;
 268
 269        PDEBUG(DBG_SCRATCH, "ptr=%d\n", *ptr);
 270}
 271
 272
 273/* This increments the scratch extra read pointer */
 274static void scratch_inc_extra_ptr(int *ptr, int len)
 275{
 276        *ptr = (*ptr + len) % scratch_buf_size;
 277
 278        PDEBUG(DBG_SCRATCH, "ptr=%d\n", *ptr);
 279}
 280
 281
 282/* This gets data from the buffer */
 283static int scratch_get(struct usb_usbvision *usbvision, unsigned char *data,
 284                       int len)
 285{
 286        int len_part;
 287
 288        if (usbvision->scratch_read_ptr + len < scratch_buf_size) {
 289                memcpy(data, usbvision->scratch + usbvision->scratch_read_ptr, len);
 290                usbvision->scratch_read_ptr += len;
 291        } else {
 292                len_part = scratch_buf_size - usbvision->scratch_read_ptr;
 293                memcpy(data, usbvision->scratch + usbvision->scratch_read_ptr, len_part);
 294                if (len == len_part) {
 295                        usbvision->scratch_read_ptr = 0;                                /* just set the read_ptr to zero */
 296                } else {
 297                        memcpy(data + len_part, usbvision->scratch, len - len_part);
 298                        usbvision->scratch_read_ptr = len - len_part;
 299                }
 300        }
 301
 302        PDEBUG(DBG_SCRATCH, "len=%d, new read_ptr=%d\n", len, usbvision->scratch_read_ptr);
 303
 304        return len;
 305}
 306
 307
 308/* This sets read pointer to next header and returns it */
 309static int scratch_get_header(struct usb_usbvision *usbvision,
 310                              struct usbvision_frame_header *header)
 311{
 312        int err_code = 0;
 313
 314        PDEBUG(DBG_SCRATCH, "from read_ptr=%d", usbvision->scratch_headermarker_read_ptr);
 315
 316        while (usbvision->scratch_headermarker_write_ptr -
 317                usbvision->scratch_headermarker_read_ptr != 0) {
 318                usbvision->scratch_read_ptr =
 319                        usbvision->scratch_headermarker[usbvision->scratch_headermarker_read_ptr];
 320                usbvision->scratch_headermarker_read_ptr += 1;
 321                usbvision->scratch_headermarker_read_ptr %= USBVISION_NUM_HEADERMARKER;
 322                scratch_get(usbvision, (unsigned char *)header, USBVISION_HEADER_LENGTH);
 323                if ((header->magic_1 == USBVISION_MAGIC_1)
 324                         && (header->magic_2 == USBVISION_MAGIC_2)
 325                         && (header->header_length == USBVISION_HEADER_LENGTH)) {
 326                        err_code = USBVISION_HEADER_LENGTH;
 327                        header->frame_width  = header->frame_width_lo  + (header->frame_width_hi << 8);
 328                        header->frame_height = header->frame_height_lo + (header->frame_height_hi << 8);
 329                        break;
 330                }
 331        }
 332
 333        return err_code;
 334}
 335
 336
 337/* This removes len bytes of old data from the buffer */
 338static void scratch_rm_old(struct usb_usbvision *usbvision, int len)
 339{
 340        usbvision->scratch_read_ptr += len;
 341        usbvision->scratch_read_ptr %= scratch_buf_size;
 342        PDEBUG(DBG_SCRATCH, "read_ptr is now %d\n", usbvision->scratch_read_ptr);
 343}
 344
 345
 346/* This resets the buffer - kills all data in it too */
 347static void scratch_reset(struct usb_usbvision *usbvision)
 348{
 349        PDEBUG(DBG_SCRATCH, "\n");
 350
 351        usbvision->scratch_read_ptr = 0;
 352        usbvision->scratch_write_ptr = 0;
 353        usbvision->scratch_headermarker_read_ptr = 0;
 354        usbvision->scratch_headermarker_write_ptr = 0;
 355        usbvision->isocstate = isoc_state_no_frame;
 356}
 357
 358int usbvision_scratch_alloc(struct usb_usbvision *usbvision)
 359{
 360        usbvision->scratch = vmalloc_32(scratch_buf_size);
 361        scratch_reset(usbvision);
 362        if (usbvision->scratch == NULL) {
 363                dev_err(&usbvision->dev->dev,
 364                        "%s: unable to allocate %d bytes for scratch\n",
 365                                __func__, scratch_buf_size);
 366                return -ENOMEM;
 367        }
 368        return 0;
 369}
 370
 371void usbvision_scratch_free(struct usb_usbvision *usbvision)
 372{
 373        vfree(usbvision->scratch);
 374        usbvision->scratch = NULL;
 375}
 376
 377/*
 378 * usbvision_decompress_alloc()
 379 *
 380 * allocates intermediate buffer for decompression
 381 */
 382int usbvision_decompress_alloc(struct usb_usbvision *usbvision)
 383{
 384        int IFB_size = MAX_FRAME_WIDTH * MAX_FRAME_HEIGHT * 3 / 2;
 385
 386        usbvision->intra_frame_buffer = vmalloc_32(IFB_size);
 387        if (usbvision->intra_frame_buffer == NULL) {
 388                dev_err(&usbvision->dev->dev,
 389                        "%s: unable to allocate %d for compr. frame buffer\n",
 390                                __func__, IFB_size);
 391                return -ENOMEM;
 392        }
 393        return 0;
 394}
 395
 396/*
 397 * usbvision_decompress_free()
 398 *
 399 * frees intermediate buffer for decompression
 400 */
 401void usbvision_decompress_free(struct usb_usbvision *usbvision)
 402{
 403        vfree(usbvision->intra_frame_buffer);
 404        usbvision->intra_frame_buffer = NULL;
 405
 406}
 407
 408/************************************************************
 409 * Here comes the data parsing stuff that is run as interrupt
 410 ************************************************************/
 411/*
 412 * usbvision_find_header()
 413 *
 414 * Locate one of supported header markers in the scratch buffer.
 415 */
 416static enum parse_state usbvision_find_header(struct usb_usbvision *usbvision)
 417{
 418        struct usbvision_frame *frame;
 419        int found_header = 0;
 420
 421        frame = usbvision->cur_frame;
 422
 423        while (scratch_get_header(usbvision, &frame->isoc_header) == USBVISION_HEADER_LENGTH) {
 424                /* found header in scratch */
 425                PDEBUG(DBG_HEADER, "found header: 0x%02x%02x %d %d %d %d %#x 0x%02x %u %u",
 426                                frame->isoc_header.magic_2,
 427                                frame->isoc_header.magic_1,
 428                                frame->isoc_header.header_length,
 429                                frame->isoc_header.frame_num,
 430                                frame->isoc_header.frame_phase,
 431                                frame->isoc_header.frame_latency,
 432                                frame->isoc_header.data_format,
 433                                frame->isoc_header.format_param,
 434                                frame->isoc_header.frame_width,
 435                                frame->isoc_header.frame_height);
 436
 437                if (usbvision->request_intra) {
 438                        if (frame->isoc_header.format_param & 0x80) {
 439                                found_header = 1;
 440                                usbvision->last_isoc_frame_num = -1; /* do not check for lost frames this time */
 441                                usbvision_unrequest_intra(usbvision);
 442                                break;
 443                        }
 444                } else {
 445                        found_header = 1;
 446                        break;
 447                }
 448        }
 449
 450        if (found_header) {
 451                frame->frmwidth = frame->isoc_header.frame_width * usbvision->stretch_width;
 452                frame->frmheight = frame->isoc_header.frame_height * usbvision->stretch_height;
 453                frame->v4l2_linesize = (frame->frmwidth * frame->v4l2_format.depth) >> 3;
 454        } else { /* no header found */
 455                PDEBUG(DBG_HEADER, "skipping scratch data, no header");
 456                scratch_reset(usbvision);
 457                return parse_state_end_parse;
 458        }
 459
 460        /* found header */
 461        if (frame->isoc_header.data_format == ISOC_MODE_COMPRESS) {
 462                /* check isoc_header.frame_num for lost frames */
 463                if (usbvision->last_isoc_frame_num >= 0) {
 464                        if (((usbvision->last_isoc_frame_num + 1) % 32) != frame->isoc_header.frame_num) {
 465                                /* unexpected frame drop: need to request new intra frame */
 466                                PDEBUG(DBG_HEADER, "Lost frame before %d on USB", frame->isoc_header.frame_num);
 467                                usbvision_request_intra(usbvision);
 468                                return parse_state_next_frame;
 469                        }
 470                }
 471                usbvision->last_isoc_frame_num = frame->isoc_header.frame_num;
 472        }
 473        usbvision->header_count++;
 474        frame->scanstate = scan_state_lines;
 475        frame->curline = 0;
 476
 477        return parse_state_continue;
 478}
 479
 480static enum parse_state usbvision_parse_lines_422(struct usb_usbvision *usbvision,
 481                                           long *pcopylen)
 482{
 483        volatile struct usbvision_frame *frame;
 484        unsigned char *f;
 485        int len;
 486        int i;
 487        unsigned char yuyv[4] = { 180, 128, 10, 128 }; /* YUV components */
 488        unsigned char rv, gv, bv;       /* RGB components */
 489        int clipmask_index, bytes_per_pixel;
 490        int stretch_bytes, clipmask_add;
 491
 492        frame  = usbvision->cur_frame;
 493        f = frame->data + (frame->v4l2_linesize * frame->curline);
 494
 495        /* Make sure there's enough data for the entire line */
 496        len = (frame->isoc_header.frame_width * 2) + 5;
 497        if (scratch_len(usbvision) < len) {
 498                PDEBUG(DBG_PARSE, "out of data in line %d, need %u.\n", frame->curline, len);
 499                return parse_state_out;
 500        }
 501
 502        if ((frame->curline + 1) >= frame->frmheight)
 503                return parse_state_next_frame;
 504
 505        bytes_per_pixel = frame->v4l2_format.bytes_per_pixel;
 506        stretch_bytes = (usbvision->stretch_width - 1) * bytes_per_pixel;
 507        clipmask_index = frame->curline * MAX_FRAME_WIDTH;
 508        clipmask_add = usbvision->stretch_width;
 509
 510        for (i = 0; i < frame->frmwidth; i += (2 * usbvision->stretch_width)) {
 511                scratch_get(usbvision, &yuyv[0], 4);
 512
 513                if (frame->v4l2_format.format == V4L2_PIX_FMT_YUYV) {
 514                        *f++ = yuyv[0]; /* Y */
 515                        *f++ = yuyv[3]; /* U */
 516                } else {
 517                        YUV_TO_RGB_BY_THE_BOOK(yuyv[0], yuyv[1], yuyv[3], rv, gv, bv);
 518                        switch (frame->v4l2_format.format) {
 519                        case V4L2_PIX_FMT_RGB565:
 520                                *f++ = (0x1F & rv) |
 521                                        (0xE0 & (gv << 5));
 522                                *f++ = (0x07 & (gv >> 3)) |
 523                                        (0xF8 &  bv);
 524                                break;
 525                        case V4L2_PIX_FMT_RGB24:
 526                                *f++ = rv;
 527                                *f++ = gv;
 528                                *f++ = bv;
 529                                break;
 530                        case V4L2_PIX_FMT_RGB32:
 531                                *f++ = rv;
 532                                *f++ = gv;
 533                                *f++ = bv;
 534                                f++;
 535                                break;
 536                        case V4L2_PIX_FMT_RGB555:
 537                                *f++ = (0x1F & rv) |
 538                                        (0xE0 & (gv << 5));
 539                                *f++ = (0x03 & (gv >> 3)) |
 540                                        (0x7C & (bv << 2));
 541                                break;
 542                        }
 543                }
 544                clipmask_index += clipmask_add;
 545                f += stretch_bytes;
 546
 547                if (frame->v4l2_format.format == V4L2_PIX_FMT_YUYV) {
 548                        *f++ = yuyv[2]; /* Y */
 549                        *f++ = yuyv[1]; /* V */
 550                } else {
 551                        YUV_TO_RGB_BY_THE_BOOK(yuyv[2], yuyv[1], yuyv[3], rv, gv, bv);
 552                        switch (frame->v4l2_format.format) {
 553                        case V4L2_PIX_FMT_RGB565:
 554                                *f++ = (0x1F & rv) |
 555                                        (0xE0 & (gv << 5));
 556                                *f++ = (0x07 & (gv >> 3)) |
 557                                        (0xF8 &  bv);
 558                                break;
 559                        case V4L2_PIX_FMT_RGB24:
 560                                *f++ = rv;
 561                                *f++ = gv;
 562                                *f++ = bv;
 563                                break;
 564                        case V4L2_PIX_FMT_RGB32:
 565                                *f++ = rv;
 566                                *f++ = gv;
 567                                *f++ = bv;
 568                                f++;
 569                                break;
 570                        case V4L2_PIX_FMT_RGB555:
 571                                *f++ = (0x1F & rv) |
 572                                        (0xE0 & (gv << 5));
 573                                *f++ = (0x03 & (gv >> 3)) |
 574                                        (0x7C & (bv << 2));
 575                                break;
 576                        }
 577                }
 578                clipmask_index += clipmask_add;
 579                f += stretch_bytes;
 580        }
 581
 582        frame->curline += usbvision->stretch_height;
 583        *pcopylen += frame->v4l2_linesize * usbvision->stretch_height;
 584
 585        if (frame->curline >= frame->frmheight)
 586                return parse_state_next_frame;
 587        return parse_state_continue;
 588}
 589
 590/* The decompression routine  */
 591static int usbvision_decompress(struct usb_usbvision *usbvision, unsigned char *compressed,
 592                                                                unsigned char *decompressed, int *start_pos,
 593                                                                int *block_typestart_pos, int len)
 594{
 595        int rest_pixel, idx, pos, extra_pos, block_len, block_type_pos, block_type_len;
 596        unsigned char block_byte, block_code, block_type, block_type_byte, integrator;
 597
 598        integrator = 0;
 599        pos = *start_pos;
 600        block_type_pos = *block_typestart_pos;
 601        extra_pos = pos;
 602        block_len = 0;
 603        block_byte = 0;
 604        block_code = 0;
 605        block_type = 0;
 606        block_type_byte = 0;
 607        block_type_len = 0;
 608        rest_pixel = len;
 609
 610        for (idx = 0; idx < len; idx++) {
 611                if (block_len == 0) {
 612                        if (block_type_len == 0) {
 613                                block_type_byte = compressed[block_type_pos];
 614                                block_type_pos++;
 615                                block_type_len = 4;
 616                        }
 617                        block_type = (block_type_byte & 0xC0) >> 6;
 618
 619                        /* statistic: */
 620                        usbvision->compr_block_types[block_type]++;
 621
 622                        pos = extra_pos;
 623                        if (block_type == 0) {
 624                                if (rest_pixel >= 24) {
 625                                        idx += 23;
 626                                        rest_pixel -= 24;
 627                                        integrator = decompressed[idx];
 628                                } else {
 629                                        idx += rest_pixel - 1;
 630                                        rest_pixel = 0;
 631                                }
 632                        } else {
 633                                block_code = compressed[pos];
 634                                pos++;
 635                                if (rest_pixel >= 24)
 636                                        block_len  = 24;
 637                                else
 638                                        block_len = rest_pixel;
 639                                rest_pixel -= block_len;
 640                                extra_pos = pos + (block_len / 4);
 641                        }
 642                        block_type_byte <<= 2;
 643                        block_type_len -= 1;
 644                }
 645                if (block_len > 0) {
 646                        if ((block_len % 4) == 0) {
 647                                block_byte = compressed[pos];
 648                                pos++;
 649                        }
 650                        if (block_type == 1) /* inter Block */
 651                                integrator = decompressed[idx];
 652                        switch (block_byte & 0xC0) {
 653                        case 0x03 << 6:
 654                                integrator += compressed[extra_pos];
 655                                extra_pos++;
 656                                break;
 657                        case 0x02 << 6:
 658                                integrator += block_code;
 659                                break;
 660                        case 0x00:
 661                                integrator -= block_code;
 662                                break;
 663                        }
 664                        decompressed[idx] = integrator;
 665                        block_byte <<= 2;
 666                        block_len -= 1;
 667                }
 668        }
 669        *start_pos = extra_pos;
 670        *block_typestart_pos = block_type_pos;
 671        return idx;
 672}
 673
 674
 675/*
 676 * usbvision_parse_compress()
 677 *
 678 * Parse compressed frame from the scratch buffer, put
 679 * decoded RGB value into the current frame buffer and add the written
 680 * number of bytes (RGB) to the *pcopylen.
 681 *
 682 */
 683static enum parse_state usbvision_parse_compress(struct usb_usbvision *usbvision,
 684                                           long *pcopylen)
 685{
 686#define USBVISION_STRIP_MAGIC           0x5A
 687#define USBVISION_STRIP_LEN_MAX         400
 688#define USBVISION_STRIP_HEADER_LEN      3
 689
 690        struct usbvision_frame *frame;
 691        unsigned char *f, *u = NULL, *v = NULL;
 692        unsigned char strip_data[USBVISION_STRIP_LEN_MAX];
 693        unsigned char strip_header[USBVISION_STRIP_HEADER_LEN];
 694        int idx, idx_end, strip_len, strip_ptr, startblock_pos, block_pos, block_type_pos;
 695        int clipmask_index;
 696        int image_size;
 697        unsigned char rv, gv, bv;
 698        static unsigned char *Y, *U, *V;
 699
 700        frame = usbvision->cur_frame;
 701        image_size = frame->frmwidth * frame->frmheight;
 702        if ((frame->v4l2_format.format == V4L2_PIX_FMT_YUV422P) ||
 703            (frame->v4l2_format.format == V4L2_PIX_FMT_YVU420)) {       /* this is a planar format */
 704                /* ... v4l2_linesize not used here. */
 705                f = frame->data + (frame->width * frame->curline);
 706        } else
 707                f = frame->data + (frame->v4l2_linesize * frame->curline);
 708
 709        if (frame->v4l2_format.format == V4L2_PIX_FMT_YUYV) { /* initialise u and v pointers */
 710                /* get base of u and b planes add halfoffset */
 711                u = frame->data
 712                        + image_size
 713                        + (frame->frmwidth >> 1) * frame->curline;
 714                v = u + (image_size >> 1);
 715        } else if (frame->v4l2_format.format == V4L2_PIX_FMT_YVU420) {
 716                v = frame->data + image_size + ((frame->curline * (frame->width)) >> 2);
 717                u = v + (image_size >> 2);
 718        }
 719
 720        if (frame->curline == 0)
 721                usbvision_adjust_compression(usbvision);
 722
 723        if (scratch_len(usbvision) < USBVISION_STRIP_HEADER_LEN)
 724                return parse_state_out;
 725
 726        /* get strip header without changing the scratch_read_ptr */
 727        scratch_set_extra_ptr(usbvision, &strip_ptr, 0);
 728        scratch_get_extra(usbvision, &strip_header[0], &strip_ptr,
 729                                USBVISION_STRIP_HEADER_LEN);
 730
 731        if (strip_header[0] != USBVISION_STRIP_MAGIC) {
 732                /* wrong strip magic */
 733                usbvision->strip_magic_errors++;
 734                return parse_state_next_frame;
 735        }
 736
 737        if (frame->curline != (int)strip_header[2]) {
 738                /* line number mismatch error */
 739                usbvision->strip_line_number_errors++;
 740        }
 741
 742        strip_len = 2 * (unsigned int)strip_header[1];
 743        if (strip_len > USBVISION_STRIP_LEN_MAX) {
 744                /* strip overrun */
 745                /* I think this never happens */
 746                usbvision_request_intra(usbvision);
 747        }
 748
 749        if (scratch_len(usbvision) < strip_len) {
 750                /* there is not enough data for the strip */
 751                return parse_state_out;
 752        }
 753
 754        if (usbvision->intra_frame_buffer) {
 755                Y = usbvision->intra_frame_buffer + frame->frmwidth * frame->curline;
 756                U = usbvision->intra_frame_buffer + image_size + (frame->frmwidth / 2) * (frame->curline / 2);
 757                V = usbvision->intra_frame_buffer + image_size / 4 * 5 + (frame->frmwidth / 2) * (frame->curline / 2);
 758        } else {
 759                return parse_state_next_frame;
 760        }
 761
 762        clipmask_index = frame->curline * MAX_FRAME_WIDTH;
 763
 764        scratch_get(usbvision, strip_data, strip_len);
 765
 766        idx_end = frame->frmwidth;
 767        block_type_pos = USBVISION_STRIP_HEADER_LEN;
 768        startblock_pos = block_type_pos + (idx_end - 1) / 96 + (idx_end / 2 - 1) / 96 + 2;
 769        block_pos = startblock_pos;
 770
 771        usbvision->block_pos = block_pos;
 772
 773        usbvision_decompress(usbvision, strip_data, Y, &block_pos, &block_type_pos, idx_end);
 774        if (strip_len > usbvision->max_strip_len)
 775                usbvision->max_strip_len = strip_len;
 776
 777        if (frame->curline % 2)
 778                usbvision_decompress(usbvision, strip_data, V, &block_pos, &block_type_pos, idx_end / 2);
 779        else
 780                usbvision_decompress(usbvision, strip_data, U, &block_pos, &block_type_pos, idx_end / 2);
 781
 782        if (block_pos > usbvision->comprblock_pos)
 783                usbvision->comprblock_pos = block_pos;
 784        if (block_pos > strip_len)
 785                usbvision->strip_len_errors++;
 786
 787        for (idx = 0; idx < idx_end; idx++) {
 788                if (frame->v4l2_format.format == V4L2_PIX_FMT_YUYV) {
 789                        *f++ = Y[idx];
 790                        *f++ = idx & 0x01 ? U[idx / 2] : V[idx / 2];
 791                } else if (frame->v4l2_format.format == V4L2_PIX_FMT_YUV422P) {
 792                        *f++ = Y[idx];
 793                        if (idx & 0x01)
 794                                *u++ = U[idx >> 1];
 795                        else
 796                                *v++ = V[idx >> 1];
 797                } else if (frame->v4l2_format.format == V4L2_PIX_FMT_YVU420) {
 798                        *f++ = Y[idx];
 799                        if (!((idx & 0x01) | (frame->curline & 0x01))) {
 800                                /* only need do this for 1 in 4 pixels */
 801                                /* intraframe buffer is YUV420 format */
 802                                *u++ = U[idx >> 1];
 803                                *v++ = V[idx >> 1];
 804                        }
 805                } else {
 806                        YUV_TO_RGB_BY_THE_BOOK(Y[idx], U[idx / 2], V[idx / 2], rv, gv, bv);
 807                        switch (frame->v4l2_format.format) {
 808                        case V4L2_PIX_FMT_GREY:
 809                                *f++ = Y[idx];
 810                                break;
 811                        case V4L2_PIX_FMT_RGB555:
 812                                *f++ = (0x1F & rv) |
 813                                        (0xE0 & (gv << 5));
 814                                *f++ = (0x03 & (gv >> 3)) |
 815                                        (0x7C & (bv << 2));
 816                                break;
 817                        case V4L2_PIX_FMT_RGB565:
 818                                *f++ = (0x1F & rv) |
 819                                        (0xE0 & (gv << 5));
 820                                *f++ = (0x07 & (gv >> 3)) |
 821                                        (0xF8 & bv);
 822                                break;
 823                        case V4L2_PIX_FMT_RGB24:
 824                                *f++ = rv;
 825                                *f++ = gv;
 826                                *f++ = bv;
 827                                break;
 828                        case V4L2_PIX_FMT_RGB32:
 829                                *f++ = rv;
 830                                *f++ = gv;
 831                                *f++ = bv;
 832                                f++;
 833                                break;
 834                        }
 835                }
 836                clipmask_index++;
 837        }
 838        /* Deal with non-integer no. of bytes for YUV420P */
 839        if (frame->v4l2_format.format != V4L2_PIX_FMT_YVU420)
 840                *pcopylen += frame->v4l2_linesize;
 841        else
 842                *pcopylen += frame->curline & 0x01 ? frame->v4l2_linesize : frame->v4l2_linesize << 1;
 843
 844        frame->curline += 1;
 845
 846        if (frame->curline >= frame->frmheight)
 847                return parse_state_next_frame;
 848        return parse_state_continue;
 849
 850}
 851
 852
 853/*
 854 * usbvision_parse_lines_420()
 855 *
 856 * Parse two lines from the scratch buffer, put
 857 * decoded RGB value into the current frame buffer and add the written
 858 * number of bytes (RGB) to the *pcopylen.
 859 *
 860 */
 861static enum parse_state usbvision_parse_lines_420(struct usb_usbvision *usbvision,
 862                                           long *pcopylen)
 863{
 864        struct usbvision_frame *frame;
 865        unsigned char *f_even = NULL, *f_odd = NULL;
 866        unsigned int pixel_per_line, block;
 867        int pixel, block_split;
 868        int y_ptr, u_ptr, v_ptr, y_odd_offset;
 869        const int y_block_size = 128;
 870        const int uv_block_size = 64;
 871        const int sub_block_size = 32;
 872        const int y_step[] = { 0, 0, 0, 2 }, y_step_size = 4;
 873        const int uv_step[] = { 0, 0, 0, 4 }, uv_step_size = 4;
 874        unsigned char y[2], u, v;       /* YUV components */
 875        int y_, u_, v_, vb, uvg, ur;
 876        int r_, g_, b_;                 /* RGB components */
 877        unsigned char g;
 878        int clipmask_even_index, clipmask_odd_index, bytes_per_pixel;
 879        int clipmask_add, stretch_bytes;
 880
 881        frame  = usbvision->cur_frame;
 882        f_even = frame->data + (frame->v4l2_linesize * frame->curline);
 883        f_odd  = f_even + frame->v4l2_linesize * usbvision->stretch_height;
 884
 885        /* Make sure there's enough data for the entire line */
 886        /* In this mode usbvision transfer 3 bytes for every 2 pixels */
 887        /* I need two lines to decode the color */
 888        bytes_per_pixel = frame->v4l2_format.bytes_per_pixel;
 889        stretch_bytes = (usbvision->stretch_width - 1) * bytes_per_pixel;
 890        clipmask_even_index = frame->curline * MAX_FRAME_WIDTH;
 891        clipmask_odd_index  = clipmask_even_index + MAX_FRAME_WIDTH;
 892        clipmask_add = usbvision->stretch_width;
 893        pixel_per_line = frame->isoc_header.frame_width;
 894
 895        if (scratch_len(usbvision) < (int)pixel_per_line * 3) {
 896                /* printk(KERN_DEBUG "out of data, need %d\n", len); */
 897                return parse_state_out;
 898        }
 899
 900        if ((frame->curline + 1) >= frame->frmheight)
 901                return parse_state_next_frame;
 902
 903        block_split = (pixel_per_line%y_block_size) ? 1 : 0;    /* are some blocks splitted into different lines? */
 904
 905        y_odd_offset = (pixel_per_line / y_block_size) * (y_block_size + uv_block_size)
 906                        + block_split * uv_block_size;
 907
 908        scratch_set_extra_ptr(usbvision, &y_ptr, y_odd_offset);
 909        scratch_set_extra_ptr(usbvision, &u_ptr, y_block_size);
 910        scratch_set_extra_ptr(usbvision, &v_ptr, y_odd_offset
 911                        + (4 - block_split) * sub_block_size);
 912
 913        for (block = 0; block < (pixel_per_line / sub_block_size); block++) {
 914                for (pixel = 0; pixel < sub_block_size; pixel += 2) {
 915                        scratch_get(usbvision, &y[0], 2);
 916                        scratch_get_extra(usbvision, &u, &u_ptr, 1);
 917                        scratch_get_extra(usbvision, &v, &v_ptr, 1);
 918
 919                        /* I don't use the YUV_TO_RGB macro for better performance */
 920                        v_ = v - 128;
 921                        u_ = u - 128;
 922                        vb = 132252 * v_;
 923                        uvg = -53281 * u_ - 25625 * v_;
 924                        ur = 104595 * u_;
 925
 926                        if (frame->v4l2_format.format == V4L2_PIX_FMT_YUYV) {
 927                                *f_even++ = y[0];
 928                                *f_even++ = v;
 929                        } else {
 930                                y_ = 76284 * (y[0] - 16);
 931
 932                                b_ = (y_ + vb) >> 16;
 933                                g_ = (y_ + uvg) >> 16;
 934                                r_ = (y_ + ur) >> 16;
 935
 936                                switch (frame->v4l2_format.format) {
 937                                case V4L2_PIX_FMT_RGB565:
 938                                        g = LIMIT_RGB(g_);
 939                                        *f_even++ =
 940                                                (0x1F & LIMIT_RGB(r_)) |
 941                                                (0xE0 & (g << 5));
 942                                        *f_even++ =
 943                                                (0x07 & (g >> 3)) |
 944                                                (0xF8 &  LIMIT_RGB(b_));
 945                                        break;
 946                                case V4L2_PIX_FMT_RGB24:
 947                                        *f_even++ = LIMIT_RGB(r_);
 948                                        *f_even++ = LIMIT_RGB(g_);
 949                                        *f_even++ = LIMIT_RGB(b_);
 950                                        break;
 951                                case V4L2_PIX_FMT_RGB32:
 952                                        *f_even++ = LIMIT_RGB(r_);
 953                                        *f_even++ = LIMIT_RGB(g_);
 954                                        *f_even++ = LIMIT_RGB(b_);
 955                                        f_even++;
 956                                        break;
 957                                case V4L2_PIX_FMT_RGB555:
 958                                        g = LIMIT_RGB(g_);
 959                                        *f_even++ = (0x1F & LIMIT_RGB(r_)) |
 960                                                (0xE0 & (g << 5));
 961                                        *f_even++ = (0x03 & (g >> 3)) |
 962                                                (0x7C & (LIMIT_RGB(b_) << 2));
 963                                        break;
 964                                }
 965                        }
 966                        clipmask_even_index += clipmask_add;
 967                        f_even += stretch_bytes;
 968
 969                        if (frame->v4l2_format.format == V4L2_PIX_FMT_YUYV) {
 970                                *f_even++ = y[1];
 971                                *f_even++ = u;
 972                        } else {
 973                                y_ = 76284 * (y[1] - 16);
 974
 975                                b_ = (y_ + vb) >> 16;
 976                                g_ = (y_ + uvg) >> 16;
 977                                r_ = (y_ + ur) >> 16;
 978
 979                                switch (frame->v4l2_format.format) {
 980                                case V4L2_PIX_FMT_RGB565:
 981                                        g = LIMIT_RGB(g_);
 982                                        *f_even++ =
 983                                                (0x1F & LIMIT_RGB(r_)) |
 984                                                (0xE0 & (g << 5));
 985                                        *f_even++ =
 986                                                (0x07 & (g >> 3)) |
 987                                                (0xF8 &  LIMIT_RGB(b_));
 988                                        break;
 989                                case V4L2_PIX_FMT_RGB24:
 990                                        *f_even++ = LIMIT_RGB(r_);
 991                                        *f_even++ = LIMIT_RGB(g_);
 992                                        *f_even++ = LIMIT_RGB(b_);
 993                                        break;
 994                                case V4L2_PIX_FMT_RGB32:
 995                                        *f_even++ = LIMIT_RGB(r_);
 996                                        *f_even++ = LIMIT_RGB(g_);
 997                                        *f_even++ = LIMIT_RGB(b_);
 998                                        f_even++;
 999                                        break;
1000                                case V4L2_PIX_FMT_RGB555:
1001                                        g = LIMIT_RGB(g_);
1002                                        *f_even++ = (0x1F & LIMIT_RGB(r_)) |
1003                                                (0xE0 & (g << 5));
1004                                        *f_even++ = (0x03 & (g >> 3)) |
1005                                                (0x7C & (LIMIT_RGB(b_) << 2));
1006                                        break;
1007                                }
1008                        }
1009                        clipmask_even_index += clipmask_add;
1010                        f_even += stretch_bytes;
1011
1012                        scratch_get_extra(usbvision, &y[0], &y_ptr, 2);
1013
1014                        if (frame->v4l2_format.format == V4L2_PIX_FMT_YUYV) {
1015                                *f_odd++ = y[0];
1016                                *f_odd++ = v;
1017                        } else {
1018                                y_ = 76284 * (y[0] - 16);
1019
1020                                b_ = (y_ + vb) >> 16;
1021                                g_ = (y_ + uvg) >> 16;
1022                                r_ = (y_ + ur) >> 16;
1023
1024                                switch (frame->v4l2_format.format) {
1025                                case V4L2_PIX_FMT_RGB565:
1026                                        g = LIMIT_RGB(g_);
1027                                        *f_odd++ =
1028                                                (0x1F & LIMIT_RGB(r_)) |
1029                                                (0xE0 & (g << 5));
1030                                        *f_odd++ =
1031                                                (0x07 & (g >> 3)) |
1032                                                (0xF8 &  LIMIT_RGB(b_));
1033                                        break;
1034                                case V4L2_PIX_FMT_RGB24:
1035                                        *f_odd++ = LIMIT_RGB(r_);
1036                                        *f_odd++ = LIMIT_RGB(g_);
1037                                        *f_odd++ = LIMIT_RGB(b_);
1038                                        break;
1039                                case V4L2_PIX_FMT_RGB32:
1040                                        *f_odd++ = LIMIT_RGB(r_);
1041                                        *f_odd++ = LIMIT_RGB(g_);
1042                                        *f_odd++ = LIMIT_RGB(b_);
1043                                        f_odd++;
1044                                        break;
1045                                case V4L2_PIX_FMT_RGB555:
1046                                        g = LIMIT_RGB(g_);
1047                                        *f_odd++ = (0x1F & LIMIT_RGB(r_)) |
1048                                                (0xE0 & (g << 5));
1049                                        *f_odd++ = (0x03 & (g >> 3)) |
1050                                                (0x7C & (LIMIT_RGB(b_) << 2));
1051                                        break;
1052                                }
1053                        }
1054                        clipmask_odd_index += clipmask_add;
1055                        f_odd += stretch_bytes;
1056
1057                        if (frame->v4l2_format.format == V4L2_PIX_FMT_YUYV) {
1058                                *f_odd++ = y[1];
1059                                *f_odd++ = u;
1060                        } else {
1061                                y_ = 76284 * (y[1] - 16);
1062
1063                                b_ = (y_ + vb) >> 16;
1064                                g_ = (y_ + uvg) >> 16;
1065                                r_ = (y_ + ur) >> 16;
1066
1067                                switch (frame->v4l2_format.format) {
1068                                case V4L2_PIX_FMT_RGB565:
1069                                        g = LIMIT_RGB(g_);
1070                                        *f_odd++ =
1071                                                (0x1F & LIMIT_RGB(r_)) |
1072                                                (0xE0 & (g << 5));
1073                                        *f_odd++ =
1074                                                (0x07 & (g >> 3)) |
1075                                                (0xF8 &  LIMIT_RGB(b_));
1076                                        break;
1077                                case V4L2_PIX_FMT_RGB24:
1078                                        *f_odd++ = LIMIT_RGB(r_);
1079                                        *f_odd++ = LIMIT_RGB(g_);
1080                                        *f_odd++ = LIMIT_RGB(b_);
1081                                        break;
1082                                case V4L2_PIX_FMT_RGB32:
1083                                        *f_odd++ = LIMIT_RGB(r_);
1084                                        *f_odd++ = LIMIT_RGB(g_);
1085                                        *f_odd++ = LIMIT_RGB(b_);
1086                                        f_odd++;
1087                                        break;
1088                                case V4L2_PIX_FMT_RGB555:
1089                                        g = LIMIT_RGB(g_);
1090                                        *f_odd++ = (0x1F & LIMIT_RGB(r_)) |
1091                                                (0xE0 & (g << 5));
1092                                        *f_odd++ = (0x03 & (g >> 3)) |
1093                                                (0x7C & (LIMIT_RGB(b_) << 2));
1094                                        break;
1095                                }
1096                        }
1097                        clipmask_odd_index += clipmask_add;
1098                        f_odd += stretch_bytes;
1099                }
1100
1101                scratch_rm_old(usbvision, y_step[block % y_step_size] * sub_block_size);
1102                scratch_inc_extra_ptr(&y_ptr, y_step[(block + 2 * block_split) % y_step_size]
1103                                * sub_block_size);
1104                scratch_inc_extra_ptr(&u_ptr, uv_step[block % uv_step_size]
1105                                * sub_block_size);
1106                scratch_inc_extra_ptr(&v_ptr, uv_step[(block + 2 * block_split) % uv_step_size]
1107                                * sub_block_size);
1108        }
1109
1110        scratch_rm_old(usbvision, pixel_per_line * 3 / 2
1111                        + block_split * sub_block_size);
1112
1113        frame->curline += 2 * usbvision->stretch_height;
1114        *pcopylen += frame->v4l2_linesize * 2 * usbvision->stretch_height;
1115
1116        if (frame->curline >= frame->frmheight)
1117                return parse_state_next_frame;
1118        return parse_state_continue;
1119}
1120
1121/*
1122 * usbvision_parse_data()
1123 *
1124 * Generic routine to parse the scratch buffer. It employs either
1125 * usbvision_find_header() or usbvision_parse_lines() to do most
1126 * of work.
1127 *
1128 */
1129static void usbvision_parse_data(struct usb_usbvision *usbvision)
1130{
1131        struct usbvision_frame *frame;
1132        enum parse_state newstate;
1133        long copylen = 0;
1134        unsigned long lock_flags;
1135
1136        frame = usbvision->cur_frame;
1137
1138        PDEBUG(DBG_PARSE, "parsing len=%d\n", scratch_len(usbvision));
1139
1140        while (1) {
1141                newstate = parse_state_out;
1142                if (scratch_len(usbvision)) {
1143                        if (frame->scanstate == scan_state_scanning) {
1144                                newstate = usbvision_find_header(usbvision);
1145                        } else if (frame->scanstate == scan_state_lines) {
1146                                if (usbvision->isoc_mode == ISOC_MODE_YUV420)
1147                                        newstate = usbvision_parse_lines_420(usbvision, &copylen);
1148                                else if (usbvision->isoc_mode == ISOC_MODE_YUV422)
1149                                        newstate = usbvision_parse_lines_422(usbvision, &copylen);
1150                                else if (usbvision->isoc_mode == ISOC_MODE_COMPRESS)
1151                                        newstate = usbvision_parse_compress(usbvision, &copylen);
1152                        }
1153                }
1154                if (newstate == parse_state_continue)
1155                        continue;
1156                if ((newstate == parse_state_next_frame) || (newstate == parse_state_out))
1157                        break;
1158                return; /* parse_state_end_parse */
1159        }
1160
1161        if (newstate == parse_state_next_frame) {
1162                frame->grabstate = frame_state_done;
1163                v4l2_get_timestamp(&(frame->timestamp));
1164                frame->sequence = usbvision->frame_num;
1165
1166                spin_lock_irqsave(&usbvision->queue_lock, lock_flags);
1167                list_move_tail(&(frame->frame), &usbvision->outqueue);
1168                usbvision->cur_frame = NULL;
1169                spin_unlock_irqrestore(&usbvision->queue_lock, lock_flags);
1170
1171                usbvision->frame_num++;
1172
1173                /* This will cause the process to request another frame. */
1174                if (waitqueue_active(&usbvision->wait_frame)) {
1175                        PDEBUG(DBG_PARSE, "Wake up !");
1176                        wake_up_interruptible(&usbvision->wait_frame);
1177                }
1178        } else {
1179                frame->grabstate = frame_state_grabbing;
1180        }
1181
1182        /* Update the frame's uncompressed length. */
1183        frame->scanlength += copylen;
1184}
1185
1186
1187/*
1188 * Make all of the blocks of data contiguous
1189 */
1190static int usbvision_compress_isochronous(struct usb_usbvision *usbvision,
1191                                          struct urb *urb)
1192{
1193        unsigned char *packet_data;
1194        int i, totlen = 0;
1195
1196        for (i = 0; i < urb->number_of_packets; i++) {
1197                int packet_len = urb->iso_frame_desc[i].actual_length;
1198                int packet_stat = urb->iso_frame_desc[i].status;
1199
1200                packet_data = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
1201
1202                /* Detect and ignore errored packets */
1203                if (packet_stat) {      /* packet_stat != 0 ????????????? */
1204                        PDEBUG(DBG_ISOC, "data error: [%d] len=%d, status=%X", i, packet_len, packet_stat);
1205                        usbvision->isoc_err_count++;
1206                        continue;
1207                }
1208
1209                /* Detect and ignore empty packets */
1210                if (packet_len < 0) {
1211                        PDEBUG(DBG_ISOC, "error packet [%d]", i);
1212                        usbvision->isoc_skip_count++;
1213                        continue;
1214                } else if (packet_len == 0) {   /* Frame end ????? */
1215                        PDEBUG(DBG_ISOC, "null packet [%d]", i);
1216                        usbvision->isocstate = isoc_state_no_frame;
1217                        usbvision->isoc_skip_count++;
1218                        continue;
1219                } else if (packet_len > usbvision->isoc_packet_size) {
1220                        PDEBUG(DBG_ISOC, "packet[%d] > isoc_packet_size", i);
1221                        usbvision->isoc_skip_count++;
1222                        continue;
1223                }
1224
1225                PDEBUG(DBG_ISOC, "packet ok [%d] len=%d", i, packet_len);
1226
1227                if (usbvision->isocstate == isoc_state_no_frame) { /* new frame begins */
1228                        usbvision->isocstate = isoc_state_in_frame;
1229                        scratch_mark_header(usbvision);
1230                        usbvision_measure_bandwidth(usbvision);
1231                        PDEBUG(DBG_ISOC, "packet with header");
1232                }
1233
1234                /*
1235                 * If usbvision continues to feed us with data but there is no
1236                 * consumption (if, for example, V4L client fell asleep) we
1237                 * may overflow the buffer. We have to move old data over to
1238                 * free room for new data. This is bad for old data. If we
1239                 * just drop new data then it's bad for new data... choose
1240                 * your favorite evil here.
1241                 */
1242                if (scratch_free(usbvision) < packet_len) {
1243                        usbvision->scratch_ovf_count++;
1244                        PDEBUG(DBG_ISOC, "scratch buf overflow! scr_len: %d, n: %d",
1245                               scratch_len(usbvision), packet_len);
1246                        scratch_rm_old(usbvision, packet_len - scratch_free(usbvision));
1247                }
1248
1249                /* Now we know that there is enough room in scratch buffer */
1250                scratch_put(usbvision, packet_data, packet_len);
1251                totlen += packet_len;
1252                usbvision->isoc_data_count += packet_len;
1253                usbvision->isoc_packet_count++;
1254        }
1255#if ENABLE_HEXDUMP
1256        if (totlen > 0) {
1257                static int foo;
1258
1259                if (foo < 1) {
1260                        printk(KERN_DEBUG "+%d.\n", usbvision->scratchlen);
1261                        usbvision_hexdump(data0, (totlen > 64) ? 64 : totlen);
1262                        ++foo;
1263                }
1264        }
1265#endif
1266        return totlen;
1267}
1268
1269static void usbvision_isoc_irq(struct urb *urb)
1270{
1271        int err_code = 0;
1272        int len;
1273        struct usb_usbvision *usbvision = urb->context;
1274        int i;
1275        unsigned long start_time = jiffies;
1276        struct usbvision_frame **f;
1277
1278        /* We don't want to do anything if we are about to be removed! */
1279        if (!USBVISION_IS_OPERATIONAL(usbvision))
1280                return;
1281
1282        /* any urb with wrong status is ignored without acknowledgement */
1283        if (urb->status == -ENOENT)
1284                return;
1285
1286        f = &usbvision->cur_frame;
1287
1288        /* Manage streaming interruption */
1289        if (usbvision->streaming == stream_interrupt) {
1290                usbvision->streaming = stream_idle;
1291                if ((*f)) {
1292                        (*f)->grabstate = frame_state_ready;
1293                        (*f)->scanstate = scan_state_scanning;
1294                }
1295                PDEBUG(DBG_IRQ, "stream interrupted");
1296                wake_up_interruptible(&usbvision->wait_stream);
1297        }
1298
1299        /* Copy the data received into our scratch buffer */
1300        len = usbvision_compress_isochronous(usbvision, urb);
1301
1302        usbvision->isoc_urb_count++;
1303        usbvision->urb_length = len;
1304
1305        if (usbvision->streaming == stream_on) {
1306                /* If we collected enough data let's parse! */
1307                if (scratch_len(usbvision) > USBVISION_HEADER_LENGTH &&
1308                    !list_empty(&(usbvision->inqueue))) {
1309                        if (!(*f)) {
1310                                (*f) = list_entry(usbvision->inqueue.next,
1311                                                  struct usbvision_frame,
1312                                                  frame);
1313                        }
1314                        usbvision_parse_data(usbvision);
1315                } else {
1316                        /* If we don't have a frame
1317                          we're current working on, complain */
1318                        PDEBUG(DBG_IRQ,
1319                               "received data, but no one needs it");
1320                        scratch_reset(usbvision);
1321                }
1322        } else {
1323                PDEBUG(DBG_IRQ, "received data, but no one needs it");
1324                scratch_reset(usbvision);
1325        }
1326
1327        usbvision->time_in_irq += jiffies - start_time;
1328
1329        for (i = 0; i < USBVISION_URB_FRAMES; i++) {
1330                urb->iso_frame_desc[i].status = 0;
1331                urb->iso_frame_desc[i].actual_length = 0;
1332        }
1333
1334        urb->status = 0;
1335        urb->dev = usbvision->dev;
1336        err_code = usb_submit_urb(urb, GFP_ATOMIC);
1337
1338        if (err_code) {
1339                dev_err(&usbvision->dev->dev,
1340                        "%s: usb_submit_urb failed: error %d\n",
1341                                __func__, err_code);
1342        }
1343
1344        return;
1345}
1346
1347/*************************************/
1348/* Low level usbvision access functions */
1349/*************************************/
1350
1351/*
1352 * usbvision_read_reg()
1353 *
1354 * return  < 0 -> Error
1355 *        >= 0 -> Data
1356 */
1357
1358int usbvision_read_reg(struct usb_usbvision *usbvision, unsigned char reg)
1359{
1360        int err_code = 0;
1361        unsigned char *buffer = usbvision->ctrl_urb_buffer;
1362
1363        if (!USBVISION_IS_OPERATIONAL(usbvision))
1364                return -1;
1365
1366        err_code = usb_control_msg(usbvision->dev, usb_rcvctrlpipe(usbvision->dev, 1),
1367                                USBVISION_OP_CODE,
1368                                USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_ENDPOINT,
1369                                0, (__u16) reg, buffer, 1, HZ);
1370
1371        if (err_code < 0) {
1372                dev_err(&usbvision->dev->dev,
1373                        "%s: failed: error %d\n", __func__, err_code);
1374                return err_code;
1375        }
1376        return buffer[0];
1377}
1378
1379/*
1380 * usbvision_write_reg()
1381 *
1382 * return 1 -> Reg written
1383 *        0 -> usbvision is not yet ready
1384 *       -1 -> Something went wrong
1385 */
1386
1387int usbvision_write_reg(struct usb_usbvision *usbvision, unsigned char reg,
1388                            unsigned char value)
1389{
1390        int err_code = 0;
1391
1392        if (!USBVISION_IS_OPERATIONAL(usbvision))
1393                return 0;
1394
1395        usbvision->ctrl_urb_buffer[0] = value;
1396        err_code = usb_control_msg(usbvision->dev, usb_sndctrlpipe(usbvision->dev, 1),
1397                                USBVISION_OP_CODE,
1398                                USB_DIR_OUT | USB_TYPE_VENDOR |
1399                                USB_RECIP_ENDPOINT, 0, (__u16) reg,
1400                                usbvision->ctrl_urb_buffer, 1, HZ);
1401
1402        if (err_code < 0) {
1403                dev_err(&usbvision->dev->dev,
1404                        "%s: failed: error %d\n", __func__, err_code);
1405        }
1406        return err_code;
1407}
1408
1409
1410static void usbvision_ctrl_urb_complete(struct urb *urb)
1411{
1412        struct usb_usbvision *usbvision = (struct usb_usbvision *)urb->context;
1413
1414        PDEBUG(DBG_IRQ, "");
1415        usbvision->ctrl_urb_busy = 0;
1416}
1417
1418
1419static int usbvision_write_reg_irq(struct usb_usbvision *usbvision, int address,
1420                                unsigned char *data, int len)
1421{
1422        int err_code = 0;
1423
1424        PDEBUG(DBG_IRQ, "");
1425        if (len > 8)
1426                return -EFAULT;
1427        if (usbvision->ctrl_urb_busy)
1428                return -EBUSY;
1429        usbvision->ctrl_urb_busy = 1;
1430
1431        usbvision->ctrl_urb_setup.bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_ENDPOINT;
1432        usbvision->ctrl_urb_setup.bRequest     = USBVISION_OP_CODE;
1433        usbvision->ctrl_urb_setup.wValue       = 0;
1434        usbvision->ctrl_urb_setup.wIndex       = cpu_to_le16(address);
1435        usbvision->ctrl_urb_setup.wLength      = cpu_to_le16(len);
1436        usb_fill_control_urb(usbvision->ctrl_urb, usbvision->dev,
1437                                                        usb_sndctrlpipe(usbvision->dev, 1),
1438                                                        (unsigned char *)&usbvision->ctrl_urb_setup,
1439                                                        (void *)usbvision->ctrl_urb_buffer, len,
1440                                                        usbvision_ctrl_urb_complete,
1441                                                        (void *)usbvision);
1442
1443        memcpy(usbvision->ctrl_urb_buffer, data, len);
1444
1445        err_code = usb_submit_urb(usbvision->ctrl_urb, GFP_ATOMIC);
1446        if (err_code < 0) {
1447                /* error in usb_submit_urb() */
1448                usbvision->ctrl_urb_busy = 0;
1449        }
1450        PDEBUG(DBG_IRQ, "submit %d byte: error %d", len, err_code);
1451        return err_code;
1452}
1453
1454
1455static int usbvision_init_compression(struct usb_usbvision *usbvision)
1456{
1457        usbvision->last_isoc_frame_num = -1;
1458        usbvision->isoc_data_count = 0;
1459        usbvision->isoc_packet_count = 0;
1460        usbvision->isoc_skip_count = 0;
1461        usbvision->compr_level = 50;
1462        usbvision->last_compr_level = -1;
1463        usbvision->isoc_urb_count = 0;
1464        usbvision->request_intra = 1;
1465        usbvision->isoc_measure_bandwidth_count = 0;
1466
1467        return 0;
1468}
1469
1470/* this function measures the used bandwidth since last call
1471 * return:    0 : no error
1472 * sets used_bandwidth to 1-100 : 1-100% of full bandwidth resp. to isoc_packet_size
1473 */
1474static int usbvision_measure_bandwidth(struct usb_usbvision *usbvision)
1475{
1476        if (usbvision->isoc_measure_bandwidth_count < 2) { /* this gives an average bandwidth of 3 frames */
1477                usbvision->isoc_measure_bandwidth_count++;
1478                return 0;
1479        }
1480        if ((usbvision->isoc_packet_size > 0) && (usbvision->isoc_packet_count > 0)) {
1481                usbvision->used_bandwidth = usbvision->isoc_data_count /
1482                                        (usbvision->isoc_packet_count + usbvision->isoc_skip_count) *
1483                                        100 / usbvision->isoc_packet_size;
1484        }
1485        usbvision->isoc_measure_bandwidth_count = 0;
1486        usbvision->isoc_data_count = 0;
1487        usbvision->isoc_packet_count = 0;
1488        usbvision->isoc_skip_count = 0;
1489        return 0;
1490}
1491
1492static int usbvision_adjust_compression(struct usb_usbvision *usbvision)
1493{
1494        int err_code = 0;
1495        unsigned char buffer[6];
1496
1497        PDEBUG(DBG_IRQ, "");
1498        if ((adjust_compression) && (usbvision->used_bandwidth > 0)) {
1499                usbvision->compr_level += (usbvision->used_bandwidth - 90) / 2;
1500                RESTRICT_TO_RANGE(usbvision->compr_level, 0, 100);
1501                if (usbvision->compr_level != usbvision->last_compr_level) {
1502                        int distortion;
1503
1504                        if (usbvision->bridge_type == BRIDGE_NT1004 || usbvision->bridge_type == BRIDGE_NT1005) {
1505                                buffer[0] = (unsigned char)(4 + 16 * usbvision->compr_level / 100);     /* PCM Threshold 1 */
1506                                buffer[1] = (unsigned char)(4 + 8 * usbvision->compr_level / 100);      /* PCM Threshold 2 */
1507                                distortion = 7 + 248 * usbvision->compr_level / 100;
1508                                buffer[2] = (unsigned char)(distortion & 0xFF);                         /* Average distortion Threshold (inter) */
1509                                buffer[3] = (unsigned char)(distortion & 0xFF);                         /* Average distortion Threshold (intra) */
1510                                distortion = 1 + 42 * usbvision->compr_level / 100;
1511                                buffer[4] = (unsigned char)(distortion & 0xFF);                         /* Maximum distortion Threshold (inter) */
1512                                buffer[5] = (unsigned char)(distortion & 0xFF);                         /* Maximum distortion Threshold (intra) */
1513                        } else { /* BRIDGE_NT1003 */
1514                                buffer[0] = (unsigned char)(4 + 16 * usbvision->compr_level / 100);     /* PCM threshold 1 */
1515                                buffer[1] = (unsigned char)(4 + 8 * usbvision->compr_level / 100);      /* PCM threshold 2 */
1516                                distortion = 2 + 253 * usbvision->compr_level / 100;
1517                                buffer[2] = (unsigned char)(distortion & 0xFF);                         /* distortion threshold bit0-7 */
1518                                buffer[3] = 0;  /* (unsigned char)((distortion >> 8) & 0x0F);           distortion threshold bit 8-11 */
1519                                distortion = 0 + 43 * usbvision->compr_level / 100;
1520                                buffer[4] = (unsigned char)(distortion & 0xFF);                         /* maximum distortion bit0-7 */
1521                                buffer[5] = 0; /* (unsigned char)((distortion >> 8) & 0x01);            maximum distortion bit 8 */
1522                        }
1523                        err_code = usbvision_write_reg_irq(usbvision, USBVISION_PCM_THR1, buffer, 6);
1524                        if (err_code == 0) {
1525                                PDEBUG(DBG_IRQ, "new compr params %#02x %#02x %#02x %#02x %#02x %#02x", buffer[0],
1526                                                                buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);
1527                                usbvision->last_compr_level = usbvision->compr_level;
1528                        }
1529                }
1530        }
1531        return err_code;
1532}
1533
1534static int usbvision_request_intra(struct usb_usbvision *usbvision)
1535{
1536        unsigned char buffer[1];
1537
1538        PDEBUG(DBG_IRQ, "");
1539        usbvision->request_intra = 1;
1540        buffer[0] = 1;
1541        usbvision_write_reg_irq(usbvision, USBVISION_FORCE_INTRA, buffer, 1);
1542        return 0;
1543}
1544
1545static int usbvision_unrequest_intra(struct usb_usbvision *usbvision)
1546{
1547        unsigned char buffer[1];
1548
1549        PDEBUG(DBG_IRQ, "");
1550        usbvision->request_intra = 0;
1551        buffer[0] = 0;
1552        usbvision_write_reg_irq(usbvision, USBVISION_FORCE_INTRA, buffer, 1);
1553        return 0;
1554}
1555
1556/*******************************
1557 * usbvision utility functions
1558 *******************************/
1559
1560int usbvision_power_off(struct usb_usbvision *usbvision)
1561{
1562        int err_code = 0;
1563
1564        PDEBUG(DBG_FUNC, "");
1565
1566        err_code = usbvision_write_reg(usbvision, USBVISION_PWR_REG, USBVISION_SSPND_EN);
1567        if (err_code == 1)
1568                usbvision->power = 0;
1569        PDEBUG(DBG_FUNC, "%s: err_code %d", (err_code != 1) ? "ERROR" : "power is off", err_code);
1570        return err_code;
1571}
1572
1573/* configure webcam image sensor using the serial port */
1574static int usbvision_init_webcam(struct usb_usbvision *usbvision)
1575{
1576        int rc;
1577        int i;
1578        static char init_values[38][3] = {
1579                { 0x04, 0x12, 0x08 }, { 0x05, 0xff, 0xc8 }, { 0x06, 0x18, 0x07 }, { 0x07, 0x90, 0x00 },
1580                { 0x09, 0x00, 0x00 }, { 0x0a, 0x00, 0x00 }, { 0x0b, 0x08, 0x00 }, { 0x0d, 0xcc, 0xcc },
1581                { 0x0e, 0x13, 0x14 }, { 0x10, 0x9b, 0x83 }, { 0x11, 0x5a, 0x3f }, { 0x12, 0xe4, 0x73 },
1582                { 0x13, 0x88, 0x84 }, { 0x14, 0x89, 0x80 }, { 0x15, 0x00, 0x20 }, { 0x16, 0x00, 0x00 },
1583                { 0x17, 0xff, 0xa0 }, { 0x18, 0x6b, 0x20 }, { 0x19, 0x22, 0x40 }, { 0x1a, 0x10, 0x07 },
1584                { 0x1b, 0x00, 0x47 }, { 0x1c, 0x03, 0xe0 }, { 0x1d, 0x00, 0x00 }, { 0x1e, 0x00, 0x00 },
1585                { 0x1f, 0x00, 0x00 }, { 0x20, 0x00, 0x00 }, { 0x21, 0x00, 0x00 }, { 0x22, 0x00, 0x00 },
1586                { 0x23, 0x00, 0x00 }, { 0x24, 0x00, 0x00 }, { 0x25, 0x00, 0x00 }, { 0x26, 0x00, 0x00 },
1587                { 0x27, 0x00, 0x00 }, { 0x28, 0x00, 0x00 }, { 0x29, 0x00, 0x00 }, { 0x08, 0x80, 0x60 },
1588                { 0x0f, 0x2d, 0x24 }, { 0x0c, 0x80, 0x80 }
1589        };
1590        unsigned char *value = usbvision->ctrl_urb_buffer;
1591
1592        /* the only difference between PAL and NTSC init_values */
1593        if (usbvision_device_data[usbvision->dev_model].video_norm == V4L2_STD_NTSC)
1594                init_values[4][1] = 0x34;
1595
1596        for (i = 0; i < sizeof(init_values) / 3; i++) {
1597                usbvision_write_reg(usbvision, USBVISION_SER_MODE, USBVISION_SER_MODE_SOFT);
1598                memcpy(value, init_values[i], 3);
1599                rc = usb_control_msg(usbvision->dev,
1600                                     usb_sndctrlpipe(usbvision->dev, 1),
1601                                     USBVISION_OP_CODE,
1602                                     USB_DIR_OUT | USB_TYPE_VENDOR |
1603                                     USB_RECIP_ENDPOINT, 0,
1604                                     (__u16) USBVISION_SER_DAT1, value,
1605                                     3, HZ);
1606                if (rc < 0)
1607                        return rc;
1608                usbvision_write_reg(usbvision, USBVISION_SER_MODE, USBVISION_SER_MODE_SIO);
1609                /* write 3 bytes to the serial port using SIO mode */
1610                usbvision_write_reg(usbvision, USBVISION_SER_CONT, 3 | 0x10);
1611                usbvision_write_reg(usbvision, USBVISION_IOPIN_REG, 0);
1612                usbvision_write_reg(usbvision, USBVISION_SER_MODE, USBVISION_SER_MODE_SOFT);
1613                usbvision_write_reg(usbvision, USBVISION_IOPIN_REG, USBVISION_IO_2);
1614                usbvision_write_reg(usbvision, USBVISION_SER_MODE, USBVISION_SER_MODE_SOFT | USBVISION_CLK_OUT);
1615                usbvision_write_reg(usbvision, USBVISION_SER_MODE, USBVISION_SER_MODE_SOFT | USBVISION_DAT_IO);
1616                usbvision_write_reg(usbvision, USBVISION_SER_MODE, USBVISION_SER_MODE_SOFT | USBVISION_CLK_OUT | USBVISION_DAT_IO);
1617        }
1618
1619        return 0;
1620}
1621
1622/*
1623 * usbvision_set_video_format()
1624 *
1625 */
1626static int usbvision_set_video_format(struct usb_usbvision *usbvision, int format)
1627{
1628        static const char proc[] = "usbvision_set_video_format";
1629        unsigned char *value = usbvision->ctrl_urb_buffer;
1630        int rc;
1631
1632        if (!USBVISION_IS_OPERATIONAL(usbvision))
1633                return 0;
1634
1635        PDEBUG(DBG_FUNC, "isoc_mode %#02x", format);
1636
1637        if ((format != ISOC_MODE_YUV422)
1638            && (format != ISOC_MODE_YUV420)
1639            && (format != ISOC_MODE_COMPRESS)) {
1640                printk(KERN_ERR "usbvision: unknown video format %02x, using default YUV420",
1641                       format);
1642                format = ISOC_MODE_YUV420;
1643        }
1644        value[0] = 0x0A;  /* TODO: See the effect of the filter */
1645        value[1] = format; /* Sets the VO_MODE register which follows FILT_CONT */
1646        rc = usb_control_msg(usbvision->dev, usb_sndctrlpipe(usbvision->dev, 1),
1647                             USBVISION_OP_CODE,
1648                             USB_DIR_OUT | USB_TYPE_VENDOR |
1649                             USB_RECIP_ENDPOINT, 0,
1650                             (__u16) USBVISION_FILT_CONT, value, 2, HZ);
1651
1652        if (rc < 0) {
1653                printk(KERN_ERR "%s: ERROR=%d. USBVISION stopped - reconnect or reload driver.\n",
1654                       proc, rc);
1655        }
1656        usbvision->isoc_mode = format;
1657        return rc;
1658}
1659
1660/*
1661 * usbvision_set_output()
1662 *
1663 */
1664
1665int usbvision_set_output(struct usb_usbvision *usbvision, int width,
1666                         int height)
1667{
1668        int err_code = 0;
1669        int usb_width, usb_height;
1670        unsigned int frame_rate = 0, frame_drop = 0;
1671        unsigned char *value = usbvision->ctrl_urb_buffer;
1672
1673        if (!USBVISION_IS_OPERATIONAL(usbvision))
1674                return 0;
1675
1676        if (width > MAX_USB_WIDTH) {
1677                usb_width = width / 2;
1678                usbvision->stretch_width = 2;
1679        } else {
1680                usb_width = width;
1681                usbvision->stretch_width = 1;
1682        }
1683
1684        if (height > MAX_USB_HEIGHT) {
1685                usb_height = height / 2;
1686                usbvision->stretch_height = 2;
1687        } else {
1688                usb_height = height;
1689                usbvision->stretch_height = 1;
1690        }
1691
1692        RESTRICT_TO_RANGE(usb_width, MIN_FRAME_WIDTH, MAX_USB_WIDTH);
1693        usb_width &= ~(MIN_FRAME_WIDTH-1);
1694        RESTRICT_TO_RANGE(usb_height, MIN_FRAME_HEIGHT, MAX_USB_HEIGHT);
1695        usb_height &= ~(1);
1696
1697        PDEBUG(DBG_FUNC, "usb %dx%d; screen %dx%d; stretch %dx%d",
1698                                                usb_width, usb_height, width, height,
1699                                                usbvision->stretch_width, usbvision->stretch_height);
1700
1701        /* I'll not rewrite the same values */
1702        if ((usb_width != usbvision->curwidth) || (usb_height != usbvision->curheight)) {
1703                value[0] = usb_width & 0xff;            /* LSB */
1704                value[1] = (usb_width >> 8) & 0x03;     /* MSB */
1705                value[2] = usb_height & 0xff;           /* LSB */
1706                value[3] = (usb_height >> 8) & 0x03;    /* MSB */
1707
1708                err_code = usb_control_msg(usbvision->dev, usb_sndctrlpipe(usbvision->dev, 1),
1709                             USBVISION_OP_CODE,
1710                             USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_ENDPOINT,
1711                                 0, (__u16) USBVISION_LXSIZE_O, value, 4, HZ);
1712
1713                if (err_code < 0) {
1714                        dev_err(&usbvision->dev->dev,
1715                                "%s failed: error %d\n", __func__, err_code);
1716                        return err_code;
1717                }
1718                usbvision->curwidth = usbvision->stretch_width * usb_width;
1719                usbvision->curheight = usbvision->stretch_height * usb_height;
1720        }
1721
1722        if (usbvision->isoc_mode == ISOC_MODE_YUV422)
1723                frame_rate = (usbvision->isoc_packet_size * 1000) / (usb_width * usb_height * 2);
1724        else if (usbvision->isoc_mode == ISOC_MODE_YUV420)
1725                frame_rate = (usbvision->isoc_packet_size * 1000) / ((usb_width * usb_height * 12) / 8);
1726        else
1727                frame_rate = FRAMERATE_MAX;
1728
1729        if (usbvision->tvnorm_id & V4L2_STD_625_50)
1730                frame_drop = frame_rate * 32 / 25 - 1;
1731        else if (usbvision->tvnorm_id & V4L2_STD_525_60)
1732                frame_drop = frame_rate * 32 / 30 - 1;
1733
1734        RESTRICT_TO_RANGE(frame_drop, FRAMERATE_MIN, FRAMERATE_MAX);
1735
1736        PDEBUG(DBG_FUNC, "frame_rate %d fps, frame_drop %d", frame_rate, frame_drop);
1737
1738        frame_drop = FRAMERATE_MAX;     /* We can allow the maximum here, because dropping is controlled */
1739
1740        if (usbvision_device_data[usbvision->dev_model].codec == CODEC_WEBCAM) {
1741                if (usbvision_device_data[usbvision->dev_model].video_norm == V4L2_STD_PAL)
1742                        frame_drop = 25;
1743                else
1744                        frame_drop = 30;
1745        }
1746
1747        /* frame_drop = 7; => frame_phase = 1, 5, 9, 13, 17, 21, 25, 0, 4, 8, ...
1748                => frame_skip = 4;
1749                => frame_rate = (7 + 1) * 25 / 32 = 200 / 32 = 6.25;
1750
1751           frame_drop = 9; => frame_phase = 1, 5, 8, 11, 14, 17, 21, 24, 27, 1, 4, 8, ...
1752            => frame_skip = 4, 3, 3, 3, 3, 4, 3, 3, 3, 3, 4, ...
1753                => frame_rate = (9 + 1) * 25 / 32 = 250 / 32 = 7.8125;
1754        */
1755        err_code = usbvision_write_reg(usbvision, USBVISION_FRM_RATE, frame_drop);
1756        return err_code;
1757}
1758
1759
1760/*
1761 * usbvision_frames_alloc
1762 * allocate the required frames
1763 */
1764int usbvision_frames_alloc(struct usb_usbvision *usbvision, int number_of_frames)
1765{
1766        int i;
1767
1768        /* needs to be page aligned cause the buffers can be mapped individually! */
1769        usbvision->max_frame_size = PAGE_ALIGN(usbvision->curwidth *
1770                                                usbvision->curheight *
1771                                                usbvision->palette.bytes_per_pixel);
1772
1773        /* Try to do my best to allocate the frames the user want in the remaining memory */
1774        usbvision->num_frames = number_of_frames;
1775        while (usbvision->num_frames > 0) {
1776                usbvision->fbuf_size = usbvision->num_frames * usbvision->max_frame_size;
1777                usbvision->fbuf = usbvision_rvmalloc(usbvision->fbuf_size);
1778                if (usbvision->fbuf)
1779                        break;
1780                usbvision->num_frames--;
1781        }
1782
1783        /* Allocate all buffers */
1784        for (i = 0; i < usbvision->num_frames; i++) {
1785                usbvision->frame[i].index = i;
1786                usbvision->frame[i].grabstate = frame_state_unused;
1787                usbvision->frame[i].data = usbvision->fbuf +
1788                        i * usbvision->max_frame_size;
1789                /*
1790                 * Set default sizes for read operation.
1791                 */
1792                usbvision->stretch_width = 1;
1793                usbvision->stretch_height = 1;
1794                usbvision->frame[i].width = usbvision->curwidth;
1795                usbvision->frame[i].height = usbvision->curheight;
1796                usbvision->frame[i].bytes_read = 0;
1797        }
1798        PDEBUG(DBG_FUNC, "allocated %d frames (%d bytes per frame)",
1799                        usbvision->num_frames, usbvision->max_frame_size);
1800        return usbvision->num_frames;
1801}
1802
1803/*
1804 * usbvision_frames_free
1805 * frees memory allocated for the frames
1806 */
1807void usbvision_frames_free(struct usb_usbvision *usbvision)
1808{
1809        /* Have to free all that memory */
1810        PDEBUG(DBG_FUNC, "free %d frames", usbvision->num_frames);
1811
1812        if (usbvision->fbuf != NULL) {
1813                usbvision_rvfree(usbvision->fbuf, usbvision->fbuf_size);
1814                usbvision->fbuf = NULL;
1815
1816                usbvision->num_frames = 0;
1817        }
1818}
1819/*
1820 * usbvision_empty_framequeues()
1821 * prepare queues for incoming and outgoing frames
1822 */
1823void usbvision_empty_framequeues(struct usb_usbvision *usbvision)
1824{
1825        u32 i;
1826
1827        INIT_LIST_HEAD(&(usbvision->inqueue));
1828        INIT_LIST_HEAD(&(usbvision->outqueue));
1829
1830        for (i = 0; i < USBVISION_NUMFRAMES; i++) {
1831                usbvision->frame[i].grabstate = frame_state_unused;
1832                usbvision->frame[i].bytes_read = 0;
1833        }
1834}
1835
1836/*
1837 * usbvision_stream_interrupt()
1838 * stops streaming
1839 */
1840int usbvision_stream_interrupt(struct usb_usbvision *usbvision)
1841{
1842        int ret = 0;
1843
1844        /* stop reading from the device */
1845
1846        usbvision->streaming = stream_interrupt;
1847        ret = wait_event_timeout(usbvision->wait_stream,
1848                                 (usbvision->streaming == stream_idle),
1849                                 msecs_to_jiffies(USBVISION_NUMSBUF*USBVISION_URB_FRAMES));
1850        return ret;
1851}
1852
1853/*
1854 * usbvision_set_compress_params()
1855 *
1856 */
1857
1858static int usbvision_set_compress_params(struct usb_usbvision *usbvision)
1859{
1860        static const char proc[] = "usbvision_set_compresion_params: ";
1861        int rc;
1862        unsigned char *value = usbvision->ctrl_urb_buffer;
1863
1864        value[0] = 0x0F;    /* Intra-Compression cycle */
1865        value[1] = 0x01;    /* Reg.45 one line per strip */
1866        value[2] = 0x00;    /* Reg.46 Force intra mode on all new frames */
1867        value[3] = 0x00;    /* Reg.47 FORCE_UP <- 0 normal operation (not force) */
1868        value[4] = 0xA2;    /* Reg.48 BUF_THR I'm not sure if this does something in not compressed mode. */
1869        value[5] = 0x00;    /* Reg.49 DVI_YUV This has nothing to do with compression */
1870
1871        /* catched values for NT1004 */
1872        /* value[0] = 0xFF; Never apply intra mode automatically */
1873        /* value[1] = 0xF1; Use full frame height for virtual strip width; One line per strip */
1874        /* value[2] = 0x01; Force intra mode on all new frames */
1875        /* value[3] = 0x00; Strip size 400 Bytes; do not force up */
1876        /* value[4] = 0xA2; */
1877        if (!USBVISION_IS_OPERATIONAL(usbvision))
1878                return 0;
1879
1880        rc = usb_control_msg(usbvision->dev, usb_sndctrlpipe(usbvision->dev, 1),
1881                             USBVISION_OP_CODE,
1882                             USB_DIR_OUT | USB_TYPE_VENDOR |
1883                             USB_RECIP_ENDPOINT, 0,
1884                             (__u16) USBVISION_INTRA_CYC, value, 5, HZ);
1885
1886        if (rc < 0) {
1887                printk(KERN_ERR "%sERROR=%d. USBVISION stopped - reconnect or reload driver.\n",
1888                       proc, rc);
1889                return rc;
1890        }
1891
1892        if (usbvision->bridge_type == BRIDGE_NT1004) {
1893                value[0] =  20; /* PCM Threshold 1 */
1894                value[1] =  12; /* PCM Threshold 2 */
1895                value[2] = 255; /* Distortion Threshold inter */
1896                value[3] = 255; /* Distortion Threshold intra */
1897                value[4] =  43; /* Max Distortion inter */
1898                value[5] =  43; /* Max Distortion intra */
1899        } else {
1900                value[0] =  20; /* PCM Threshold 1 */
1901                value[1] =  12; /* PCM Threshold 2 */
1902                value[2] = 255; /* Distortion Threshold d7-d0 */
1903                value[3] =   0; /* Distortion Threshold d11-d8 */
1904                value[4] =  43; /* Max Distortion d7-d0 */
1905                value[5] =   0; /* Max Distortion d8 */
1906        }
1907
1908        if (!USBVISION_IS_OPERATIONAL(usbvision))
1909                return 0;
1910
1911        rc = usb_control_msg(usbvision->dev, usb_sndctrlpipe(usbvision->dev, 1),
1912                             USBVISION_OP_CODE,
1913                             USB_DIR_OUT | USB_TYPE_VENDOR |
1914                             USB_RECIP_ENDPOINT, 0,
1915                             (__u16) USBVISION_PCM_THR1, value, 6, HZ);
1916
1917        if (rc < 0) {
1918                printk(KERN_ERR "%sERROR=%d. USBVISION stopped - reconnect or reload driver.\n",
1919                       proc, rc);
1920        }
1921        return rc;
1922}
1923
1924
1925/*
1926 * usbvision_set_input()
1927 *
1928 * Set the input (saa711x, ...) size x y and other misc input params
1929 * I've no idea if this parameters are right
1930 *
1931 */
1932int usbvision_set_input(struct usb_usbvision *usbvision)
1933{
1934        static const char proc[] = "usbvision_set_input: ";
1935        int rc;
1936        unsigned char *value = usbvision->ctrl_urb_buffer;
1937        unsigned char dvi_yuv_value;
1938
1939        if (!USBVISION_IS_OPERATIONAL(usbvision))
1940                return 0;
1941
1942        /* Set input format expected from decoder*/
1943        if (usbvision_device_data[usbvision->dev_model].vin_reg1_override) {
1944                value[0] = usbvision_device_data[usbvision->dev_model].vin_reg1;
1945        } else if (usbvision_device_data[usbvision->dev_model].codec == CODEC_SAA7113) {
1946                /* SAA7113 uses 8 bit output */
1947                value[0] = USBVISION_8_422_SYNC;
1948        } else {
1949                /* I'm sure only about d2-d0 [010] 16 bit 4:2:2 usin sync pulses
1950                 * as that is how saa7111 is configured */
1951                value[0] = USBVISION_16_422_SYNC;
1952                /* | USBVISION_VSNC_POL | USBVISION_VCLK_POL);*/
1953        }
1954
1955        rc = usbvision_write_reg(usbvision, USBVISION_VIN_REG1, value[0]);
1956        if (rc < 0) {
1957                printk(KERN_ERR "%sERROR=%d. USBVISION stopped - reconnect or reload driver.\n",
1958                       proc, rc);
1959                return rc;
1960        }
1961
1962
1963        if (usbvision->tvnorm_id & V4L2_STD_PAL) {
1964                value[0] = 0xC0;
1965                value[1] = 0x02;        /* 0x02C0 -> 704 Input video line length */
1966                value[2] = 0x20;
1967                value[3] = 0x01;        /* 0x0120 -> 288 Input video n. of lines */
1968                value[4] = 0x60;
1969                value[5] = 0x00;        /* 0x0060 -> 96 Input video h offset */
1970                value[6] = 0x16;
1971                value[7] = 0x00;        /* 0x0016 -> 22 Input video v offset */
1972        } else if (usbvision->tvnorm_id & V4L2_STD_SECAM) {
1973                value[0] = 0xC0;
1974                value[1] = 0x02;        /* 0x02C0 -> 704 Input video line length */
1975                value[2] = 0x20;
1976                value[3] = 0x01;        /* 0x0120 -> 288 Input video n. of lines */
1977                value[4] = 0x01;
1978                value[5] = 0x00;        /* 0x0001 -> 01 Input video h offset */
1979                value[6] = 0x01;
1980                value[7] = 0x00;        /* 0x0001 -> 01 Input video v offset */
1981        } else {        /* V4L2_STD_NTSC */
1982                value[0] = 0xD0;
1983                value[1] = 0x02;        /* 0x02D0 -> 720 Input video line length */
1984                value[2] = 0xF0;
1985                value[3] = 0x00;        /* 0x00F0 -> 240 Input video number of lines */
1986                value[4] = 0x50;
1987                value[5] = 0x00;        /* 0x0050 -> 80 Input video h offset */
1988                value[6] = 0x10;
1989                value[7] = 0x00;        /* 0x0010 -> 16 Input video v offset */
1990        }
1991
1992        /* webcam is only 480 pixels wide, both PAL and NTSC version */
1993        if (usbvision_device_data[usbvision->dev_model].codec == CODEC_WEBCAM) {
1994                value[0] = 0xe0;
1995                value[1] = 0x01;        /* 0x01E0 -> 480 Input video line length */
1996        }
1997
1998        if (usbvision_device_data[usbvision->dev_model].x_offset >= 0) {
1999                value[4] = usbvision_device_data[usbvision->dev_model].x_offset & 0xff;
2000                value[5] = (usbvision_device_data[usbvision->dev_model].x_offset & 0x0300) >> 8;
2001        }
2002
2003        if (adjust_x_offset != -1) {
2004                value[4] = adjust_x_offset & 0xff;
2005                value[5] = (adjust_x_offset & 0x0300) >> 8;
2006        }
2007
2008        if (usbvision_device_data[usbvision->dev_model].y_offset >= 0) {
2009                value[6] = usbvision_device_data[usbvision->dev_model].y_offset & 0xff;
2010                value[7] = (usbvision_device_data[usbvision->dev_model].y_offset & 0x0300) >> 8;
2011        }
2012
2013        if (adjust_y_offset != -1) {
2014                value[6] = adjust_y_offset & 0xff;
2015                value[7] = (adjust_y_offset & 0x0300) >> 8;
2016        }
2017
2018        rc = usb_control_msg(usbvision->dev, usb_sndctrlpipe(usbvision->dev, 1),
2019                             USBVISION_OP_CODE, /* USBVISION specific code */
2020                             USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_ENDPOINT, 0,
2021                             (__u16) USBVISION_LXSIZE_I, value, 8, HZ);
2022        if (rc < 0) {
2023                printk(KERN_ERR "%sERROR=%d. USBVISION stopped - reconnect or reload driver.\n",
2024                       proc, rc);
2025                return rc;
2026        }
2027
2028
2029        dvi_yuv_value = 0x00;   /* U comes after V, Ya comes after U/V, Yb comes after Yb */
2030
2031        if (usbvision_device_data[usbvision->dev_model].dvi_yuv_override) {
2032                dvi_yuv_value = usbvision_device_data[usbvision->dev_model].dvi_yuv;
2033        } else if (usbvision_device_data[usbvision->dev_model].codec == CODEC_SAA7113) {
2034                /* This changes as the fine sync control changes. Further investigation necessary */
2035                dvi_yuv_value = 0x06;
2036        }
2037
2038        return usbvision_write_reg(usbvision, USBVISION_DVI_YUV, dvi_yuv_value);
2039}
2040
2041
2042/*
2043 * usbvision_set_dram_settings()
2044 *
2045 * Set the buffer address needed by the usbvision dram to operate
2046 * This values has been taken with usbsnoop.
2047 *
2048 */
2049
2050static int usbvision_set_dram_settings(struct usb_usbvision *usbvision)
2051{
2052        unsigned char *value = usbvision->ctrl_urb_buffer;
2053        int rc;
2054
2055        if (usbvision->isoc_mode == ISOC_MODE_COMPRESS) {
2056                value[0] = 0x42;
2057                value[1] = 0x71;
2058                value[2] = 0xff;
2059                value[3] = 0x00;
2060                value[4] = 0x98;
2061                value[5] = 0xe0;
2062                value[6] = 0x71;
2063                value[7] = 0xff;
2064                /* UR:  0x0E200-0x3FFFF = 204288 Words (1 Word = 2 Byte) */
2065                /* FDL: 0x00000-0x0E099 =  57498 Words */
2066                /* VDW: 0x0E3FF-0x3FFFF */
2067        } else {
2068                value[0] = 0x42;
2069                value[1] = 0x00;
2070                value[2] = 0xff;
2071                value[3] = 0x00;
2072                value[4] = 0x00;
2073                value[5] = 0x00;
2074                value[6] = 0x00;
2075                value[7] = 0xff;
2076        }
2077        /* These are the values of the address of the video buffer,
2078         * they have to be loaded into the USBVISION_DRM_PRM1-8
2079         *
2080         * Start address of video output buffer for read:       drm_prm1-2 -> 0x00000
2081         * End address of video output buffer for read:         drm_prm1-3 -> 0x1ffff
2082         * Start address of video frame delay buffer:           drm_prm1-4 -> 0x20000
2083         *    Only used in compressed mode
2084         * End address of video frame delay buffer:             drm_prm1-5-6 -> 0x3ffff
2085         *    Only used in compressed mode
2086         * Start address of video output buffer for write:      drm_prm1-7 -> 0x00000
2087         * End address of video output buffer for write:        drm_prm1-8 -> 0x1ffff
2088         */
2089
2090        if (!USBVISION_IS_OPERATIONAL(usbvision))
2091                return 0;
2092
2093        rc = usb_control_msg(usbvision->dev, usb_sndctrlpipe(usbvision->dev, 1),
2094                             USBVISION_OP_CODE, /* USBVISION specific code */
2095                             USB_DIR_OUT | USB_TYPE_VENDOR |
2096                             USB_RECIP_ENDPOINT, 0,
2097                             (__u16) USBVISION_DRM_PRM1, value, 8, HZ);
2098
2099        if (rc < 0) {
2100                dev_err(&usbvision->dev->dev, "%s: ERROR=%d\n", __func__, rc);
2101                return rc;
2102        }
2103
2104        /* Restart the video buffer logic */
2105        rc = usbvision_write_reg(usbvision, USBVISION_DRM_CONT, USBVISION_RES_UR |
2106                                   USBVISION_RES_FDL | USBVISION_RES_VDW);
2107        if (rc < 0)
2108                return rc;
2109        rc = usbvision_write_reg(usbvision, USBVISION_DRM_CONT, 0x00);
2110
2111        return rc;
2112}
2113
2114/*
2115 * ()
2116 *
2117 * Power on the device, enables suspend-resume logic
2118 * &  reset the isoc End-Point
2119 *
2120 */
2121
2122int usbvision_power_on(struct usb_usbvision *usbvision)
2123{
2124        int err_code = 0;
2125
2126        PDEBUG(DBG_FUNC, "");
2127
2128        usbvision_write_reg(usbvision, USBVISION_PWR_REG, USBVISION_SSPND_EN);
2129        usbvision_write_reg(usbvision, USBVISION_PWR_REG,
2130                        USBVISION_SSPND_EN | USBVISION_RES2);
2131
2132        if (usbvision_device_data[usbvision->dev_model].codec == CODEC_WEBCAM) {
2133                usbvision_write_reg(usbvision, USBVISION_VIN_REG1,
2134                                USBVISION_16_422_SYNC | USBVISION_HVALID_PO);
2135                usbvision_write_reg(usbvision, USBVISION_VIN_REG2,
2136                                USBVISION_NOHVALID | USBVISION_KEEP_BLANK);
2137        }
2138        usbvision_write_reg(usbvision, USBVISION_PWR_REG,
2139                        USBVISION_SSPND_EN | USBVISION_PWR_VID);
2140        mdelay(10);
2141        err_code = usbvision_write_reg(usbvision, USBVISION_PWR_REG,
2142                        USBVISION_SSPND_EN | USBVISION_PWR_VID | USBVISION_RES2);
2143        if (err_code == 1)
2144                usbvision->power = 1;
2145        PDEBUG(DBG_FUNC, "%s: err_code %d", (err_code < 0) ? "ERROR" : "power is on", err_code);
2146        return err_code;
2147}
2148
2149
2150/*
2151 * usbvision_begin_streaming()
2152 * Sure you have to put bit 7 to 0, if not incoming frames are droped, but no
2153 * idea about the rest
2154 */
2155int usbvision_begin_streaming(struct usb_usbvision *usbvision)
2156{
2157        if (usbvision->isoc_mode == ISOC_MODE_COMPRESS)
2158                usbvision_init_compression(usbvision);
2159        return usbvision_write_reg(usbvision, USBVISION_VIN_REG2,
2160                USBVISION_NOHVALID | usbvision->vin_reg2_preset);
2161}
2162
2163/*
2164 * usbvision_restart_isoc()
2165 * Not sure yet if touching here PWR_REG make loose the config
2166 */
2167
2168int usbvision_restart_isoc(struct usb_usbvision *usbvision)
2169{
2170        int ret;
2171
2172        ret = usbvision_write_reg(usbvision, USBVISION_PWR_REG,
2173                              USBVISION_SSPND_EN | USBVISION_PWR_VID);
2174        if (ret < 0)
2175                return ret;
2176        ret = usbvision_write_reg(usbvision, USBVISION_PWR_REG,
2177                              USBVISION_SSPND_EN | USBVISION_PWR_VID |
2178                              USBVISION_RES2);
2179        if (ret < 0)
2180                return ret;
2181        ret = usbvision_write_reg(usbvision, USBVISION_VIN_REG2,
2182                              USBVISION_KEEP_BLANK | USBVISION_NOHVALID |
2183                                  usbvision->vin_reg2_preset);
2184        if (ret < 0)
2185                return ret;
2186
2187        /* TODO: schedule timeout */
2188        while ((usbvision_read_reg(usbvision, USBVISION_STATUS_REG) & 0x01) != 1)
2189                ;
2190
2191        return 0;
2192}
2193
2194int usbvision_audio_off(struct usb_usbvision *usbvision)
2195{
2196        if (usbvision_write_reg(usbvision, USBVISION_IOPIN_REG, USBVISION_AUDIO_MUTE) < 0) {
2197                printk(KERN_ERR "usbvision_audio_off: can't write reg\n");
2198                return -1;
2199        }
2200        usbvision->audio_mute = 0;
2201        usbvision->audio_channel = USBVISION_AUDIO_MUTE;
2202        return 0;
2203}
2204
2205int usbvision_set_audio(struct usb_usbvision *usbvision, int audio_channel)
2206{
2207        if (!usbvision->audio_mute) {
2208                if (usbvision_write_reg(usbvision, USBVISION_IOPIN_REG, audio_channel) < 0) {
2209                        printk(KERN_ERR "usbvision_set_audio: can't write iopin register for audio switching\n");
2210                        return -1;
2211                }
2212        }
2213        usbvision->audio_channel = audio_channel;
2214        return 0;
2215}
2216
2217int usbvision_setup(struct usb_usbvision *usbvision, int format)
2218{
2219        if (usbvision_device_data[usbvision->dev_model].codec == CODEC_WEBCAM)
2220                usbvision_init_webcam(usbvision);
2221        usbvision_set_video_format(usbvision, format);
2222        usbvision_set_dram_settings(usbvision);
2223        usbvision_set_compress_params(usbvision);
2224        usbvision_set_input(usbvision);
2225        usbvision_set_output(usbvision, MAX_USB_WIDTH, MAX_USB_HEIGHT);
2226        usbvision_restart_isoc(usbvision);
2227
2228        /* cosas del PCM */
2229        return USBVISION_IS_OPERATIONAL(usbvision);
2230}
2231
2232int usbvision_set_alternate(struct usb_usbvision *dev)
2233{
2234        int err_code, prev_alt = dev->iface_alt;
2235        int i;
2236
2237        dev->iface_alt = 0;
2238        for (i = 0; i < dev->num_alt; i++)
2239                if (dev->alt_max_pkt_size[i] > dev->alt_max_pkt_size[dev->iface_alt])
2240                        dev->iface_alt = i;
2241
2242        if (dev->iface_alt != prev_alt) {
2243                dev->isoc_packet_size = dev->alt_max_pkt_size[dev->iface_alt];
2244                PDEBUG(DBG_FUNC, "setting alternate %d with max_packet_size=%u",
2245                                dev->iface_alt, dev->isoc_packet_size);
2246                err_code = usb_set_interface(dev->dev, dev->iface, dev->iface_alt);
2247                if (err_code < 0) {
2248                        dev_err(&dev->dev->dev,
2249                                "cannot change alternate number to %d (error=%i)\n",
2250                                        dev->iface_alt, err_code);
2251                        return err_code;
2252                }
2253        }
2254
2255        PDEBUG(DBG_ISOC, "ISO Packet Length:%d", dev->isoc_packet_size);
2256
2257        return 0;
2258}
2259
2260/*
2261 * usbvision_init_isoc()
2262 *
2263 */
2264int usbvision_init_isoc(struct usb_usbvision *usbvision)
2265{
2266        struct usb_device *dev = usbvision->dev;
2267        int buf_idx, err_code, reg_value;
2268        int sb_size;
2269
2270        if (!USBVISION_IS_OPERATIONAL(usbvision))
2271                return -EFAULT;
2272
2273        usbvision->cur_frame = NULL;
2274        scratch_reset(usbvision);
2275
2276        /* Alternate interface 1 is is the biggest frame size */
2277        err_code = usbvision_set_alternate(usbvision);
2278        if (err_code < 0) {
2279                usbvision->last_error = err_code;
2280                return -EBUSY;
2281        }
2282        sb_size = USBVISION_URB_FRAMES * usbvision->isoc_packet_size;
2283
2284        reg_value = (16 - usbvision_read_reg(usbvision,
2285                                            USBVISION_ALTER_REG)) & 0x0F;
2286
2287        usbvision->usb_bandwidth = reg_value >> 1;
2288        PDEBUG(DBG_ISOC, "USB Bandwidth Usage: %dMbit/Sec",
2289               usbvision->usb_bandwidth);
2290
2291
2292
2293        /* We double buffer the Iso lists */
2294
2295        for (buf_idx = 0; buf_idx < USBVISION_NUMSBUF; buf_idx++) {
2296                int j, k;
2297                struct urb *urb;
2298
2299                urb = usb_alloc_urb(USBVISION_URB_FRAMES, GFP_KERNEL);
2300                if (urb == NULL)
2301                        return -ENOMEM;
2302                usbvision->sbuf[buf_idx].urb = urb;
2303                usbvision->sbuf[buf_idx].data =
2304                        usb_alloc_coherent(usbvision->dev,
2305                                           sb_size,
2306                                           GFP_KERNEL,
2307                                           &urb->transfer_dma);
2308                urb->dev = dev;
2309                urb->context = usbvision;
2310                urb->pipe = usb_rcvisocpipe(dev, usbvision->video_endp);
2311                urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
2312                urb->interval = 1;
2313                urb->transfer_buffer = usbvision->sbuf[buf_idx].data;
2314                urb->complete = usbvision_isoc_irq;
2315                urb->number_of_packets = USBVISION_URB_FRAMES;
2316                urb->transfer_buffer_length =
2317                    usbvision->isoc_packet_size * USBVISION_URB_FRAMES;
2318                for (j = k = 0; j < USBVISION_URB_FRAMES; j++,
2319                     k += usbvision->isoc_packet_size) {
2320                        urb->iso_frame_desc[j].offset = k;
2321                        urb->iso_frame_desc[j].length =
2322                                usbvision->isoc_packet_size;
2323                }
2324        }
2325
2326        /* Submit all URBs */
2327        for (buf_idx = 0; buf_idx < USBVISION_NUMSBUF; buf_idx++) {
2328                err_code = usb_submit_urb(usbvision->sbuf[buf_idx].urb,
2329                                         GFP_KERNEL);
2330                if (err_code) {
2331                        dev_err(&usbvision->dev->dev,
2332                                "%s: usb_submit_urb(%d) failed: error %d\n",
2333                                        __func__, buf_idx, err_code);
2334                }
2335        }
2336
2337        usbvision->streaming = stream_idle;
2338        PDEBUG(DBG_ISOC, "%s: streaming=1 usbvision->video_endp=$%02x",
2339               __func__,
2340               usbvision->video_endp);
2341        return 0;
2342}
2343
2344/*
2345 * usbvision_stop_isoc()
2346 *
2347 * This procedure stops streaming and deallocates URBs. Then it
2348 * activates zero-bandwidth alt. setting of the video interface.
2349 *
2350 */
2351void usbvision_stop_isoc(struct usb_usbvision *usbvision)
2352{
2353        int buf_idx, err_code, reg_value;
2354        int sb_size = USBVISION_URB_FRAMES * usbvision->isoc_packet_size;
2355
2356        if ((usbvision->streaming == stream_off) || (usbvision->dev == NULL))
2357                return;
2358
2359        /* Unschedule all of the iso td's */
2360        for (buf_idx = 0; buf_idx < USBVISION_NUMSBUF; buf_idx++) {
2361                usb_kill_urb(usbvision->sbuf[buf_idx].urb);
2362                if (usbvision->sbuf[buf_idx].data) {
2363                        usb_free_coherent(usbvision->dev,
2364                                          sb_size,
2365                                          usbvision->sbuf[buf_idx].data,
2366                                          usbvision->sbuf[buf_idx].urb->transfer_dma);
2367                }
2368                usb_free_urb(usbvision->sbuf[buf_idx].urb);
2369                usbvision->sbuf[buf_idx].urb = NULL;
2370        }
2371
2372        PDEBUG(DBG_ISOC, "%s: streaming=stream_off\n", __func__);
2373        usbvision->streaming = stream_off;
2374
2375        if (!usbvision->remove_pending) {
2376                /* Set packet size to 0 */
2377                usbvision->iface_alt = 0;
2378                err_code = usb_set_interface(usbvision->dev, usbvision->iface,
2379                                            usbvision->iface_alt);
2380                if (err_code < 0) {
2381                        dev_err(&usbvision->dev->dev,
2382                                "%s: usb_set_interface() failed: error %d\n",
2383                                        __func__, err_code);
2384                        usbvision->last_error = err_code;
2385                }
2386                reg_value = (16-usbvision_read_reg(usbvision, USBVISION_ALTER_REG)) & 0x0F;
2387                usbvision->isoc_packet_size =
2388                        (reg_value == 0) ? 0 : (reg_value * 64) - 1;
2389                PDEBUG(DBG_ISOC, "ISO Packet Length:%d",
2390                       usbvision->isoc_packet_size);
2391
2392                usbvision->usb_bandwidth = reg_value >> 1;
2393                PDEBUG(DBG_ISOC, "USB Bandwidth Usage: %dMbit/Sec",
2394                       usbvision->usb_bandwidth);
2395        }
2396}
2397
2398int usbvision_muxsel(struct usb_usbvision *usbvision, int channel)
2399{
2400        /* inputs #0 and #3 are constant for every SAA711x. */
2401        /* inputs #1 and #2 are variable for SAA7111 and SAA7113 */
2402        int mode[4] = { SAA7115_COMPOSITE0, 0, 0, SAA7115_COMPOSITE3 };
2403        int audio[] = { 1, 0, 0, 0 };
2404        /* channel 0 is TV with audiochannel 1 (tuner mono) */
2405        /* channel 1 is Composite with audio channel 0 (line in) */
2406        /* channel 2 is S-Video with audio channel 0 (line in) */
2407        /* channel 3 is additional video inputs to the device with audio channel 0 (line in) */
2408
2409        RESTRICT_TO_RANGE(channel, 0, usbvision->video_inputs);
2410        usbvision->ctl_input = channel;
2411
2412        /* set the new channel */
2413        /* Regular USB TV Tuners -> channel: 0 = Television, 1 = Composite, 2 = S-Video */
2414        /* Four video input devices -> channel: 0 = Chan White, 1 = Chan Green, 2 = Chan Yellow, 3 = Chan Red */
2415
2416        switch (usbvision_device_data[usbvision->dev_model].codec) {
2417        case CODEC_SAA7113:
2418                mode[1] = SAA7115_COMPOSITE2;
2419                if (switch_svideo_input) {
2420                        /* To handle problems with S-Video Input for
2421                         * some devices.  Use switch_svideo_input
2422                         * parameter when loading the module.*/
2423                        mode[2] = SAA7115_COMPOSITE1;
2424                } else {
2425                        mode[2] = SAA7115_SVIDEO1;
2426                }
2427                break;
2428        case CODEC_SAA7111:
2429        default:
2430                /* modes for saa7111 */
2431                mode[1] = SAA7115_COMPOSITE1;
2432                mode[2] = SAA7115_SVIDEO1;
2433                break;
2434        }
2435        call_all(usbvision, video, s_routing, mode[channel], 0, 0);
2436        usbvision_set_audio(usbvision, audio[channel]);
2437        return 0;
2438}
2439