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