linux/drivers/media/usb/gspca/spca561.c
<<
>>
Prefs
   1/*
   2 * Sunplus spca561 subdriver
   3 *
   4 * Copyright (C) 2004 Michel Xhaard mxhaard@magic.fr
   5 *
   6 * V4L2 by Jean-Francois Moine <http://moinejf.free.fr>
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * any later version.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16 * GNU General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU General Public License
  19 * along with this program; if not, write to the Free Software
  20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  21 */
  22
  23#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  24
  25#define MODULE_NAME "spca561"
  26
  27#include <linux/input.h>
  28#include "gspca.h"
  29
  30MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
  31MODULE_DESCRIPTION("GSPCA/SPCA561 USB Camera Driver");
  32MODULE_LICENSE("GPL");
  33
  34#define EXPOSURE_MAX (2047 + 325)
  35
  36/* specific webcam descriptor */
  37struct sd {
  38        struct gspca_dev gspca_dev;     /* !! must be the first item */
  39
  40        struct { /* hue/contrast control cluster */
  41                struct v4l2_ctrl *contrast;
  42                struct v4l2_ctrl *hue;
  43        };
  44        struct v4l2_ctrl *autogain;
  45
  46#define EXPO12A_DEF 3
  47        __u8 expo12a;           /* expo/gain? for rev 12a */
  48
  49        __u8 chip_revision;
  50#define Rev012A 0
  51#define Rev072A 1
  52
  53        signed char ag_cnt;
  54#define AG_CNT_START 13
  55};
  56
  57static const struct v4l2_pix_format sif_012a_mode[] = {
  58        {160, 120, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
  59                .bytesperline = 160,
  60                .sizeimage = 160 * 120,
  61                .colorspace = V4L2_COLORSPACE_SRGB,
  62                .priv = 3},
  63        {176, 144, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
  64                .bytesperline = 176,
  65                .sizeimage = 176 * 144,
  66                .colorspace = V4L2_COLORSPACE_SRGB,
  67                .priv = 2},
  68        {320, 240, V4L2_PIX_FMT_SPCA561, V4L2_FIELD_NONE,
  69                .bytesperline = 320,
  70                .sizeimage = 320 * 240 * 4 / 8,
  71                .colorspace = V4L2_COLORSPACE_SRGB,
  72                .priv = 1},
  73        {352, 288, V4L2_PIX_FMT_SPCA561, V4L2_FIELD_NONE,
  74                .bytesperline = 352,
  75                .sizeimage = 352 * 288 * 4 / 8,
  76                .colorspace = V4L2_COLORSPACE_SRGB,
  77                .priv = 0},
  78};
  79
  80static const struct v4l2_pix_format sif_072a_mode[] = {
  81        {160, 120, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
  82                .bytesperline = 160,
  83                .sizeimage = 160 * 120,
  84                .colorspace = V4L2_COLORSPACE_SRGB,
  85                .priv = 3},
  86        {176, 144, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
  87                .bytesperline = 176,
  88                .sizeimage = 176 * 144,
  89                .colorspace = V4L2_COLORSPACE_SRGB,
  90                .priv = 2},
  91        {320, 240, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
  92                .bytesperline = 320,
  93                .sizeimage = 320 * 240,
  94                .colorspace = V4L2_COLORSPACE_SRGB,
  95                .priv = 1},
  96        {352, 288, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
  97                .bytesperline = 352,
  98                .sizeimage = 352 * 288,
  99                .colorspace = V4L2_COLORSPACE_SRGB,
 100                .priv = 0},
 101};
 102
 103/*
 104 * Initialization data
 105 * I'm not very sure how to split initialization from open data
 106 * chunks. For now, we'll consider everything as initialization
 107 */
 108/* Frame packet header offsets for the spca561 */
 109#define SPCA561_OFFSET_SNAP 1
 110#define SPCA561_OFFSET_TYPE 2
 111#define SPCA561_OFFSET_COMPRESS 3
 112#define SPCA561_OFFSET_FRAMSEQ   4
 113#define SPCA561_OFFSET_GPIO 5
 114#define SPCA561_OFFSET_USBBUFF 6
 115#define SPCA561_OFFSET_WIN2GRAVE 7
 116#define SPCA561_OFFSET_WIN2RAVE 8
 117#define SPCA561_OFFSET_WIN2BAVE 9
 118#define SPCA561_OFFSET_WIN2GBAVE 10
 119#define SPCA561_OFFSET_WIN1GRAVE 11
 120#define SPCA561_OFFSET_WIN1RAVE 12
 121#define SPCA561_OFFSET_WIN1BAVE 13
 122#define SPCA561_OFFSET_WIN1GBAVE 14
 123#define SPCA561_OFFSET_FREQ 15
 124#define SPCA561_OFFSET_VSYNC 16
 125#define SPCA561_INDEX_I2C_BASE 0x8800
 126#define SPCA561_SNAPBIT 0x20
 127#define SPCA561_SNAPCTRL 0x40
 128
 129static const u16 rev72a_reset[][2] = {
 130        {0x0000, 0x8114},       /* Software GPIO output data */
 131        {0x0001, 0x8114},       /* Software GPIO output data */
 132        {0x0000, 0x8112},       /* Some kind of reset */
 133        {}
 134};
 135static const __u16 rev72a_init_data1[][2] = {
 136        {0x0003, 0x8701},       /* PCLK clock delay adjustment */
 137        {0x0001, 0x8703},       /* HSYNC from cmos inverted */
 138        {0x0011, 0x8118},       /* Enable and conf sensor */
 139        {0x0001, 0x8118},       /* Conf sensor */
 140        {0x0092, 0x8804},       /* I know nothing about these */
 141        {0x0010, 0x8802},       /* 0x88xx registers, so I won't */
 142        {}
 143};
 144static const u16 rev72a_init_sensor1[][2] = {
 145        {0x0001, 0x000d},
 146        {0x0002, 0x0018},
 147        {0x0004, 0x0165},
 148        {0x0005, 0x0021},
 149        {0x0007, 0x00aa},
 150        {0x0020, 0x1504},
 151        {0x0039, 0x0002},
 152        {0x0035, 0x0010},
 153        {0x0009, 0x1049},
 154        {0x0028, 0x000b},
 155        {0x003b, 0x000f},
 156        {0x003c, 0x0000},
 157        {}
 158};
 159static const __u16 rev72a_init_data2[][2] = {
 160        {0x0018, 0x8601},       /* Pixel/line selection for color separation */
 161        {0x0000, 0x8602},       /* Optical black level for user setting */
 162        {0x0060, 0x8604},       /* Optical black horizontal offset */
 163        {0x0002, 0x8605},       /* Optical black vertical offset */
 164        {0x0000, 0x8603},       /* Non-automatic optical black level */
 165        {0x0002, 0x865b},       /* Horizontal offset for valid pixels */
 166        {0x0000, 0x865f},       /* Vertical valid pixels window (x2) */
 167        {0x00b0, 0x865d},       /* Horizontal valid pixels window (x2) */
 168        {0x0090, 0x865e},       /* Vertical valid lines window (x2) */
 169        {0x00e0, 0x8406},       /* Memory buffer threshold */
 170        {0x0000, 0x8660},       /* Compensation memory stuff */
 171        {0x0002, 0x8201},       /* Output address for r/w serial EEPROM */
 172        {0x0008, 0x8200},       /* Clear valid bit for serial EEPROM */
 173        {0x0001, 0x8200},       /* OprMode to be executed by hardware */
 174/* from ms-win */
 175        {0x0000, 0x8611},       /* R offset for white balance */
 176        {0x00fd, 0x8612},       /* Gr offset for white balance */
 177        {0x0003, 0x8613},       /* B offset for white balance */
 178        {0x0000, 0x8614},       /* Gb offset for white balance */
 179/* from ms-win */
 180        {0x0035, 0x8651},       /* R gain for white balance */
 181        {0x0040, 0x8652},       /* Gr gain for white balance */
 182        {0x005f, 0x8653},       /* B gain for white balance */
 183        {0x0040, 0x8654},       /* Gb gain for white balance */
 184        {0x0002, 0x8502},       /* Maximum average bit rate stuff */
 185        {0x0011, 0x8802},
 186
 187        {0x0087, 0x8700},       /* Set master clock (96Mhz????) */
 188        {0x0081, 0x8702},       /* Master clock output enable */
 189
 190        {0x0000, 0x8500},       /* Set image type (352x288 no compression) */
 191        /* Originally was 0x0010 (352x288 compression) */
 192
 193        {0x0002, 0x865b},       /* Horizontal offset for valid pixels */
 194        {0x0003, 0x865c},       /* Vertical offset for valid lines */
 195        {}
 196};
 197static const u16 rev72a_init_sensor2[][2] = {
 198        {0x0003, 0x0121},
 199        {0x0004, 0x0165},
 200        {0x0005, 0x002f},       /* blanking control column */
 201        {0x0006, 0x0000},       /* blanking mode row*/
 202        {0x000a, 0x0002},
 203        {0x0009, 0x1061},       /* setexposure times && pixel clock
 204                                 * 0001 0 | 000 0110 0001 */
 205        {0x0035, 0x0014},
 206        {}
 207};
 208
 209/******************** QC Express etch2 stuff ********************/
 210static const __u16 Pb100_1map8300[][2] = {
 211        /* reg, value */
 212        {0x8320, 0x3304},
 213
 214        {0x8303, 0x0125},       /* image area */
 215        {0x8304, 0x0169},
 216        {0x8328, 0x000b},
 217        {0x833c, 0x0001},               /*fixme: win:07*/
 218
 219        {0x832f, 0x1904},               /*fixme: was 0419*/
 220        {0x8307, 0x00aa},
 221        {0x8301, 0x0003},
 222        {0x8302, 0x000e},
 223        {}
 224};
 225static const __u16 Pb100_2map8300[][2] = {
 226        /* reg, value */
 227        {0x8339, 0x0000},
 228        {0x8307, 0x00aa},
 229        {}
 230};
 231
 232static const __u16 spca561_161rev12A_data1[][2] = {
 233        {0x29, 0x8118},         /* Control register (various enable bits) */
 234        {0x08, 0x8114},         /* GPIO: Led off */
 235        {0x0e, 0x8112},         /* 0x0e stream off 0x3e stream on */
 236        {0x00, 0x8102},         /* white balance - new */
 237        {0x92, 0x8804},
 238        {0x04, 0x8802},         /* windows uses 08 */
 239        {}
 240};
 241static const __u16 spca561_161rev12A_data2[][2] = {
 242        {0x21, 0x8118},
 243        {0x10, 0x8500},
 244        {0x07, 0x8601},
 245        {0x07, 0x8602},
 246        {0x04, 0x8501},
 247
 248        {0x07, 0x8201},         /* windows uses 02 */
 249        {0x08, 0x8200},
 250        {0x01, 0x8200},
 251
 252        {0x90, 0x8604},
 253        {0x00, 0x8605},
 254        {0xb0, 0x8603},
 255
 256        /* sensor gains */
 257        {0x07, 0x8601},         /* white balance - new */
 258        {0x07, 0x8602},         /* white balance - new */
 259        {0x00, 0x8610},         /* *red */
 260        {0x00, 0x8611},         /* 3f   *green */
 261        {0x00, 0x8612},         /* green *blue */
 262        {0x00, 0x8613},         /* blue *green */
 263        {0x43, 0x8614},         /* green *red - white balance - was 0x35 */
 264        {0x40, 0x8615},         /* 40   *green - white balance - was 0x35 */
 265        {0x71, 0x8616},         /* 7a   *blue - white balance - was 0x35 */
 266        {0x40, 0x8617},         /* 40   *green - white balance - was 0x35 */
 267
 268        {0x0c, 0x8620},         /* 0c */
 269        {0xc8, 0x8631},         /* c8 */
 270        {0xc8, 0x8634},         /* c8 */
 271        {0x23, 0x8635},         /* 23 */
 272        {0x1f, 0x8636},         /* 1f */
 273        {0xdd, 0x8637},         /* dd */
 274        {0xe1, 0x8638},         /* e1 */
 275        {0x1d, 0x8639},         /* 1d */
 276        {0x21, 0x863a},         /* 21 */
 277        {0xe3, 0x863b},         /* e3 */
 278        {0xdf, 0x863c},         /* df */
 279        {0xf0, 0x8505},
 280        {0x32, 0x850a},
 281/*      {0x99, 0x8700},          * - white balance - new (removed) */
 282        /* HDG we used to do this in stop0, making the init state and the state
 283           after a start / stop different, so do this here instead. */
 284        {0x29, 0x8118},
 285        {}
 286};
 287
 288static void reg_w_val(struct gspca_dev *gspca_dev, __u16 index, __u8 value)
 289{
 290        int ret;
 291        struct usb_device *dev = gspca_dev->dev;
 292
 293        ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
 294                              0,                /* request */
 295                              USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 296                              value, index, NULL, 0, 500);
 297        PDEBUG(D_USBO, "reg write: 0x%02x:0x%02x", index, value);
 298        if (ret < 0)
 299                pr_err("reg write: error %d\n", ret);
 300}
 301
 302static void write_vector(struct gspca_dev *gspca_dev,
 303                        const __u16 data[][2])
 304{
 305        int i;
 306
 307        i = 0;
 308        while (data[i][1] != 0) {
 309                reg_w_val(gspca_dev, data[i][1], data[i][0]);
 310                i++;
 311        }
 312}
 313
 314/* read 'len' bytes to gspca_dev->usb_buf */
 315static void reg_r(struct gspca_dev *gspca_dev,
 316                  __u16 index, __u16 length)
 317{
 318        usb_control_msg(gspca_dev->dev,
 319                        usb_rcvctrlpipe(gspca_dev->dev, 0),
 320                        0,                      /* request */
 321                        USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 322                        0,                      /* value */
 323                        index, gspca_dev->usb_buf, length, 500);
 324}
 325
 326/* write 'len' bytes from gspca_dev->usb_buf */
 327static void reg_w_buf(struct gspca_dev *gspca_dev,
 328                      __u16 index, __u16 len)
 329{
 330        usb_control_msg(gspca_dev->dev,
 331                        usb_sndctrlpipe(gspca_dev->dev, 0),
 332                        0,                      /* request */
 333                        USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 334                        0,                      /* value */
 335                        index, gspca_dev->usb_buf, len, 500);
 336}
 337
 338static void i2c_write(struct gspca_dev *gspca_dev, __u16 value, __u16 reg)
 339{
 340        int retry = 60;
 341
 342        reg_w_val(gspca_dev, 0x8801, reg);
 343        reg_w_val(gspca_dev, 0x8805, value);
 344        reg_w_val(gspca_dev, 0x8800, value >> 8);
 345        do {
 346                reg_r(gspca_dev, 0x8803, 1);
 347                if (!gspca_dev->usb_buf[0])
 348                        return;
 349                msleep(10);
 350        } while (--retry);
 351}
 352
 353static int i2c_read(struct gspca_dev *gspca_dev, __u16 reg, __u8 mode)
 354{
 355        int retry = 60;
 356        __u8 value;
 357
 358        reg_w_val(gspca_dev, 0x8804, 0x92);
 359        reg_w_val(gspca_dev, 0x8801, reg);
 360        reg_w_val(gspca_dev, 0x8802, mode | 0x01);
 361        do {
 362                reg_r(gspca_dev, 0x8803, 1);
 363                if (!gspca_dev->usb_buf[0]) {
 364                        reg_r(gspca_dev, 0x8800, 1);
 365                        value = gspca_dev->usb_buf[0];
 366                        reg_r(gspca_dev, 0x8805, 1);
 367                        return ((int) value << 8) | gspca_dev->usb_buf[0];
 368                }
 369                msleep(10);
 370        } while (--retry);
 371        return -1;
 372}
 373
 374static void sensor_mapwrite(struct gspca_dev *gspca_dev,
 375                            const __u16 (*sensormap)[2])
 376{
 377        while ((*sensormap)[0]) {
 378                gspca_dev->usb_buf[0] = (*sensormap)[1];
 379                gspca_dev->usb_buf[1] = (*sensormap)[1] >> 8;
 380                reg_w_buf(gspca_dev, (*sensormap)[0], 2);
 381                sensormap++;
 382        }
 383}
 384
 385static void write_sensor_72a(struct gspca_dev *gspca_dev,
 386                            const __u16 (*sensor)[2])
 387{
 388        while ((*sensor)[0]) {
 389                i2c_write(gspca_dev, (*sensor)[1], (*sensor)[0]);
 390                sensor++;
 391        }
 392}
 393
 394static void init_161rev12A(struct gspca_dev *gspca_dev)
 395{
 396        write_vector(gspca_dev, spca561_161rev12A_data1);
 397        sensor_mapwrite(gspca_dev, Pb100_1map8300);
 398/*fixme: should be in sd_start*/
 399        write_vector(gspca_dev, spca561_161rev12A_data2);
 400        sensor_mapwrite(gspca_dev, Pb100_2map8300);
 401}
 402
 403/* this function is called at probe time */
 404static int sd_config(struct gspca_dev *gspca_dev,
 405                     const struct usb_device_id *id)
 406{
 407        struct sd *sd = (struct sd *) gspca_dev;
 408        struct cam *cam;
 409        __u16 vendor, product;
 410        __u8 data1, data2;
 411
 412        /* Read frm global register the USB product and vendor IDs, just to
 413         * prove that we can communicate with the device.  This works, which
 414         * confirms at we are communicating properly and that the device
 415         * is a 561. */
 416        reg_r(gspca_dev, 0x8104, 1);
 417        data1 = gspca_dev->usb_buf[0];
 418        reg_r(gspca_dev, 0x8105, 1);
 419        data2 = gspca_dev->usb_buf[0];
 420        vendor = (data2 << 8) | data1;
 421        reg_r(gspca_dev, 0x8106, 1);
 422        data1 = gspca_dev->usb_buf[0];
 423        reg_r(gspca_dev, 0x8107, 1);
 424        data2 = gspca_dev->usb_buf[0];
 425        product = (data2 << 8) | data1;
 426        if (vendor != id->idVendor || product != id->idProduct) {
 427                PDEBUG(D_PROBE, "Bad vendor / product from device");
 428                return -EINVAL;
 429        }
 430
 431        cam = &gspca_dev->cam;
 432        cam->needs_full_bandwidth = 1;
 433
 434        sd->chip_revision = id->driver_info;
 435        if (sd->chip_revision == Rev012A) {
 436                cam->cam_mode = sif_012a_mode;
 437                cam->nmodes = ARRAY_SIZE(sif_012a_mode);
 438        } else {
 439                cam->cam_mode = sif_072a_mode;
 440                cam->nmodes = ARRAY_SIZE(sif_072a_mode);
 441        }
 442        sd->expo12a = EXPO12A_DEF;
 443        return 0;
 444}
 445
 446/* this function is called at probe and resume time */
 447static int sd_init_12a(struct gspca_dev *gspca_dev)
 448{
 449        PDEBUG(D_STREAM, "Chip revision: 012a");
 450        init_161rev12A(gspca_dev);
 451        return 0;
 452}
 453static int sd_init_72a(struct gspca_dev *gspca_dev)
 454{
 455        PDEBUG(D_STREAM, "Chip revision: 072a");
 456        write_vector(gspca_dev, rev72a_reset);
 457        msleep(200);
 458        write_vector(gspca_dev, rev72a_init_data1);
 459        write_sensor_72a(gspca_dev, rev72a_init_sensor1);
 460        write_vector(gspca_dev, rev72a_init_data2);
 461        write_sensor_72a(gspca_dev, rev72a_init_sensor2);
 462        reg_w_val(gspca_dev, 0x8112, 0x30);
 463        return 0;
 464}
 465
 466static void setbrightness(struct gspca_dev *gspca_dev, s32 val)
 467{
 468        struct sd *sd = (struct sd *) gspca_dev;
 469        __u16 reg;
 470
 471        if (sd->chip_revision == Rev012A)
 472                reg = 0x8610;
 473        else
 474                reg = 0x8611;
 475
 476        reg_w_val(gspca_dev, reg + 0, val);             /* R */
 477        reg_w_val(gspca_dev, reg + 1, val);             /* Gr */
 478        reg_w_val(gspca_dev, reg + 2, val);             /* B */
 479        reg_w_val(gspca_dev, reg + 3, val);             /* Gb */
 480}
 481
 482static void setwhite(struct gspca_dev *gspca_dev, s32 white, s32 contrast)
 483{
 484        struct sd *sd = (struct sd *) gspca_dev;
 485        __u8 blue, red;
 486        __u16 reg;
 487
 488        /* try to emulate MS-win as possible */
 489        red = 0x20 + white * 3 / 8;
 490        blue = 0x90 - white * 5 / 8;
 491        if (sd->chip_revision == Rev012A) {
 492                reg = 0x8614;
 493        } else {
 494                reg = 0x8651;
 495                red += contrast - 0x20;
 496                blue += contrast - 0x20;
 497                reg_w_val(gspca_dev, 0x8652, contrast + 0x20); /* Gr */
 498                reg_w_val(gspca_dev, 0x8654, contrast + 0x20); /* Gb */
 499        }
 500        reg_w_val(gspca_dev, reg, red);
 501        reg_w_val(gspca_dev, reg + 2, blue);
 502}
 503
 504/* rev 12a only */
 505static void setexposure(struct gspca_dev *gspca_dev, s32 val)
 506{
 507        int i, expo = 0;
 508
 509        /* Register 0x8309 controls exposure for the spca561,
 510           the basic exposure setting goes from 1-2047, where 1 is completely
 511           dark and 2047 is very bright. It not only influences exposure but
 512           also the framerate (to allow for longer exposure) from 1 - 300 it
 513           only raises the exposure time then from 300 - 600 it halves the
 514           framerate to be able to further raise the exposure time and for every
 515           300 more it halves the framerate again. This allows for a maximum
 516           exposure time of circa 0.2 - 0.25 seconds (30 / (2000/3000) fps).
 517           Sometimes this is not enough, the 1-2047 uses bits 0-10, bits 11-12
 518           configure a divider for the base framerate which us used at the
 519           exposure setting of 1-300. These bits configure the base framerate
 520           according to the following formula: fps = 60 / (value + 2) */
 521
 522        /* We choose to use the high bits setting the fixed framerate divisor
 523           asap, as setting high basic exposure setting without the fixed
 524           divider in combination with high gains makes the cam stop */
 525        int table[] =  { 0, 450, 550, 625, EXPOSURE_MAX };
 526
 527        for (i = 0; i < ARRAY_SIZE(table) - 1; i++) {
 528                if (val <= table[i + 1]) {
 529                        expo  = val - table[i];
 530                        if (i)
 531                                expo += 300;
 532                        expo |= i << 11;
 533                        break;
 534                }
 535        }
 536
 537        gspca_dev->usb_buf[0] = expo;
 538        gspca_dev->usb_buf[1] = expo >> 8;
 539        reg_w_buf(gspca_dev, 0x8309, 2);
 540}
 541
 542/* rev 12a only */
 543static void setgain(struct gspca_dev *gspca_dev, s32 val)
 544{
 545        /* gain reg low 6 bits  0-63 gain, bit 6 and 7, both double the
 546           sensitivity when set, so 31 + one of them set == 63, and 15
 547           with both of them set == 63 */
 548        if (val < 64)
 549                gspca_dev->usb_buf[0] = val;
 550        else if (val < 128)
 551                gspca_dev->usb_buf[0] = (val / 2) | 0x40;
 552        else
 553                gspca_dev->usb_buf[0] = (val / 4) | 0xc0;
 554
 555        gspca_dev->usb_buf[1] = 0;
 556        reg_w_buf(gspca_dev, 0x8335, 2);
 557}
 558
 559static void setautogain(struct gspca_dev *gspca_dev, s32 val)
 560{
 561        struct sd *sd = (struct sd *) gspca_dev;
 562
 563        if (val)
 564                sd->ag_cnt = AG_CNT_START;
 565        else
 566                sd->ag_cnt = -1;
 567}
 568
 569static int sd_start_12a(struct gspca_dev *gspca_dev)
 570{
 571        int mode;
 572        static const __u8 Reg8391[8] =
 573                {0x92, 0x30, 0x20, 0x00, 0x0c, 0x00, 0x00, 0x00};
 574
 575        mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
 576        if (mode <= 1) {
 577                /* Use compression on 320x240 and above */
 578                reg_w_val(gspca_dev, 0x8500, 0x10 | mode);
 579        } else {
 580                /* I couldn't get the compression to work below 320x240
 581                 * Fortunately at these resolutions the bandwidth
 582                 * is sufficient to push raw frames at ~20fps */
 583                reg_w_val(gspca_dev, 0x8500, mode);
 584        }               /* -- qq@kuku.eu.org */
 585
 586        gspca_dev->usb_buf[0] = 0xaa;
 587        gspca_dev->usb_buf[1] = 0x00;
 588        reg_w_buf(gspca_dev, 0x8307, 2);
 589        /* clock - lower 0x8X values lead to fps > 30 */
 590        reg_w_val(gspca_dev, 0x8700, 0x8a);
 591                                        /* 0x8f 0x85 0x27 clock */
 592        reg_w_val(gspca_dev, 0x8112, 0x1e | 0x20);
 593        reg_w_val(gspca_dev, 0x850b, 0x03);
 594        memcpy(gspca_dev->usb_buf, Reg8391, 8);
 595        reg_w_buf(gspca_dev, 0x8391, 8);
 596        reg_w_buf(gspca_dev, 0x8390, 8);
 597
 598        /* Led ON (bit 3 -> 0 */
 599        reg_w_val(gspca_dev, 0x8114, 0x00);
 600        return 0;
 601}
 602static int sd_start_72a(struct gspca_dev *gspca_dev)
 603{
 604        struct sd *sd = (struct sd *) gspca_dev;
 605        int Clck;
 606        int mode;
 607
 608        write_vector(gspca_dev, rev72a_reset);
 609        msleep(200);
 610        write_vector(gspca_dev, rev72a_init_data1);
 611        write_sensor_72a(gspca_dev, rev72a_init_sensor1);
 612
 613        mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
 614        switch (mode) {
 615        default:
 616        case 0:
 617                Clck = 0x27;            /* ms-win 0x87 */
 618                break;
 619        case 1:
 620                Clck = 0x25;
 621                break;
 622        case 2:
 623                Clck = 0x22;
 624                break;
 625        case 3:
 626                Clck = 0x21;
 627                break;
 628        }
 629        reg_w_val(gspca_dev, 0x8700, Clck);     /* 0x27 clock */
 630        reg_w_val(gspca_dev, 0x8702, 0x81);
 631        reg_w_val(gspca_dev, 0x8500, mode);     /* mode */
 632        write_sensor_72a(gspca_dev, rev72a_init_sensor2);
 633        setwhite(gspca_dev, v4l2_ctrl_g_ctrl(sd->hue),
 634                        v4l2_ctrl_g_ctrl(sd->contrast));
 635/*      setbrightness(gspca_dev);        * fixme: bad values */
 636        setautogain(gspca_dev, v4l2_ctrl_g_ctrl(sd->autogain));
 637        reg_w_val(gspca_dev, 0x8112, 0x10 | 0x20);
 638        return 0;
 639}
 640
 641static void sd_stopN(struct gspca_dev *gspca_dev)
 642{
 643        struct sd *sd = (struct sd *) gspca_dev;
 644
 645        if (sd->chip_revision == Rev012A) {
 646                reg_w_val(gspca_dev, 0x8112, 0x0e);
 647                /* Led Off (bit 3 -> 1 */
 648                reg_w_val(gspca_dev, 0x8114, 0x08);
 649        } else {
 650                reg_w_val(gspca_dev, 0x8112, 0x20);
 651/*              reg_w_val(gspca_dev, 0x8102, 0x00); ?? */
 652        }
 653}
 654
 655static void do_autogain(struct gspca_dev *gspca_dev)
 656{
 657        struct sd *sd = (struct sd *) gspca_dev;
 658        int expotimes;
 659        int pixelclk;
 660        int gainG;
 661        __u8 R, Gr, Gb, B;
 662        int y;
 663        __u8 luma_mean = 110;
 664        __u8 luma_delta = 20;
 665        __u8 spring = 4;
 666
 667        if (sd->ag_cnt < 0)
 668                return;
 669        if (--sd->ag_cnt >= 0)
 670                return;
 671        sd->ag_cnt = AG_CNT_START;
 672
 673        switch (sd->chip_revision) {
 674        case Rev072A:
 675                reg_r(gspca_dev, 0x8621, 1);
 676                Gr = gspca_dev->usb_buf[0];
 677                reg_r(gspca_dev, 0x8622, 1);
 678                R = gspca_dev->usb_buf[0];
 679                reg_r(gspca_dev, 0x8623, 1);
 680                B = gspca_dev->usb_buf[0];
 681                reg_r(gspca_dev, 0x8624, 1);
 682                Gb = gspca_dev->usb_buf[0];
 683                y = (77 * R + 75 * (Gr + Gb) + 29 * B) >> 8;
 684                /* u= (128*B-(43*(Gr+Gb+R))) >> 8; */
 685                /* v= (128*R-(53*(Gr+Gb))-21*B) >> 8; */
 686                /* PDEBUG(D_CONF,"reading Y %d U %d V %d ",y,u,v); */
 687
 688                if (y < luma_mean - luma_delta ||
 689                    y > luma_mean + luma_delta) {
 690                        expotimes = i2c_read(gspca_dev, 0x09, 0x10);
 691                        pixelclk = 0x0800;
 692                        expotimes = expotimes & 0x07ff;
 693                        /* PDEBUG(D_PACK,
 694                                "Exposition Times 0x%03X Clock 0x%04X ",
 695                                expotimes,pixelclk); */
 696                        gainG = i2c_read(gspca_dev, 0x35, 0x10);
 697                        /* PDEBUG(D_PACK,
 698                                "reading Gain register %d", gainG); */
 699
 700                        expotimes += (luma_mean - y) >> spring;
 701                        gainG += (luma_mean - y) / 50;
 702                        /* PDEBUG(D_PACK,
 703                                "compute expotimes %d gain %d",
 704                                expotimes,gainG); */
 705
 706                        if (gainG > 0x3f)
 707                                gainG = 0x3f;
 708                        else if (gainG < 3)
 709                                gainG = 3;
 710                        i2c_write(gspca_dev, gainG, 0x35);
 711
 712                        if (expotimes > 0x0256)
 713                                expotimes = 0x0256;
 714                        else if (expotimes < 3)
 715                                expotimes = 3;
 716                        i2c_write(gspca_dev, expotimes | pixelclk, 0x09);
 717                }
 718                break;
 719        }
 720}
 721
 722static void sd_pkt_scan(struct gspca_dev *gspca_dev,
 723                        u8 *data,               /* isoc packet */
 724                        int len)                /* iso packet length */
 725{
 726        struct sd *sd = (struct sd *) gspca_dev;
 727
 728        len--;
 729        switch (*data++) {                      /* sequence number */
 730        case 0:                                 /* start of frame */
 731                gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
 732
 733                /* This should never happen */
 734                if (len < 2) {
 735                        PERR("Short SOF packet, ignoring");
 736                        gspca_dev->last_packet_type = DISCARD_PACKET;
 737                        return;
 738                }
 739
 740#if IS_ENABLED(CONFIG_INPUT)
 741                if (data[0] & 0x20) {
 742                        input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);
 743                        input_sync(gspca_dev->input_dev);
 744                        input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);
 745                        input_sync(gspca_dev->input_dev);
 746                }
 747#endif
 748
 749                if (data[1] & 0x10) {
 750                        /* compressed bayer */
 751                        gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
 752                } else {
 753                        /* raw bayer (with a header, which we skip) */
 754                        if (sd->chip_revision == Rev012A) {
 755                                data += 20;
 756                                len -= 20;
 757                        } else {
 758                                data += 16;
 759                                len -= 16;
 760                        }
 761                        gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
 762                }
 763                return;
 764        case 0xff:                      /* drop (empty mpackets) */
 765                return;
 766        }
 767        gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
 768}
 769
 770static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
 771{
 772        struct gspca_dev *gspca_dev =
 773                container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
 774        struct sd *sd = (struct sd *)gspca_dev;
 775
 776        gspca_dev->usb_err = 0;
 777
 778        if (!gspca_dev->streaming)
 779                return 0;
 780
 781        switch (ctrl->id) {
 782        case V4L2_CID_BRIGHTNESS:
 783                setbrightness(gspca_dev, ctrl->val);
 784                break;
 785        case V4L2_CID_CONTRAST:
 786                /* hue/contrast control cluster for 72a */
 787                setwhite(gspca_dev, sd->hue->val, ctrl->val);
 788                break;
 789        case V4L2_CID_HUE:
 790                /* just plain hue control for 12a */
 791                setwhite(gspca_dev, ctrl->val, 0);
 792                break;
 793        case V4L2_CID_EXPOSURE:
 794                setexposure(gspca_dev, ctrl->val);
 795                break;
 796        case V4L2_CID_GAIN:
 797                setgain(gspca_dev, ctrl->val);
 798                break;
 799        case V4L2_CID_AUTOGAIN:
 800                setautogain(gspca_dev, ctrl->val);
 801                break;
 802        }
 803        return gspca_dev->usb_err;
 804}
 805
 806static const struct v4l2_ctrl_ops sd_ctrl_ops = {
 807        .s_ctrl = sd_s_ctrl,
 808};
 809
 810static int sd_init_controls_12a(struct gspca_dev *gspca_dev)
 811{
 812        struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
 813
 814        gspca_dev->vdev.ctrl_handler = hdl;
 815        v4l2_ctrl_handler_init(hdl, 3);
 816        v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 817                        V4L2_CID_HUE, 1, 0x7f, 1, 0x40);
 818        v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 819                        V4L2_CID_BRIGHTNESS, -128, 127, 1, 0);
 820        v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 821                        V4L2_CID_EXPOSURE, 1, EXPOSURE_MAX, 1, 700);
 822        v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 823                        V4L2_CID_GAIN, 0, 255, 1, 63);
 824
 825        if (hdl->error) {
 826                pr_err("Could not initialize controls\n");
 827                return hdl->error;
 828        }
 829        return 0;
 830}
 831
 832static int sd_init_controls_72a(struct gspca_dev *gspca_dev)
 833{
 834        struct sd *sd = (struct sd *)gspca_dev;
 835        struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
 836
 837        gspca_dev->vdev.ctrl_handler = hdl;
 838        v4l2_ctrl_handler_init(hdl, 4);
 839        sd->contrast = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 840                        V4L2_CID_CONTRAST, 0, 0x3f, 1, 0x20);
 841        sd->hue = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 842                        V4L2_CID_HUE, 1, 0x7f, 1, 0x40);
 843        v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 844                        V4L2_CID_BRIGHTNESS, 0, 0x3f, 1, 0x20);
 845        sd->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 846                        V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
 847
 848        if (hdl->error) {
 849                pr_err("Could not initialize controls\n");
 850                return hdl->error;
 851        }
 852        v4l2_ctrl_cluster(2, &sd->contrast);
 853        return 0;
 854}
 855
 856/* sub-driver description */
 857static const struct sd_desc sd_desc_12a = {
 858        .name = MODULE_NAME,
 859        .init_controls = sd_init_controls_12a,
 860        .config = sd_config,
 861        .init = sd_init_12a,
 862        .start = sd_start_12a,
 863        .stopN = sd_stopN,
 864        .pkt_scan = sd_pkt_scan,
 865#if IS_ENABLED(CONFIG_INPUT)
 866        .other_input = 1,
 867#endif
 868};
 869static const struct sd_desc sd_desc_72a = {
 870        .name = MODULE_NAME,
 871        .init_controls = sd_init_controls_72a,
 872        .config = sd_config,
 873        .init = sd_init_72a,
 874        .start = sd_start_72a,
 875        .stopN = sd_stopN,
 876        .pkt_scan = sd_pkt_scan,
 877        .dq_callback = do_autogain,
 878#if IS_ENABLED(CONFIG_INPUT)
 879        .other_input = 1,
 880#endif
 881};
 882static const struct sd_desc *sd_desc[2] = {
 883        &sd_desc_12a,
 884        &sd_desc_72a
 885};
 886
 887/* -- module initialisation -- */
 888static const struct usb_device_id device_table[] = {
 889        {USB_DEVICE(0x041e, 0x401a), .driver_info = Rev072A},
 890        {USB_DEVICE(0x041e, 0x403b), .driver_info = Rev012A},
 891        {USB_DEVICE(0x0458, 0x7004), .driver_info = Rev072A},
 892        {USB_DEVICE(0x0461, 0x0815), .driver_info = Rev072A},
 893        {USB_DEVICE(0x046d, 0x0928), .driver_info = Rev012A},
 894        {USB_DEVICE(0x046d, 0x0929), .driver_info = Rev012A},
 895        {USB_DEVICE(0x046d, 0x092a), .driver_info = Rev012A},
 896        {USB_DEVICE(0x046d, 0x092b), .driver_info = Rev012A},
 897        {USB_DEVICE(0x046d, 0x092c), .driver_info = Rev012A},
 898        {USB_DEVICE(0x046d, 0x092d), .driver_info = Rev012A},
 899        {USB_DEVICE(0x046d, 0x092e), .driver_info = Rev012A},
 900        {USB_DEVICE(0x046d, 0x092f), .driver_info = Rev012A},
 901        {USB_DEVICE(0x04fc, 0x0561), .driver_info = Rev072A},
 902        {USB_DEVICE(0x060b, 0xa001), .driver_info = Rev072A},
 903        {USB_DEVICE(0x10fd, 0x7e50), .driver_info = Rev072A},
 904        {USB_DEVICE(0xabcd, 0xcdee), .driver_info = Rev072A},
 905        {}
 906};
 907
 908MODULE_DEVICE_TABLE(usb, device_table);
 909
 910/* -- device connect -- */
 911static int sd_probe(struct usb_interface *intf,
 912                    const struct usb_device_id *id)
 913{
 914        return gspca_dev_probe(intf, id,
 915                                sd_desc[id->driver_info],
 916                                sizeof(struct sd),
 917                               THIS_MODULE);
 918}
 919
 920static struct usb_driver sd_driver = {
 921        .name = MODULE_NAME,
 922        .id_table = device_table,
 923        .probe = sd_probe,
 924        .disconnect = gspca_disconnect,
 925#ifdef CONFIG_PM
 926        .suspend = gspca_suspend,
 927        .resume = gspca_resume,
 928        .reset_resume = gspca_resume,
 929#endif
 930};
 931
 932module_usb_driver(sd_driver);
 933