linux/drivers/media/usb/gspca/spca500.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * SPCA500 chip based cameras initialization data
   4 *
   5 * V4L2 by Jean-Francois Moine <http://moinejf.free.fr>
   6 */
   7
   8#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
   9
  10#define MODULE_NAME "spca500"
  11
  12#include "gspca.h"
  13#include "jpeg.h"
  14
  15MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
  16MODULE_DESCRIPTION("GSPCA/SPCA500 USB Camera Driver");
  17MODULE_LICENSE("GPL");
  18
  19#define QUALITY 85
  20
  21/* specific webcam descriptor */
  22struct sd {
  23        struct gspca_dev gspca_dev;             /* !! must be the first item */
  24
  25        char subtype;
  26#define AgfaCl20 0
  27#define AiptekPocketDV 1
  28#define BenqDC1016 2
  29#define CreativePCCam300 3
  30#define DLinkDSC350 4
  31#define Gsmartmini 5
  32#define IntelPocketPCCamera 6
  33#define KodakEZ200 7
  34#define LogitechClickSmart310 8
  35#define LogitechClickSmart510 9
  36#define LogitechTraveler 10
  37#define MustekGsmart300 11
  38#define Optimedia 12
  39#define PalmPixDC85 13
  40#define ToptroIndus 14
  41
  42        u8 jpeg_hdr[JPEG_HDR_SZ];
  43};
  44
  45static const struct v4l2_pix_format vga_mode[] = {
  46        {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
  47                .bytesperline = 320,
  48                .sizeimage = 320 * 240 * 3 / 8 + 590,
  49                .colorspace = V4L2_COLORSPACE_JPEG,
  50                .priv = 1},
  51        {640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
  52                .bytesperline = 640,
  53                .sizeimage = 640 * 480 * 3 / 8 + 590,
  54                .colorspace = V4L2_COLORSPACE_JPEG,
  55                .priv = 0},
  56};
  57
  58static const struct v4l2_pix_format sif_mode[] = {
  59        {176, 144, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
  60                .bytesperline = 176,
  61                .sizeimage = 176 * 144 * 3 / 8 + 590,
  62                .colorspace = V4L2_COLORSPACE_JPEG,
  63                .priv = 1},
  64        {352, 288, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
  65                .bytesperline = 352,
  66                .sizeimage = 352 * 288 * 3 / 8 + 590,
  67                .colorspace = V4L2_COLORSPACE_JPEG,
  68                .priv = 0},
  69};
  70
  71/* Frame packet header offsets for the spca500 */
  72#define SPCA500_OFFSET_PADDINGLB 2
  73#define SPCA500_OFFSET_PADDINGHB 3
  74#define SPCA500_OFFSET_MODE      4
  75#define SPCA500_OFFSET_IMGWIDTH  5
  76#define SPCA500_OFFSET_IMGHEIGHT 6
  77#define SPCA500_OFFSET_IMGMODE   7
  78#define SPCA500_OFFSET_QTBLINDEX 8
  79#define SPCA500_OFFSET_FRAMSEQ   9
  80#define SPCA500_OFFSET_CDSPINFO  10
  81#define SPCA500_OFFSET_GPIO      11
  82#define SPCA500_OFFSET_AUGPIO    12
  83#define SPCA500_OFFSET_DATA      16
  84
  85
  86static const __u16 spca500_visual_defaults[][3] = {
  87        {0x00, 0x0003, 0x816b}, /* SSI not active sync with vsync,
  88                                 * hue (H byte) = 0,
  89                                 * saturation/hue enable,
  90                                 * brightness/contrast enable.
  91                                 */
  92        {0x00, 0x0000, 0x8167}, /* brightness = 0 */
  93        {0x00, 0x0020, 0x8168}, /* contrast = 0 */
  94        {0x00, 0x0003, 0x816b}, /* SSI not active sync with vsync,
  95                                 * hue (H byte) = 0, saturation/hue enable,
  96                                 * brightness/contrast enable.
  97                                 * was 0x0003, now 0x0000.
  98                                 */
  99        {0x00, 0x0000, 0x816a}, /* hue (L byte) = 0 */
 100        {0x00, 0x0020, 0x8169}, /* saturation = 0x20 */
 101        {0x00, 0x0050, 0x8157}, /* edge gain high threshold */
 102        {0x00, 0x0030, 0x8158}, /* edge gain low threshold */
 103        {0x00, 0x0028, 0x8159}, /* edge bandwidth high threshold */
 104        {0x00, 0x000a, 0x815a}, /* edge bandwidth low threshold */
 105        {0x00, 0x0001, 0x8202}, /* clock rate compensation = 1/25 sec/frame */
 106        {0x0c, 0x0004, 0x0000},
 107        /* set interface */
 108        {}
 109};
 110static const __u16 Clicksmart510_defaults[][3] = {
 111        {0x00, 0x00, 0x8211},
 112        {0x00, 0x01, 0x82c0},
 113        {0x00, 0x10, 0x82cb},
 114        {0x00, 0x0f, 0x800d},
 115        {0x00, 0x82, 0x8225},
 116        {0x00, 0x21, 0x8228},
 117        {0x00, 0x00, 0x8203},
 118        {0x00, 0x00, 0x8204},
 119        {0x00, 0x08, 0x8205},
 120        {0x00, 0xf8, 0x8206},
 121        {0x00, 0x28, 0x8207},
 122        {0x00, 0xa0, 0x8208},
 123        {0x00, 0x08, 0x824a},
 124        {0x00, 0x08, 0x8214},
 125        {0x00, 0x80, 0x82c1},
 126        {0x00, 0x00, 0x82c2},
 127        {0x00, 0x00, 0x82ca},
 128        {0x00, 0x80, 0x82c1},
 129        {0x00, 0x04, 0x82c2},
 130        {0x00, 0x00, 0x82ca},
 131        {0x00, 0xfc, 0x8100},
 132        {0x00, 0xfc, 0x8105},
 133        {0x00, 0x30, 0x8101},
 134        {0x00, 0x00, 0x8102},
 135        {0x00, 0x00, 0x8103},
 136        {0x00, 0x66, 0x8107},
 137        {0x00, 0x00, 0x816b},
 138        {0x00, 0x00, 0x8155},
 139        {0x00, 0x01, 0x8156},
 140        {0x00, 0x60, 0x8157},
 141        {0x00, 0x40, 0x8158},
 142        {0x00, 0x0a, 0x8159},
 143        {0x00, 0x06, 0x815a},
 144        {0x00, 0x00, 0x813f},
 145        {0x00, 0x00, 0x8200},
 146        {0x00, 0x19, 0x8201},
 147        {0x00, 0x00, 0x82c1},
 148        {0x00, 0xa0, 0x82c2},
 149        {0x00, 0x00, 0x82ca},
 150        {0x00, 0x00, 0x8117},
 151        {0x00, 0x00, 0x8118},
 152        {0x00, 0x65, 0x8119},
 153        {0x00, 0x00, 0x811a},
 154        {0x00, 0x00, 0x811b},
 155        {0x00, 0x55, 0x811c},
 156        {0x00, 0x65, 0x811d},
 157        {0x00, 0x55, 0x811e},
 158        {0x00, 0x16, 0x811f},
 159        {0x00, 0x19, 0x8120},
 160        {0x00, 0x80, 0x8103},
 161        {0x00, 0x83, 0x816b},
 162        {0x00, 0x25, 0x8168},
 163        {0x00, 0x01, 0x820f},
 164        {0x00, 0xff, 0x8115},
 165        {0x00, 0x48, 0x8116},
 166        {0x00, 0x50, 0x8151},
 167        {0x00, 0x40, 0x8152},
 168        {0x00, 0x78, 0x8153},
 169        {0x00, 0x40, 0x8154},
 170        {0x00, 0x00, 0x8167},
 171        {0x00, 0x20, 0x8168},
 172        {0x00, 0x00, 0x816a},
 173        {0x00, 0x03, 0x816b},
 174        {0x00, 0x20, 0x8169},
 175        {0x00, 0x60, 0x8157},
 176        {0x00, 0x00, 0x8190},
 177        {0x00, 0x00, 0x81a1},
 178        {0x00, 0x00, 0x81b2},
 179        {0x00, 0x27, 0x8191},
 180        {0x00, 0x27, 0x81a2},
 181        {0x00, 0x27, 0x81b3},
 182        {0x00, 0x4b, 0x8192},
 183        {0x00, 0x4b, 0x81a3},
 184        {0x00, 0x4b, 0x81b4},
 185        {0x00, 0x66, 0x8193},
 186        {0x00, 0x66, 0x81a4},
 187        {0x00, 0x66, 0x81b5},
 188        {0x00, 0x79, 0x8194},
 189        {0x00, 0x79, 0x81a5},
 190        {0x00, 0x79, 0x81b6},
 191        {0x00, 0x8a, 0x8195},
 192        {0x00, 0x8a, 0x81a6},
 193        {0x00, 0x8a, 0x81b7},
 194        {0x00, 0x9b, 0x8196},
 195        {0x00, 0x9b, 0x81a7},
 196        {0x00, 0x9b, 0x81b8},
 197        {0x00, 0xa6, 0x8197},
 198        {0x00, 0xa6, 0x81a8},
 199        {0x00, 0xa6, 0x81b9},
 200        {0x00, 0xb2, 0x8198},
 201        {0x00, 0xb2, 0x81a9},
 202        {0x00, 0xb2, 0x81ba},
 203        {0x00, 0xbe, 0x8199},
 204        {0x00, 0xbe, 0x81aa},
 205        {0x00, 0xbe, 0x81bb},
 206        {0x00, 0xc8, 0x819a},
 207        {0x00, 0xc8, 0x81ab},
 208        {0x00, 0xc8, 0x81bc},
 209        {0x00, 0xd2, 0x819b},
 210        {0x00, 0xd2, 0x81ac},
 211        {0x00, 0xd2, 0x81bd},
 212        {0x00, 0xdb, 0x819c},
 213        {0x00, 0xdb, 0x81ad},
 214        {0x00, 0xdb, 0x81be},
 215        {0x00, 0xe4, 0x819d},
 216        {0x00, 0xe4, 0x81ae},
 217        {0x00, 0xe4, 0x81bf},
 218        {0x00, 0xed, 0x819e},
 219        {0x00, 0xed, 0x81af},
 220        {0x00, 0xed, 0x81c0},
 221        {0x00, 0xf7, 0x819f},
 222        {0x00, 0xf7, 0x81b0},
 223        {0x00, 0xf7, 0x81c1},
 224        {0x00, 0xff, 0x81a0},
 225        {0x00, 0xff, 0x81b1},
 226        {0x00, 0xff, 0x81c2},
 227        {0x00, 0x03, 0x8156},
 228        {0x00, 0x00, 0x8211},
 229        {0x00, 0x20, 0x8168},
 230        {0x00, 0x01, 0x8202},
 231        {0x00, 0x30, 0x8101},
 232        {0x00, 0x00, 0x8111},
 233        {0x00, 0x00, 0x8112},
 234        {0x00, 0x00, 0x8113},
 235        {0x00, 0x00, 0x8114},
 236        {}
 237};
 238
 239static const __u8 qtable_creative_pccam[2][64] = {
 240        {                               /* Q-table Y-components */
 241         0x05, 0x03, 0x03, 0x05, 0x07, 0x0c, 0x0f, 0x12,
 242         0x04, 0x04, 0x04, 0x06, 0x08, 0x11, 0x12, 0x11,
 243         0x04, 0x04, 0x05, 0x07, 0x0c, 0x11, 0x15, 0x11,
 244         0x04, 0x05, 0x07, 0x09, 0x0f, 0x1a, 0x18, 0x13,
 245         0x05, 0x07, 0x0b, 0x11, 0x14, 0x21, 0x1f, 0x17,
 246         0x07, 0x0b, 0x11, 0x13, 0x18, 0x1f, 0x22, 0x1c,
 247         0x0f, 0x13, 0x17, 0x1a, 0x1f, 0x24, 0x24, 0x1e,
 248         0x16, 0x1c, 0x1d, 0x1d, 0x22, 0x1e, 0x1f, 0x1e},
 249        {                               /* Q-table C-components */
 250         0x05, 0x05, 0x07, 0x0e, 0x1e, 0x1e, 0x1e, 0x1e,
 251         0x05, 0x06, 0x08, 0x14, 0x1e, 0x1e, 0x1e, 0x1e,
 252         0x07, 0x08, 0x11, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
 253         0x0e, 0x14, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
 254         0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
 255         0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
 256         0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
 257         0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e}
 258};
 259
 260static const __u8 qtable_kodak_ez200[2][64] = {
 261        {                               /* Q-table Y-components */
 262         0x02, 0x01, 0x01, 0x02, 0x02, 0x04, 0x05, 0x06,
 263         0x01, 0x01, 0x01, 0x02, 0x03, 0x06, 0x06, 0x06,
 264         0x01, 0x01, 0x02, 0x02, 0x04, 0x06, 0x07, 0x06,
 265         0x01, 0x02, 0x02, 0x03, 0x05, 0x09, 0x08, 0x06,
 266         0x02, 0x02, 0x04, 0x06, 0x07, 0x0b, 0x0a, 0x08,
 267         0x02, 0x04, 0x06, 0x06, 0x08, 0x0a, 0x0b, 0x09,
 268         0x05, 0x06, 0x08, 0x09, 0x0a, 0x0c, 0x0c, 0x0a,
 269         0x07, 0x09, 0x0a, 0x0a, 0x0b, 0x0a, 0x0a, 0x0a},
 270        {                               /* Q-table C-components */
 271         0x02, 0x02, 0x02, 0x05, 0x0a, 0x0a, 0x0a, 0x0a,
 272         0x02, 0x02, 0x03, 0x07, 0x0a, 0x0a, 0x0a, 0x0a,
 273         0x02, 0x03, 0x06, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
 274         0x05, 0x07, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
 275         0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
 276         0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
 277         0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
 278         0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a}
 279};
 280
 281static const __u8 qtable_pocketdv[2][64] = {
 282        {               /* Q-table Y-components start registers 0x8800 */
 283         0x06, 0x04, 0x04, 0x06, 0x0a, 0x10, 0x14, 0x18,
 284         0x05, 0x05, 0x06, 0x08, 0x0a, 0x17, 0x18, 0x16,
 285         0x06, 0x05, 0x06, 0x0a, 0x10, 0x17, 0x1c, 0x16,
 286         0x06, 0x07, 0x09, 0x0c, 0x14, 0x23, 0x20, 0x19,
 287         0x07, 0x09, 0x0f, 0x16, 0x1b, 0x2c, 0x29, 0x1f,
 288         0x0a, 0x0e, 0x16, 0x1a, 0x20, 0x2a, 0x2d, 0x25,
 289         0x14, 0x1a, 0x1f, 0x23, 0x29, 0x30, 0x30, 0x28,
 290         0x1d, 0x25, 0x26, 0x27, 0x2d, 0x28, 0x29, 0x28,
 291         },
 292        {               /* Q-table C-components start registers 0x8840 */
 293         0x07, 0x07, 0x0a, 0x13, 0x28, 0x28, 0x28, 0x28,
 294         0x07, 0x08, 0x0a, 0x1a, 0x28, 0x28, 0x28, 0x28,
 295         0x0a, 0x0a, 0x16, 0x28, 0x28, 0x28, 0x28, 0x28,
 296         0x13, 0x1a, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
 297         0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
 298         0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
 299         0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
 300         0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28}
 301};
 302
 303/* read 'len' bytes to gspca_dev->usb_buf */
 304static void reg_r(struct gspca_dev *gspca_dev,
 305                  __u16 index,
 306                  __u16 length)
 307{
 308        usb_control_msg(gspca_dev->dev,
 309                        usb_rcvctrlpipe(gspca_dev->dev, 0),
 310                        0,
 311                        USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 312                        0,              /* value */
 313                        index, gspca_dev->usb_buf, length, 500);
 314}
 315
 316static int reg_w(struct gspca_dev *gspca_dev,
 317                     __u16 req, __u16 index, __u16 value)
 318{
 319        int ret;
 320
 321        gspca_dbg(gspca_dev, D_USBO, "reg write: [0x%02x] = 0x%02x\n",
 322                  index, value);
 323        ret = usb_control_msg(gspca_dev->dev,
 324                        usb_sndctrlpipe(gspca_dev->dev, 0),
 325                        req,
 326                        USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 327                        value, index, NULL, 0, 500);
 328        if (ret < 0)
 329                pr_err("reg write: error %d\n", ret);
 330        return ret;
 331}
 332
 333/* returns: negative is error, pos or zero is data */
 334static int reg_r_12(struct gspca_dev *gspca_dev,
 335                        __u16 req,      /* bRequest */
 336                        __u16 index,    /* wIndex */
 337                        __u16 length)   /* wLength (1 or 2 only) */
 338{
 339        int ret;
 340
 341        gspca_dev->usb_buf[1] = 0;
 342        ret = usb_control_msg(gspca_dev->dev,
 343                        usb_rcvctrlpipe(gspca_dev->dev, 0),
 344                        req,
 345                        USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 346                        0,              /* value */
 347                        index,
 348                        gspca_dev->usb_buf, length,
 349                        500);           /* timeout */
 350        if (ret < 0) {
 351                pr_err("reg_r_12 err %d\n", ret);
 352                return ret;
 353        }
 354        return (gspca_dev->usb_buf[1] << 8) + gspca_dev->usb_buf[0];
 355}
 356
 357/*
 358 * Simple function to wait for a given 8-bit value to be returned from
 359 * a reg_read call.
 360 * Returns: negative is error or timeout, zero is success.
 361 */
 362static int reg_r_wait(struct gspca_dev *gspca_dev,
 363                        __u16 reg, __u16 index, __u16 value)
 364{
 365        int ret, cnt = 20;
 366
 367        while (--cnt > 0) {
 368                ret = reg_r_12(gspca_dev, reg, index, 1);
 369                if (ret == value)
 370                        return 0;
 371                msleep(50);
 372        }
 373        return -EIO;
 374}
 375
 376static int write_vector(struct gspca_dev *gspca_dev,
 377                        const __u16 data[][3])
 378{
 379        int ret, i = 0;
 380
 381        while (data[i][0] != 0 || data[i][1] != 0 || data[i][2] != 0) {
 382                ret = reg_w(gspca_dev, data[i][0], data[i][2], data[i][1]);
 383                if (ret < 0)
 384                        return ret;
 385                i++;
 386        }
 387        return 0;
 388}
 389
 390static int spca50x_setup_qtable(struct gspca_dev *gspca_dev,
 391                                unsigned int request,
 392                                unsigned int ybase,
 393                                unsigned int cbase,
 394                                const __u8 qtable[2][64])
 395{
 396        int i, err;
 397
 398        /* loop over y components */
 399        for (i = 0; i < 64; i++) {
 400                err = reg_w(gspca_dev, request, ybase + i, qtable[0][i]);
 401                if (err < 0)
 402                        return err;
 403        }
 404
 405        /* loop over c components */
 406        for (i = 0; i < 64; i++) {
 407                err = reg_w(gspca_dev, request, cbase + i, qtable[1][i]);
 408                if (err < 0)
 409                        return err;
 410        }
 411        return 0;
 412}
 413
 414static void spca500_ping310(struct gspca_dev *gspca_dev)
 415{
 416        reg_r(gspca_dev, 0x0d04, 2);
 417        gspca_dbg(gspca_dev, D_STREAM, "ClickSmart310 ping 0x0d04 0x%02x 0x%02x\n",
 418                  gspca_dev->usb_buf[0], gspca_dev->usb_buf[1]);
 419}
 420
 421static void spca500_clksmart310_init(struct gspca_dev *gspca_dev)
 422{
 423        reg_r(gspca_dev, 0x0d05, 2);
 424        gspca_dbg(gspca_dev, D_STREAM, "ClickSmart310 init 0x0d05 0x%02x 0x%02x\n",
 425                  gspca_dev->usb_buf[0], gspca_dev->usb_buf[1]);
 426        reg_w(gspca_dev, 0x00, 0x8167, 0x5a);
 427        spca500_ping310(gspca_dev);
 428
 429        reg_w(gspca_dev, 0x00, 0x8168, 0x22);
 430        reg_w(gspca_dev, 0x00, 0x816a, 0xc0);
 431        reg_w(gspca_dev, 0x00, 0x816b, 0x0b);
 432        reg_w(gspca_dev, 0x00, 0x8169, 0x25);
 433        reg_w(gspca_dev, 0x00, 0x8157, 0x5b);
 434        reg_w(gspca_dev, 0x00, 0x8158, 0x5b);
 435        reg_w(gspca_dev, 0x00, 0x813f, 0x03);
 436        reg_w(gspca_dev, 0x00, 0x8151, 0x4a);
 437        reg_w(gspca_dev, 0x00, 0x8153, 0x78);
 438        reg_w(gspca_dev, 0x00, 0x0d01, 0x04);
 439                                                /* 00 for adjust shutter */
 440        reg_w(gspca_dev, 0x00, 0x0d02, 0x01);
 441        reg_w(gspca_dev, 0x00, 0x8169, 0x25);
 442        reg_w(gspca_dev, 0x00, 0x0d01, 0x02);
 443}
 444
 445static void spca500_setmode(struct gspca_dev *gspca_dev,
 446                        __u8 xmult, __u8 ymult)
 447{
 448        int mode;
 449
 450        /* set x multiplier */
 451        reg_w(gspca_dev, 0, 0x8001, xmult);
 452
 453        /* set y multiplier */
 454        reg_w(gspca_dev, 0, 0x8002, ymult);
 455
 456        /* use compressed mode, VGA, with mode specific subsample */
 457        mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
 458        reg_w(gspca_dev, 0, 0x8003, mode << 4);
 459}
 460
 461static int spca500_full_reset(struct gspca_dev *gspca_dev)
 462{
 463        int err;
 464
 465        /* send the reset command */
 466        err = reg_w(gspca_dev, 0xe0, 0x0001, 0x0000);
 467        if (err < 0)
 468                return err;
 469
 470        /* wait for the reset to complete */
 471        err = reg_r_wait(gspca_dev, 0x06, 0x0000, 0x0000);
 472        if (err < 0)
 473                return err;
 474        err = reg_w(gspca_dev, 0xe0, 0x0000, 0x0000);
 475        if (err < 0)
 476                return err;
 477        err = reg_r_wait(gspca_dev, 0x06, 0, 0);
 478        if (err < 0) {
 479                gspca_err(gspca_dev, "reg_r_wait() failed\n");
 480                return err;
 481        }
 482        /* all ok */
 483        return 0;
 484}
 485
 486/* Synchro the Bridge with sensor */
 487/* Maybe that will work on all spca500 chip */
 488/* because i only own a clicksmart310 try for that chip */
 489/* using spca50x_set_packet_size() cause an Ooops here */
 490/* usb_set_interface from kernel 2.6.x clear all the urb stuff */
 491/* up-port the same feature as in 2.4.x kernel */
 492static int spca500_synch310(struct gspca_dev *gspca_dev)
 493{
 494        if (usb_set_interface(gspca_dev->dev, gspca_dev->iface, 0) < 0) {
 495                gspca_err(gspca_dev, "Set packet size: set interface error\n");
 496                goto error;
 497        }
 498        spca500_ping310(gspca_dev);
 499
 500        reg_r(gspca_dev, 0x0d00, 1);
 501
 502        /* need alt setting here */
 503        gspca_dbg(gspca_dev, D_PACK, "ClickSmart310 sync alt: %d\n",
 504                  gspca_dev->alt);
 505
 506        /* Windoze use pipe with altsetting 6 why 7 here */
 507        if (usb_set_interface(gspca_dev->dev,
 508                                gspca_dev->iface,
 509                                gspca_dev->alt) < 0) {
 510                gspca_err(gspca_dev, "Set packet size: set interface error\n");
 511                goto error;
 512        }
 513        return 0;
 514error:
 515        return -EBUSY;
 516}
 517
 518static void spca500_reinit(struct gspca_dev *gspca_dev)
 519{
 520        int err;
 521        __u8 Data;
 522
 523        /* some unknown command from Aiptek pocket dv and family300 */
 524
 525        reg_w(gspca_dev, 0x00, 0x0d01, 0x01);
 526        reg_w(gspca_dev, 0x00, 0x0d03, 0x00);
 527        reg_w(gspca_dev, 0x00, 0x0d02, 0x01);
 528
 529        /* enable drop packet */
 530        reg_w(gspca_dev, 0x00, 0x850a, 0x0001);
 531
 532        err = spca50x_setup_qtable(gspca_dev, 0x00, 0x8800, 0x8840,
 533                                 qtable_pocketdv);
 534        if (err < 0)
 535                gspca_err(gspca_dev, "spca50x_setup_qtable failed on init\n");
 536
 537        /* set qtable index */
 538        reg_w(gspca_dev, 0x00, 0x8880, 2);
 539        /* family cam Quicksmart stuff */
 540        reg_w(gspca_dev, 0x00, 0x800a, 0x00);
 541        /* Set agc transfer: synced between frames */
 542        reg_w(gspca_dev, 0x00, 0x820f, 0x01);
 543        /* Init SDRAM - needed for SDRAM access */
 544        reg_w(gspca_dev, 0x00, 0x870a, 0x04);
 545        /*Start init sequence or stream */
 546        reg_w(gspca_dev, 0, 0x8003, 0x00);
 547        /* switch to video camera mode */
 548        reg_w(gspca_dev, 0x00, 0x8000, 0x0004);
 549        msleep(2000);
 550        if (reg_r_wait(gspca_dev, 0, 0x8000, 0x44) != 0) {
 551                reg_r(gspca_dev, 0x816b, 1);
 552                Data = gspca_dev->usb_buf[0];
 553                reg_w(gspca_dev, 0x00, 0x816b, Data);
 554        }
 555}
 556
 557/* this function is called at probe time */
 558static int sd_config(struct gspca_dev *gspca_dev,
 559                        const struct usb_device_id *id)
 560{
 561        struct sd *sd = (struct sd *) gspca_dev;
 562        struct cam *cam;
 563
 564        cam = &gspca_dev->cam;
 565        sd->subtype = id->driver_info;
 566        if (sd->subtype != LogitechClickSmart310) {
 567                cam->cam_mode = vga_mode;
 568                cam->nmodes = ARRAY_SIZE(vga_mode);
 569        } else {
 570                cam->cam_mode = sif_mode;
 571                cam->nmodes = ARRAY_SIZE(sif_mode);
 572        }
 573        return 0;
 574}
 575
 576/* this function is called at probe and resume time */
 577static int sd_init(struct gspca_dev *gspca_dev)
 578{
 579        struct sd *sd = (struct sd *) gspca_dev;
 580
 581        /* initialisation of spca500 based cameras is deferred */
 582        gspca_dbg(gspca_dev, D_STREAM, "SPCA500 init\n");
 583        if (sd->subtype == LogitechClickSmart310)
 584                spca500_clksmart310_init(gspca_dev);
 585/*      else
 586                spca500_initialise(gspca_dev); */
 587        gspca_dbg(gspca_dev, D_STREAM, "SPCA500 init done\n");
 588        return 0;
 589}
 590
 591static int sd_start(struct gspca_dev *gspca_dev)
 592{
 593        struct sd *sd = (struct sd *) gspca_dev;
 594        int err;
 595        __u8 Data;
 596        __u8 xmult, ymult;
 597
 598        /* create the JPEG header */
 599        jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
 600                        gspca_dev->pixfmt.width,
 601                        0x22);          /* JPEG 411 */
 602        jpeg_set_qual(sd->jpeg_hdr, QUALITY);
 603
 604        if (sd->subtype == LogitechClickSmart310) {
 605                xmult = 0x16;
 606                ymult = 0x12;
 607        } else {
 608                xmult = 0x28;
 609                ymult = 0x1e;
 610        }
 611
 612        /* is there a sensor here ? */
 613        reg_r(gspca_dev, 0x8a04, 1);
 614        gspca_dbg(gspca_dev, D_STREAM, "Spca500 Sensor Address 0x%02x\n",
 615                  gspca_dev->usb_buf[0]);
 616        gspca_dbg(gspca_dev, D_STREAM, "Spca500 curr_mode: %d Xmult: 0x%02x, Ymult: 0x%02x",
 617                  gspca_dev->curr_mode, xmult, ymult);
 618
 619        /* setup qtable */
 620        switch (sd->subtype) {
 621        case LogitechClickSmart310:
 622                 spca500_setmode(gspca_dev, xmult, ymult);
 623
 624                /* enable drop packet */
 625                reg_w(gspca_dev, 0x00, 0x850a, 0x0001);
 626                reg_w(gspca_dev, 0x00, 0x8880, 3);
 627                err = spca50x_setup_qtable(gspca_dev,
 628                                           0x00, 0x8800, 0x8840,
 629                                           qtable_creative_pccam);
 630                if (err < 0)
 631                        gspca_err(gspca_dev, "spca50x_setup_qtable failed\n");
 632                /* Init SDRAM - needed for SDRAM access */
 633                reg_w(gspca_dev, 0x00, 0x870a, 0x04);
 634
 635                /* switch to video camera mode */
 636                reg_w(gspca_dev, 0x00, 0x8000, 0x0004);
 637                msleep(500);
 638                if (reg_r_wait(gspca_dev, 0, 0x8000, 0x44) != 0)
 639                        gspca_err(gspca_dev, "reg_r_wait() failed\n");
 640
 641                reg_r(gspca_dev, 0x816b, 1);
 642                Data = gspca_dev->usb_buf[0];
 643                reg_w(gspca_dev, 0x00, 0x816b, Data);
 644
 645                spca500_synch310(gspca_dev);
 646
 647                write_vector(gspca_dev, spca500_visual_defaults);
 648                spca500_setmode(gspca_dev, xmult, ymult);
 649                /* enable drop packet */
 650                err = reg_w(gspca_dev, 0x00, 0x850a, 0x0001);
 651                if (err < 0)
 652                        gspca_err(gspca_dev, "failed to enable drop packet\n");
 653                reg_w(gspca_dev, 0x00, 0x8880, 3);
 654                err = spca50x_setup_qtable(gspca_dev,
 655                                           0x00, 0x8800, 0x8840,
 656                                           qtable_creative_pccam);
 657                if (err < 0)
 658                        gspca_err(gspca_dev, "spca50x_setup_qtable failed\n");
 659
 660                /* Init SDRAM - needed for SDRAM access */
 661                reg_w(gspca_dev, 0x00, 0x870a, 0x04);
 662
 663                /* switch to video camera mode */
 664                reg_w(gspca_dev, 0x00, 0x8000, 0x0004);
 665
 666                if (reg_r_wait(gspca_dev, 0, 0x8000, 0x44) != 0)
 667                        gspca_err(gspca_dev, "reg_r_wait() failed\n");
 668
 669                reg_r(gspca_dev, 0x816b, 1);
 670                Data = gspca_dev->usb_buf[0];
 671                reg_w(gspca_dev, 0x00, 0x816b, Data);
 672                break;
 673        case CreativePCCam300:          /* Creative PC-CAM 300 640x480 CCD */
 674        case IntelPocketPCCamera:       /* FIXME: Temporary fix for
 675                                         *      Intel Pocket PC Camera
 676                                         *      - NWG (Sat 29th March 2003) */
 677
 678                /* do a full reset */
 679                err = spca500_full_reset(gspca_dev);
 680                if (err < 0)
 681                        gspca_err(gspca_dev, "spca500_full_reset failed\n");
 682
 683                /* enable drop packet */
 684                err = reg_w(gspca_dev, 0x00, 0x850a, 0x0001);
 685                if (err < 0)
 686                        gspca_err(gspca_dev, "failed to enable drop packet\n");
 687                reg_w(gspca_dev, 0x00, 0x8880, 3);
 688                err = spca50x_setup_qtable(gspca_dev,
 689                                           0x00, 0x8800, 0x8840,
 690                                           qtable_creative_pccam);
 691                if (err < 0)
 692                        gspca_err(gspca_dev, "spca50x_setup_qtable failed\n");
 693
 694                spca500_setmode(gspca_dev, xmult, ymult);
 695                reg_w(gspca_dev, 0x20, 0x0001, 0x0004);
 696
 697                /* switch to video camera mode */
 698                reg_w(gspca_dev, 0x00, 0x8000, 0x0004);
 699
 700                if (reg_r_wait(gspca_dev, 0, 0x8000, 0x44) != 0)
 701                        gspca_err(gspca_dev, "reg_r_wait() failed\n");
 702
 703                reg_r(gspca_dev, 0x816b, 1);
 704                Data = gspca_dev->usb_buf[0];
 705                reg_w(gspca_dev, 0x00, 0x816b, Data);
 706
 707/*              write_vector(gspca_dev, spca500_visual_defaults); */
 708                break;
 709        case KodakEZ200:                /* Kodak EZ200 */
 710
 711                /* do a full reset */
 712                err = spca500_full_reset(gspca_dev);
 713                if (err < 0)
 714                        gspca_err(gspca_dev, "spca500_full_reset failed\n");
 715                /* enable drop packet */
 716                reg_w(gspca_dev, 0x00, 0x850a, 0x0001);
 717                reg_w(gspca_dev, 0x00, 0x8880, 0);
 718                err = spca50x_setup_qtable(gspca_dev,
 719                                           0x00, 0x8800, 0x8840,
 720                                           qtable_kodak_ez200);
 721                if (err < 0)
 722                        gspca_err(gspca_dev, "spca50x_setup_qtable failed\n");
 723                spca500_setmode(gspca_dev, xmult, ymult);
 724
 725                reg_w(gspca_dev, 0x20, 0x0001, 0x0004);
 726
 727                /* switch to video camera mode */
 728                reg_w(gspca_dev, 0x00, 0x8000, 0x0004);
 729
 730                if (reg_r_wait(gspca_dev, 0, 0x8000, 0x44) != 0)
 731                        gspca_err(gspca_dev, "reg_r_wait() failed\n");
 732
 733                reg_r(gspca_dev, 0x816b, 1);
 734                Data = gspca_dev->usb_buf[0];
 735                reg_w(gspca_dev, 0x00, 0x816b, Data);
 736
 737/*              write_vector(gspca_dev, spca500_visual_defaults); */
 738                break;
 739
 740        case BenqDC1016:
 741        case DLinkDSC350:               /* FamilyCam 300 */
 742        case AiptekPocketDV:            /* Aiptek PocketDV */
 743        case Gsmartmini:                /*Mustek Gsmart Mini */
 744        case MustekGsmart300:           /* Mustek Gsmart 300 */
 745        case PalmPixDC85:
 746        case Optimedia:
 747        case ToptroIndus:
 748        case AgfaCl20:
 749                spca500_reinit(gspca_dev);
 750                reg_w(gspca_dev, 0x00, 0x0d01, 0x01);
 751                /* enable drop packet */
 752                reg_w(gspca_dev, 0x00, 0x850a, 0x0001);
 753
 754                err = spca50x_setup_qtable(gspca_dev,
 755                                   0x00, 0x8800, 0x8840, qtable_pocketdv);
 756                if (err < 0)
 757                        gspca_err(gspca_dev, "spca50x_setup_qtable failed\n");
 758                reg_w(gspca_dev, 0x00, 0x8880, 2);
 759
 760                /* familycam Quicksmart pocketDV stuff */
 761                reg_w(gspca_dev, 0x00, 0x800a, 0x00);
 762                /* Set agc transfer: synced between frames */
 763                reg_w(gspca_dev, 0x00, 0x820f, 0x01);
 764                /* Init SDRAM - needed for SDRAM access */
 765                reg_w(gspca_dev, 0x00, 0x870a, 0x04);
 766
 767                spca500_setmode(gspca_dev, xmult, ymult);
 768                /* switch to video camera mode */
 769                reg_w(gspca_dev, 0x00, 0x8000, 0x0004);
 770
 771                reg_r_wait(gspca_dev, 0, 0x8000, 0x44);
 772
 773                reg_r(gspca_dev, 0x816b, 1);
 774                Data = gspca_dev->usb_buf[0];
 775                reg_w(gspca_dev, 0x00, 0x816b, Data);
 776                break;
 777        case LogitechTraveler:
 778        case LogitechClickSmart510:
 779                reg_w(gspca_dev, 0x02, 0x00, 0x00);
 780                /* enable drop packet */
 781                reg_w(gspca_dev, 0x00, 0x850a, 0x0001);
 782
 783                err = spca50x_setup_qtable(gspca_dev,
 784                                        0x00, 0x8800,
 785                                        0x8840, qtable_creative_pccam);
 786                if (err < 0)
 787                        gspca_err(gspca_dev, "spca50x_setup_qtable failed\n");
 788                reg_w(gspca_dev, 0x00, 0x8880, 3);
 789                reg_w(gspca_dev, 0x00, 0x800a, 0x00);
 790                /* Init SDRAM - needed for SDRAM access */
 791                reg_w(gspca_dev, 0x00, 0x870a, 0x04);
 792
 793                spca500_setmode(gspca_dev, xmult, ymult);
 794
 795                /* switch to video camera mode */
 796                reg_w(gspca_dev, 0x00, 0x8000, 0x0004);
 797                reg_r_wait(gspca_dev, 0, 0x8000, 0x44);
 798
 799                reg_r(gspca_dev, 0x816b, 1);
 800                Data = gspca_dev->usb_buf[0];
 801                reg_w(gspca_dev, 0x00, 0x816b, Data);
 802                write_vector(gspca_dev, Clicksmart510_defaults);
 803                break;
 804        }
 805        return 0;
 806}
 807
 808static void sd_stopN(struct gspca_dev *gspca_dev)
 809{
 810        reg_w(gspca_dev, 0, 0x8003, 0x00);
 811
 812        /* switch to video camera mode */
 813        reg_w(gspca_dev, 0x00, 0x8000, 0x0004);
 814        reg_r(gspca_dev, 0x8000, 1);
 815        gspca_dbg(gspca_dev, D_STREAM, "stop SPCA500 done reg8000: 0x%2x\n",
 816                  gspca_dev->usb_buf[0]);
 817}
 818
 819static void sd_pkt_scan(struct gspca_dev *gspca_dev,
 820                        u8 *data,                       /* isoc packet */
 821                        int len)                        /* iso packet length */
 822{
 823        struct sd *sd = (struct sd *) gspca_dev;
 824        int i;
 825        static __u8 ffd9[] = {0xff, 0xd9};
 826
 827/* frames are jpeg 4.1.1 without 0xff escape */
 828        if (data[0] == 0xff) {
 829                if (data[1] != 0x01) {  /* drop packet */
 830/*                      gspca_dev->last_packet_type = DISCARD_PACKET; */
 831                        return;
 832                }
 833                gspca_frame_add(gspca_dev, LAST_PACKET,
 834                                        ffd9, 2);
 835
 836                /* put the JPEG header in the new frame */
 837                gspca_frame_add(gspca_dev, FIRST_PACKET,
 838                        sd->jpeg_hdr, JPEG_HDR_SZ);
 839
 840                data += SPCA500_OFFSET_DATA;
 841                len -= SPCA500_OFFSET_DATA;
 842        } else {
 843                data += 1;
 844                len -= 1;
 845        }
 846
 847        /* add 0x00 after 0xff */
 848        i = 0;
 849        do {
 850                if (data[i] == 0xff) {
 851                        gspca_frame_add(gspca_dev, INTER_PACKET,
 852                                        data, i + 1);
 853                        len -= i;
 854                        data += i;
 855                        *data = 0x00;
 856                        i = 0;
 857                }
 858                i++;
 859        } while (i < len);
 860        gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
 861}
 862
 863static void setbrightness(struct gspca_dev *gspca_dev, s32 val)
 864{
 865        reg_w(gspca_dev, 0x00, 0x8167,
 866                        (__u8) (val - 128));
 867}
 868
 869static void setcontrast(struct gspca_dev *gspca_dev, s32 val)
 870{
 871        reg_w(gspca_dev, 0x00, 0x8168, val);
 872}
 873
 874static void setcolors(struct gspca_dev *gspca_dev, s32 val)
 875{
 876        reg_w(gspca_dev, 0x00, 0x8169, val);
 877}
 878
 879static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
 880{
 881        struct gspca_dev *gspca_dev =
 882                container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
 883
 884        gspca_dev->usb_err = 0;
 885
 886        if (!gspca_dev->streaming)
 887                return 0;
 888
 889        switch (ctrl->id) {
 890        case V4L2_CID_BRIGHTNESS:
 891                setbrightness(gspca_dev, ctrl->val);
 892                break;
 893        case V4L2_CID_CONTRAST:
 894                setcontrast(gspca_dev, ctrl->val);
 895                break;
 896        case V4L2_CID_SATURATION:
 897                setcolors(gspca_dev, ctrl->val);
 898                break;
 899        }
 900        return gspca_dev->usb_err;
 901}
 902
 903static const struct v4l2_ctrl_ops sd_ctrl_ops = {
 904        .s_ctrl = sd_s_ctrl,
 905};
 906
 907static int sd_init_controls(struct gspca_dev *gspca_dev)
 908{
 909        struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
 910
 911        gspca_dev->vdev.ctrl_handler = hdl;
 912        v4l2_ctrl_handler_init(hdl, 3);
 913        v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 914                        V4L2_CID_BRIGHTNESS, 0, 255, 1, 127);
 915        v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 916                        V4L2_CID_CONTRAST, 0, 63, 1, 31);
 917        v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 918                        V4L2_CID_SATURATION, 0, 63, 1, 31);
 919
 920        if (hdl->error) {
 921                pr_err("Could not initialize controls\n");
 922                return hdl->error;
 923        }
 924        return 0;
 925}
 926
 927/* sub-driver description */
 928static const struct sd_desc sd_desc = {
 929        .name = MODULE_NAME,
 930        .config = sd_config,
 931        .init = sd_init,
 932        .init_controls = sd_init_controls,
 933        .start = sd_start,
 934        .stopN = sd_stopN,
 935        .pkt_scan = sd_pkt_scan,
 936};
 937
 938/* -- module initialisation -- */
 939static const struct usb_device_id device_table[] = {
 940        {USB_DEVICE(0x040a, 0x0300), .driver_info = KodakEZ200},
 941        {USB_DEVICE(0x041e, 0x400a), .driver_info = CreativePCCam300},
 942        {USB_DEVICE(0x046d, 0x0890), .driver_info = LogitechTraveler},
 943        {USB_DEVICE(0x046d, 0x0900), .driver_info = LogitechClickSmart310},
 944        {USB_DEVICE(0x046d, 0x0901), .driver_info = LogitechClickSmart510},
 945        {USB_DEVICE(0x04a5, 0x300c), .driver_info = BenqDC1016},
 946        {USB_DEVICE(0x04fc, 0x7333), .driver_info = PalmPixDC85},
 947        {USB_DEVICE(0x055f, 0xc200), .driver_info = MustekGsmart300},
 948        {USB_DEVICE(0x055f, 0xc220), .driver_info = Gsmartmini},
 949        {USB_DEVICE(0x06bd, 0x0404), .driver_info = AgfaCl20},
 950        {USB_DEVICE(0x06be, 0x0800), .driver_info = Optimedia},
 951        {USB_DEVICE(0x084d, 0x0003), .driver_info = DLinkDSC350},
 952        {USB_DEVICE(0x08ca, 0x0103), .driver_info = AiptekPocketDV},
 953        {USB_DEVICE(0x2899, 0x012c), .driver_info = ToptroIndus},
 954        {USB_DEVICE(0x8086, 0x0630), .driver_info = IntelPocketPCCamera},
 955        {}
 956};
 957MODULE_DEVICE_TABLE(usb, device_table);
 958
 959/* -- device connect -- */
 960static int sd_probe(struct usb_interface *intf,
 961                        const struct usb_device_id *id)
 962{
 963        return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
 964                                THIS_MODULE);
 965}
 966
 967static struct usb_driver sd_driver = {
 968        .name = MODULE_NAME,
 969        .id_table = device_table,
 970        .probe = sd_probe,
 971        .disconnect = gspca_disconnect,
 972#ifdef CONFIG_PM
 973        .suspend = gspca_suspend,
 974        .resume = gspca_resume,
 975        .reset_resume = gspca_resume,
 976#endif
 977};
 978
 979module_usb_driver(sd_driver);
 980