aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca/spca561.c
diff options
context:
space:
mode:
authorJean-Francois Moine <moinejf@free.fr>2008-12-17 12:34:53 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2008-12-30 06:39:40 -0500
commit35dc1b4cfa75dc0fa5ed44991b41db814e0f7741 (patch)
tree404482447eb48027dabadb04656a94a657a72072 /drivers/media/video/gspca/spca561.c
parentca8959bb07f27514f811200b4f71669b1783dc54 (diff)
V4L/DVB (9985): gspca - spca561: Cleanup source.
Signed-off-by: Jean-Francois Moine <moinejf@free.fr> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/gspca/spca561.c')
-rw-r--r--drivers/media/video/gspca/spca561.c246
1 files changed, 117 insertions, 129 deletions
diff --git a/drivers/media/video/gspca/spca561.c b/drivers/media/video/gspca/spca561.c
index c3de4e44123d..3a27faf60242 100644
--- a/drivers/media/video/gspca/spca561.c
+++ b/drivers/media/video/gspca/spca561.c
@@ -146,98 +146,7 @@ static struct v4l2_pix_format sif_072a_mode[] = {
146#define SPCA561_SNAPBIT 0x20 146#define SPCA561_SNAPBIT 0x20
147#define SPCA561_SNAPCTRL 0x40 147#define SPCA561_SNAPCTRL 0x40
148 148
149static void reg_w_val(struct usb_device *dev, __u16 index, __u8 value) 149static const __u16 rev72a_init_data[][2] = {
150{
151 int ret;
152
153 ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
154 0, /* request */
155 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
156 value, index, NULL, 0, 500);
157 PDEBUG(D_USBO, "reg write: 0x%02x:0x%02x", index, value);
158 if (ret < 0)
159 PDEBUG(D_ERR, "reg write: error %d", ret);
160}
161
162static void write_vector(struct gspca_dev *gspca_dev,
163 const __u16 data[][2])
164{
165 struct usb_device *dev = gspca_dev->dev;
166 int i;
167
168 i = 0;
169 while (data[i][1] != 0) {
170 reg_w_val(dev, data[i][1], data[i][0]);
171 i++;
172 }
173}
174
175/* read 'len' bytes to gspca_dev->usb_buf */
176static void reg_r(struct gspca_dev *gspca_dev,
177 __u16 index, __u16 length)
178{
179 usb_control_msg(gspca_dev->dev,
180 usb_rcvctrlpipe(gspca_dev->dev, 0),
181 0, /* request */
182 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
183 0, /* value */
184 index, gspca_dev->usb_buf, length, 500);
185}
186
187static void reg_w_buf(struct gspca_dev *gspca_dev,
188 __u16 index, const __u8 *buffer, __u16 len)
189{
190 memcpy(gspca_dev->usb_buf, buffer, len);
191 usb_control_msg(gspca_dev->dev,
192 usb_sndctrlpipe(gspca_dev->dev, 0),
193 0, /* request */
194 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
195 0, /* value */
196 index, gspca_dev->usb_buf, len, 500);
197}
198
199static void i2c_write(struct gspca_dev *gspca_dev, __u16 valeur, __u16 reg)
200{
201 int retry = 60;
202 __u8 DataLow;
203 __u8 DataHight;
204
205 DataLow = valeur;
206 DataHight = valeur >> 8;
207 reg_w_val(gspca_dev->dev, 0x8801, reg);
208 reg_w_val(gspca_dev->dev, 0x8805, DataLow);
209 reg_w_val(gspca_dev->dev, 0x8800, DataHight);
210 while (retry--) {
211 reg_r(gspca_dev, 0x8803, 1);
212 if (!gspca_dev->usb_buf[0])
213 break;
214 }
215}
216
217static int i2c_read(struct gspca_dev *gspca_dev, __u16 reg, __u8 mode)
218{
219 int retry = 60;
220 __u8 value;
221 __u8 vallsb;
222
223 reg_w_val(gspca_dev->dev, 0x8804, 0x92);
224 reg_w_val(gspca_dev->dev, 0x8801, reg);
225 reg_w_val(gspca_dev->dev, 0x8802, (mode | 0x01));
226 do {
227 reg_r(gspca_dev, 0x8803, 1);
228 if (!gspca_dev->usb_buf[0])
229 break;
230 } while (--retry);
231 if (retry == 0)
232 return -1;
233 reg_r(gspca_dev, 0x8800, 1);
234 value = gspca_dev->usb_buf[0];
235 reg_r(gspca_dev, 0x8805, 1);
236 vallsb = gspca_dev->usb_buf[0];
237 return ((int) value << 8) | vallsb;
238}
239
240static const __u16 spca561_init_data[][2] = {
241 {0x0000, 0x8114}, /* Software GPIO output data */ 150 {0x0000, 0x8114}, /* Software GPIO output data */
242 {0x0001, 0x8114}, /* Software GPIO output data */ 151 {0x0001, 0x8114}, /* Software GPIO output data */
243 {0x0000, 0x8112}, /* Some kind of reset */ 152 {0x0000, 0x8112}, /* Some kind of reset */
@@ -324,7 +233,7 @@ static const __u16 spca561_init_data[][2] = {
324 233
325 {0x0002, 0x865b}, /* Horizontal offset for valid pixels */ 234 {0x0002, 0x865b}, /* Horizontal offset for valid pixels */
326 {0x0003, 0x865c}, /* Vertical offset for valid lines */ 235 {0x0003, 0x865c}, /* Vertical offset for valid lines */
327 /***************//* sensor active */ 236 /***************/ /* sensor active */
328 {0x0003, 0x8801}, /* 0x03 <- 0x01 0x21 //289 */ 237 {0x0003, 0x8801}, /* 0x03 <- 0x01 0x21 //289 */
329 {0x0021, 0x8805}, 238 {0x0021, 0x8805},
330 {0x0001, 0x8800}, 239 {0x0001, 0x8800},
@@ -434,7 +343,6 @@ static const __u16 spca561_init_data[][2] = {
434 {} 343 {}
435}; 344};
436 345
437
438/******************** QC Express etch2 stuff ********************/ 346/******************** QC Express etch2 stuff ********************/
439static const __u16 Pb100_1map8300[][2] = { 347static const __u16 Pb100_1map8300[][2] = {
440 /* reg, value */ 348 /* reg, value */
@@ -515,22 +423,103 @@ static const __u16 spca561_161rev12A_data2[][2] = {
515 {} 423 {}
516}; 424};
517 425
518static void sensor_mapwrite(struct gspca_dev *gspca_dev, 426static void reg_w_val(struct usb_device *dev, __u16 index, __u8 value)
519 const __u16 sensormap[][2]) 427{
428 int ret;
429
430 ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
431 0, /* request */
432 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
433 value, index, NULL, 0, 500);
434 PDEBUG(D_USBO, "reg write: 0x%02x:0x%02x", index, value);
435 if (ret < 0)
436 PDEBUG(D_ERR, "reg write: error %d", ret);
437}
438
439static void write_vector(struct gspca_dev *gspca_dev,
440 const __u16 data[][2])
520{ 441{
521 int i = 0; 442 struct usb_device *dev = gspca_dev->dev;
522 __u8 usbval[2]; 443 int i;
523 444
524 while (sensormap[i][0]) { 445 i = 0;
525 usbval[0] = sensormap[i][1]; 446 while (data[i][1] != 0) {
526 usbval[1] = sensormap[i][1] >> 8; 447 reg_w_val(dev, data[i][1], data[i][0]);
527 reg_w_buf(gspca_dev, sensormap[i][0], usbval, 2);
528 i++; 448 i++;
529 } 449 }
530} 450}
451
452/* read 'len' bytes to gspca_dev->usb_buf */
453static void reg_r(struct gspca_dev *gspca_dev,
454 __u16 index, __u16 length)
455{
456 usb_control_msg(gspca_dev->dev,
457 usb_rcvctrlpipe(gspca_dev->dev, 0),
458 0, /* request */
459 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
460 0, /* value */
461 index, gspca_dev->usb_buf, length, 500);
462}
463
464/* write 'len' bytes from gspca_dev->usb_buf */
465static void reg_w_buf(struct gspca_dev *gspca_dev,
466 __u16 index, __u16 len)
467{
468 usb_control_msg(gspca_dev->dev,
469 usb_sndctrlpipe(gspca_dev->dev, 0),
470 0, /* request */
471 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
472 0, /* value */
473 index, gspca_dev->usb_buf, len, 500);
474}
475
476static void i2c_write(struct gspca_dev *gspca_dev, __u16 value, __u16 reg)
477{
478 int retry = 60;
479
480 reg_w_val(gspca_dev->dev, 0x8801, reg);
481 reg_w_val(gspca_dev->dev, 0x8805, value);
482 reg_w_val(gspca_dev->dev, 0x8800, value >> 8);
483 do {
484 reg_r(gspca_dev, 0x8803, 1);
485 if (!gspca_dev->usb_buf[0])
486 return;
487 } while (--retry);
488}
489
490static int i2c_read(struct gspca_dev *gspca_dev, __u16 reg, __u8 mode)
491{
492 int retry = 60;
493 __u8 value;
494
495 reg_w_val(gspca_dev->dev, 0x8804, 0x92);
496 reg_w_val(gspca_dev->dev, 0x8801, reg);
497 reg_w_val(gspca_dev->dev, 0x8802, mode | 0x01);
498 do {
499 reg_r(gspca_dev, 0x8803, 1);
500 if (!gspca_dev->usb_buf[0]) {
501 reg_r(gspca_dev, 0x8800, 1);
502 value = gspca_dev->usb_buf[0];
503 reg_r(gspca_dev, 0x8805, 1);
504 return ((int) value << 8) | gspca_dev->usb_buf[0];
505 }
506 } while (--retry);
507 return -1;
508}
509
510static void sensor_mapwrite(struct gspca_dev *gspca_dev,
511 const __u16 (*sensormap)[2])
512{
513 while ((*sensormap)[0]) {
514 gspca_dev->usb_buf[0] = (*sensormap)[1];
515 gspca_dev->usb_buf[1] = (*sensormap)[1] >> 8;
516 reg_w_buf(gspca_dev, (*sensormap)[0], 2);
517 sensormap++;
518 }
519}
520
531static void init_161rev12A(struct gspca_dev *gspca_dev) 521static void init_161rev12A(struct gspca_dev *gspca_dev)
532{ 522{
533/* sensor_reset(gspca_dev); (not in win) */
534 write_vector(gspca_dev, spca561_161rev12A_data1); 523 write_vector(gspca_dev, spca561_161rev12A_data1);
535 sensor_mapwrite(gspca_dev, Pb100_1map8300); 524 sensor_mapwrite(gspca_dev, Pb100_1map8300);
536/*fixme: should be in sd_start*/ 525/*fixme: should be in sd_start*/
@@ -598,7 +587,7 @@ static int sd_init_12a(struct gspca_dev *gspca_dev)
598static int sd_init_72a(struct gspca_dev *gspca_dev) 587static int sd_init_72a(struct gspca_dev *gspca_dev)
599{ 588{
600 PDEBUG(D_STREAM, "Chip revision: 072a"); 589 PDEBUG(D_STREAM, "Chip revision: 072a");
601 write_vector(gspca_dev, spca561_init_data); 590 write_vector(gspca_dev, rev72a_init_data);
602 return 0; 591 return 0;
603} 592}
604 593
@@ -621,8 +610,9 @@ static void setcontrast(struct gspca_dev *gspca_dev)
621 static const __u8 Reg8391[] = 610 static const __u8 Reg8391[] =
622 { 0x92, 0x30, 0x20, 0x00, 0x0c, 0x00, 0x00, 0x00 }; 611 { 0x92, 0x30, 0x20, 0x00, 0x0c, 0x00, 0x00, 0x00 };
623 612
624 reg_w_buf(gspca_dev, 0x8391, Reg8391, 8); 613 memcpy(gspca_dev->usb_buf, Reg8391, 8);
625 reg_w_buf(gspca_dev, 0x8390, Reg8391, 8); 614 reg_w_buf(gspca_dev, 0x8391, 8);
615 reg_w_buf(gspca_dev, 0x8390, 8);
626 break; 616 break;
627 } 617 }
628 } 618 }
@@ -649,7 +639,6 @@ static void setexposure(struct gspca_dev *gspca_dev)
649 struct sd *sd = (struct sd *) gspca_dev; 639 struct sd *sd = (struct sd *) gspca_dev;
650 int expo; 640 int expo;
651 int clock_divider; 641 int clock_divider;
652 __u8 data[2];
653 642
654 /* Register 0x8309 controls exposure for the spca561, 643 /* Register 0x8309 controls exposure for the spca561,
655 the basic exposure setting goes from 1-2047, where 1 is completely 644 the basic exposure setting goes from 1-2047, where 1 is completely
@@ -673,20 +662,19 @@ static void setexposure(struct gspca_dev *gspca_dev)
673 clock_divider = 3; 662 clock_divider = 3;
674 } 663 }
675 expo |= clock_divider << 11; 664 expo |= clock_divider << 11;
676 data[0] = expo; 665 gspca_dev->usb_buf[0] = expo;
677 data[1] = expo >> 8; 666 gspca_dev->usb_buf[1] = expo >> 8;
678 reg_w_buf(gspca_dev, 0x8309, data, 2); 667 reg_w_buf(gspca_dev, 0x8309, 2);
679} 668}
680 669
681/* rev 12a only */ 670/* rev 12a only */
682static void setgain(struct gspca_dev *gspca_dev) 671static void setgain(struct gspca_dev *gspca_dev)
683{ 672{
684 struct sd *sd = (struct sd *) gspca_dev; 673 struct sd *sd = (struct sd *) gspca_dev;
685 __u8 data[2];
686 674
687 data[0] = sd->gain; 675 gspca_dev->usb_buf[0] = sd->gain;
688 data[1] = 0; 676 gspca_dev->usb_buf[1] = 0;
689 reg_w_buf(gspca_dev, 0x8335, data, 2); 677 reg_w_buf(gspca_dev, 0x8335, 2);
690} 678}
691 679
692static void setautogain(struct gspca_dev *gspca_dev) 680static void setautogain(struct gspca_dev *gspca_dev)
@@ -716,7 +704,9 @@ static int sd_start_12a(struct gspca_dev *gspca_dev)
716 * is sufficient to push raw frames at ~20fps */ 704 * is sufficient to push raw frames at ~20fps */
717 reg_w_val(dev, 0x8500, mode); 705 reg_w_val(dev, 0x8500, mode);
718 } /* -- qq@kuku.eu.org */ 706 } /* -- qq@kuku.eu.org */
719 reg_w_buf(gspca_dev, 0x8307, Reg8307, 2); 707
708 memcpy(gspca_dev->usb_buf, Reg8307, sizeof Reg8307);
709 reg_w_buf(gspca_dev, 0x8307, sizeof Reg8307);
720 reg_w_val(gspca_dev->dev, 0x8700, Clck); 710 reg_w_val(gspca_dev->dev, 0x8700, Clck);
721 /* 0x8f 0x85 0x27 clock */ 711 /* 0x8f 0x85 0x27 clock */
722 reg_w_val(gspca_dev->dev, 0x8112, 0x1e | 0x20); 712 reg_w_val(gspca_dev->dev, 0x8112, 0x1e | 0x20);
@@ -791,7 +781,6 @@ static void do_autogain(struct gspca_dev *gspca_dev)
791 __u8 luma_mean = 110; 781 __u8 luma_mean = 110;
792 __u8 luma_delta = 20; 782 __u8 luma_delta = 20;
793 __u8 spring = 4; 783 __u8 spring = 4;
794 __u8 reg8339[2];
795 784
796 if (sd->ag_cnt < 0) 785 if (sd->ag_cnt < 0)
797 return; 786 return;
@@ -834,13 +823,13 @@ static void do_autogain(struct gspca_dev *gspca_dev)
834 823
835 if (gainG > 0x3f) 824 if (gainG > 0x3f)
836 gainG = 0x3f; 825 gainG = 0x3f;
837 else if (gainG < 4) 826 else if (gainG < 3)
838 gainG = 3; 827 gainG = 3;
839 i2c_write(gspca_dev, gainG, 0x35); 828 i2c_write(gspca_dev, gainG, 0x35);
840 829
841 if (expotimes >= 0x0256) 830 if (expotimes > 0x0256)
842 expotimes = 0x0256; 831 expotimes = 0x0256;
843 else if (expotimes < 4) 832 else if (expotimes < 3)
844 expotimes = 3; 833 expotimes = 3;
845 i2c_write(gspca_dev, expotimes | pixelclk, 0x09); 834 i2c_write(gspca_dev, expotimes | pixelclk, 0x09);
846 } 835 }
@@ -848,13 +837,13 @@ static void do_autogain(struct gspca_dev *gspca_dev)
848 case Rev012A: 837 case Rev012A:
849 reg_r(gspca_dev, 0x8330, 2); 838 reg_r(gspca_dev, 0x8330, 2);
850 if (gspca_dev->usb_buf[1] > 0x08) { 839 if (gspca_dev->usb_buf[1] > 0x08) {
851 reg8339[0] = ++sd->expo12a; 840 gspca_dev->usb_buf[0] = ++sd->expo12a;
852 reg8339[1] = 0; 841 gspca_dev->usb_buf[1] = 0;
853 reg_w_buf(gspca_dev, 0x8339, reg8339, 2); 842 reg_w_buf(gspca_dev, 0x8339, 2);
854 } else if (gspca_dev->usb_buf[1] < 0x02) { 843 } else if (gspca_dev->usb_buf[1] < 0x02) {
855 reg8339[0] = --sd->expo12a; 844 gspca_dev->usb_buf[0] = --sd->expo12a;
856 reg8339[1] = 0; 845 gspca_dev->usb_buf[1] = 0;
857 reg_w_buf(gspca_dev, 0x8339, reg8339, 2); 846 reg_w_buf(gspca_dev, 0x8339, 2);
858 } 847 }
859 break; 848 break;
860 } 849 }
@@ -867,8 +856,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
867{ 856{
868 struct sd *sd = (struct sd *) gspca_dev; 857 struct sd *sd = (struct sd *) gspca_dev;
869 858
870 switch (data[0]) { 859 switch (data[0]) { /* sequence number */
871 case 0: /* start of frame */ 860 case 0: /* start of frame */
872 frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, 861 frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame,
873 data, 0); 862 data, 0);
874 data += SPCA561_OFFSET_DATA; 863 data += SPCA561_OFFSET_DATA;
@@ -890,8 +879,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
890 frame, data, len); 879 frame, data, len);
891 } 880 }
892 return; 881 return;
893 case 0xff: /* drop */ 882 case 0xff: /* drop (empty mpackets) */
894/* gspca_dev->last_packet_type = DISCARD_PACKET; */
895 return; 883 return;
896 } 884 }
897 data++; 885 data++;