linux/drivers/media/video/gspca/mr97310a.c
<<
>>
Prefs
   1/*
   2 * Mars MR97310A library
   3 *
   4 * The original mr97310a driver, which supported the Aiptek Pencam VGA+, is
   5 * Copyright (C) 2009 Kyle Guinn <elyk03@gmail.com>
   6 *
   7 * Support for the MR97310A cameras in addition to the Aiptek Pencam VGA+
   8 * and for the routines for detecting and classifying these various cameras,
   9 * is Copyright (C) 2009 Theodore Kilgore <kilgota@auburn.edu>
  10 *
  11 * Support for the control settings for the CIF cameras is
  12 * Copyright (C) 2009 Hans de Goede <hdegoede@redhat.com> and
  13 * Thomas Kaiser <thomas@kaiser-linux.li>
  14 *
  15 * Support for the control settings for the VGA cameras is
  16 * Copyright (C) 2009 Theodore Kilgore <kilgota@auburn.edu>
  17 *
  18 * Several previously unsupported cameras are owned and have been tested by
  19 * Hans de Goede <hdegoede@redhat.com> and
  20 * Thomas Kaiser <thomas@kaiser-linux.li> and
  21 * Theodore Kilgore <kilgota@auburn.edu> and
  22 * Edmond Rodriguez <erodrig_97@yahoo.com> and
  23 * Aurelien Jacobs <aurel@gnuage.org>
  24 *
  25 * The MR97311A support in gspca/mars.c has been helpful in understanding some
  26 * of the registers in these cameras.
  27 *
  28 * This program is free software; you can redistribute it and/or modify
  29 * it under the terms of the GNU General Public License as published by
  30 * the Free Software Foundation; either version 2 of the License, or
  31 * any later version.
  32 *
  33 * This program is distributed in the hope that it will be useful,
  34 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  35 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  36 * GNU General Public License for more details.
  37 *
  38 * You should have received a copy of the GNU General Public License
  39 * along with this program; if not, write to the Free Software
  40 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  41 */
  42
  43#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  44
  45#define MODULE_NAME "mr97310a"
  46
  47#include "gspca.h"
  48
  49#define CAM_TYPE_CIF                    0
  50#define CAM_TYPE_VGA                    1
  51
  52#define MR97310A_BRIGHTNESS_DEFAULT     0
  53
  54#define MR97310A_EXPOSURE_MIN           0
  55#define MR97310A_EXPOSURE_MAX           4095
  56#define MR97310A_EXPOSURE_DEFAULT       1000
  57
  58#define MR97310A_GAIN_MIN               0
  59#define MR97310A_GAIN_MAX               31
  60#define MR97310A_GAIN_DEFAULT           25
  61
  62#define MR97310A_CONTRAST_MIN           0
  63#define MR97310A_CONTRAST_MAX           31
  64#define MR97310A_CONTRAST_DEFAULT       23
  65
  66#define MR97310A_CS_GAIN_MIN            0
  67#define MR97310A_CS_GAIN_MAX            0x7ff
  68#define MR97310A_CS_GAIN_DEFAULT        0x110
  69
  70#define MR97310A_MIN_CLOCKDIV_MIN       3
  71#define MR97310A_MIN_CLOCKDIV_MAX       8
  72#define MR97310A_MIN_CLOCKDIV_DEFAULT   3
  73
  74MODULE_AUTHOR("Kyle Guinn <elyk03@gmail.com>,"
  75              "Theodore Kilgore <kilgota@auburn.edu>");
  76MODULE_DESCRIPTION("GSPCA/Mars-Semi MR97310A USB Camera Driver");
  77MODULE_LICENSE("GPL");
  78
  79/* global parameters */
  80static int force_sensor_type = -1;
  81module_param(force_sensor_type, int, 0644);
  82MODULE_PARM_DESC(force_sensor_type, "Force sensor type (-1 (auto), 0 or 1)");
  83
  84/* specific webcam descriptor */
  85struct sd {
  86        struct gspca_dev gspca_dev;  /* !! must be the first item */
  87        u8 sof_read;
  88        u8 cam_type;    /* 0 is CIF and 1 is VGA */
  89        u8 sensor_type; /* We use 0 and 1 here, too. */
  90        u8 do_lcd_stop;
  91        u8 adj_colors;
  92
  93        int brightness;
  94        u16 exposure;
  95        u32 gain;
  96        u8 contrast;
  97        u8 min_clockdiv;
  98};
  99
 100struct sensor_w_data {
 101        u8 reg;
 102        u8 flags;
 103        u8 data[16];
 104        int len;
 105};
 106
 107static void sd_stopN(struct gspca_dev *gspca_dev);
 108static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val);
 109static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val);
 110static int sd_setexposure(struct gspca_dev *gspca_dev, __s32 val);
 111static int sd_getexposure(struct gspca_dev *gspca_dev, __s32 *val);
 112static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val);
 113static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val);
 114static int sd_setgain(struct gspca_dev *gspca_dev, __s32 val);
 115static int sd_getgain(struct gspca_dev *gspca_dev, __s32 *val);
 116static int sd_setmin_clockdiv(struct gspca_dev *gspca_dev, __s32 val);
 117static int sd_getmin_clockdiv(struct gspca_dev *gspca_dev, __s32 *val);
 118static void setbrightness(struct gspca_dev *gspca_dev);
 119static void setexposure(struct gspca_dev *gspca_dev);
 120static void setgain(struct gspca_dev *gspca_dev);
 121static void setcontrast(struct gspca_dev *gspca_dev);
 122
 123/* V4L2 controls supported by the driver */
 124static const struct ctrl sd_ctrls[] = {
 125/* Separate brightness control description for Argus QuickClix as it has
 126 * different limits from the other mr97310a cameras, and separate gain
 127 * control for Sakar CyberPix camera. */
 128        {
 129#define NORM_BRIGHTNESS_IDX 0
 130                {
 131                        .id = V4L2_CID_BRIGHTNESS,
 132                        .type = V4L2_CTRL_TYPE_INTEGER,
 133                        .name = "Brightness",
 134                        .minimum = -254,
 135                        .maximum = 255,
 136                        .step = 1,
 137                        .default_value = MR97310A_BRIGHTNESS_DEFAULT,
 138                        .flags = 0,
 139                },
 140                .set = sd_setbrightness,
 141                .get = sd_getbrightness,
 142        },
 143        {
 144#define ARGUS_QC_BRIGHTNESS_IDX 1
 145                {
 146                        .id = V4L2_CID_BRIGHTNESS,
 147                        .type = V4L2_CTRL_TYPE_INTEGER,
 148                        .name = "Brightness",
 149                        .minimum = 0,
 150                        .maximum = 15,
 151                        .step = 1,
 152                        .default_value = MR97310A_BRIGHTNESS_DEFAULT,
 153                        .flags = 0,
 154                },
 155                .set = sd_setbrightness,
 156                .get = sd_getbrightness,
 157        },
 158        {
 159#define EXPOSURE_IDX 2
 160                {
 161                        .id = V4L2_CID_EXPOSURE,
 162                        .type = V4L2_CTRL_TYPE_INTEGER,
 163                        .name = "Exposure",
 164                        .minimum = MR97310A_EXPOSURE_MIN,
 165                        .maximum = MR97310A_EXPOSURE_MAX,
 166                        .step = 1,
 167                        .default_value = MR97310A_EXPOSURE_DEFAULT,
 168                        .flags = 0,
 169                },
 170                .set = sd_setexposure,
 171                .get = sd_getexposure,
 172        },
 173        {
 174#define GAIN_IDX 3
 175                {
 176                        .id = V4L2_CID_GAIN,
 177                        .type = V4L2_CTRL_TYPE_INTEGER,
 178                        .name = "Gain",
 179                        .minimum = MR97310A_GAIN_MIN,
 180                        .maximum = MR97310A_GAIN_MAX,
 181                        .step = 1,
 182                        .default_value = MR97310A_GAIN_DEFAULT,
 183                        .flags = 0,
 184                },
 185                .set = sd_setgain,
 186                .get = sd_getgain,
 187        },
 188        {
 189#define SAKAR_CS_GAIN_IDX 4
 190                {
 191                        .id = V4L2_CID_GAIN,
 192                        .type = V4L2_CTRL_TYPE_INTEGER,
 193                        .name = "Gain",
 194                        .minimum = MR97310A_CS_GAIN_MIN,
 195                        .maximum = MR97310A_CS_GAIN_MAX,
 196                        .step = 1,
 197                        .default_value = MR97310A_CS_GAIN_DEFAULT,
 198                        .flags = 0,
 199                },
 200                .set = sd_setgain,
 201                .get = sd_getgain,
 202        },
 203        {
 204#define CONTRAST_IDX 5
 205                {
 206                        .id = V4L2_CID_CONTRAST,
 207                        .type = V4L2_CTRL_TYPE_INTEGER,
 208                        .name = "Contrast",
 209                        .minimum = MR97310A_CONTRAST_MIN,
 210                        .maximum = MR97310A_CONTRAST_MAX,
 211                        .step = 1,
 212                        .default_value = MR97310A_CONTRAST_DEFAULT,
 213                        .flags = 0,
 214                },
 215                .set = sd_setcontrast,
 216                .get = sd_getcontrast,
 217        },
 218        {
 219#define MIN_CLOCKDIV_IDX 6
 220                {
 221                        .id = V4L2_CID_PRIVATE_BASE,
 222                        .type = V4L2_CTRL_TYPE_INTEGER,
 223                        .name = "Minimum Clock Divider",
 224                        .minimum = MR97310A_MIN_CLOCKDIV_MIN,
 225                        .maximum = MR97310A_MIN_CLOCKDIV_MAX,
 226                        .step = 1,
 227                        .default_value = MR97310A_MIN_CLOCKDIV_DEFAULT,
 228                        .flags = 0,
 229                },
 230                .set = sd_setmin_clockdiv,
 231                .get = sd_getmin_clockdiv,
 232        },
 233};
 234
 235static const struct v4l2_pix_format vga_mode[] = {
 236        {160, 120, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
 237                .bytesperline = 160,
 238                .sizeimage = 160 * 120,
 239                .colorspace = V4L2_COLORSPACE_SRGB,
 240                .priv = 4},
 241        {176, 144, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
 242                .bytesperline = 176,
 243                .sizeimage = 176 * 144,
 244                .colorspace = V4L2_COLORSPACE_SRGB,
 245                .priv = 3},
 246        {320, 240, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
 247                .bytesperline = 320,
 248                .sizeimage = 320 * 240,
 249                .colorspace = V4L2_COLORSPACE_SRGB,
 250                .priv = 2},
 251        {352, 288, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
 252                .bytesperline = 352,
 253                .sizeimage = 352 * 288,
 254                .colorspace = V4L2_COLORSPACE_SRGB,
 255                .priv = 1},
 256        {640, 480, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
 257                .bytesperline = 640,
 258                .sizeimage = 640 * 480,
 259                .colorspace = V4L2_COLORSPACE_SRGB,
 260                .priv = 0},
 261};
 262
 263/* the bytes to write are in gspca_dev->usb_buf */
 264static int mr_write(struct gspca_dev *gspca_dev, int len)
 265{
 266        int rc;
 267
 268        rc = usb_bulk_msg(gspca_dev->dev,
 269                          usb_sndbulkpipe(gspca_dev->dev, 4),
 270                          gspca_dev->usb_buf, len, NULL, 500);
 271        if (rc < 0)
 272                pr_err("reg write [%02x] error %d\n",
 273                       gspca_dev->usb_buf[0], rc);
 274        return rc;
 275}
 276
 277/* the bytes are read into gspca_dev->usb_buf */
 278static int mr_read(struct gspca_dev *gspca_dev, int len)
 279{
 280        int rc;
 281
 282        rc = usb_bulk_msg(gspca_dev->dev,
 283                          usb_rcvbulkpipe(gspca_dev->dev, 3),
 284                          gspca_dev->usb_buf, len, NULL, 500);
 285        if (rc < 0)
 286                pr_err("reg read [%02x] error %d\n",
 287                       gspca_dev->usb_buf[0], rc);
 288        return rc;
 289}
 290
 291static int sensor_write_reg(struct gspca_dev *gspca_dev, u8 reg, u8 flags,
 292        const u8 *data, int len)
 293{
 294        gspca_dev->usb_buf[0] = 0x1f;
 295        gspca_dev->usb_buf[1] = flags;
 296        gspca_dev->usb_buf[2] = reg;
 297        memcpy(gspca_dev->usb_buf + 3, data, len);
 298
 299        return mr_write(gspca_dev, len + 3);
 300}
 301
 302static int sensor_write_regs(struct gspca_dev *gspca_dev,
 303        const struct sensor_w_data *data, int len)
 304{
 305        int i, rc;
 306
 307        for (i = 0; i < len; i++) {
 308                rc = sensor_write_reg(gspca_dev, data[i].reg, data[i].flags,
 309                                          data[i].data, data[i].len);
 310                if (rc < 0)
 311                        return rc;
 312        }
 313
 314        return 0;
 315}
 316
 317static int sensor_write1(struct gspca_dev *gspca_dev, u8 reg, u8 data)
 318{
 319        struct sd *sd = (struct sd *) gspca_dev;
 320        u8 buf, confirm_reg;
 321        int rc;
 322
 323        buf = data;
 324        if (sd->cam_type == CAM_TYPE_CIF) {
 325                rc = sensor_write_reg(gspca_dev, reg, 0x01, &buf, 1);
 326                confirm_reg = sd->sensor_type ? 0x13 : 0x11;
 327        } else {
 328                rc = sensor_write_reg(gspca_dev, reg, 0x00, &buf, 1);
 329                confirm_reg = 0x11;
 330        }
 331        if (rc < 0)
 332                return rc;
 333
 334        buf = 0x01;
 335        rc = sensor_write_reg(gspca_dev, confirm_reg, 0x00, &buf, 1);
 336        if (rc < 0)
 337                return rc;
 338
 339        return 0;
 340}
 341
 342static int cam_get_response16(struct gspca_dev *gspca_dev, u8 reg, int verbose)
 343{
 344        int err_code;
 345
 346        gspca_dev->usb_buf[0] = reg;
 347        err_code = mr_write(gspca_dev, 1);
 348        if (err_code < 0)
 349                return err_code;
 350
 351        err_code = mr_read(gspca_dev, 16);
 352        if (err_code < 0)
 353                return err_code;
 354
 355        if (verbose)
 356                PDEBUG(D_PROBE, "Register: %02x reads %02x%02x%02x", reg,
 357                       gspca_dev->usb_buf[0],
 358                       gspca_dev->usb_buf[1],
 359                       gspca_dev->usb_buf[2]);
 360
 361        return 0;
 362}
 363
 364static int zero_the_pointer(struct gspca_dev *gspca_dev)
 365{
 366        __u8 *data = gspca_dev->usb_buf;
 367        int err_code;
 368        u8 status = 0;
 369        int tries = 0;
 370
 371        err_code = cam_get_response16(gspca_dev, 0x21, 0);
 372        if (err_code < 0)
 373                return err_code;
 374
 375        data[0] = 0x19;
 376        data[1] = 0x51;
 377        err_code = mr_write(gspca_dev, 2);
 378        if (err_code < 0)
 379                return err_code;
 380
 381        err_code = cam_get_response16(gspca_dev, 0x21, 0);
 382        if (err_code < 0)
 383                return err_code;
 384
 385        data[0] = 0x19;
 386        data[1] = 0xba;
 387        err_code = mr_write(gspca_dev, 2);
 388        if (err_code < 0)
 389                return err_code;
 390
 391        err_code = cam_get_response16(gspca_dev, 0x21, 0);
 392        if (err_code < 0)
 393                return err_code;
 394
 395        data[0] = 0x19;
 396        data[1] = 0x00;
 397        err_code = mr_write(gspca_dev, 2);
 398        if (err_code < 0)
 399                return err_code;
 400
 401        err_code = cam_get_response16(gspca_dev, 0x21, 0);
 402        if (err_code < 0)
 403                return err_code;
 404
 405        data[0] = 0x19;
 406        data[1] = 0x00;
 407        err_code = mr_write(gspca_dev, 2);
 408        if (err_code < 0)
 409                return err_code;
 410
 411        while (status != 0x0a && tries < 256) {
 412                err_code = cam_get_response16(gspca_dev, 0x21, 0);
 413                status = data[0];
 414                tries++;
 415                if (err_code < 0)
 416                        return err_code;
 417        }
 418        if (status != 0x0a)
 419                PDEBUG(D_ERR, "status is %02x", status);
 420
 421        tries = 0;
 422        while (tries < 4) {
 423                data[0] = 0x19;
 424                data[1] = 0x00;
 425                err_code = mr_write(gspca_dev, 2);
 426                if (err_code < 0)
 427                        return err_code;
 428
 429                err_code = cam_get_response16(gspca_dev, 0x21, 0);
 430                status = data[0];
 431                tries++;
 432                if (err_code < 0)
 433                        return err_code;
 434        }
 435
 436        data[0] = 0x19;
 437        err_code = mr_write(gspca_dev, 1);
 438        if (err_code < 0)
 439                return err_code;
 440
 441        err_code = mr_read(gspca_dev, 16);
 442        if (err_code < 0)
 443                return err_code;
 444
 445        return 0;
 446}
 447
 448static int stream_start(struct gspca_dev *gspca_dev)
 449{
 450        gspca_dev->usb_buf[0] = 0x01;
 451        gspca_dev->usb_buf[1] = 0x01;
 452        return mr_write(gspca_dev, 2);
 453}
 454
 455static void stream_stop(struct gspca_dev *gspca_dev)
 456{
 457        gspca_dev->usb_buf[0] = 0x01;
 458        gspca_dev->usb_buf[1] = 0x00;
 459        if (mr_write(gspca_dev, 2) < 0)
 460                PDEBUG(D_ERR, "Stream Stop failed");
 461}
 462
 463static void lcd_stop(struct gspca_dev *gspca_dev)
 464{
 465        gspca_dev->usb_buf[0] = 0x19;
 466        gspca_dev->usb_buf[1] = 0x54;
 467        if (mr_write(gspca_dev, 2) < 0)
 468                PDEBUG(D_ERR, "LCD Stop failed");
 469}
 470
 471static int isoc_enable(struct gspca_dev *gspca_dev)
 472{
 473        gspca_dev->usb_buf[0] = 0x00;
 474        gspca_dev->usb_buf[1] = 0x4d;  /* ISOC transferring enable... */
 475        return mr_write(gspca_dev, 2);
 476}
 477
 478/* This function is called at probe time */
 479static int sd_config(struct gspca_dev *gspca_dev,
 480                     const struct usb_device_id *id)
 481{
 482        struct sd *sd = (struct sd *) gspca_dev;
 483        struct cam *cam;
 484        int gain_default = MR97310A_GAIN_DEFAULT;
 485        int err_code;
 486
 487        cam = &gspca_dev->cam;
 488        cam->cam_mode = vga_mode;
 489        cam->nmodes = ARRAY_SIZE(vga_mode);
 490        sd->do_lcd_stop = 0;
 491
 492        /* Several of the supported CIF cameras share the same USB ID but
 493         * require different initializations and different control settings.
 494         * The same is true of the VGA cameras. Therefore, we are forced
 495         * to start the initialization process in order to determine which
 496         * camera is present. Some of the supported cameras require the
 497         * memory pointer to be set to 0 as the very first item of business
 498         * or else they will not stream. So we do that immediately.
 499         */
 500        err_code = zero_the_pointer(gspca_dev);
 501        if (err_code < 0)
 502                return err_code;
 503
 504        err_code = stream_start(gspca_dev);
 505        if (err_code < 0)
 506                return err_code;
 507
 508        /* Now, the query for sensor type. */
 509        err_code = cam_get_response16(gspca_dev, 0x07, 1);
 510        if (err_code < 0)
 511                return err_code;
 512
 513        if (id->idProduct == 0x0110 || id->idProduct == 0x010e) {
 514                sd->cam_type = CAM_TYPE_CIF;
 515                cam->nmodes--;
 516                /*
 517                 * All but one of the known CIF cameras share the same USB ID,
 518                 * but two different init routines are in use, and the control
 519                 * settings are different, too. We need to detect which camera
 520                 * of the two known varieties is connected!
 521                 *
 522                 * A list of known CIF cameras follows. They all report either
 523                 * 0200 for type 0 or 0300 for type 1.
 524                 * If you have another to report, please do
 525                 *
 526                 * Name         sd->sensor_type         reported by
 527                 *
 528                 * Sakar 56379 Spy-shot 0               T. Kilgore
 529                 * Innovage             0               T. Kilgore
 530                 * Vivitar Mini         0               H. De Goede
 531                 * Vivitar Mini         0               E. Rodriguez
 532                 * Vivitar Mini         1               T. Kilgore
 533                 * Elta-Media 8212dc    1               T. Kaiser
 534                 * Philips dig. keych.  1               T. Kilgore
 535                 * Trust Spyc@m 100     1               A. Jacobs
 536                 */
 537                switch (gspca_dev->usb_buf[0]) {
 538                case 2:
 539                        sd->sensor_type = 0;
 540                        break;
 541                case 3:
 542                        sd->sensor_type = 1;
 543                        break;
 544                default:
 545                        pr_err("Unknown CIF Sensor id : %02x\n",
 546                               gspca_dev->usb_buf[1]);
 547                        return -ENODEV;
 548                }
 549                PDEBUG(D_PROBE, "MR97310A CIF camera detected, sensor: %d",
 550                       sd->sensor_type);
 551        } else {
 552                sd->cam_type = CAM_TYPE_VGA;
 553
 554                /*
 555                 * Here is a table of the responses to the query for sensor
 556                 * type, from the known MR97310A VGA cameras. Six different
 557                 * cameras of which five share the same USB ID.
 558                 *
 559                 * Name                 gspca_dev->usb_buf[]    sd->sensor_type
 560                 *                              sd->do_lcd_stop
 561                 * Aiptek Pencam VGA+   0300            0               1
 562                 * ION digital          0300            0               1
 563                 * Argus DC-1620        0450            1               0
 564                 * Argus QuickClix      0420            1               1
 565                 * Sakar 77379 Digital  0350            0               1
 566                 * Sakar 1638x CyberPix 0120            0               2
 567                 *
 568                 * Based upon these results, we assume default settings
 569                 * and then correct as necessary, as follows.
 570                 *
 571                 */
 572
 573                sd->sensor_type = 1;
 574                sd->do_lcd_stop = 0;
 575                sd->adj_colors = 0;
 576                if (gspca_dev->usb_buf[0] == 0x01) {
 577                        sd->sensor_type = 2;
 578                } else if ((gspca_dev->usb_buf[0] != 0x03) &&
 579                                        (gspca_dev->usb_buf[0] != 0x04)) {
 580                        pr_err("Unknown VGA Sensor id Byte 0: %02x\n",
 581                               gspca_dev->usb_buf[0]);
 582                        pr_err("Defaults assumed, may not work\n");
 583                        pr_err("Please report this\n");
 584                }
 585                /* Sakar Digital color needs to be adjusted. */
 586                if ((gspca_dev->usb_buf[0] == 0x03) &&
 587                                        (gspca_dev->usb_buf[1] == 0x50))
 588                        sd->adj_colors = 1;
 589                if (gspca_dev->usb_buf[0] == 0x04) {
 590                        sd->do_lcd_stop = 1;
 591                        switch (gspca_dev->usb_buf[1]) {
 592                        case 0x50:
 593                                sd->sensor_type = 0;
 594                                PDEBUG(D_PROBE, "sensor_type corrected to 0");
 595                                break;
 596                        case 0x20:
 597                                /* Nothing to do here. */
 598                                break;
 599                        default:
 600                                pr_err("Unknown VGA Sensor id Byte 1: %02x\n",
 601                                       gspca_dev->usb_buf[1]);
 602                                pr_err("Defaults assumed, may not work\n");
 603                                pr_err("Please report this\n");
 604                        }
 605                }
 606                PDEBUG(D_PROBE, "MR97310A VGA camera detected, sensor: %d",
 607                       sd->sensor_type);
 608        }
 609        /* Stop streaming as we've started it only to probe the sensor type. */
 610        sd_stopN(gspca_dev);
 611
 612        if (force_sensor_type != -1) {
 613                sd->sensor_type = !!force_sensor_type;
 614                PDEBUG(D_PROBE, "Forcing sensor type to: %d",
 615                       sd->sensor_type);
 616        }
 617
 618        /* Setup controls depending on camera type */
 619        if (sd->cam_type == CAM_TYPE_CIF) {
 620                /* No brightness for sensor_type 0 */
 621                if (sd->sensor_type == 0)
 622                        gspca_dev->ctrl_dis = (1 << NORM_BRIGHTNESS_IDX) |
 623                                              (1 << ARGUS_QC_BRIGHTNESS_IDX) |
 624                                              (1 << CONTRAST_IDX) |
 625                                              (1 << SAKAR_CS_GAIN_IDX);
 626                else
 627                        gspca_dev->ctrl_dis = (1 << ARGUS_QC_BRIGHTNESS_IDX) |
 628                                              (1 << CONTRAST_IDX) |
 629                                              (1 << SAKAR_CS_GAIN_IDX) |
 630                                              (1 << MIN_CLOCKDIV_IDX);
 631        } else {
 632                /* All controls need to be disabled if VGA sensor_type is 0 */
 633                if (sd->sensor_type == 0)
 634                        gspca_dev->ctrl_dis = (1 << NORM_BRIGHTNESS_IDX) |
 635                                              (1 << ARGUS_QC_BRIGHTNESS_IDX) |
 636                                              (1 << EXPOSURE_IDX) |
 637                                              (1 << GAIN_IDX) |
 638                                              (1 << CONTRAST_IDX) |
 639                                              (1 << SAKAR_CS_GAIN_IDX) |
 640                                              (1 << MIN_CLOCKDIV_IDX);
 641                else if (sd->sensor_type == 2) {
 642                        gspca_dev->ctrl_dis = (1 << NORM_BRIGHTNESS_IDX) |
 643                                              (1 << ARGUS_QC_BRIGHTNESS_IDX) |
 644                                              (1 << GAIN_IDX) |
 645                                              (1 << MIN_CLOCKDIV_IDX);
 646                        gain_default = MR97310A_CS_GAIN_DEFAULT;
 647                } else if (sd->do_lcd_stop)
 648                        /* Argus QuickClix has different brightness limits */
 649                        gspca_dev->ctrl_dis = (1 << NORM_BRIGHTNESS_IDX) |
 650                                              (1 << CONTRAST_IDX) |
 651                                              (1 << SAKAR_CS_GAIN_IDX);
 652                else
 653                        gspca_dev->ctrl_dis = (1 << ARGUS_QC_BRIGHTNESS_IDX) |
 654                                              (1 << CONTRAST_IDX) |
 655                                              (1 << SAKAR_CS_GAIN_IDX);
 656        }
 657
 658        sd->brightness = MR97310A_BRIGHTNESS_DEFAULT;
 659        sd->exposure = MR97310A_EXPOSURE_DEFAULT;
 660        sd->gain = gain_default;
 661        sd->contrast = MR97310A_CONTRAST_DEFAULT;
 662        sd->min_clockdiv = MR97310A_MIN_CLOCKDIV_DEFAULT;
 663
 664        return 0;
 665}
 666
 667/* this function is called at probe and resume time */
 668static int sd_init(struct gspca_dev *gspca_dev)
 669{
 670        return 0;
 671}
 672
 673static int start_cif_cam(struct gspca_dev *gspca_dev)
 674{
 675        struct sd *sd = (struct sd *) gspca_dev;
 676        __u8 *data = gspca_dev->usb_buf;
 677        int err_code;
 678        static const __u8 startup_string[] = {
 679                0x00,
 680                0x0d,
 681                0x01,
 682                0x00, /* Hsize/8 for 352 or 320 */
 683                0x00, /* Vsize/4 for 288 or 240 */
 684                0x13, /* or 0xbb, depends on sensor */
 685                0x00, /* Hstart, depends on res. */
 686                0x00, /* reserved ? */
 687                0x00, /* Vstart, depends on res. and sensor */
 688                0x50, /* 0x54 to get 176 or 160 */
 689                0xc0
 690        };
 691
 692        /* Note: Some of the above descriptions guessed from MR97113A driver */
 693
 694        memcpy(data, startup_string, 11);
 695        if (sd->sensor_type)
 696                data[5] = 0xbb;
 697
 698        switch (gspca_dev->width) {
 699        case 160:
 700                data[9] |= 0x04;  /* reg 8, 2:1 scale down from 320 */
 701                /* fall thru */
 702        case 320:
 703        default:
 704                data[3] = 0x28;                    /* reg 2, H size/8 */
 705                data[4] = 0x3c;                    /* reg 3, V size/4 */
 706                data[6] = 0x14;                    /* reg 5, H start  */
 707                data[8] = 0x1a + sd->sensor_type;  /* reg 7, V start  */
 708                break;
 709        case 176:
 710                data[9] |= 0x04;  /* reg 8, 2:1 scale down from 352 */
 711                /* fall thru */
 712        case 352:
 713                data[3] = 0x2c;                    /* reg 2, H size/8 */
 714                data[4] = 0x48;                    /* reg 3, V size/4 */
 715                data[6] = 0x06;                    /* reg 5, H start  */
 716                data[8] = 0x06 - sd->sensor_type;  /* reg 7, V start  */
 717                break;
 718        }
 719        err_code = mr_write(gspca_dev, 11);
 720        if (err_code < 0)
 721                return err_code;
 722
 723        if (!sd->sensor_type) {
 724                static const struct sensor_w_data cif_sensor0_init_data[] = {
 725                        {0x02, 0x00, {0x03, 0x5a, 0xb5, 0x01,
 726                                      0x0f, 0x14, 0x0f, 0x10}, 8},
 727                        {0x0c, 0x00, {0x04, 0x01, 0x01, 0x00, 0x1f}, 5},
 728                        {0x12, 0x00, {0x07}, 1},
 729                        {0x1f, 0x00, {0x06}, 1},
 730                        {0x27, 0x00, {0x04}, 1},
 731                        {0x29, 0x00, {0x0c}, 1},
 732                        {0x40, 0x00, {0x40, 0x00, 0x04}, 3},
 733                        {0x50, 0x00, {0x60}, 1},
 734                        {0x60, 0x00, {0x06}, 1},
 735                        {0x6b, 0x00, {0x85, 0x85, 0xc8, 0xc8, 0xc8, 0xc8}, 6},
 736                        {0x72, 0x00, {0x1e, 0x56}, 2},
 737                        {0x75, 0x00, {0x58, 0x40, 0xa2, 0x02, 0x31, 0x02,
 738                                      0x31, 0x80, 0x00}, 9},
 739                        {0x11, 0x00, {0x01}, 1},
 740                        {0, 0, {0}, 0}
 741                };
 742                err_code = sensor_write_regs(gspca_dev, cif_sensor0_init_data,
 743                                         ARRAY_SIZE(cif_sensor0_init_data));
 744        } else {        /* sd->sensor_type = 1 */
 745                static const struct sensor_w_data cif_sensor1_init_data[] = {
 746                        /* Reg 3,4, 7,8 get set by the controls */
 747                        {0x02, 0x00, {0x10}, 1},
 748                        {0x05, 0x01, {0x22}, 1}, /* 5/6 also seen as 65h/32h */
 749                        {0x06, 0x01, {0x00}, 1},
 750                        {0x09, 0x02, {0x0e}, 1},
 751                        {0x0a, 0x02, {0x05}, 1},
 752                        {0x0b, 0x02, {0x05}, 1},
 753                        {0x0c, 0x02, {0x0f}, 1},
 754                        {0x0d, 0x02, {0x07}, 1},
 755                        {0x0e, 0x02, {0x0c}, 1},
 756                        {0x0f, 0x00, {0x00}, 1},
 757                        {0x10, 0x00, {0x06}, 1},
 758                        {0x11, 0x00, {0x07}, 1},
 759                        {0x12, 0x00, {0x00}, 1},
 760                        {0x13, 0x00, {0x01}, 1},
 761                        {0, 0, {0}, 0}
 762                };
 763                /* Without this command the cam won't work with USB-UHCI */
 764                gspca_dev->usb_buf[0] = 0x0a;
 765                gspca_dev->usb_buf[1] = 0x00;
 766                err_code = mr_write(gspca_dev, 2);
 767                if (err_code < 0)
 768                        return err_code;
 769                err_code = sensor_write_regs(gspca_dev, cif_sensor1_init_data,
 770                                         ARRAY_SIZE(cif_sensor1_init_data));
 771        }
 772        return err_code;
 773}
 774
 775static int start_vga_cam(struct gspca_dev *gspca_dev)
 776{
 777        struct sd *sd = (struct sd *) gspca_dev;
 778        __u8 *data = gspca_dev->usb_buf;
 779        int err_code;
 780        static const __u8 startup_string[] =
 781                {0x00, 0x0d, 0x01, 0x00, 0x00, 0x2b, 0x00, 0x00,
 782                 0x00, 0x50, 0xc0};
 783        /* What some of these mean is explained in start_cif_cam(), above */
 784
 785        memcpy(data, startup_string, 11);
 786        if (!sd->sensor_type) {
 787                data[5]  = 0x00;
 788                data[10] = 0x91;
 789        }
 790        if (sd->sensor_type == 2) {
 791                data[5]  = 0x00;
 792                data[10] = 0x18;
 793        }
 794
 795        switch (gspca_dev->width) {
 796        case 160:
 797                data[9] |= 0x0c;  /* reg 8, 4:1 scale down */
 798                /* fall thru */
 799        case 320:
 800                data[9] |= 0x04;  /* reg 8, 2:1 scale down */
 801                /* fall thru */
 802        case 640:
 803        default:
 804                data[3] = 0x50;  /* reg 2, H size/8 */
 805                data[4] = 0x78;  /* reg 3, V size/4 */
 806                data[6] = 0x04;  /* reg 5, H start */
 807                data[8] = 0x03;  /* reg 7, V start */
 808                if (sd->sensor_type == 2) {
 809                        data[6] = 2;
 810                        data[8] = 1;
 811                }
 812                if (sd->do_lcd_stop)
 813                        data[8] = 0x04;  /* Bayer tile shifted */
 814                break;
 815
 816        case 176:
 817                data[9] |= 0x04;  /* reg 8, 2:1 scale down */
 818                /* fall thru */
 819        case 352:
 820                data[3] = 0x2c;  /* reg 2, H size */
 821                data[4] = 0x48;  /* reg 3, V size */
 822                data[6] = 0x94;  /* reg 5, H start */
 823                data[8] = 0x63;  /* reg 7, V start */
 824                if (sd->do_lcd_stop)
 825                        data[8] = 0x64;  /* Bayer tile shifted */
 826                break;
 827        }
 828
 829        err_code = mr_write(gspca_dev, 11);
 830        if (err_code < 0)
 831                return err_code;
 832
 833        if (!sd->sensor_type) {
 834                static const struct sensor_w_data vga_sensor0_init_data[] = {
 835                        {0x01, 0x00, {0x0c, 0x00, 0x04}, 3},
 836                        {0x14, 0x00, {0x01, 0xe4, 0x02, 0x84}, 4},
 837                        {0x20, 0x00, {0x00, 0x80, 0x00, 0x08}, 4},
 838                        {0x25, 0x00, {0x03, 0xa9, 0x80}, 3},
 839                        {0x30, 0x00, {0x30, 0x18, 0x10, 0x18}, 4},
 840                        {0, 0, {0}, 0}
 841                };
 842                err_code = sensor_write_regs(gspca_dev, vga_sensor0_init_data,
 843                                         ARRAY_SIZE(vga_sensor0_init_data));
 844        } else if (sd->sensor_type == 1) {
 845                static const struct sensor_w_data color_adj[] = {
 846                        {0x02, 0x00, {0x06, 0x59, 0x0c, 0x16, 0x00,
 847                                /* adjusted blue, green, red gain correct
 848                                   too much blue from the Sakar Digital */
 849                                0x05, 0x01, 0x04}, 8}
 850                };
 851
 852                static const struct sensor_w_data color_no_adj[] = {
 853                        {0x02, 0x00, {0x06, 0x59, 0x0c, 0x16, 0x00,
 854                                /* default blue, green, red gain settings */
 855                                0x07, 0x00, 0x01}, 8}
 856                };
 857
 858                static const struct sensor_w_data vga_sensor1_init_data[] = {
 859                        {0x11, 0x04, {0x01}, 1},
 860                        {0x0a, 0x00, {0x00, 0x01, 0x00, 0x00, 0x01,
 861                        /* These settings may be better for some cameras */
 862                        /* {0x0a, 0x00, {0x01, 0x06, 0x00, 0x00, 0x01, */
 863                                0x00, 0x0a}, 7},
 864                        {0x11, 0x04, {0x01}, 1},
 865                        {0x12, 0x00, {0x00, 0x63, 0x00, 0x70, 0x00, 0x00}, 6},
 866                        {0x11, 0x04, {0x01}, 1},
 867                        {0, 0, {0}, 0}
 868                };
 869
 870                if (sd->adj_colors)
 871                        err_code = sensor_write_regs(gspca_dev, color_adj,
 872                                         ARRAY_SIZE(color_adj));
 873                else
 874                        err_code = sensor_write_regs(gspca_dev, color_no_adj,
 875                                         ARRAY_SIZE(color_no_adj));
 876
 877                if (err_code < 0)
 878                        return err_code;
 879
 880                err_code = sensor_write_regs(gspca_dev, vga_sensor1_init_data,
 881                                         ARRAY_SIZE(vga_sensor1_init_data));
 882        } else {        /* sensor type == 2 */
 883                static const struct sensor_w_data vga_sensor2_init_data[] = {
 884
 885                        {0x01, 0x00, {0x48}, 1},
 886                        {0x02, 0x00, {0x22}, 1},
 887                        /* Reg 3 msb and 4 is lsb of the exposure setting*/
 888                        {0x05, 0x00, {0x10}, 1},
 889                        {0x06, 0x00, {0x00}, 1},
 890                        {0x07, 0x00, {0x00}, 1},
 891                        {0x08, 0x00, {0x00}, 1},
 892                        {0x09, 0x00, {0x00}, 1},
 893                        /* The following are used in the gain control
 894                         * which is BTW completely borked in the OEM driver
 895                         * The values for each color go from 0 to 0x7ff
 896                         *{0x0a, 0x00, {0x01}, 1},  green1 gain msb
 897                         *{0x0b, 0x00, {0x10}, 1},  green1 gain lsb
 898                         *{0x0c, 0x00, {0x01}, 1},  red gain msb
 899                         *{0x0d, 0x00, {0x10}, 1},  red gain lsb
 900                         *{0x0e, 0x00, {0x01}, 1},  blue gain msb
 901                         *{0x0f, 0x00, {0x10}, 1},  blue gain lsb
 902                         *{0x10, 0x00, {0x01}, 1}, green2 gain msb
 903                         *{0x11, 0x00, {0x10}, 1}, green2 gain lsb
 904                         */
 905                        {0x12, 0x00, {0x00}, 1},
 906                        {0x13, 0x00, {0x04}, 1}, /* weird effect on colors */
 907                        {0x14, 0x00, {0x00}, 1},
 908                        {0x15, 0x00, {0x06}, 1},
 909                        {0x16, 0x00, {0x01}, 1},
 910                        {0x17, 0x00, {0xe2}, 1}, /* vertical alignment */
 911                        {0x18, 0x00, {0x02}, 1},
 912                        {0x19, 0x00, {0x82}, 1}, /* don't mess with */
 913                        {0x1a, 0x00, {0x00}, 1},
 914                        {0x1b, 0x00, {0x20}, 1},
 915                        /* {0x1c, 0x00, {0x17}, 1}, contrast control */
 916                        {0x1d, 0x00, {0x80}, 1}, /* moving causes a mess */
 917                        {0x1e, 0x00, {0x08}, 1}, /* moving jams the camera */
 918                        {0x1f, 0x00, {0x0c}, 1},
 919                        {0x20, 0x00, {0x00}, 1},
 920                        {0, 0, {0}, 0}
 921                };
 922                err_code = sensor_write_regs(gspca_dev, vga_sensor2_init_data,
 923                                         ARRAY_SIZE(vga_sensor2_init_data));
 924        }
 925        return err_code;
 926}
 927
 928static int sd_start(struct gspca_dev *gspca_dev)
 929{
 930        struct sd *sd = (struct sd *) gspca_dev;
 931        int err_code;
 932
 933        sd->sof_read = 0;
 934
 935        /* Some of the VGA cameras require the memory pointer
 936         * to be set to 0 again. We have been forced to start the
 937         * stream in sd_config() to detect the hardware, and closed it.
 938         * Thus, we need here to do a completely fresh and clean start. */
 939        err_code = zero_the_pointer(gspca_dev);
 940        if (err_code < 0)
 941                return err_code;
 942
 943        err_code = stream_start(gspca_dev);
 944        if (err_code < 0)
 945                return err_code;
 946
 947        if (sd->cam_type == CAM_TYPE_CIF) {
 948                err_code = start_cif_cam(gspca_dev);
 949        } else {
 950                err_code = start_vga_cam(gspca_dev);
 951        }
 952        if (err_code < 0)
 953                return err_code;
 954
 955        setbrightness(gspca_dev);
 956        setcontrast(gspca_dev);
 957        setexposure(gspca_dev);
 958        setgain(gspca_dev);
 959
 960        return isoc_enable(gspca_dev);
 961}
 962
 963static void sd_stopN(struct gspca_dev *gspca_dev)
 964{
 965        struct sd *sd = (struct sd *) gspca_dev;
 966
 967        stream_stop(gspca_dev);
 968        /* Not all the cams need this, but even if not, probably a good idea */
 969        zero_the_pointer(gspca_dev);
 970        if (sd->do_lcd_stop)
 971                lcd_stop(gspca_dev);
 972}
 973
 974static void setbrightness(struct gspca_dev *gspca_dev)
 975{
 976        struct sd *sd = (struct sd *) gspca_dev;
 977        u8 val;
 978        u8 sign_reg = 7;  /* This reg and the next one used on CIF cams. */
 979        u8 value_reg = 8; /* VGA cams seem to use regs 0x0b and 0x0c */
 980        static const u8 quick_clix_table[] =
 981        /*        0  1  2   3  4  5  6  7  8  9  10  11  12  13  14  15 */
 982                { 0, 4, 8, 12, 1, 2, 3, 5, 6, 9,  7, 10, 13, 11, 14, 15};
 983        /*
 984         * This control is disabled for CIF type 1 and VGA type 0 cameras.
 985         * It does not quite act linearly for the Argus QuickClix camera,
 986         * but it does control brightness. The values are 0 - 15 only, and
 987         * the table above makes them act consecutively.
 988         */
 989        if ((gspca_dev->ctrl_dis & (1 << NORM_BRIGHTNESS_IDX)) &&
 990            (gspca_dev->ctrl_dis & (1 << ARGUS_QC_BRIGHTNESS_IDX)))
 991                return;
 992
 993        if (sd->cam_type == CAM_TYPE_VGA) {
 994                sign_reg += 4;
 995                value_reg += 4;
 996        }
 997
 998        /* Note register 7 is also seen as 0x8x or 0xCx in some dumps */
 999        if (sd->brightness > 0) {
1000                sensor_write1(gspca_dev, sign_reg, 0x00);
1001                val = sd->brightness;
1002        } else {
1003                sensor_write1(gspca_dev, sign_reg, 0x01);
1004                val = (257 - sd->brightness);
1005        }
1006        /* Use lookup table for funky Argus QuickClix brightness */
1007        if (sd->do_lcd_stop)
1008                val = quick_clix_table[val];
1009
1010        sensor_write1(gspca_dev, value_reg, val);
1011}
1012
1013static void setexposure(struct gspca_dev *gspca_dev)
1014{
1015        struct sd *sd = (struct sd *) gspca_dev;
1016        int exposure = MR97310A_EXPOSURE_DEFAULT;
1017        u8 buf[2];
1018
1019        if (gspca_dev->ctrl_dis & (1 << EXPOSURE_IDX))
1020                return;
1021
1022        if (sd->cam_type == CAM_TYPE_CIF && sd->sensor_type == 1) {
1023                /* This cam does not like exposure settings < 300,
1024                   so scale 0 - 4095 to 300 - 4095 */
1025                exposure = (sd->exposure * 9267) / 10000 + 300;
1026                sensor_write1(gspca_dev, 3, exposure >> 4);
1027                sensor_write1(gspca_dev, 4, exposure & 0x0f);
1028        } else if (sd->sensor_type == 2) {
1029                exposure = sd->exposure;
1030                exposure >>= 3;
1031                sensor_write1(gspca_dev, 3, exposure >> 8);
1032                sensor_write1(gspca_dev, 4, exposure & 0xff);
1033        } else {
1034                /* We have both a clock divider and an exposure register.
1035                   We first calculate the clock divider, as that determines
1036                   the maximum exposure and then we calculate the exposure
1037                   register setting (which goes from 0 - 511).
1038
1039                   Note our 0 - 4095 exposure is mapped to 0 - 511
1040                   milliseconds exposure time */
1041                u8 clockdiv = (60 * sd->exposure + 7999) / 8000;
1042
1043                /* Limit framerate to not exceed usb bandwidth */
1044                if (clockdiv < sd->min_clockdiv && gspca_dev->width >= 320)
1045                        clockdiv = sd->min_clockdiv;
1046                else if (clockdiv < 2)
1047                        clockdiv = 2;
1048
1049                if (sd->cam_type == CAM_TYPE_VGA && clockdiv < 4)
1050                        clockdiv = 4;
1051
1052                /* Frame exposure time in ms = 1000 * clockdiv / 60 ->
1053                exposure = (sd->exposure / 8) * 511 / (1000 * clockdiv / 60) */
1054                exposure = (60 * 511 * sd->exposure) / (8000 * clockdiv);
1055                if (exposure > 511)
1056                        exposure = 511;
1057
1058                /* exposure register value is reversed! */
1059                exposure = 511 - exposure;
1060
1061                buf[0] = exposure & 0xff;
1062                buf[1] = exposure >> 8;
1063                sensor_write_reg(gspca_dev, 0x0e, 0, buf, 2);
1064                sensor_write1(gspca_dev, 0x02, clockdiv);
1065        }
1066}
1067
1068static void setgain(struct gspca_dev *gspca_dev)
1069{
1070        struct sd *sd = (struct sd *) gspca_dev;
1071        u8 gainreg;
1072
1073        if ((gspca_dev->ctrl_dis & (1 << GAIN_IDX)) &&
1074            (gspca_dev->ctrl_dis & (1 << SAKAR_CS_GAIN_IDX)))
1075                return;
1076
1077        if (sd->cam_type == CAM_TYPE_CIF && sd->sensor_type == 1)
1078                sensor_write1(gspca_dev, 0x0e, sd->gain);
1079        else if (sd->cam_type == CAM_TYPE_VGA && sd->sensor_type == 2)
1080                for (gainreg = 0x0a; gainreg < 0x11; gainreg += 2) {
1081                        sensor_write1(gspca_dev, gainreg, sd->gain >> 8);
1082                        sensor_write1(gspca_dev, gainreg + 1, sd->gain & 0xff);
1083                }
1084        else
1085                sensor_write1(gspca_dev, 0x10, sd->gain);
1086}
1087
1088static void setcontrast(struct gspca_dev *gspca_dev)
1089{
1090        struct sd *sd = (struct sd *) gspca_dev;
1091
1092        if (gspca_dev->ctrl_dis & (1 << CONTRAST_IDX))
1093                return;
1094
1095        sensor_write1(gspca_dev, 0x1c, sd->contrast);
1096}
1097
1098
1099static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
1100{
1101        struct sd *sd = (struct sd *) gspca_dev;
1102
1103        sd->brightness = val;
1104        if (gspca_dev->streaming)
1105                setbrightness(gspca_dev);
1106        return 0;
1107}
1108
1109static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val)
1110{
1111        struct sd *sd = (struct sd *) gspca_dev;
1112
1113        *val = sd->brightness;
1114        return 0;
1115}
1116
1117static int sd_setexposure(struct gspca_dev *gspca_dev, __s32 val)
1118{
1119        struct sd *sd = (struct sd *) gspca_dev;
1120
1121        sd->exposure = val;
1122        if (gspca_dev->streaming)
1123                setexposure(gspca_dev);
1124        return 0;
1125}
1126
1127static int sd_getexposure(struct gspca_dev *gspca_dev, __s32 *val)
1128{
1129        struct sd *sd = (struct sd *) gspca_dev;
1130
1131        *val = sd->exposure;
1132        return 0;
1133}
1134
1135static int sd_setgain(struct gspca_dev *gspca_dev, __s32 val)
1136{
1137        struct sd *sd = (struct sd *) gspca_dev;
1138
1139        sd->gain = val;
1140        if (gspca_dev->streaming)
1141                setgain(gspca_dev);
1142        return 0;
1143}
1144
1145static int sd_getgain(struct gspca_dev *gspca_dev, __s32 *val)
1146{
1147        struct sd *sd = (struct sd *) gspca_dev;
1148
1149        *val = sd->gain;
1150        return 0;
1151}
1152
1153static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val)
1154{
1155        struct sd *sd = (struct sd *) gspca_dev;
1156
1157        sd->contrast = val;
1158        if (gspca_dev->streaming)
1159                setcontrast(gspca_dev);
1160        return 0;
1161}
1162
1163
1164static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val)
1165{
1166        struct sd *sd = (struct sd *) gspca_dev;
1167
1168        *val = sd->contrast;
1169        return 0;
1170}
1171
1172static int sd_setmin_clockdiv(struct gspca_dev *gspca_dev, __s32 val)
1173{
1174        struct sd *sd = (struct sd *) gspca_dev;
1175
1176        sd->min_clockdiv = val;
1177        if (gspca_dev->streaming)
1178                setexposure(gspca_dev);
1179        return 0;
1180}
1181
1182static int sd_getmin_clockdiv(struct gspca_dev *gspca_dev, __s32 *val)
1183{
1184        struct sd *sd = (struct sd *) gspca_dev;
1185
1186        *val = sd->min_clockdiv;
1187        return 0;
1188}
1189
1190/* Include pac common sof detection functions */
1191#include "pac_common.h"
1192
1193static void sd_pkt_scan(struct gspca_dev *gspca_dev,
1194                        u8 *data,               /* isoc packet */
1195                        int len)                /* iso packet length */
1196{
1197        struct sd *sd = (struct sd *) gspca_dev;
1198        unsigned char *sof;
1199
1200        sof = pac_find_sof(&sd->sof_read, data, len);
1201        if (sof) {
1202                int n;
1203
1204                /* finish decoding current frame */
1205                n = sof - data;
1206                if (n > sizeof pac_sof_marker)
1207                        n -= sizeof pac_sof_marker;
1208                else
1209                        n = 0;
1210                gspca_frame_add(gspca_dev, LAST_PACKET,
1211                                        data, n);
1212                /* Start next frame. */
1213                gspca_frame_add(gspca_dev, FIRST_PACKET,
1214                        pac_sof_marker, sizeof pac_sof_marker);
1215                len -= sof - data;
1216                data = sof;
1217        }
1218        gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
1219}
1220
1221/* sub-driver description */
1222static const struct sd_desc sd_desc = {
1223        .name = MODULE_NAME,
1224        .ctrls = sd_ctrls,
1225        .nctrls = ARRAY_SIZE(sd_ctrls),
1226        .config = sd_config,
1227        .init = sd_init,
1228        .start = sd_start,
1229        .stopN = sd_stopN,
1230        .pkt_scan = sd_pkt_scan,
1231};
1232
1233/* -- module initialisation -- */
1234static const struct usb_device_id device_table[] = {
1235        {USB_DEVICE(0x08ca, 0x0110)},   /* Trust Spyc@m 100 */
1236        {USB_DEVICE(0x08ca, 0x0111)},   /* Aiptek Pencam VGA+ */
1237        {USB_DEVICE(0x093a, 0x010f)},   /* All other known MR97310A VGA cams */
1238        {USB_DEVICE(0x093a, 0x010e)},   /* All known MR97310A CIF cams */
1239        {}
1240};
1241MODULE_DEVICE_TABLE(usb, device_table);
1242
1243/* -- device connect -- */
1244static int sd_probe(struct usb_interface *intf,
1245                    const struct usb_device_id *id)
1246{
1247        return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
1248                               THIS_MODULE);
1249}
1250
1251static struct usb_driver sd_driver = {
1252        .name = MODULE_NAME,
1253        .id_table = device_table,
1254        .probe = sd_probe,
1255        .disconnect = gspca_disconnect,
1256#ifdef CONFIG_PM
1257        .suspend = gspca_suspend,
1258        .resume = gspca_resume,
1259#endif
1260};
1261
1262module_usb_driver(sd_driver);
1263