22 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
24 #define MODULE_NAME "sunplus"
42 #define BRIDGE_SPCA504 0
43 #define BRIDGE_SPCA504B 1
44 #define BRIDGE_SPCA504C 2
45 #define BRIDGE_SPCA533 3
46 #define BRIDGE_SPCA536 4
48 #define AiptekMiniPenCam13 1
49 #define LogitechClickSmart420 2
50 #define LogitechClickSmart820 3
60 .sizeimage = 320 * 240 * 3 / 8 + 590,
65 .sizeimage = 640 * 480 * 3 / 8 + 590,
73 .sizeimage = 320 * 240 * 3 / 8 + 590,
78 .sizeimage = 464 * 480 * 3 / 8 + 590,
86 .sizeimage = 176 * 144 * 3 / 8 + 590,
91 .sizeimage = 320 * 240 * 3 / 8 + 590,
96 .sizeimage = 352 * 288 * 3 / 8 + 590,
101 .sizeimage = 640 * 480 * 3 / 8 + 590,
106 #define SPCA50X_OFFSET_DATA 10
107 #define SPCA504_PCCAM600_OFFSET_SNAPSHOT 3
108 #define SPCA504_PCCAM600_OFFSET_COMPRESS 4
109 #define SPCA504_PCCAM600_OFFSET_MODE 5
110 #define SPCA504_PCCAM600_OFFSET_DATA 14
112 #define SPCA533_OFFSET_DATA 16
113 #define SPCA533_OFFSET_FRAMSEQ 15
115 #define SPCA536_OFFSET_DATA 4
116 #define SPCA536_OFFSET_FRAMSEQ 1
125 static const struct cmd spca504_pccam600_init_data[] = {
127 {0x00, 0x0000, 0x2000},
128 {0x00, 0x0013, 0x2301},
129 {0x00, 0x0003, 0x2000},
130 {0x00, 0x0001, 0x21ac},
131 {0x00, 0x0001, 0x21a6},
132 {0x00, 0x0000, 0x21a7},
133 {0x00, 0x0020, 0x21a8},
134 {0x00, 0x0001, 0x21ac},
135 {0x00, 0x0000, 0x21ad},
136 {0x00, 0x001a, 0x21ae},
137 {0x00, 0x0002, 0x21a3},
138 {0x30, 0x0154, 0x0008},
139 {0x30, 0x0004, 0x0006},
140 {0x30, 0x0258, 0x0009},
141 {0x30, 0x0004, 0x0000},
142 {0x30, 0x0093, 0x0004},
143 {0x30, 0x0066, 0x0005},
144 {0x00, 0x0000, 0x2000},
145 {0x00, 0x0013, 0x2301},
146 {0x00, 0x0003, 0x2000},
147 {0x00, 0x0013, 0x2301},
148 {0x00, 0x0003, 0x2000},
154 static const struct cmd spca504_pccam600_open_data[] = {
155 {0x00, 0x0001, 0x2501},
156 {0x20, 0x0500, 0x0001},
157 {0x00, 0x0003, 0x2880},
158 {0x00, 0x0001, 0x2881},
162 static const struct cmd spca504A_clicksmart420_init_data[] = {
164 {0x00, 0x0000, 0x2000},
165 {0x00, 0x0013, 0x2301},
166 {0x00, 0x0003, 0x2000},
167 {0x00, 0x0001, 0x21ac},
168 {0x00, 0x0001, 0x21a6},
169 {0x00, 0x0000, 0x21a7},
170 {0x00, 0x0020, 0x21a8},
171 {0x00, 0x0001, 0x21ac},
172 {0x00, 0x0000, 0x21ad},
173 {0x00, 0x001a, 0x21ae},
174 {0x00, 0x0002, 0x21a3},
175 {0x30, 0x0004, 0x000a},
176 {0xb0, 0x0001, 0x0000},
178 {0xa1, 0x0080, 0x0001},
179 {0x30, 0x0049, 0x0000},
180 {0x30, 0x0060, 0x0005},
181 {0x0c, 0x0004, 0x0000},
182 {0x00, 0x0000, 0x0000},
183 {0x00, 0x0000, 0x2000},
184 {0x00, 0x0013, 0x2301},
185 {0x00, 0x0003, 0x2000},
189 static const struct cmd spca504A_clicksmart420_open_data[] = {
190 {0x00, 0x0001, 0x2501},
191 {0x20, 0x0502, 0x0000},
192 {0x06, 0x0000, 0x0000},
193 {0x00, 0x0004, 0x2880},
194 {0x00, 0x0001, 0x2881},
196 {0xa0, 0x0000, 0x0503},
199 static const u8 qtable_creative_pccam[2][64] = {
201 0x05, 0x03, 0x03, 0x05, 0x07, 0x0c, 0x0f, 0x12,
202 0x04, 0x04, 0x04, 0x06, 0x08, 0x11, 0x12, 0x11,
203 0x04, 0x04, 0x05, 0x07, 0x0c, 0x11, 0x15, 0x11,
204 0x04, 0x05, 0x07, 0x09, 0x0f, 0x1a, 0x18, 0x13,
205 0x05, 0x07, 0x0b, 0x11, 0x14, 0x21, 0x1f, 0x17,
206 0x07, 0x0b, 0x11, 0x13, 0x18, 0x1f, 0x22, 0x1c,
207 0x0f, 0x13, 0x17, 0x1a, 0x1f, 0x24, 0x24, 0x1e,
208 0x16, 0x1c, 0x1d, 0x1d, 0x22, 0x1e, 0x1f, 0x1e},
210 0x05, 0x05, 0x07, 0x0e, 0x1e, 0x1e, 0x1e, 0x1e,
211 0x05, 0x06, 0x08, 0x14, 0x1e, 0x1e, 0x1e, 0x1e,
212 0x07, 0x08, 0x11, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
213 0x0e, 0x14, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
214 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
215 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
216 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
217 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e}
224 static const u8 qtable_spca504_default[2][64] = {
226 0x05, 0x03, 0x03, 0x05, 0x07, 0x0c, 0x0f, 0x12,
227 0x04, 0x04, 0x04, 0x06, 0x08, 0x11, 0x12, 0x11,
228 0x04, 0x04, 0x05, 0x07, 0x0c, 0x11, 0x15, 0x11,
229 0x04, 0x05, 0x07, 0x09, 0x0f, 0x1a, 0x18, 0x13,
230 0x05, 0x07, 0x0b, 0x11, 0x14, 0x21, 0x1f, 0x17,
231 0x07, 0x0b, 0x11, 0x13, 0x18, 0x1f, 0x22, 0x1c,
232 0x0f, 0x13, 0x17, 0x1a, 0x1f, 0x24, 0x24, 0x1e,
233 0x16, 0x1c, 0x1d, 0x1d, 0x1d , 0x1e, 0x1f, 0x1e,
236 0x05, 0x05, 0x07, 0x0e, 0x1e, 0x1e, 0x1e, 0x1e,
237 0x05, 0x06, 0x08, 0x14, 0x1e, 0x1e, 0x1e, 0x1e,
238 0x07, 0x08, 0x11, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
239 0x0e, 0x14, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
240 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
241 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
242 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
243 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e}
256 pr_err(
"reg_r: buffer overflow\n");
263 usb_rcvctrlpipe(gspca_dev->
dev, 0),
271 pr_err(
"reg_r err %d\n", ret);
277 static void reg_w_1(
struct gspca_dev *gspca_dev,
289 usb_sndctrlpipe(gspca_dev->
dev, 0),
296 pr_err(
"reg_w_1 err %d\n", ret);
302 static void reg_w_riv(
struct gspca_dev *gspca_dev,
305 struct usb_device *
dev = gspca_dev->
dev;
311 usb_sndctrlpipe(dev, 0),
314 value, index,
NULL, 0, 500);
316 pr_err(
"reg_w_riv err %d\n", ret);
320 PDEBUG(D_USBO,
"reg_w_riv: 0x%02x,0x%04x:0x%04x",
324 static void write_vector(
struct gspca_dev *gspca_dev,
325 const struct cmd *
data,
int ncmds)
327 while (--ncmds >= 0) {
328 reg_w_riv(gspca_dev, data->
req, data->
idx, data->
val);
333 static void setup_qtable(
struct gspca_dev *gspca_dev,
334 const u8 qtable[2][64])
339 for (i = 0; i < 64; i++)
340 reg_w_riv(gspca_dev, 0x00, 0x2800 + i, qtable[0][i]);
343 for (i = 0; i < 64; i++)
344 reg_w_riv(gspca_dev, 0x00, 0x2840 + i, qtable[1][i]);
347 static void spca504_acknowledged_command(
struct gspca_dev *gspca_dev,
350 reg_w_riv(gspca_dev, req, idx, val);
351 reg_r(gspca_dev, 0x01, 0x0001, 1);
353 reg_w_riv(gspca_dev, req, idx, val);
356 reg_r(gspca_dev, 0x01, 0x0001, 1);
361 static void spca504_read_info(
struct gspca_dev *gspca_dev)
366 for (i = 0; i < 6; i++) {
367 reg_r(gspca_dev, 0, i, 1);
371 "Read info: %d %d %d %d %d %d."
372 " Should be 1,0,2,2,0,0",
373 info[0], info[1], info[2],
374 info[3], info[4], info[5]);
378 static void spca504A_acknowledged_command(
struct gspca_dev *gspca_dev,
384 reg_w_riv(gspca_dev, req, idx, val);
385 reg_r(gspca_dev, 0x01, 0x0001, 1);
388 PDEBUG(D_FRAM,
"Status 0x%02x Need 0x%02x",
389 gspca_dev->
usb_buf[0], endcode);
393 while (--count > 0) {
397 reg_r(gspca_dev, 0x01, 0x0001, 1);
398 status = gspca_dev->
usb_buf[0];
399 if (status == endcode) {
400 PDEBUG(D_FRAM,
"status 0x%04x after wait %d",
401 status, 200 - count);
407 static void spca504B_PollingDataReady(
struct gspca_dev *gspca_dev)
411 while (--count > 0) {
412 reg_r(gspca_dev, 0x21, 0, 1);
413 if ((gspca_dev->
usb_buf[0] & 0x01) == 0)
419 static void spca504B_WaitCmdStatus(
struct gspca_dev *gspca_dev)
423 while (--count > 0) {
424 reg_r(gspca_dev, 0x21, 1, 1);
425 if (gspca_dev->
usb_buf[0] != 0) {
426 reg_w_1(gspca_dev, 0x21, 0, 1, 0);
427 reg_r(gspca_dev, 0x21, 1, 1);
428 spca504B_PollingDataReady(gspca_dev);
436 static void spca50x_GetFirmware(
struct gspca_dev *gspca_dev)
441 reg_r(gspca_dev, 0x20, 0, 5);
442 PDEBUG(D_STREAM,
"FirmWare: %d %d %d %d %d",
443 data[0], data[1], data[2], data[3], data[4]);
444 reg_r(gspca_dev, 0x23, 0, 64);
445 reg_r(gspca_dev, 0x23, 1, 64);
449 static void spca504B_SetSizeType(
struct gspca_dev *gspca_dev)
451 struct sd *
sd = (
struct sd *) gspca_dev;
454 Size = gspca_dev->
cam.cam_mode[gspca_dev->
curr_mode].priv;
457 reg_w_riv(gspca_dev, 0x31, 0, 0);
458 spca504B_WaitCmdStatus(gspca_dev);
459 spca504B_PollingDataReady(gspca_dev);
461 spca50x_GetFirmware(gspca_dev);
463 reg_w_1(gspca_dev, 0x24, 0, 8, 2);
464 reg_r(gspca_dev, 0x24, 8, 1);
466 reg_w_1(gspca_dev, 0x25, 0, 4, Size);
467 reg_r(gspca_dev, 0x25, 4, 1);
468 spca504B_PollingDataReady(gspca_dev);
471 reg_w_riv(gspca_dev, 0x31, 0x0004, 0x00);
472 spca504B_WaitCmdStatus(gspca_dev);
473 spca504B_PollingDataReady(gspca_dev);
478 reg_w_1(gspca_dev, 0x25, 0, 4, Size);
479 reg_r(gspca_dev, 0x25, 4, 1);
480 reg_w_1(gspca_dev, 0x27, 0, 0, 6);
481 reg_r(gspca_dev, 0x27, 0, 1);
482 spca504B_PollingDataReady(gspca_dev);
488 spca504A_acknowledged_command(gspca_dev,
490 0x80 | (Size & 0x0f), 1);
491 spca504A_acknowledged_command(gspca_dev,
494 spca504_acknowledged_command(gspca_dev, 0x08, Size, 0);
499 reg_w_riv(gspca_dev, 0xa0, (0x0500 | (Size & 0x0f)), 0x00);
500 reg_w_riv(gspca_dev, 0x20, 0x01, 0x0500 | (Size & 0x0f));
505 static void spca504_wait_status(
struct gspca_dev *gspca_dev)
512 reg_r(gspca_dev, 0x06, 0x00, 1);
513 if (gspca_dev->
usb_buf[0] == 0)
519 static void spca504B_setQtable(
struct gspca_dev *gspca_dev)
521 reg_w_1(gspca_dev, 0x26, 0, 0, 3);
522 reg_r(gspca_dev, 0x26, 0, 1);
523 spca504B_PollingDataReady(gspca_dev);
526 static void setbrightness(
struct gspca_dev *gspca_dev,
s32 val)
528 struct sd *sd = (
struct sd *) gspca_dev;
532 reg_w_riv(gspca_dev, 0x00, reg, val);
535 static void setcontrast(
struct gspca_dev *gspca_dev,
s32 val)
537 struct sd *sd = (
struct sd *) gspca_dev;
541 reg_w_riv(gspca_dev, 0x00, reg, val);
544 static void setcolors(
struct gspca_dev *gspca_dev,
s32 val)
546 struct sd *sd = (
struct sd *) gspca_dev;
550 reg_w_riv(gspca_dev, 0x00, reg, val);
553 static void init_ctl_reg(
struct gspca_dev *gspca_dev)
555 struct sd *sd = (
struct sd *) gspca_dev;
566 reg_w_riv(gspca_dev, 0, 0x21ad, 0x00);
567 reg_w_riv(gspca_dev, 0, 0x21ac, 0x01);
568 reg_w_riv(gspca_dev, 0, 0x21a3, 0x00);
571 reg_w_riv(gspca_dev, 0, 0x20f5, 0x40);
572 reg_w_riv(gspca_dev, 0, 0x20f4, 0x01);
573 reg_w_riv(gspca_dev, 0, 0x2089, 0x00);
577 spca504B_PollingDataReady(gspca_dev);
581 static int sd_config(
struct gspca_dev *gspca_dev,
584 struct sd *sd = (
struct sd *) gspca_dev;
587 cam = &gspca_dev->
cam;
589 sd->
bridge =
id->driver_info >> 8;
596 reg_r(gspca_dev, 0x20, 0, 1);
597 switch (gspca_dev->
usb_buf[0]) {
633 static int sd_init(
struct gspca_dev *gspca_dev)
635 struct sd *sd = (
struct sd *) gspca_dev;
639 reg_w_riv(gspca_dev, 0x1d, 0x00, 0);
640 reg_w_riv(gspca_dev, 0x00, 0x2306, 0x01);
641 reg_w_riv(gspca_dev, 0x00, 0x0d04, 0x00);
642 reg_w_riv(gspca_dev, 0x00, 0x2000, 0x00);
643 reg_w_riv(gspca_dev, 0x00, 0x2301, 0x13);
644 reg_w_riv(gspca_dev, 0x00, 0x2306, 0x00);
647 spca504B_PollingDataReady(gspca_dev);
649 spca50x_GetFirmware(gspca_dev);
654 spca50x_GetFirmware(gspca_dev);
656 reg_r(gspca_dev, 0x00, 0x5002, 1);
657 reg_w_1(gspca_dev, 0x24, 0, 0, 0);
658 reg_r(gspca_dev, 0x24, 0, 1);
659 spca504B_PollingDataReady(gspca_dev);
660 reg_w_riv(gspca_dev, 0x34, 0, 0);
661 spca504B_WaitCmdStatus(gspca_dev);
664 PDEBUG(D_STREAM,
"Opening SPCA504 (PC-CAM 600)");
665 reg_w_riv(gspca_dev, 0xe0, 0x0000, 0x0000);
666 reg_w_riv(gspca_dev, 0xe0, 0x0000, 0x0001);
667 spca504_wait_status(gspca_dev);
669 write_vector(gspca_dev,
670 spca504A_clicksmart420_open_data,
671 ARRAY_SIZE(spca504A_clicksmart420_open_data));
673 write_vector(gspca_dev, spca504_pccam600_open_data,
675 setup_qtable(gspca_dev, qtable_creative_pccam);
679 PDEBUG(D_STREAM,
"Opening SPCA504");
682 spca504_read_info(gspca_dev);
686 spca504A_acknowledged_command(gspca_dev, 0x24,
689 spca504A_acknowledged_command(gspca_dev, 0x24,
692 spca504A_acknowledged_command(gspca_dev, 0x24,
696 spca504A_acknowledged_command(gspca_dev, 0x08,
704 reg_w_riv(gspca_dev, 0x00, 0x270c, 0x05);
706 reg_w_riv(gspca_dev, 0x00, 0x2310, 0x05);
707 spca504A_acknowledged_command(gspca_dev, 0x01,
711 reg_w_riv(gspca_dev, 0, 0x2000, 0);
712 reg_w_riv(gspca_dev, 0, 0x2883, 1);
713 setup_qtable(gspca_dev, qtable_spca504_default);
719 static int sd_start(
struct gspca_dev *gspca_dev)
721 struct sd *sd = (
struct sd *) gspca_dev;
730 spca504B_setQtable(gspca_dev);
731 spca504B_SetSizeType(gspca_dev);
741 reg_w_riv(gspca_dev, 0xf0, 0, 0);
742 spca504B_WaitCmdStatus(gspca_dev);
743 reg_r(gspca_dev, 0xf0, 4, 0);
744 spca504B_WaitCmdStatus(gspca_dev);
747 reg_w_riv(gspca_dev, 0x31, 0x0004, 0x00);
748 spca504B_WaitCmdStatus(gspca_dev);
749 spca504B_PollingDataReady(gspca_dev);
756 spca504_read_info(gspca_dev);
760 spca504A_acknowledged_command(gspca_dev, 0x24,
763 spca504A_acknowledged_command(gspca_dev, 0x24,
765 spca504A_acknowledged_command(gspca_dev, 0x24,
768 spca504_acknowledged_command(gspca_dev, 0x24, 8, 3);
770 spca504_read_info(gspca_dev);
772 spca504_acknowledged_command(gspca_dev, 0x24, 8, 3);
773 spca504_acknowledged_command(gspca_dev, 0x24, 0, 0);
775 spca504B_SetSizeType(gspca_dev);
776 reg_w_riv(gspca_dev, 0x00, 0x270c, 0x05);
778 reg_w_riv(gspca_dev, 0x00, 0x2310, 0x05);
782 write_vector(gspca_dev,
783 spca504A_clicksmart420_init_data,
784 ARRAY_SIZE(spca504A_clicksmart420_init_data));
786 write_vector(gspca_dev, spca504_pccam600_init_data,
789 enable = (sd->
autogain ? 0x04 : 0x01);
790 reg_w_riv(gspca_dev, 0x0c, 0x0000, enable);
792 reg_w_riv(gspca_dev, 0xb0, 0x0000, enable);
796 reg_w_riv(gspca_dev, 0x30, 0x0001, 800);
797 reg_w_riv(gspca_dev, 0x30, 0x0002, 1600);
798 spca504B_SetSizeType(gspca_dev);
801 init_ctl_reg(gspca_dev);
805 static void sd_stopN(
struct gspca_dev *gspca_dev)
807 struct sd *sd = (
struct sd *) gspca_dev;
814 reg_w_riv(gspca_dev, 0x31, 0, 0);
815 spca504B_WaitCmdStatus(gspca_dev);
816 spca504B_PollingDataReady(gspca_dev);
820 reg_w_riv(gspca_dev, 0x00, 0x2000, 0x0000);
826 spca504A_acknowledged_command(gspca_dev, 0x24,
827 0x00, 0x00, 0x9d, 1);
828 spca504A_acknowledged_command(gspca_dev, 0x01,
829 0x0f, 0x00, 0xff, 1);
831 spca504_acknowledged_command(gspca_dev, 0x24, 0, 0);
832 reg_w_riv(gspca_dev, 0x01, 0x000f, 0x0000);
838 static void sd_pkt_scan(
struct gspca_dev *gspca_dev,
842 struct sd *sd = (
struct sd *) gspca_dev;
844 static u8 ffd9[] = {0xff, 0xd9};
849 if (data[0] == 0xff) {
850 if (data[1] != 0x01) {
863 if (data[0] == 0xff) {
919 if (data[i] == 0xff) {
934 struct gspca_dev *gspca_dev =
936 struct sd *sd = (
struct sd *)gspca_dev;
945 setbrightness(gspca_dev, ctrl->
val);
948 setcontrast(gspca_dev, ctrl->
val);
951 setcolors(gspca_dev, ctrl->
val);
964 static int sd_init_controls(
struct gspca_dev *gspca_dev)
968 gspca_dev->
vdev.ctrl_handler = hdl;
980 pr_err(
"Could not initialize controls\n");
991 .init_controls = sd_init_controls,
994 .pkt_scan = sd_pkt_scan,
998 #define BS(bridge, subtype) \
999 .driver_info = (BRIDGE_ ## bridge << 8) \
1002 {USB_DEVICE(0x041e, 0x400b),
BS(SPCA504C, 0)},
1003 {USB_DEVICE(0x041e, 0x4012),
BS(SPCA504C, 0)},
1004 {USB_DEVICE(0x041e, 0x4013),
BS(SPCA504C, 0)},
1005 {USB_DEVICE(0x0458, 0x7006),
BS(SPCA504B, 0)},
1006 {USB_DEVICE(0x0461, 0x0821),
BS(SPCA533, 0)},
1009 {USB_DEVICE(0x0471, 0x0322),
BS(SPCA504B, 0)},
1010 {USB_DEVICE(0x04a5, 0x3003),
BS(SPCA504B, 0)},
1011 {USB_DEVICE(0x04a5, 0x3008),
BS(SPCA533, 0)},
1012 {USB_DEVICE(0x04a5, 0x300a),
BS(SPCA533, 0)},
1013 {USB_DEVICE(0x04f1, 0x1001),
BS(SPCA504B, 0)},
1014 {USB_DEVICE(0x04fc, 0x500c),
BS(SPCA504B, 0)},
1016 {USB_DEVICE(0x04fc, 0x504b),
BS(SPCA504B, 0)},
1017 {USB_DEVICE(0x04fc, 0x5330),
BS(SPCA533, 0)},
1018 {USB_DEVICE(0x04fc, 0x5360),
BS(SPCA536, 0)},
1019 {USB_DEVICE(0x04fc, 0xffff),
BS(SPCA504B, 0)},
1020 {USB_DEVICE(0x052b, 0x1507),
BS(SPCA533,
MegapixV4)},
1021 {USB_DEVICE(0x052b, 0x1513),
BS(SPCA533,
MegapixV4)},
1023 {USB_DEVICE(0x0546, 0x3155),
BS(SPCA533, 0)},
1024 {USB_DEVICE(0x0546, 0x3191),
BS(SPCA504B, 0)},
1025 {USB_DEVICE(0x0546, 0x3273),
BS(SPCA504B, 0)},
1026 {USB_DEVICE(0x055f, 0xc211),
BS(SPCA536, 0)},
1027 {USB_DEVICE(0x055f, 0xc230),
BS(SPCA533, 0)},
1028 {USB_DEVICE(0x055f, 0xc232),
BS(SPCA533, 0)},
1029 {USB_DEVICE(0x055f, 0xc360),
BS(SPCA536, 0)},
1030 {USB_DEVICE(0x055f, 0xc420),
BS(SPCA504, 0)},
1031 {USB_DEVICE(0x055f, 0xc430),
BS(SPCA533, 0)},
1032 {USB_DEVICE(0x055f, 0xc440),
BS(SPCA533, 0)},
1033 {USB_DEVICE(0x055f, 0xc520),
BS(SPCA504, 0)},
1034 {USB_DEVICE(0x055f, 0xc530),
BS(SPCA533, 0)},
1035 {USB_DEVICE(0x055f, 0xc540),
BS(SPCA533, 0)},
1036 {USB_DEVICE(0x055f, 0xc630),
BS(SPCA533, 0)},
1037 {USB_DEVICE(0x055f, 0xc650),
BS(SPCA533, 0)},
1038 {USB_DEVICE(0x05da, 0x1018),
BS(SPCA504B, 0)},
1039 {USB_DEVICE(0x06d6, 0x0031),
BS(SPCA533, 0)},
1040 {USB_DEVICE(0x0733, 0x1311),
BS(SPCA533, 0)},
1041 {USB_DEVICE(0x0733, 0x1314),
BS(SPCA533, 0)},
1042 {USB_DEVICE(0x0733, 0x2211),
BS(SPCA533, 0)},
1043 {USB_DEVICE(0x0733, 0x2221),
BS(SPCA533, 0)},
1044 {USB_DEVICE(0x0733, 0x3261),
BS(SPCA536, 0)},
1045 {USB_DEVICE(0x0733, 0x3281),
BS(SPCA536, 0)},
1046 {USB_DEVICE(0x08ca, 0x0104),
BS(SPCA533, 0)},
1047 {USB_DEVICE(0x08ca, 0x0106),
BS(SPCA533, 0)},
1048 {USB_DEVICE(0x08ca, 0x2008),
BS(SPCA504B, 0)},
1049 {USB_DEVICE(0x08ca, 0x2010),
BS(SPCA533, 0)},
1050 {USB_DEVICE(0x08ca, 0x2016),
BS(SPCA504B, 0)},
1051 {USB_DEVICE(0x08ca, 0x2018),
BS(SPCA504B, 0)},
1052 {USB_DEVICE(0x08ca, 0x2020),
BS(SPCA533, 0)},
1053 {USB_DEVICE(0x08ca, 0x2022),
BS(SPCA533, 0)},
1054 {USB_DEVICE(0x08ca, 0x2024),
BS(SPCA536, 0)},
1055 {USB_DEVICE(0x08ca, 0x2028),
BS(SPCA533, 0)},
1056 {USB_DEVICE(0x08ca, 0x2040),
BS(SPCA536, 0)},
1057 {USB_DEVICE(0x08ca, 0x2042),
BS(SPCA536, 0)},
1058 {USB_DEVICE(0x08ca, 0x2050),
BS(SPCA536, 0)},
1059 {USB_DEVICE(0x08ca, 0x2060),
BS(SPCA536, 0)},
1060 {USB_DEVICE(0x0d64, 0x0303),
BS(SPCA536, 0)},
1073 static struct usb_driver sd_driver = {
1075 .id_table = device_table,
1079 .suspend = gspca_suspend,
1080 .resume = gspca_resume,
1081 .reset_resume = gspca_resume,