diff options
author | Jean-Francois Moine <moinejf@free.fr> | 2008-07-14 08:38:29 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-07-20 06:26:14 -0400 |
commit | 739570bb218bb4607df1f197282561e97a98e54a (patch) | |
tree | 25555dfe5ac873bc96866c486d6f6c1dcabf24f4 /drivers/media | |
parent | 5b77ae7776183d733ec86727bcc34c52a336afd6 (diff) |
V4L/DVB (8352): gspca: Buffers for USB exchanges cannot be in the stack.
gspca: Protect dq_callback() against simultaneous USB exchanges.
Temporary buffer for USB exchanges added in the device struct.
(all) Use a temporary buffer for all USB exchanges.
Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media')
22 files changed, 1700 insertions, 1795 deletions
diff --git a/drivers/media/video/gspca/conex.c b/drivers/media/video/gspca/conex.c index b5481017dd4f..013d593b0c67 100644 --- a/drivers/media/video/gspca/conex.c +++ b/drivers/media/video/gspca/conex.c | |||
@@ -25,8 +25,8 @@ | |||
25 | #define CONEX_CAM 1 /* special JPEG header */ | 25 | #define CONEX_CAM 1 /* special JPEG header */ |
26 | #include "jpeg.h" | 26 | #include "jpeg.h" |
27 | 27 | ||
28 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 28 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
29 | static const char version[] = "2.1.5"; | 29 | static const char version[] = "2.1.7"; |
30 | 30 | ||
31 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); | 31 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); |
32 | MODULE_DESCRIPTION("GSPCA USB Conexant Camera Driver"); | 32 | MODULE_DESCRIPTION("GSPCA USB Conexant Camera Driver"); |
@@ -119,40 +119,67 @@ static struct v4l2_pix_format vga_mode[] = { | |||
119 | .priv = 0}, | 119 | .priv = 0}, |
120 | }; | 120 | }; |
121 | 121 | ||
122 | static void reg_r(struct usb_device *dev, | 122 | /* the read bytes are found in gspca_dev->usb_buf */ |
123 | __u16 index, | 123 | static void reg_r(struct gspca_dev *gspca_dev, |
124 | __u8 *buffer, __u16 length) | 124 | __u16 index, |
125 | __u16 len) | ||
125 | { | 126 | { |
127 | struct usb_device *dev = gspca_dev->dev; | ||
128 | |||
129 | #ifdef CONFIG_VIDEO_ADV_DEBUG | ||
130 | if (len > sizeof gspca_dev->usb_buf) { | ||
131 | err("reg_r: buffer overflow"); | ||
132 | return; | ||
133 | } | ||
134 | #endif | ||
126 | usb_control_msg(dev, | 135 | usb_control_msg(dev, |
127 | usb_rcvctrlpipe(dev, 0), | 136 | usb_rcvctrlpipe(dev, 0), |
128 | 0, | 137 | 0, |
129 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 138 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
130 | 0, | 139 | 0, |
131 | index, buffer, length, | 140 | index, gspca_dev->usb_buf, len, |
132 | 500); | 141 | 500); |
133 | PDEBUG(D_USBI, "reg read [%02x] -> %02x ..", index, *buffer); | 142 | PDEBUG(D_USBI, "reg read [%02x] -> %02x ..", |
143 | index, gspca_dev->usb_buf[0]); | ||
144 | } | ||
145 | |||
146 | /* the bytes to write are in gspca_dev->usb_buf */ | ||
147 | static void reg_w_val(struct gspca_dev *gspca_dev, | ||
148 | __u16 index, | ||
149 | __u8 val) | ||
150 | { | ||
151 | struct usb_device *dev = gspca_dev->dev; | ||
152 | |||
153 | gspca_dev->usb_buf[0] = val; | ||
154 | usb_control_msg(dev, | ||
155 | usb_sndctrlpipe(dev, 0), | ||
156 | 0, | ||
157 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
158 | 0, | ||
159 | index, gspca_dev->usb_buf, 1, 500); | ||
134 | } | 160 | } |
135 | 161 | ||
136 | static void reg_w(struct usb_device *dev, | 162 | static void reg_w(struct gspca_dev *gspca_dev, |
137 | __u16 index, | 163 | __u16 index, |
138 | const __u8 *buffer, __u16 len) | 164 | const __u8 *buffer, |
165 | __u16 len) | ||
139 | { | 166 | { |
140 | __u8 tmpbuf[8]; | 167 | struct usb_device *dev = gspca_dev->dev; |
141 | 168 | ||
142 | #ifdef CONFIG_VIDEO_ADV_DEBUG | 169 | #ifdef CONFIG_VIDEO_ADV_DEBUG |
143 | if (len > sizeof tmpbuf) { | 170 | if (len > sizeof gspca_dev->usb_buf) { |
144 | PDEBUG(D_ERR|D_PACK, "reg_w: buffer overflow"); | 171 | err("reg_w: buffer overflow"); |
145 | return; | 172 | return; |
146 | } | 173 | } |
147 | PDEBUG(D_USBO, "reg write [%02x] = %02x..", index, *buffer); | 174 | PDEBUG(D_USBO, "reg write [%02x] = %02x..", index, *buffer); |
148 | #endif | 175 | #endif |
149 | memcpy(tmpbuf, buffer, len); | 176 | memcpy(gspca_dev->usb_buf, buffer, len); |
150 | usb_control_msg(dev, | 177 | usb_control_msg(dev, |
151 | usb_sndctrlpipe(dev, 0), | 178 | usb_sndctrlpipe(dev, 0), |
152 | 0, | 179 | 0, |
153 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 180 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
154 | 0, | 181 | 0, |
155 | index, tmpbuf, len, 500); | 182 | index, gspca_dev->usb_buf, len, 500); |
156 | } | 183 | } |
157 | 184 | ||
158 | static const __u8 cx_sensor_init[][4] = { | 185 | static const __u8 cx_sensor_init[][4] = { |
@@ -232,17 +259,14 @@ static const __u8 cx11646_fw1[][3] = { | |||
232 | }; | 259 | }; |
233 | static void cx11646_fw(struct gspca_dev*gspca_dev) | 260 | static void cx11646_fw(struct gspca_dev*gspca_dev) |
234 | { | 261 | { |
235 | __u8 val; | ||
236 | int i = 0; | 262 | int i = 0; |
237 | 263 | ||
238 | val = 0x02; | 264 | reg_w_val(gspca_dev, 0x006a, 0x02); |
239 | reg_w(gspca_dev->dev, 0x006a, &val, 1); | ||
240 | while (cx11646_fw1[i][1]) { | 265 | while (cx11646_fw1[i][1]) { |
241 | reg_w(gspca_dev->dev, 0x006b, cx11646_fw1[i], 3); | 266 | reg_w(gspca_dev, 0x006b, cx11646_fw1[i], 3); |
242 | i++; | 267 | i++; |
243 | } | 268 | } |
244 | val = 0x00; | 269 | reg_w_val(gspca_dev, 0x006a, 0x00); |
245 | reg_w(gspca_dev->dev, 0x006a, &val, 1); | ||
246 | } | 270 | } |
247 | 271 | ||
248 | static const __u8 cxsensor[] = { | 272 | static const __u8 cxsensor[] = { |
@@ -273,52 +297,47 @@ static const __u8 reg7b[] = { 0x00, 0xff, 0x00, 0xff, 0x00, 0xff }; | |||
273 | 297 | ||
274 | static void cx_sensor(struct gspca_dev*gspca_dev) | 298 | static void cx_sensor(struct gspca_dev*gspca_dev) |
275 | { | 299 | { |
276 | __u8 val; | ||
277 | int i = 0; | 300 | int i = 0; |
278 | __u8 bufread[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; | ||
279 | int length; | 301 | int length; |
280 | const __u8 *ptsensor = cxsensor; | 302 | const __u8 *ptsensor = cxsensor; |
281 | 303 | ||
282 | reg_w(gspca_dev->dev, 0x0020, reg20, 8); | 304 | reg_w(gspca_dev, 0x0020, reg20, 8); |
283 | reg_w(gspca_dev->dev, 0x0028, reg28, 8); | 305 | reg_w(gspca_dev, 0x0028, reg28, 8); |
284 | reg_w(gspca_dev->dev, 0x0010, reg10, 8); | 306 | reg_w(gspca_dev, 0x0010, reg10, 8); |
285 | val = 0x03; | 307 | reg_w_val(gspca_dev, 0x0092, 0x03); |
286 | reg_w(gspca_dev->dev, 0x0092, &val, 1); | ||
287 | 308 | ||
288 | switch (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) { | 309 | switch (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) { |
289 | case 0: | 310 | case 0: |
290 | reg_w(gspca_dev->dev, 0x0071, reg71a, 4); | 311 | reg_w(gspca_dev, 0x0071, reg71a, 4); |
291 | break; | 312 | break; |
292 | case 1: | 313 | case 1: |
293 | reg_w(gspca_dev->dev, 0x0071, reg71b, 4); | 314 | reg_w(gspca_dev, 0x0071, reg71b, 4); |
294 | break; | 315 | break; |
295 | default: | 316 | default: |
296 | /* case 2: */ | 317 | /* case 2: */ |
297 | reg_w(gspca_dev->dev, 0x0071, reg71c, 4); | 318 | reg_w(gspca_dev, 0x0071, reg71c, 4); |
298 | break; | 319 | break; |
299 | case 3: | 320 | case 3: |
300 | reg_w(gspca_dev->dev, 0x0071, reg71d, 4); | 321 | reg_w(gspca_dev, 0x0071, reg71d, 4); |
301 | break; | 322 | break; |
302 | } | 323 | } |
303 | reg_w(gspca_dev->dev, 0x007b, reg7b, 6); | 324 | reg_w(gspca_dev, 0x007b, reg7b, 6); |
304 | val = 0x00; | 325 | reg_w_val(gspca_dev, 0x00f8, 0x00); |
305 | reg_w(gspca_dev->dev, 0x00f8, &val, 1); | 326 | reg_w(gspca_dev, 0x0010, reg10, 8); |
306 | reg_w(gspca_dev->dev, 0x0010, reg10, 8); | 327 | reg_w_val(gspca_dev, 0x0098, 0x41); |
307 | val = 0x41; | ||
308 | reg_w(gspca_dev->dev, 0x0098, &val, 1); | ||
309 | for (i = 0; i < 11; i++) { | 328 | for (i = 0; i < 11; i++) { |
310 | if (i == 3 || i == 5 || i == 8) | 329 | if (i == 3 || i == 5 || i == 8) |
311 | length = 8; | 330 | length = 8; |
312 | else | 331 | else |
313 | length = 4; | 332 | length = 4; |
314 | reg_w(gspca_dev->dev, 0x00e5, ptsensor, length); | 333 | reg_w(gspca_dev, 0x00e5, ptsensor, length); |
315 | if (length == 4) | 334 | if (length == 4) |
316 | reg_r(gspca_dev->dev, 0x00e8, &val, 1); | 335 | reg_r(gspca_dev, 0x00e8, 1); |
317 | else | 336 | else |
318 | reg_r(gspca_dev->dev, 0x00e8, bufread, length); | 337 | reg_r(gspca_dev, 0x00e8, length); |
319 | ptsensor += length; | 338 | ptsensor += length; |
320 | } | 339 | } |
321 | reg_r(gspca_dev->dev, 0x00e7, bufread, 8); | 340 | reg_r(gspca_dev, 0x00e7, 8); |
322 | } | 341 | } |
323 | 342 | ||
324 | static const __u8 cx_inits_176[] = { | 343 | static const __u8 cx_inits_176[] = { |
@@ -358,10 +377,9 @@ static const __u8 cx_inits_640[] = { | |||
358 | 0x77, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | 377 | 0x77, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |
359 | }; | 378 | }; |
360 | 379 | ||
361 | static int cx11646_initsize(struct gspca_dev *gspca_dev) | 380 | static void cx11646_initsize(struct gspca_dev *gspca_dev) |
362 | { | 381 | { |
363 | const __u8 *cxinit; | 382 | const __u8 *cxinit; |
364 | __u8 val; | ||
365 | static const __u8 reg12[] = { 0x08, 0x05, 0x07, 0x04, 0x24 }; | 383 | static const __u8 reg12[] = { 0x08, 0x05, 0x07, 0x04, 0x24 }; |
366 | static const __u8 reg17[] = | 384 | static const __u8 reg17[] = |
367 | { 0x0a, 0x00, 0xf2, 0x01, 0x0f, 0x00, 0x97, 0x02 }; | 385 | { 0x0a, 0x00, 0xf2, 0x01, 0x0f, 0x00, 0x97, 0x02 }; |
@@ -381,35 +399,29 @@ static int cx11646_initsize(struct gspca_dev *gspca_dev) | |||
381 | cxinit = cx_inits_176; | 399 | cxinit = cx_inits_176; |
382 | break; | 400 | break; |
383 | } | 401 | } |
384 | val = 0x01; | 402 | reg_w_val(gspca_dev, 0x009a, 0x01); |
385 | reg_w(gspca_dev->dev, 0x009a, &val, 1); | 403 | reg_w_val(gspca_dev, 0x0010, 0x10); |
386 | val = 0x10; | 404 | reg_w(gspca_dev, 0x0012, reg12, 5); |
387 | reg_w(gspca_dev->dev, 0x0010, &val, 1); | 405 | reg_w(gspca_dev, 0x0017, reg17, 8); |
388 | reg_w(gspca_dev->dev, 0x0012, reg12, 5); | 406 | reg_w_val(gspca_dev, 0x00c0, 0x00); |
389 | reg_w(gspca_dev->dev, 0x0017, reg17, 8); | 407 | reg_w_val(gspca_dev, 0x00c1, 0x04); |
390 | val = 0x00; | 408 | reg_w_val(gspca_dev, 0x00c2, 0x04); |
391 | reg_w(gspca_dev->dev, 0x00c0, &val, 1); | 409 | |
392 | val = 0x04; | 410 | reg_w(gspca_dev, 0x0061, cxinit, 8); |
393 | reg_w(gspca_dev->dev, 0x00c1, &val, 1); | ||
394 | val = 0x04; | ||
395 | reg_w(gspca_dev->dev, 0x00c2, &val, 1); | ||
396 | |||
397 | reg_w(gspca_dev->dev, 0x0061, cxinit, 8); | ||
398 | cxinit += 8; | 411 | cxinit += 8; |
399 | reg_w(gspca_dev->dev, 0x00ca, cxinit, 8); | 412 | reg_w(gspca_dev, 0x00ca, cxinit, 8); |
400 | cxinit += 8; | 413 | cxinit += 8; |
401 | reg_w(gspca_dev->dev, 0x00d2, cxinit, 8); | 414 | reg_w(gspca_dev, 0x00d2, cxinit, 8); |
402 | cxinit += 8; | 415 | cxinit += 8; |
403 | reg_w(gspca_dev->dev, 0x00da, cxinit, 6); | 416 | reg_w(gspca_dev, 0x00da, cxinit, 6); |
404 | cxinit += 8; | 417 | cxinit += 8; |
405 | reg_w(gspca_dev->dev, 0x0041, cxinit, 8); | 418 | reg_w(gspca_dev, 0x0041, cxinit, 8); |
406 | cxinit += 8; | 419 | cxinit += 8; |
407 | reg_w(gspca_dev->dev, 0x0049, cxinit, 8); | 420 | reg_w(gspca_dev, 0x0049, cxinit, 8); |
408 | cxinit += 8; | 421 | cxinit += 8; |
409 | reg_w(gspca_dev->dev, 0x0051, cxinit, 2); | 422 | reg_w(gspca_dev, 0x0051, cxinit, 2); |
410 | 423 | ||
411 | reg_r(gspca_dev->dev, 0x0010, &val, 1); | 424 | reg_r(gspca_dev, 0x0010, 1); |
412 | return val; | ||
413 | } | 425 | } |
414 | 426 | ||
415 | static const __u8 cx_jpeg_init[][8] = { | 427 | static const __u8 cx_jpeg_init[][8] = { |
@@ -636,26 +648,21 @@ static const __u8 cxjpeg_qtable[][8] = { | |||
636 | 648 | ||
637 | static void cx11646_jpegInit(struct gspca_dev*gspca_dev) | 649 | static void cx11646_jpegInit(struct gspca_dev*gspca_dev) |
638 | { | 650 | { |
639 | __u8 val; | ||
640 | int i; | 651 | int i; |
641 | int length; | 652 | int length; |
642 | 653 | ||
643 | val = 0x01; | 654 | reg_w_val(gspca_dev, 0x00c0, 0x01); |
644 | reg_w(gspca_dev->dev, 0x00c0, &val, 1); | 655 | reg_w_val(gspca_dev, 0x00c3, 0x00); |
645 | val = 0x00; | 656 | reg_w_val(gspca_dev, 0x00c0, 0x00); |
646 | reg_w(gspca_dev->dev, 0x00c3, &val, 1); | 657 | reg_r(gspca_dev, 0x0001, 1); |
647 | val = 0x00; | ||
648 | reg_w(gspca_dev->dev, 0x00c0, &val, 1); | ||
649 | reg_r(gspca_dev->dev, 0x0001, &val, 1); | ||
650 | length = 8; | 658 | length = 8; |
651 | for (i = 0; i < 79; i++) { | 659 | for (i = 0; i < 79; i++) { |
652 | if (i == 78) | 660 | if (i == 78) |
653 | length = 6; | 661 | length = 6; |
654 | reg_w(gspca_dev->dev, 0x0008, cx_jpeg_init[i], length); | 662 | reg_w(gspca_dev, 0x0008, cx_jpeg_init[i], length); |
655 | } | 663 | } |
656 | reg_r(gspca_dev->dev, 0x0002, &val, 1); | 664 | reg_r(gspca_dev, 0x0002, 1); |
657 | val = 0x14; | 665 | reg_w_val(gspca_dev, 0x0055, 0x14); |
658 | reg_w(gspca_dev->dev, 0x0055, &val, 1); | ||
659 | } | 666 | } |
660 | 667 | ||
661 | static const __u8 reg12[] = { 0x0a, 0x05, 0x07, 0x04, 0x19 }; | 668 | static const __u8 reg12[] = { 0x0a, 0x05, 0x07, 0x04, 0x19 }; |
@@ -665,31 +672,26 @@ static const __u8 regE5a[] = { 0x88, 0x0a, 0x0c, 0x01 }; | |||
665 | static const __u8 regE5b[] = { 0x88, 0x0b, 0x12, 0x01 }; | 672 | static const __u8 regE5b[] = { 0x88, 0x0b, 0x12, 0x01 }; |
666 | static const __u8 regE5c[] = { 0x88, 0x05, 0x01, 0x01 }; | 673 | static const __u8 regE5c[] = { 0x88, 0x05, 0x01, 0x01 }; |
667 | static const __u8 reg51[] = { 0x77, 0x03 }; | 674 | static const __u8 reg51[] = { 0x77, 0x03 }; |
668 | static const __u8 reg70 = 0x03; | 675 | #define reg70 0x03 |
669 | 676 | ||
670 | static void cx11646_jpeg(struct gspca_dev*gspca_dev) | 677 | static void cx11646_jpeg(struct gspca_dev*gspca_dev) |
671 | { | 678 | { |
672 | __u8 val; | ||
673 | int i; | 679 | int i; |
674 | int length; | 680 | int length; |
675 | __u8 Reg55; | 681 | __u8 Reg55; |
676 | __u8 bufread[8]; | ||
677 | int retry; | 682 | int retry; |
678 | 683 | ||
679 | val = 0x01; | 684 | reg_w_val(gspca_dev, 0x00c0, 0x01); |
680 | reg_w(gspca_dev->dev, 0x00c0, &val, 1); | 685 | reg_w_val(gspca_dev, 0x00c3, 0x00); |
681 | val = 0x00; | 686 | reg_w_val(gspca_dev, 0x00c0, 0x00); |
682 | reg_w(gspca_dev->dev, 0x00c3, &val, 1); | 687 | reg_r(gspca_dev, 0x0001, 1); |
683 | val = 0x00; | ||
684 | reg_w(gspca_dev->dev, 0x00c0, &val, 1); | ||
685 | reg_r(gspca_dev->dev, 0x0001, &val, 1); | ||
686 | length = 8; | 688 | length = 8; |
687 | switch (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) { | 689 | switch (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) { |
688 | case 0: | 690 | case 0: |
689 | for (i = 0; i < 27; i++) { | 691 | for (i = 0; i < 27; i++) { |
690 | if (i == 26) | 692 | if (i == 26) |
691 | length = 2; | 693 | length = 2; |
692 | reg_w(gspca_dev->dev, 0x0008, cxjpeg_640[i], length); | 694 | reg_w(gspca_dev, 0x0008, cxjpeg_640[i], length); |
693 | } | 695 | } |
694 | Reg55 = 0x28; | 696 | Reg55 = 0x28; |
695 | break; | 697 | break; |
@@ -697,7 +699,7 @@ static void cx11646_jpeg(struct gspca_dev*gspca_dev) | |||
697 | for (i = 0; i < 27; i++) { | 699 | for (i = 0; i < 27; i++) { |
698 | if (i == 26) | 700 | if (i == 26) |
699 | length = 2; | 701 | length = 2; |
700 | reg_w(gspca_dev->dev, 0x0008, cxjpeg_352[i], length); | 702 | reg_w(gspca_dev, 0x0008, cxjpeg_352[i], length); |
701 | } | 703 | } |
702 | Reg55 = 0x16; | 704 | Reg55 = 0x16; |
703 | break; | 705 | break; |
@@ -706,7 +708,7 @@ static void cx11646_jpeg(struct gspca_dev*gspca_dev) | |||
706 | for (i = 0; i < 27; i++) { | 708 | for (i = 0; i < 27; i++) { |
707 | if (i == 26) | 709 | if (i == 26) |
708 | length = 2; | 710 | length = 2; |
709 | reg_w(gspca_dev->dev, 0x0008, cxjpeg_320[i], length); | 711 | reg_w(gspca_dev, 0x0008, cxjpeg_320[i], length); |
710 | } | 712 | } |
711 | Reg55 = 0x14; | 713 | Reg55 = 0x14; |
712 | break; | 714 | break; |
@@ -714,124 +716,98 @@ static void cx11646_jpeg(struct gspca_dev*gspca_dev) | |||
714 | for (i = 0; i < 27; i++) { | 716 | for (i = 0; i < 27; i++) { |
715 | if (i == 26) | 717 | if (i == 26) |
716 | length = 2; | 718 | length = 2; |
717 | reg_w(gspca_dev->dev, 0x0008, cxjpeg_176[i], length); | 719 | reg_w(gspca_dev, 0x0008, cxjpeg_176[i], length); |
718 | } | 720 | } |
719 | Reg55 = 0x0B; | 721 | Reg55 = 0x0B; |
720 | break; | 722 | break; |
721 | } | 723 | } |
722 | 724 | ||
723 | reg_r(gspca_dev->dev, 0x0002, &val, 1); | 725 | reg_r(gspca_dev, 0x0002, 1); |
724 | val = Reg55; | 726 | reg_w_val(gspca_dev, 0x0055, Reg55); |
725 | reg_w(gspca_dev->dev, 0x0055, &val, 1); | 727 | reg_r(gspca_dev, 0x0002, 1); |
726 | reg_r(gspca_dev->dev, 0x0002, &val, 1); | 728 | reg_w(gspca_dev, 0x0010, reg10, 2); |
727 | reg_w(gspca_dev->dev, 0x0010, reg10, 2); | 729 | reg_w_val(gspca_dev, 0x0054, 0x02); |
728 | val = 0x02; | 730 | reg_w_val(gspca_dev, 0x0054, 0x01); |
729 | reg_w(gspca_dev->dev, 0x0054, &val, 1); | 731 | reg_w_val(gspca_dev, 0x0000, 0x94); |
730 | val = 0x01; | 732 | reg_w_val(gspca_dev, 0x0053, 0xc0); |
731 | reg_w(gspca_dev->dev, 0x0054, &val, 1); | 733 | reg_w_val(gspca_dev, 0x00fc, 0xe1); |
732 | val = 0x94; | 734 | reg_w_val(gspca_dev, 0x0000, 0x00); |
733 | reg_w(gspca_dev->dev, 0x0000, &val, 1); | ||
734 | val = 0xc0; | ||
735 | reg_w(gspca_dev->dev, 0x0053, &val, 1); | ||
736 | val = 0xe1; | ||
737 | reg_w(gspca_dev->dev, 0x00fc, &val, 1); | ||
738 | val = 0x00; | ||
739 | reg_w(gspca_dev->dev, 0x0000, &val, 1); | ||
740 | /* wait for completion */ | 735 | /* wait for completion */ |
741 | retry = 50; | 736 | retry = 50; |
742 | while (retry--) { | 737 | while (retry--) { |
743 | reg_r(gspca_dev->dev, 0x0002, &val, 1); | 738 | reg_r(gspca_dev, 0x0002, 1); |
744 | /* 0x07 until 0x00 */ | 739 | /* 0x07 until 0x00 */ |
745 | if (val == 0x00) | 740 | if (gspca_dev->usb_buf[0] == 0x00) |
746 | break; | 741 | break; |
747 | val = 0x00; | 742 | reg_w_val(gspca_dev, 0x0053, 0x00); |
748 | reg_w(gspca_dev->dev, 0x0053, &val, 1); | ||
749 | } | 743 | } |
750 | if (retry == 0) | 744 | if (retry == 0) |
751 | PDEBUG(D_ERR, "Damned Errors sending jpeg Table"); | 745 | PDEBUG(D_ERR, "Damned Errors sending jpeg Table"); |
752 | /* send the qtable now */ | 746 | /* send the qtable now */ |
753 | reg_r(gspca_dev->dev, 0x0001, &val, 1); /* -> 0x18 */ | 747 | reg_r(gspca_dev, 0x0001, 1); /* -> 0x18 */ |
754 | length = 8; | 748 | length = 8; |
755 | for (i = 0; i < 18; i++) { | 749 | for (i = 0; i < 18; i++) { |
756 | if (i == 17) | 750 | if (i == 17) |
757 | length = 2; | 751 | length = 2; |
758 | reg_w(gspca_dev->dev, 0x0008, cxjpeg_qtable[i], length); | 752 | reg_w(gspca_dev, 0x0008, cxjpeg_qtable[i], length); |
759 | 753 | ||
760 | } | 754 | } |
761 | reg_r(gspca_dev->dev, 0x0002, &val, 1); /* 0x00 */ | 755 | reg_r(gspca_dev, 0x0002, 1); /* 0x00 */ |
762 | reg_r(gspca_dev->dev, 0x0053, &val, 1); /* 0x00 */ | 756 | reg_r(gspca_dev, 0x0053, 1); /* 0x00 */ |
763 | val = 0x02; | 757 | reg_w_val(gspca_dev, 0x0054, 0x02); |
764 | reg_w(gspca_dev->dev, 0x0054, &val, 1); | 758 | reg_w_val(gspca_dev, 0x0054, 0x01); |
765 | val = 0x01; | 759 | reg_w_val(gspca_dev, 0x0000, 0x94); |
766 | reg_w(gspca_dev->dev, 0x0054, &val, 1); | 760 | reg_w_val(gspca_dev, 0x0053, 0xc0); |
767 | val = 0x94; | 761 | |
768 | reg_w(gspca_dev->dev, 0x0000, &val, 1); | 762 | reg_r(gspca_dev, 0x0038, 1); /* 0x40 */ |
769 | val = 0xc0; | 763 | reg_r(gspca_dev, 0x0038, 1); /* 0x40 */ |
770 | reg_w(gspca_dev->dev, 0x0053, &val, 1); | 764 | reg_r(gspca_dev, 0x001f, 1); /* 0x38 */ |
771 | 765 | reg_w(gspca_dev, 0x0012, reg12, 5); | |
772 | reg_r(gspca_dev->dev, 0x0038, &val, 1); /* 0x40 */ | 766 | reg_w(gspca_dev, 0x00e5, regE5_8, 8); |
773 | reg_r(gspca_dev->dev, 0x0038, &val, 1); /* 0x40 */ | 767 | reg_r(gspca_dev, 0x00e8, 8); |
774 | reg_r(gspca_dev->dev, 0x001f, &val, 1); /* 0x38 */ | 768 | reg_w(gspca_dev, 0x00e5, regE5a, 4); |
775 | reg_w(gspca_dev->dev, 0x0012, reg12, 5); | 769 | reg_r(gspca_dev, 0x00e8, 1); /* 0x00 */ |
776 | reg_w(gspca_dev->dev, 0x00e5, regE5_8, 8); | 770 | reg_w_val(gspca_dev, 0x009a, 0x01); |
777 | reg_r(gspca_dev->dev, 0x00e8, bufread, 8); | 771 | reg_w(gspca_dev, 0x00e5, regE5b, 4); |
778 | reg_w(gspca_dev->dev, 0x00e5, regE5a, 4); | 772 | reg_r(gspca_dev, 0x00e8, 1); /* 0x00 */ |
779 | reg_r(gspca_dev->dev, 0x00e8, &val, 1); /* 0x00 */ | 773 | reg_w(gspca_dev, 0x00e5, regE5c, 4); |
780 | val = 0x01; | 774 | reg_r(gspca_dev, 0x00e8, 1); /* 0x00 */ |
781 | reg_w(gspca_dev->dev, 0x009a, &val, 1); | 775 | |
782 | reg_w(gspca_dev->dev, 0x00e5, regE5b, 4); | 776 | reg_w(gspca_dev, 0x0051, reg51, 2); |
783 | reg_r(gspca_dev->dev, 0x00e8, &val, 1); /* 0x00 */ | 777 | reg_w(gspca_dev, 0x0010, reg10, 2); |
784 | reg_w(gspca_dev->dev, 0x00e5, regE5c, 4); | 778 | reg_w_val(gspca_dev, 0x0070, reg70); |
785 | reg_r(gspca_dev->dev, 0x00e8, &val, 1); /* 0x00 */ | ||
786 | |||
787 | reg_w(gspca_dev->dev, 0x0051, reg51, 2); | ||
788 | reg_w(gspca_dev->dev, 0x0010, reg10, 2); | ||
789 | reg_w(gspca_dev->dev, 0x0070, ®70, 1); | ||
790 | } | 779 | } |
791 | 780 | ||
792 | static void cx11646_init1(struct gspca_dev *gspca_dev) | 781 | static void cx11646_init1(struct gspca_dev *gspca_dev) |
793 | { | 782 | { |
794 | __u8 val; | ||
795 | int i = 0; | 783 | int i = 0; |
796 | 784 | ||
797 | val = 0; | 785 | reg_w_val(gspca_dev, 0x0010, 0x00); |
798 | reg_w(gspca_dev->dev, 0x0010, &val, 1); | 786 | reg_w_val(gspca_dev, 0x0053, 0x00); |
799 | reg_w(gspca_dev->dev, 0x0053, &val, 1); | 787 | reg_w_val(gspca_dev, 0x0052, 0x00); |
800 | reg_w(gspca_dev->dev, 0x0052, &val, 1); | 788 | reg_w_val(gspca_dev, 0x009b, 0x2f); |
801 | val = 0x2f; | 789 | reg_w_val(gspca_dev, 0x009c, 0x10); |
802 | reg_w(gspca_dev->dev, 0x009b, &val, 1); | 790 | reg_r(gspca_dev, 0x0098, 1); |
803 | val = 0x10; | 791 | reg_w_val(gspca_dev, 0x0098, 0x40); |
804 | reg_w(gspca_dev->dev, 0x009c, &val, 1); | 792 | reg_r(gspca_dev, 0x0099, 1); |
805 | reg_r(gspca_dev->dev, 0x0098, &val, 1); | 793 | reg_w_val(gspca_dev, 0x0099, 0x07); |
806 | val = 0x40; | 794 | reg_w_val(gspca_dev, 0x0039, 0x40); |
807 | reg_w(gspca_dev->dev, 0x0098, &val, 1); | 795 | reg_w_val(gspca_dev, 0x003c, 0xff); |
808 | reg_r(gspca_dev->dev, 0x0099, &val, 1); | 796 | reg_w_val(gspca_dev, 0x003f, 0x1f); |
809 | val = 0x07; | 797 | reg_w_val(gspca_dev, 0x003d, 0x40); |
810 | reg_w(gspca_dev->dev, 0x0099, &val, 1); | 798 | /* reg_w_val(gspca_dev, 0x003d, 0x60); */ |
811 | val = 0x40; | 799 | reg_r(gspca_dev, 0x0099, 1); /* ->0x07 */ |
812 | reg_w(gspca_dev->dev, 0x0039, &val, 1); | ||
813 | val = 0xff; | ||
814 | reg_w(gspca_dev->dev, 0x003c, &val, 1); | ||
815 | val = 0x1f; | ||
816 | reg_w(gspca_dev->dev, 0x003f, &val, 1); | ||
817 | val = 0x40; | ||
818 | reg_w(gspca_dev->dev, 0x003d, &val, 1); | ||
819 | /* val= 0x60; */ | ||
820 | /* reg_w(gspca_dev->dev, 0x00, 0x00, 0x003d, &val, 1); */ | ||
821 | reg_r(gspca_dev->dev, 0x0099, &val, 1); /* ->0x07 */ | ||
822 | 800 | ||
823 | while (cx_sensor_init[i][0]) { | 801 | while (cx_sensor_init[i][0]) { |
824 | reg_w(gspca_dev->dev, 0x00e5, cx_sensor_init[i], 1); | 802 | reg_w_val(gspca_dev, 0x00e5, cx_sensor_init[i][0]); |
825 | reg_r(gspca_dev->dev, 0x00e8, &val, 1); /* -> 0x00 */ | 803 | reg_r(gspca_dev, 0x00e8, 1); /* -> 0x00 */ |
826 | if (i == 1) { | 804 | if (i == 1) { |
827 | val = 1; | 805 | reg_w_val(gspca_dev, 0x00ed, 0x01); |
828 | reg_w(gspca_dev->dev, 0x00ed, &val, 1); | 806 | reg_r(gspca_dev, 0x00ed, 1); /* -> 0x01 */ |
829 | reg_r(gspca_dev->dev, 0x00ed, &val, 1); /* -> 0x01 */ | ||
830 | } | 807 | } |
831 | i++; | 808 | i++; |
832 | } | 809 | } |
833 | val = 0x00; | 810 | reg_w_val(gspca_dev, 0x00c3, 0x00); |
834 | reg_w(gspca_dev->dev, 0x00c3, &val, 1); | ||
835 | } | 811 | } |
836 | 812 | ||
837 | /* this function is called at probe time */ | 813 | /* this function is called at probe time */ |
@@ -880,29 +856,23 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
880 | static void sd_stop0(struct gspca_dev *gspca_dev) | 856 | static void sd_stop0(struct gspca_dev *gspca_dev) |
881 | { | 857 | { |
882 | int retry = 50; | 858 | int retry = 50; |
883 | __u8 val; | ||
884 | 859 | ||
885 | val = 0; | 860 | reg_w_val(gspca_dev, 0x0000, 0x00); |
886 | reg_w(gspca_dev->dev, 0x0000, &val, 1); | 861 | reg_r(gspca_dev, 0x0002, 1); |
887 | reg_r(gspca_dev->dev, 0x0002, &val, 1); | 862 | reg_w_val(gspca_dev, 0x0053, 0x00); |
888 | val = 0; | ||
889 | reg_w(gspca_dev->dev, 0x0053, &val, 1); | ||
890 | 863 | ||
891 | while (retry--) { | 864 | while (retry--) { |
892 | /* reg_r(gspca_dev->dev, 0x0002, &val, 1);*/ | 865 | /* reg_r(gspca_dev, 0x0002, 1);*/ |
893 | reg_r(gspca_dev->dev, 0x0053, &val, 1); | 866 | reg_r(gspca_dev, 0x0053, 1); |
894 | if (val == 0) | 867 | if (gspca_dev->usb_buf[0] == 0) |
895 | break; | 868 | break; |
896 | } | 869 | } |
897 | val = 0; | 870 | reg_w_val(gspca_dev, 0x0000, 0x00); |
898 | reg_w(gspca_dev->dev, 0x0000, &val, 1); | 871 | reg_r(gspca_dev, 0x0002, 1); |
899 | reg_r(gspca_dev->dev, 0x0002, &val, 1); | 872 | |
900 | 873 | reg_w_val(gspca_dev, 0x0010, 0x00); | |
901 | val = 0; | 874 | reg_r(gspca_dev, 0x0033, 1); |
902 | reg_w(gspca_dev->dev, 0x0010, &val, 1); | 875 | reg_w_val(gspca_dev, 0x00fc, 0xe0); |
903 | reg_r(gspca_dev->dev, 0x0033, &val, 1); | ||
904 | val = 0xe0; | ||
905 | reg_w(gspca_dev->dev, 0x00fc, &val, 1); | ||
906 | } | 876 | } |
907 | 877 | ||
908 | static void sd_close(struct gspca_dev *gspca_dev) | 878 | static void sd_close(struct gspca_dev *gspca_dev) |
@@ -937,22 +907,20 @@ static void setbrightness(struct gspca_dev*gspca_dev) | |||
937 | __u8 reg51c[2]; | 907 | __u8 reg51c[2]; |
938 | __u8 bright; | 908 | __u8 bright; |
939 | __u8 colors; | 909 | __u8 colors; |
940 | __u8 val; | ||
941 | __u8 bufread[8]; | ||
942 | 910 | ||
943 | bright = sd->brightness; | 911 | bright = sd->brightness; |
944 | regE5cbx[2] = bright; | 912 | regE5cbx[2] = bright; |
945 | reg_w(gspca_dev->dev, 0x00e5, regE5cbx, 8); | 913 | reg_w(gspca_dev, 0x00e5, regE5cbx, 8); |
946 | reg_r(gspca_dev->dev, 0x00e8, bufread, 8); | 914 | reg_r(gspca_dev, 0x00e8, 8); |
947 | reg_w(gspca_dev->dev, 0x00e5, regE5c, 4); | 915 | reg_w(gspca_dev, 0x00e5, regE5c, 4); |
948 | reg_r(gspca_dev->dev, 0x00e8, &val, 1); /* 0x00 */ | 916 | reg_r(gspca_dev, 0x00e8, 1); /* 0x00 */ |
949 | 917 | ||
950 | colors = sd->colors; | 918 | colors = sd->colors; |
951 | reg51c[0] = 0x77; | 919 | reg51c[0] = 0x77; |
952 | reg51c[1] = colors; | 920 | reg51c[1] = colors; |
953 | reg_w(gspca_dev->dev, 0x0051, reg51c, 2); | 921 | reg_w(gspca_dev, 0x0051, reg51c, 2); |
954 | reg_w(gspca_dev->dev, 0x0010, reg10, 2); | 922 | reg_w(gspca_dev, 0x0010, reg10, 2); |
955 | reg_w(gspca_dev->dev, 0x0070, ®70, 1); | 923 | reg_w_val(gspca_dev, 0x0070, reg70); |
956 | } | 924 | } |
957 | 925 | ||
958 | static void setcontrast(struct gspca_dev*gspca_dev) | 926 | static void setcontrast(struct gspca_dev*gspca_dev) |
@@ -961,16 +929,15 @@ static void setcontrast(struct gspca_dev*gspca_dev) | |||
961 | __u8 regE5acx[] = { 0x88, 0x0a, 0x0c, 0x01 }; /* seem MSB */ | 929 | __u8 regE5acx[] = { 0x88, 0x0a, 0x0c, 0x01 }; /* seem MSB */ |
962 | /* __u8 regE5bcx[] = { 0x88, 0x0b, 0x12, 0x01}; * LSB */ | 930 | /* __u8 regE5bcx[] = { 0x88, 0x0b, 0x12, 0x01}; * LSB */ |
963 | __u8 reg51c[2]; | 931 | __u8 reg51c[2]; |
964 | __u8 val; | ||
965 | 932 | ||
966 | regE5acx[2] = sd->contrast; | 933 | regE5acx[2] = sd->contrast; |
967 | reg_w(gspca_dev->dev, 0x00e5, regE5acx, 4); | 934 | reg_w(gspca_dev, 0x00e5, regE5acx, 4); |
968 | reg_r(gspca_dev->dev, 0x00e8, &val, 1); /* 0x00 */ | 935 | reg_r(gspca_dev, 0x00e8, 1); /* 0x00 */ |
969 | reg51c[0] = 0x77; | 936 | reg51c[0] = 0x77; |
970 | reg51c[1] = sd->colors; | 937 | reg51c[1] = sd->colors; |
971 | reg_w(gspca_dev->dev, 0x0051, reg51c, 2); | 938 | reg_w(gspca_dev, 0x0051, reg51c, 2); |
972 | reg_w(gspca_dev->dev, 0x0010, reg10, 2); | 939 | reg_w(gspca_dev, 0x0010, reg10, 2); |
973 | reg_w(gspca_dev->dev, 0x0070, ®70, 1); | 940 | reg_w_val(gspca_dev, 0x0070, reg70); |
974 | } | 941 | } |
975 | 942 | ||
976 | static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) | 943 | static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) |
diff --git a/drivers/media/video/gspca/etoms.c b/drivers/media/video/gspca/etoms.c index 1da6a182561f..5bb8dc1adbb7 100644 --- a/drivers/media/video/gspca/etoms.c +++ b/drivers/media/video/gspca/etoms.c | |||
@@ -22,8 +22,8 @@ | |||
22 | 22 | ||
23 | #include "gspca.h" | 23 | #include "gspca.h" |
24 | 24 | ||
25 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 25 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
26 | static const char version[] = "2.1.5"; | 26 | static const char version[] = "2.1.7"; |
27 | 27 | ||
28 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); | 28 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); |
29 | MODULE_DESCRIPTION("Etoms USB Camera Driver"); | 29 | MODULE_DESCRIPTION("Etoms USB Camera Driver"); |
@@ -229,201 +229,215 @@ static const __u8 I2c3[] = { 0x12, 0x05 }; | |||
229 | 229 | ||
230 | static const __u8 I2c4[] = { 0x41, 0x08 }; | 230 | static const __u8 I2c4[] = { 0x41, 0x08 }; |
231 | 231 | ||
232 | static void reg_r(struct usb_device *dev, | 232 | /* read 'len' bytes to gspca_dev->usb_buf */ |
233 | __u16 index, __u8 *buffer, int len) | 233 | static void reg_r(struct gspca_dev *gspca_dev, |
234 | __u16 index, | ||
235 | __u16 len) | ||
234 | { | 236 | { |
237 | struct usb_device *dev = gspca_dev->dev; | ||
238 | |||
239 | #ifdef CONFIG_VIDEO_ADV_DEBUG | ||
240 | if (len > sizeof gspca_dev->usb_buf) { | ||
241 | err("reg_r: buffer overflow"); | ||
242 | return; | ||
243 | } | ||
244 | #endif | ||
235 | usb_control_msg(dev, | 245 | usb_control_msg(dev, |
236 | usb_rcvctrlpipe(dev, 0), | 246 | usb_rcvctrlpipe(dev, 0), |
237 | 0, | 247 | 0, |
238 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, | 248 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, |
239 | 0, index, buffer, len, 500); | 249 | 0, |
250 | index, gspca_dev->usb_buf, len, 500); | ||
251 | PDEBUG(D_USBI, "reg read [%02x] -> %02x ..", | ||
252 | index, gspca_dev->usb_buf[0]); | ||
240 | } | 253 | } |
241 | 254 | ||
242 | static void reg_w_val(struct usb_device *dev, | 255 | static void reg_w_val(struct gspca_dev *gspca_dev, |
243 | __u16 index, __u8 val) | 256 | __u16 index, |
257 | __u8 val) | ||
244 | { | 258 | { |
245 | __u8 data; | 259 | struct usb_device *dev = gspca_dev->dev; |
246 | 260 | ||
247 | data = val; | 261 | gspca_dev->usb_buf[0] = val; |
248 | usb_control_msg(dev, | 262 | usb_control_msg(dev, |
249 | usb_sndctrlpipe(dev, 0), | 263 | usb_sndctrlpipe(dev, 0), |
250 | 0, | 264 | 0, |
251 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, | 265 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, |
252 | 0, index, &data, 1, 500); | 266 | 0, |
267 | index, gspca_dev->usb_buf, 1, 500); | ||
253 | } | 268 | } |
254 | 269 | ||
255 | static void reg_w(struct usb_device *dev, | 270 | static void reg_w(struct gspca_dev *gspca_dev, |
256 | __u16 index, const __u8 *buffer, __u16 len) | 271 | __u16 index, |
272 | const __u8 *buffer, | ||
273 | __u16 len) | ||
257 | { | 274 | { |
258 | __u8 tmpbuf[8]; | 275 | struct usb_device *dev = gspca_dev->dev; |
259 | 276 | ||
260 | memcpy(tmpbuf, buffer, len); | 277 | #ifdef CONFIG_VIDEO_ADV_DEBUG |
278 | if (len > sizeof gspca_dev->usb_buf) { | ||
279 | err("reg_w: buffer overflow"); | ||
280 | return; | ||
281 | } | ||
282 | PDEBUG(D_USBO, "reg write [%02x] = %02x..", index, *buffer); | ||
283 | #endif | ||
284 | memcpy(gspca_dev->usb_buf, buffer, len); | ||
261 | usb_control_msg(dev, | 285 | usb_control_msg(dev, |
262 | usb_sndctrlpipe(dev, 0), | 286 | usb_sndctrlpipe(dev, 0), |
263 | 0, | 287 | 0, |
264 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, | 288 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, |
265 | 0, index, tmpbuf, len, 500); | 289 | 0, index, gspca_dev->usb_buf, len, 500); |
266 | } | 290 | } |
267 | 291 | ||
268 | static int Et_i2cwrite(struct usb_device *dev, __u8 reg, | 292 | static int i2c_w(struct gspca_dev *gspca_dev, |
269 | const __u8 *buffer, | 293 | __u8 reg, |
270 | __u16 len, __u8 mode) | 294 | const __u8 *buffer, |
295 | __u16 len, __u8 mode) | ||
271 | { | 296 | { |
272 | /* buffer should be [D0..D7] */ | 297 | /* buffer should be [D0..D7] */ |
273 | __u8 ptchcount; | 298 | __u8 ptchcount; |
274 | 299 | ||
275 | /* set the base address */ | 300 | /* set the base address */ |
276 | reg_w_val(dev, ET_I2C_BASE, 0x40); /* sensor base for the pas106 */ | 301 | reg_w_val(gspca_dev, ET_I2C_BASE, 0x40); |
302 | /* sensor base for the pas106 */ | ||
277 | /* set count and prefetch */ | 303 | /* set count and prefetch */ |
278 | ptchcount = ((len & 0x07) << 4) | (mode & 0x03); | 304 | ptchcount = ((len & 0x07) << 4) | (mode & 0x03); |
279 | reg_w_val(dev, ET_I2C_COUNT, ptchcount); | 305 | reg_w_val(gspca_dev, ET_I2C_COUNT, ptchcount); |
280 | /* set the register base */ | 306 | /* set the register base */ |
281 | reg_w_val(dev, ET_I2C_REG, reg); | 307 | reg_w_val(gspca_dev, ET_I2C_REG, reg); |
282 | while (--len >= 0) | 308 | while (--len >= 0) |
283 | reg_w_val(dev, ET_I2C_DATA0 + len, buffer[len]); | 309 | reg_w_val(gspca_dev, ET_I2C_DATA0 + len, buffer[len]); |
284 | return 0; | 310 | return 0; |
285 | } | 311 | } |
286 | 312 | ||
287 | static int Et_i2cread(struct usb_device *dev, __u8 reg, | 313 | static int i2c_r(struct gspca_dev *gspca_dev, |
288 | __u8 *buffer, | 314 | __u8 reg) |
289 | __u16 length, __u8 mode) | ||
290 | { | 315 | { |
291 | /* buffer should be [D0..D7] */ | ||
292 | int i, j; | ||
293 | __u8 ptchcount; | ||
294 | |||
295 | /* set the base address */ | 316 | /* set the base address */ |
296 | reg_w_val(dev, ET_I2C_BASE, 0x40); /* sensor base for the pas106 */ | 317 | reg_w_val(gspca_dev, ET_I2C_BASE, 0x40); |
297 | /* set count and prefetch */ | 318 | /* sensor base for the pas106 */ |
298 | ptchcount = ((length & 0x07) << 4) | (mode & 0x03); | 319 | /* set count and prefetch (cnd: 4 bits - mode: 4 bits) */ |
299 | reg_w_val(dev, ET_I2C_COUNT, ptchcount); | 320 | reg_w_val(gspca_dev, ET_I2C_COUNT, 0x11); |
300 | /* set the register base */ | 321 | reg_w_val(gspca_dev, ET_I2C_REG, reg); /* set the register base */ |
301 | reg_w_val(dev, ET_I2C_REG, reg); | 322 | reg_w_val(gspca_dev, ET_I2C_PREFETCH, 0x02); /* prefetch */ |
302 | reg_w_val(dev, ET_I2C_PREFETCH, 0x02); /* prefetch */ | 323 | reg_w_val(gspca_dev, ET_I2C_PREFETCH, 0x00); |
303 | reg_w_val(dev, ET_I2C_PREFETCH, 0); | 324 | reg_r(gspca_dev, ET_I2C_DATA0, 1); /* read one byte */ |
304 | j = length - 1; | ||
305 | for (i = 0; i < length; i++) { | ||
306 | reg_r(dev, (ET_I2C_DATA0 + j), &buffer[j], 1); | ||
307 | j--; | ||
308 | } | ||
309 | return 0; | 325 | return 0; |
310 | } | 326 | } |
311 | 327 | ||
312 | static int Et_WaitStatus(struct usb_device *dev) | 328 | static int Et_WaitStatus(struct gspca_dev *gspca_dev) |
313 | { | 329 | { |
314 | __u8 bytereceived; | ||
315 | int retry = 10; | 330 | int retry = 10; |
316 | 331 | ||
317 | while (retry--) { | 332 | while (retry--) { |
318 | reg_r(dev, ET_ClCK, &bytereceived, 1); | 333 | reg_r(gspca_dev, ET_ClCK, 1); |
319 | if (bytereceived != 0) | 334 | if (gspca_dev->usb_buf[0] != 0) |
320 | return 1; | 335 | return 1; |
321 | } | 336 | } |
322 | return 0; | 337 | return 0; |
323 | } | 338 | } |
324 | 339 | ||
325 | static int et_video(struct usb_device *dev, int on) | 340 | static int et_video(struct gspca_dev *gspca_dev, |
341 | int on) | ||
326 | { | 342 | { |
327 | int err; | 343 | int ret; |
328 | 344 | ||
329 | reg_w_val(dev, ET_GPIO_OUT, on | 345 | reg_w_val(gspca_dev, ET_GPIO_OUT, |
330 | ? 0x10 /* startvideo - set Bit5 */ | 346 | on ? 0x10 /* startvideo - set Bit5 */ |
331 | : 0); /* stopvideo */ | 347 | : 0); /* stopvideo */ |
332 | err = Et_WaitStatus(dev); | 348 | ret = Et_WaitStatus(gspca_dev); |
333 | if (!err) | 349 | if (ret != 0) |
334 | PDEBUG(D_ERR, "timeout video on/off"); | 350 | PDEBUG(D_ERR, "timeout video on/off"); |
335 | return err; | 351 | return ret; |
336 | } | 352 | } |
337 | 353 | ||
338 | static void Et_init2(struct gspca_dev *gspca_dev) | 354 | static void Et_init2(struct gspca_dev *gspca_dev) |
339 | { | 355 | { |
340 | struct usb_device *dev = gspca_dev->dev; | ||
341 | __u8 value; | 356 | __u8 value; |
342 | __u8 received; | ||
343 | static const __u8 FormLine[] = { 0x84, 0x03, 0x14, 0xf4, 0x01, 0x05 }; | 357 | static const __u8 FormLine[] = { 0x84, 0x03, 0x14, 0xf4, 0x01, 0x05 }; |
344 | 358 | ||
345 | PDEBUG(D_STREAM, "Open Init2 ET"); | 359 | PDEBUG(D_STREAM, "Open Init2 ET"); |
346 | reg_w_val(dev, ET_GPIO_DIR_CTRL, 0x2f); | 360 | reg_w_val(gspca_dev, ET_GPIO_DIR_CTRL, 0x2f); |
347 | reg_w_val(dev, ET_GPIO_OUT, 0x10); | 361 | reg_w_val(gspca_dev, ET_GPIO_OUT, 0x10); |
348 | reg_r(dev, ET_GPIO_IN, &received, 1); | 362 | reg_r(gspca_dev, ET_GPIO_IN, 1); |
349 | reg_w_val(dev, ET_ClCK, 0x14); /* 0x14 // 0x16 enabled pattern */ | 363 | reg_w_val(gspca_dev, ET_ClCK, 0x14); /* 0x14 // 0x16 enabled pattern */ |
350 | reg_w_val(dev, ET_CTRL, 0x1b); | 364 | reg_w_val(gspca_dev, ET_CTRL, 0x1b); |
351 | 365 | ||
352 | /* compression et subsampling */ | 366 | /* compression et subsampling */ |
353 | if (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) | 367 | if (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) |
354 | value = ET_COMP_VAL1; /* 320 */ | 368 | value = ET_COMP_VAL1; /* 320 */ |
355 | else | 369 | else |
356 | value = ET_COMP_VAL0; /* 640 */ | 370 | value = ET_COMP_VAL0; /* 640 */ |
357 | reg_w_val(dev, ET_COMP, value); | 371 | reg_w_val(gspca_dev, ET_COMP, value); |
358 | reg_w_val(dev, ET_MAXQt, 0x1f); | 372 | reg_w_val(gspca_dev, ET_MAXQt, 0x1f); |
359 | reg_w_val(dev, ET_MINQt, 0x04); | 373 | reg_w_val(gspca_dev, ET_MINQt, 0x04); |
360 | /* undocumented registers */ | 374 | /* undocumented registers */ |
361 | reg_w_val(dev, ET_REG1d, 0xff); | 375 | reg_w_val(gspca_dev, ET_REG1d, 0xff); |
362 | reg_w_val(dev, ET_REG1e, 0xff); | 376 | reg_w_val(gspca_dev, ET_REG1e, 0xff); |
363 | reg_w_val(dev, ET_REG1f, 0xff); | 377 | reg_w_val(gspca_dev, ET_REG1f, 0xff); |
364 | reg_w_val(dev, ET_REG20, 0x35); | 378 | reg_w_val(gspca_dev, ET_REG20, 0x35); |
365 | reg_w_val(dev, ET_REG21, 0x01); | 379 | reg_w_val(gspca_dev, ET_REG21, 0x01); |
366 | reg_w_val(dev, ET_REG22, 0x00); | 380 | reg_w_val(gspca_dev, ET_REG22, 0x00); |
367 | reg_w_val(dev, ET_REG23, 0xff); | 381 | reg_w_val(gspca_dev, ET_REG23, 0xff); |
368 | reg_w_val(dev, ET_REG24, 0xff); | 382 | reg_w_val(gspca_dev, ET_REG24, 0xff); |
369 | reg_w_val(dev, ET_REG25, 0x0f); | 383 | reg_w_val(gspca_dev, ET_REG25, 0x0f); |
370 | /* colors setting */ | 384 | /* colors setting */ |
371 | reg_w_val(dev, 0x30, 0x11); /* 0x30 */ | 385 | reg_w_val(gspca_dev, 0x30, 0x11); /* 0x30 */ |
372 | reg_w_val(dev, 0x31, 0x40); | 386 | reg_w_val(gspca_dev, 0x31, 0x40); |
373 | reg_w_val(dev, 0x32, 0x00); | 387 | reg_w_val(gspca_dev, 0x32, 0x00); |
374 | reg_w_val(dev, ET_O_RED, 0x00); /* 0x34 */ | 388 | reg_w_val(gspca_dev, ET_O_RED, 0x00); /* 0x34 */ |
375 | reg_w_val(dev, ET_O_GREEN1, 0x00); | 389 | reg_w_val(gspca_dev, ET_O_GREEN1, 0x00); |
376 | reg_w_val(dev, ET_O_BLUE, 0x00); | 390 | reg_w_val(gspca_dev, ET_O_BLUE, 0x00); |
377 | reg_w_val(dev, ET_O_GREEN2, 0x00); | 391 | reg_w_val(gspca_dev, ET_O_GREEN2, 0x00); |
378 | /*************/ | 392 | /*************/ |
379 | reg_w_val(dev, ET_G_RED, 0x80); /* 0x4d */ | 393 | reg_w_val(gspca_dev, ET_G_RED, 0x80); /* 0x4d */ |
380 | reg_w_val(dev, ET_G_GREEN1, 0x80); | 394 | reg_w_val(gspca_dev, ET_G_GREEN1, 0x80); |
381 | reg_w_val(dev, ET_G_BLUE, 0x80); | 395 | reg_w_val(gspca_dev, ET_G_BLUE, 0x80); |
382 | reg_w_val(dev, ET_G_GREEN2, 0x80); | 396 | reg_w_val(gspca_dev, ET_G_GREEN2, 0x80); |
383 | reg_w_val(dev, ET_G_GR_H, 0x00); | 397 | reg_w_val(gspca_dev, ET_G_GR_H, 0x00); |
384 | reg_w_val(dev, ET_G_GB_H, 0x00); /* 0x52 */ | 398 | reg_w_val(gspca_dev, ET_G_GB_H, 0x00); /* 0x52 */ |
385 | /* Window control registers */ | 399 | /* Window control registers */ |
386 | reg_w_val(dev, 0x61, 0x80); /* use cmc_out */ | 400 | reg_w_val(gspca_dev, 0x61, 0x80); /* use cmc_out */ |
387 | reg_w_val(dev, 0x62, 0x02); | 401 | reg_w_val(gspca_dev, 0x62, 0x02); |
388 | reg_w_val(dev, 0x63, 0x03); | 402 | reg_w_val(gspca_dev, 0x63, 0x03); |
389 | reg_w_val(dev, 0x64, 0x14); | 403 | reg_w_val(gspca_dev, 0x64, 0x14); |
390 | reg_w_val(dev, 0x65, 0x0e); | 404 | reg_w_val(gspca_dev, 0x65, 0x0e); |
391 | reg_w_val(dev, 0x66, 0x02); | 405 | reg_w_val(gspca_dev, 0x66, 0x02); |
392 | reg_w_val(dev, 0x67, 0x02); | 406 | reg_w_val(gspca_dev, 0x67, 0x02); |
393 | 407 | ||
394 | /**************************************/ | 408 | /**************************************/ |
395 | reg_w_val(dev, ET_SYNCHRO, 0x8f); /* 0x68 */ | 409 | reg_w_val(gspca_dev, ET_SYNCHRO, 0x8f); /* 0x68 */ |
396 | reg_w_val(dev, ET_STARTX, 0x69); /* 0x6a //0x69 */ | 410 | reg_w_val(gspca_dev, ET_STARTX, 0x69); /* 0x6a //0x69 */ |
397 | reg_w_val(dev, ET_STARTY, 0x0d); /* 0x0d //0x0c */ | 411 | reg_w_val(gspca_dev, ET_STARTY, 0x0d); /* 0x0d //0x0c */ |
398 | reg_w_val(dev, ET_WIDTH_LOW, 0x80); | 412 | reg_w_val(gspca_dev, ET_WIDTH_LOW, 0x80); |
399 | reg_w_val(dev, ET_HEIGTH_LOW, 0xe0); | 413 | reg_w_val(gspca_dev, ET_HEIGTH_LOW, 0xe0); |
400 | reg_w_val(dev, ET_W_H_HEIGTH, 0x60); /* 6d */ | 414 | reg_w_val(gspca_dev, ET_W_H_HEIGTH, 0x60); /* 6d */ |
401 | reg_w_val(dev, ET_REG6e, 0x86); | 415 | reg_w_val(gspca_dev, ET_REG6e, 0x86); |
402 | reg_w_val(dev, ET_REG6f, 0x01); | 416 | reg_w_val(gspca_dev, ET_REG6f, 0x01); |
403 | reg_w_val(dev, ET_REG70, 0x26); | 417 | reg_w_val(gspca_dev, ET_REG70, 0x26); |
404 | reg_w_val(dev, ET_REG71, 0x7a); | 418 | reg_w_val(gspca_dev, ET_REG71, 0x7a); |
405 | reg_w_val(dev, ET_REG72, 0x01); | 419 | reg_w_val(gspca_dev, ET_REG72, 0x01); |
406 | /* Clock Pattern registers ***************** */ | 420 | /* Clock Pattern registers ***************** */ |
407 | reg_w_val(dev, ET_REG73, 0x00); | 421 | reg_w_val(gspca_dev, ET_REG73, 0x00); |
408 | reg_w_val(dev, ET_REG74, 0x18); /* 0x28 */ | 422 | reg_w_val(gspca_dev, ET_REG74, 0x18); /* 0x28 */ |
409 | reg_w_val(dev, ET_REG75, 0x0f); /* 0x01 */ | 423 | reg_w_val(gspca_dev, ET_REG75, 0x0f); /* 0x01 */ |
410 | /**********************************************/ | 424 | /**********************************************/ |
411 | reg_w_val(dev, 0x8a, 0x20); | 425 | reg_w_val(gspca_dev, 0x8a, 0x20); |
412 | reg_w_val(dev, 0x8d, 0x0f); | 426 | reg_w_val(gspca_dev, 0x8d, 0x0f); |
413 | reg_w_val(dev, 0x8e, 0x08); | 427 | reg_w_val(gspca_dev, 0x8e, 0x08); |
414 | /**************************************/ | 428 | /**************************************/ |
415 | reg_w_val(dev, 0x03, 0x08); | 429 | reg_w_val(gspca_dev, 0x03, 0x08); |
416 | reg_w_val(dev, ET_PXL_CLK, 0x03); | 430 | reg_w_val(gspca_dev, ET_PXL_CLK, 0x03); |
417 | reg_w_val(dev, 0x81, 0xff); | 431 | reg_w_val(gspca_dev, 0x81, 0xff); |
418 | reg_w_val(dev, 0x80, 0x00); | 432 | reg_w_val(gspca_dev, 0x80, 0x00); |
419 | reg_w_val(dev, 0x81, 0xff); | 433 | reg_w_val(gspca_dev, 0x81, 0xff); |
420 | reg_w_val(dev, 0x80, 0x20); | 434 | reg_w_val(gspca_dev, 0x80, 0x20); |
421 | reg_w_val(dev, 0x03, 0x01); | 435 | reg_w_val(gspca_dev, 0x03, 0x01); |
422 | reg_w_val(dev, 0x03, 0x00); | 436 | reg_w_val(gspca_dev, 0x03, 0x00); |
423 | reg_w_val(dev, 0x03, 0x08); | 437 | reg_w_val(gspca_dev, 0x03, 0x08); |
424 | /********************************************/ | 438 | /********************************************/ |
425 | 439 | ||
426 | /* reg_r(dev, ET_I2C_BASE, &received, 1); | 440 | /* reg_r(gspca_dev, ET_I2C_BASE, 1); |
427 | always 0x40 as the pas106 ??? */ | 441 | always 0x40 as the pas106 ??? */ |
428 | /* set the sensor */ | 442 | /* set the sensor */ |
429 | if (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) | 443 | if (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) |
@@ -435,25 +449,24 @@ static void Et_init2(struct gspca_dev *gspca_dev) | |||
435 | * 0x0b -> 24/(11+1) = 2 Mhz | 449 | * 0x0b -> 24/(11+1) = 2 Mhz |
436 | * 0x17 -> 24/(23+1) = 1 Mhz | 450 | * 0x17 -> 24/(23+1) = 1 Mhz |
437 | */ | 451 | */ |
438 | reg_w_val(dev, ET_PXL_CLK, value); | 452 | reg_w_val(gspca_dev, ET_PXL_CLK, value); |
439 | /* now set by fifo the FormatLine setting */ | 453 | /* now set by fifo the FormatLine setting */ |
440 | reg_w(dev, 0x62, FormLine, 6); | 454 | reg_w(gspca_dev, 0x62, FormLine, 6); |
441 | 455 | ||
442 | /* set exposure times [ 0..0x78] 0->longvalue 0x78->shortvalue */ | 456 | /* set exposure times [ 0..0x78] 0->longvalue 0x78->shortvalue */ |
443 | reg_w_val(dev, 0x81, 0x47); /* 0x47; */ | 457 | reg_w_val(gspca_dev, 0x81, 0x47); /* 0x47; */ |
444 | reg_w_val(dev, 0x80, 0x40); /* 0x40; */ | 458 | reg_w_val(gspca_dev, 0x80, 0x40); /* 0x40; */ |
445 | /* Pedro change */ | 459 | /* Pedro change */ |
446 | /* Brightness change Brith+ decrease value */ | 460 | /* Brightness change Brith+ decrease value */ |
447 | /* Brigth- increase value */ | 461 | /* Brigth- increase value */ |
448 | /* original value = 0x70; */ | 462 | /* original value = 0x70; */ |
449 | reg_w_val(dev, 0x81, 0x30); /* 0x20; - set brightness */ | 463 | reg_w_val(gspca_dev, 0x81, 0x30); /* 0x20; - set brightness */ |
450 | reg_w_val(dev, 0x80, 0x20); /* 0x20; */ | 464 | reg_w_val(gspca_dev, 0x80, 0x20); /* 0x20; */ |
451 | } | 465 | } |
452 | 466 | ||
453 | static void setcolors(struct gspca_dev *gspca_dev) | 467 | static void setcolors(struct gspca_dev *gspca_dev) |
454 | { | 468 | { |
455 | struct sd *sd = (struct sd *) gspca_dev; | 469 | struct sd *sd = (struct sd *) gspca_dev; |
456 | struct usb_device *dev = gspca_dev->dev; | ||
457 | __u8 I2cc[] = { 0x05, 0x02, 0x02, 0x05, 0x0d }; | 470 | __u8 I2cc[] = { 0x05, 0x02, 0x02, 0x05, 0x0d }; |
458 | __u8 i2cflags = 0x01; | 471 | __u8 i2cflags = 0x01; |
459 | /* __u8 green = 0; */ | 472 | /* __u8 green = 0; */ |
@@ -464,8 +477,8 @@ static void setcolors(struct gspca_dev *gspca_dev) | |||
464 | /* green = 15 - ((((7*I2cc[0]) >> 2 ) + I2cc[3]) >> 1); */ | 477 | /* green = 15 - ((((7*I2cc[0]) >> 2 ) + I2cc[3]) >> 1); */ |
465 | /* I2cc[1] = I2cc[2] = green; */ | 478 | /* I2cc[1] = I2cc[2] = green; */ |
466 | if (sd->sensor == SENSOR_PAS106) { | 479 | if (sd->sensor == SENSOR_PAS106) { |
467 | Et_i2cwrite(dev, PAS106_REG13, &i2cflags, 1, 3); | 480 | i2c_w(gspca_dev, PAS106_REG13, &i2cflags, 1, 3); |
468 | Et_i2cwrite(dev, PAS106_REG9, I2cc, sizeof I2cc, 1); | 481 | i2c_w(gspca_dev, PAS106_REG9, I2cc, sizeof I2cc, 1); |
469 | } | 482 | } |
470 | /* PDEBUG(D_CONF , "Etoms red %d blue %d green %d", | 483 | /* PDEBUG(D_CONF , "Etoms red %d blue %d green %d", |
471 | I2cc[3], I2cc[0], green); */ | 484 | I2cc[3], I2cc[0], green); */ |
@@ -474,21 +487,17 @@ static void setcolors(struct gspca_dev *gspca_dev) | |||
474 | static void getcolors(struct gspca_dev *gspca_dev) | 487 | static void getcolors(struct gspca_dev *gspca_dev) |
475 | { | 488 | { |
476 | struct sd *sd = (struct sd *) gspca_dev; | 489 | struct sd *sd = (struct sd *) gspca_dev; |
477 | /* __u8 valblue; */ | ||
478 | __u8 valred; | ||
479 | 490 | ||
480 | if (sd->sensor == SENSOR_PAS106) { | 491 | if (sd->sensor == SENSOR_PAS106) { |
481 | /* Et_i2cread(gspca_dev->dev, PAS106_REG9, &valblue, 1, 1); */ | 492 | /* i2c_r(gspca_dev, PAS106_REG9); * blue */ |
482 | Et_i2cread(gspca_dev->dev, PAS106_REG9 + 3, &valred, 1, 1); | 493 | i2c_r(gspca_dev, PAS106_REG9 + 3); /* red */ |
483 | sd->colors = valred & 0x0f; | 494 | sd->colors = gspca_dev->usb_buf[0] & 0x0f; |
484 | } | 495 | } |
485 | } | 496 | } |
486 | 497 | ||
487 | static void Et_init1(struct gspca_dev *gspca_dev) | 498 | static void Et_init1(struct gspca_dev *gspca_dev) |
488 | { | 499 | { |
489 | struct usb_device *dev = gspca_dev->dev; | ||
490 | __u8 value; | 500 | __u8 value; |
491 | __u8 received; | ||
492 | /* __u8 I2c0 [] = {0x0a, 0x12, 0x05, 0x22, 0xac, 0x00, 0x01, 0x00}; */ | 501 | /* __u8 I2c0 [] = {0x0a, 0x12, 0x05, 0x22, 0xac, 0x00, 0x01, 0x00}; */ |
493 | __u8 I2c0[] = { 0x0a, 0x12, 0x05, 0x6d, 0xcd, 0x00, 0x01, 0x00 }; | 502 | __u8 I2c0[] = { 0x0a, 0x12, 0x05, 0x6d, 0xcd, 0x00, 0x01, 0x00 }; |
494 | /* try 1/120 0x6d 0xcd 0x40 */ | 503 | /* try 1/120 0x6d 0xcd 0x40 */ |
@@ -496,12 +505,12 @@ static void Et_init1(struct gspca_dev *gspca_dev) | |||
496 | * 1/60000 hmm ?? */ | 505 | * 1/60000 hmm ?? */ |
497 | 506 | ||
498 | PDEBUG(D_STREAM, "Open Init1 ET"); | 507 | PDEBUG(D_STREAM, "Open Init1 ET"); |
499 | reg_w_val(dev, ET_GPIO_DIR_CTRL, 7); | 508 | reg_w_val(gspca_dev, ET_GPIO_DIR_CTRL, 7); |
500 | reg_r(dev, ET_GPIO_IN, &received, 1); | 509 | reg_r(gspca_dev, ET_GPIO_IN, 1); |
501 | reg_w_val(dev, ET_RESET_ALL, 1); | 510 | reg_w_val(gspca_dev, ET_RESET_ALL, 1); |
502 | reg_w_val(dev, ET_RESET_ALL, 0); | 511 | reg_w_val(gspca_dev, ET_RESET_ALL, 0); |
503 | reg_w_val(dev, ET_ClCK, 0x10); | 512 | reg_w_val(gspca_dev, ET_ClCK, 0x10); |
504 | reg_w_val(dev, ET_CTRL, 0x19); | 513 | reg_w_val(gspca_dev, ET_CTRL, 0x19); |
505 | /* compression et subsampling */ | 514 | /* compression et subsampling */ |
506 | if (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) | 515 | if (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) |
507 | value = ET_COMP_VAL1; | 516 | value = ET_COMP_VAL1; |
@@ -510,80 +519,79 @@ static void Et_init1(struct gspca_dev *gspca_dev) | |||
510 | PDEBUG(D_STREAM, "Open mode %d Compression %d", | 519 | PDEBUG(D_STREAM, "Open mode %d Compression %d", |
511 | gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv, | 520 | gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv, |
512 | value); | 521 | value); |
513 | reg_w_val(dev, ET_COMP, value); | 522 | reg_w_val(gspca_dev, ET_COMP, value); |
514 | reg_w_val(dev, ET_MAXQt, 0x1d); | 523 | reg_w_val(gspca_dev, ET_MAXQt, 0x1d); |
515 | reg_w_val(dev, ET_MINQt, 0x02); | 524 | reg_w_val(gspca_dev, ET_MINQt, 0x02); |
516 | /* undocumented registers */ | 525 | /* undocumented registers */ |
517 | reg_w_val(dev, ET_REG1d, 0xff); | 526 | reg_w_val(gspca_dev, ET_REG1d, 0xff); |
518 | reg_w_val(dev, ET_REG1e, 0xff); | 527 | reg_w_val(gspca_dev, ET_REG1e, 0xff); |
519 | reg_w_val(dev, ET_REG1f, 0xff); | 528 | reg_w_val(gspca_dev, ET_REG1f, 0xff); |
520 | reg_w_val(dev, ET_REG20, 0x35); | 529 | reg_w_val(gspca_dev, ET_REG20, 0x35); |
521 | reg_w_val(dev, ET_REG21, 0x01); | 530 | reg_w_val(gspca_dev, ET_REG21, 0x01); |
522 | reg_w_val(dev, ET_REG22, 0x00); | 531 | reg_w_val(gspca_dev, ET_REG22, 0x00); |
523 | reg_w_val(dev, ET_REG23, 0xf7); | 532 | reg_w_val(gspca_dev, ET_REG23, 0xf7); |
524 | reg_w_val(dev, ET_REG24, 0xff); | 533 | reg_w_val(gspca_dev, ET_REG24, 0xff); |
525 | reg_w_val(dev, ET_REG25, 0x07); | 534 | reg_w_val(gspca_dev, ET_REG25, 0x07); |
526 | /* colors setting */ | 535 | /* colors setting */ |
527 | reg_w_val(dev, ET_G_RED, 0x80); | 536 | reg_w_val(gspca_dev, ET_G_RED, 0x80); |
528 | reg_w_val(dev, ET_G_GREEN1, 0x80); | 537 | reg_w_val(gspca_dev, ET_G_GREEN1, 0x80); |
529 | reg_w_val(dev, ET_G_BLUE, 0x80); | 538 | reg_w_val(gspca_dev, ET_G_BLUE, 0x80); |
530 | reg_w_val(dev, ET_G_GREEN2, 0x80); | 539 | reg_w_val(gspca_dev, ET_G_GREEN2, 0x80); |
531 | reg_w_val(dev, ET_G_GR_H, 0x00); | 540 | reg_w_val(gspca_dev, ET_G_GR_H, 0x00); |
532 | reg_w_val(dev, ET_G_GB_H, 0x00); | 541 | reg_w_val(gspca_dev, ET_G_GB_H, 0x00); |
533 | /* Window control registers */ | 542 | /* Window control registers */ |
534 | reg_w_val(dev, ET_SYNCHRO, 0xf0); | 543 | reg_w_val(gspca_dev, ET_SYNCHRO, 0xf0); |
535 | reg_w_val(dev, ET_STARTX, 0x56); /* 0x56 */ | 544 | reg_w_val(gspca_dev, ET_STARTX, 0x56); /* 0x56 */ |
536 | reg_w_val(dev, ET_STARTY, 0x05); /* 0x04 */ | 545 | reg_w_val(gspca_dev, ET_STARTY, 0x05); /* 0x04 */ |
537 | reg_w_val(dev, ET_WIDTH_LOW, 0x60); | 546 | reg_w_val(gspca_dev, ET_WIDTH_LOW, 0x60); |
538 | reg_w_val(dev, ET_HEIGTH_LOW, 0x20); | 547 | reg_w_val(gspca_dev, ET_HEIGTH_LOW, 0x20); |
539 | reg_w_val(dev, ET_W_H_HEIGTH, 0x50); | 548 | reg_w_val(gspca_dev, ET_W_H_HEIGTH, 0x50); |
540 | reg_w_val(dev, ET_REG6e, 0x86); | 549 | reg_w_val(gspca_dev, ET_REG6e, 0x86); |
541 | reg_w_val(dev, ET_REG6f, 0x01); | 550 | reg_w_val(gspca_dev, ET_REG6f, 0x01); |
542 | reg_w_val(dev, ET_REG70, 0x86); | 551 | reg_w_val(gspca_dev, ET_REG70, 0x86); |
543 | reg_w_val(dev, ET_REG71, 0x14); | 552 | reg_w_val(gspca_dev, ET_REG71, 0x14); |
544 | reg_w_val(dev, ET_REG72, 0x00); | 553 | reg_w_val(gspca_dev, ET_REG72, 0x00); |
545 | /* Clock Pattern registers */ | 554 | /* Clock Pattern registers */ |
546 | reg_w_val(dev, ET_REG73, 0x00); | 555 | reg_w_val(gspca_dev, ET_REG73, 0x00); |
547 | reg_w_val(dev, ET_REG74, 0x00); | 556 | reg_w_val(gspca_dev, ET_REG74, 0x00); |
548 | reg_w_val(dev, ET_REG75, 0x0a); | 557 | reg_w_val(gspca_dev, ET_REG75, 0x0a); |
549 | reg_w_val(dev, ET_I2C_CLK, 0x04); | 558 | reg_w_val(gspca_dev, ET_I2C_CLK, 0x04); |
550 | reg_w_val(dev, ET_PXL_CLK, 0x01); | 559 | reg_w_val(gspca_dev, ET_PXL_CLK, 0x01); |
551 | /* set the sensor */ | 560 | /* set the sensor */ |
552 | if (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) { | 561 | if (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) { |
553 | I2c0[0] = 0x06; | 562 | I2c0[0] = 0x06; |
554 | Et_i2cwrite(dev, PAS106_REG2, I2c0, sizeof I2c0, 1); | 563 | i2c_w(gspca_dev, PAS106_REG2, I2c0, sizeof I2c0, 1); |
555 | Et_i2cwrite(dev, PAS106_REG9, I2c2, sizeof I2c2, 1); | 564 | i2c_w(gspca_dev, PAS106_REG9, I2c2, sizeof I2c2, 1); |
556 | value = 0x06; | 565 | value = 0x06; |
557 | Et_i2cwrite(dev, PAS106_REG2, &value, 1, 1); | 566 | i2c_w(gspca_dev, PAS106_REG2, &value, 1, 1); |
558 | Et_i2cwrite(dev, PAS106_REG3, I2c3, sizeof I2c3, 1); | 567 | i2c_w(gspca_dev, PAS106_REG3, I2c3, sizeof I2c3, 1); |
559 | /* value = 0x1f; */ | 568 | /* value = 0x1f; */ |
560 | value = 0x04; | 569 | value = 0x04; |
561 | Et_i2cwrite(dev, PAS106_REG0e, &value, 1, 1); | 570 | i2c_w(gspca_dev, PAS106_REG0e, &value, 1, 1); |
562 | } else { | 571 | } else { |
563 | I2c0[0] = 0x0a; | 572 | I2c0[0] = 0x0a; |
564 | 573 | ||
565 | Et_i2cwrite(dev, PAS106_REG2, I2c0, sizeof I2c0, 1); | 574 | i2c_w(gspca_dev, PAS106_REG2, I2c0, sizeof I2c0, 1); |
566 | Et_i2cwrite(dev, PAS106_REG9, I2c2, sizeof I2c2, 1); | 575 | i2c_w(gspca_dev, PAS106_REG9, I2c2, sizeof I2c2, 1); |
567 | value = 0x0a; | 576 | value = 0x0a; |
568 | 577 | i2c_w(gspca_dev, PAS106_REG2, &value, 1, 1); | |
569 | Et_i2cwrite(dev, PAS106_REG2, &value, 1, 1); | 578 | i2c_w(gspca_dev, PAS106_REG3, I2c3, sizeof I2c3, 1); |
570 | Et_i2cwrite(dev, PAS106_REG3, I2c3, sizeof I2c3, 1); | ||
571 | value = 0x04; | 579 | value = 0x04; |
572 | /* value = 0x10; */ | 580 | /* value = 0x10; */ |
573 | Et_i2cwrite(dev, PAS106_REG0e, &value, 1, 1); | 581 | i2c_w(gspca_dev, PAS106_REG0e, &value, 1, 1); |
574 | /* bit 2 enable bit 1:2 select 0 1 2 3 | 582 | /* bit 2 enable bit 1:2 select 0 1 2 3 |
575 | value = 0x07; * curve 0 * | 583 | value = 0x07; * curve 0 * |
576 | Et_i2cwrite(dev,PAS106_REG0f,&value,1,1); | 584 | i2c_w(gspca_dev, PAS106_REG0f, &value, 1, 1); |
577 | */ | 585 | */ |
578 | } | 586 | } |
579 | 587 | ||
580 | /* value = 0x01; */ | 588 | /* value = 0x01; */ |
581 | /* value = 0x22; */ | 589 | /* value = 0x22; */ |
582 | /* Et_i2cwrite(dev, PAS106_REG5, &value, 1, 1); */ | 590 | /* i2c_w(gspca_dev, PAS106_REG5, &value, 1, 1); */ |
583 | /* magnetude and sign bit for DAC */ | 591 | /* magnetude and sign bit for DAC */ |
584 | Et_i2cwrite(dev, PAS106_REG7, I2c4, sizeof I2c4, 1); | 592 | i2c_w(gspca_dev, PAS106_REG7, I2c4, sizeof I2c4, 1); |
585 | /* now set by fifo the whole colors setting */ | 593 | /* now set by fifo the whole colors setting */ |
586 | reg_w(dev, ET_G_RED, GainRGBG, 6); | 594 | reg_w(gspca_dev, ET_G_RED, GainRGBG, 6); |
587 | getcolors(gspca_dev); | 595 | getcolors(gspca_dev); |
588 | setcolors(gspca_dev); | 596 | setcolors(gspca_dev); |
589 | } | 597 | } |
@@ -632,14 +640,13 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
632 | static int sd_open(struct gspca_dev *gspca_dev) | 640 | static int sd_open(struct gspca_dev *gspca_dev) |
633 | { | 641 | { |
634 | struct sd *sd = (struct sd *) gspca_dev; | 642 | struct sd *sd = (struct sd *) gspca_dev; |
635 | struct usb_device *dev = gspca_dev->dev; | ||
636 | 643 | ||
637 | if (sd->sensor == SENSOR_PAS106) | 644 | if (sd->sensor == SENSOR_PAS106) |
638 | Et_init1(gspca_dev); | 645 | Et_init1(gspca_dev); |
639 | else | 646 | else |
640 | Et_init2(gspca_dev); | 647 | Et_init2(gspca_dev); |
641 | reg_w_val(dev, ET_RESET_ALL, 0x08); | 648 | reg_w_val(gspca_dev, ET_RESET_ALL, 0x08); |
642 | et_video(dev, 0); /* video off */ | 649 | et_video(gspca_dev, 0); /* video off */ |
643 | return 0; | 650 | return 0; |
644 | } | 651 | } |
645 | 652 | ||
@@ -647,20 +654,19 @@ static int sd_open(struct gspca_dev *gspca_dev) | |||
647 | static void sd_start(struct gspca_dev *gspca_dev) | 654 | static void sd_start(struct gspca_dev *gspca_dev) |
648 | { | 655 | { |
649 | struct sd *sd = (struct sd *) gspca_dev; | 656 | struct sd *sd = (struct sd *) gspca_dev; |
650 | struct usb_device *dev = gspca_dev->dev; | ||
651 | 657 | ||
652 | if (sd->sensor == SENSOR_PAS106) | 658 | if (sd->sensor == SENSOR_PAS106) |
653 | Et_init1(gspca_dev); | 659 | Et_init1(gspca_dev); |
654 | else | 660 | else |
655 | Et_init2(gspca_dev); | 661 | Et_init2(gspca_dev); |
656 | 662 | ||
657 | reg_w_val(dev, ET_RESET_ALL, 0x08); | 663 | reg_w_val(gspca_dev, ET_RESET_ALL, 0x08); |
658 | et_video(dev, 1); /* video on */ | 664 | et_video(gspca_dev, 1); /* video on */ |
659 | } | 665 | } |
660 | 666 | ||
661 | static void sd_stopN(struct gspca_dev *gspca_dev) | 667 | static void sd_stopN(struct gspca_dev *gspca_dev) |
662 | { | 668 | { |
663 | et_video(gspca_dev->dev, 0); /* video off */ | 669 | et_video(gspca_dev, 0); /* video off */ |
664 | } | 670 | } |
665 | 671 | ||
666 | static void sd_stop0(struct gspca_dev *gspca_dev) | 672 | static void sd_stop0(struct gspca_dev *gspca_dev) |
@@ -678,7 +684,7 @@ static void setbrightness(struct gspca_dev *gspca_dev) | |||
678 | __u8 brightness = sd->brightness; | 684 | __u8 brightness = sd->brightness; |
679 | 685 | ||
680 | for (i = 0; i < 4; i++) | 686 | for (i = 0; i < 4; i++) |
681 | reg_w_val(gspca_dev->dev, (ET_O_RED + i), brightness); | 687 | reg_w_val(gspca_dev, ET_O_RED + i, brightness); |
682 | } | 688 | } |
683 | 689 | ||
684 | static void getbrightness(struct gspca_dev *gspca_dev) | 690 | static void getbrightness(struct gspca_dev *gspca_dev) |
@@ -686,11 +692,10 @@ static void getbrightness(struct gspca_dev *gspca_dev) | |||
686 | struct sd *sd = (struct sd *) gspca_dev; | 692 | struct sd *sd = (struct sd *) gspca_dev; |
687 | int i; | 693 | int i; |
688 | int brightness = 0; | 694 | int brightness = 0; |
689 | __u8 value; | ||
690 | 695 | ||
691 | for (i = 0; i < 4; i++) { | 696 | for (i = 0; i < 4; i++) { |
692 | reg_r(gspca_dev->dev, (ET_O_RED + i), &value, 1); | 697 | reg_r(gspca_dev, ET_O_RED + i, 1); |
693 | brightness += value; | 698 | brightness += gspca_dev->usb_buf[0]; |
694 | } | 699 | } |
695 | sd->brightness = brightness >> 3; | 700 | sd->brightness = brightness >> 3; |
696 | } | 701 | } |
@@ -701,8 +706,8 @@ static void setcontrast(struct gspca_dev *gspca_dev) | |||
701 | __u8 RGBG[] = { 0x80, 0x80, 0x80, 0x80, 0x00, 0x00 }; | 706 | __u8 RGBG[] = { 0x80, 0x80, 0x80, 0x80, 0x00, 0x00 }; |
702 | __u8 contrast = sd->contrast; | 707 | __u8 contrast = sd->contrast; |
703 | 708 | ||
704 | memset(RGBG, contrast, sizeof RGBG - 2); | 709 | memset(RGBG, contrast, sizeof(RGBG) - 2); |
705 | reg_w(gspca_dev->dev, ET_G_RED, RGBG, 6); | 710 | reg_w(gspca_dev, ET_G_RED, RGBG, 6); |
706 | } | 711 | } |
707 | 712 | ||
708 | static void getcontrast(struct gspca_dev *gspca_dev) | 713 | static void getcontrast(struct gspca_dev *gspca_dev) |
@@ -710,11 +715,10 @@ static void getcontrast(struct gspca_dev *gspca_dev) | |||
710 | struct sd *sd = (struct sd *) gspca_dev; | 715 | struct sd *sd = (struct sd *) gspca_dev; |
711 | int i; | 716 | int i; |
712 | int contrast = 0; | 717 | int contrast = 0; |
713 | __u8 value = 0; | ||
714 | 718 | ||
715 | for (i = 0; i < 4; i++) { | 719 | for (i = 0; i < 4; i++) { |
716 | reg_r(gspca_dev->dev, (ET_G_RED + i), &value, 1); | 720 | reg_r(gspca_dev, ET_G_RED + i, 1); |
717 | contrast += value; | 721 | contrast += gspca_dev->usb_buf[0]; |
718 | } | 722 | } |
719 | sd->contrast = contrast >> 2; | 723 | sd->contrast = contrast >> 2; |
720 | } | 724 | } |
@@ -722,12 +726,11 @@ static void getcontrast(struct gspca_dev *gspca_dev) | |||
722 | static __u8 Et_getgainG(struct gspca_dev *gspca_dev) | 726 | static __u8 Et_getgainG(struct gspca_dev *gspca_dev) |
723 | { | 727 | { |
724 | struct sd *sd = (struct sd *) gspca_dev; | 728 | struct sd *sd = (struct sd *) gspca_dev; |
725 | __u8 value = 0; | ||
726 | 729 | ||
727 | if (sd->sensor == SENSOR_PAS106) { | 730 | if (sd->sensor == SENSOR_PAS106) { |
728 | Et_i2cread(gspca_dev->dev, PAS106_REG0e, &value, 1, 1); | 731 | i2c_r(gspca_dev, PAS106_REG0e); |
729 | PDEBUG(D_CONF, "Etoms gain G %d", value); | 732 | PDEBUG(D_CONF, "Etoms gain G %d", gspca_dev->usb_buf[0]); |
730 | return value; | 733 | return gspca_dev->usb_buf[0]; |
731 | } | 734 | } |
732 | return 0x1f; | 735 | return 0x1f; |
733 | } | 736 | } |
@@ -735,12 +738,12 @@ static __u8 Et_getgainG(struct gspca_dev *gspca_dev) | |||
735 | static void Et_setgainG(struct gspca_dev *gspca_dev, __u8 gain) | 738 | static void Et_setgainG(struct gspca_dev *gspca_dev, __u8 gain) |
736 | { | 739 | { |
737 | struct sd *sd = (struct sd *) gspca_dev; | 740 | struct sd *sd = (struct sd *) gspca_dev; |
738 | struct usb_device *dev = gspca_dev->dev; | ||
739 | __u8 i2cflags = 0x01; | ||
740 | 741 | ||
741 | if (sd->sensor == SENSOR_PAS106) { | 742 | if (sd->sensor == SENSOR_PAS106) { |
742 | Et_i2cwrite(dev, PAS106_REG13, &i2cflags, 1, 3); | 743 | __u8 i2cflags = 0x01; |
743 | Et_i2cwrite(dev, PAS106_REG0e, &gain, 1, 1); | 744 | |
745 | i2c_w(gspca_dev, PAS106_REG13, &i2cflags, 1, 3); | ||
746 | i2c_w(gspca_dev, PAS106_REG0e, &gain, 1, 1); | ||
744 | } | 747 | } |
745 | } | 748 | } |
746 | 749 | ||
@@ -751,8 +754,6 @@ static void Et_setgainG(struct gspca_dev *gspca_dev, __u8 gain) | |||
751 | 754 | ||
752 | static void setautogain(struct gspca_dev *gspca_dev) | 755 | static void setautogain(struct gspca_dev *gspca_dev) |
753 | { | 756 | { |
754 | struct usb_device *dev = gspca_dev->dev; | ||
755 | __u8 GRBG[] = { 0, 0, 0, 0 }; | ||
756 | __u8 luma = 0; | 757 | __u8 luma = 0; |
757 | __u8 luma_mean = 128; | 758 | __u8 luma_mean = 128; |
758 | __u8 luma_delta = 20; | 759 | __u8 luma_delta = 20; |
@@ -761,10 +762,10 @@ static void setautogain(struct gspca_dev *gspca_dev) | |||
761 | __u8 r, g, b; | 762 | __u8 r, g, b; |
762 | 763 | ||
763 | Gbright = Et_getgainG(gspca_dev); | 764 | Gbright = Et_getgainG(gspca_dev); |
764 | reg_r(dev, ET_LUMA_CENTER, GRBG, 4); | 765 | reg_r(gspca_dev, ET_LUMA_CENTER, 4); |
765 | g = (GRBG[0] + GRBG[3]) >> 1; | 766 | g = (gspca_dev->usb_buf[0] + gspca_dev->usb_buf[3]) >> 1; |
766 | r = GRBG[1]; | 767 | r = gspca_dev->usb_buf[1]; |
767 | b = GRBG[2]; | 768 | b = gspca_dev->usb_buf[2]; |
768 | r = ((r << 8) - (r << 4) - (r << 3)) >> 10; | 769 | r = ((r << 8) - (r << 4) - (r << 3)) >> 10; |
769 | b = ((b << 7) >> 10); | 770 | b = ((b << 7) >> 10); |
770 | g = ((g << 9) + (g << 7) + (g << 5)) >> 10; | 771 | g = ((g << 9) + (g << 7) + (g << 5)) >> 10; |
diff --git a/drivers/media/video/gspca/gspca.c b/drivers/media/video/gspca/gspca.c index a566fd394895..242f0fb68d6e 100644 --- a/drivers/media/video/gspca/gspca.c +++ b/drivers/media/video/gspca/gspca.c | |||
@@ -1347,9 +1347,11 @@ ok: | |||
1347 | gspca_dev->fr_i, | 1347 | gspca_dev->fr_i, |
1348 | gspca_dev->fr_o); | 1348 | gspca_dev->fr_o); |
1349 | 1349 | ||
1350 | if (gspca_dev->sd_desc->dq_callback) | 1350 | if (gspca_dev->sd_desc->dq_callback) { |
1351 | mutex_lock(&gspca_dev->usb_lock); | ||
1351 | gspca_dev->sd_desc->dq_callback(gspca_dev); | 1352 | gspca_dev->sd_desc->dq_callback(gspca_dev); |
1352 | 1353 | mutex_unlock(&gspca_dev->usb_lock); | |
1354 | } | ||
1353 | return j; | 1355 | return j; |
1354 | } | 1356 | } |
1355 | 1357 | ||
diff --git a/drivers/media/video/gspca/gspca.h b/drivers/media/video/gspca/gspca.h index 78fccefcd576..3fd2c4eee204 100644 --- a/drivers/media/video/gspca/gspca.h +++ b/drivers/media/video/gspca/gspca.h | |||
@@ -125,6 +125,7 @@ struct gspca_dev { | |||
125 | struct cam cam; /* device information */ | 125 | struct cam cam; /* device information */ |
126 | const struct sd_desc *sd_desc; /* subdriver description */ | 126 | const struct sd_desc *sd_desc; /* subdriver description */ |
127 | 127 | ||
128 | __u8 usb_buf[8]; /* buffer for USB exchanges */ | ||
128 | struct urb *urb[MAX_NURBS]; | 129 | struct urb *urb[MAX_NURBS]; |
129 | 130 | ||
130 | __u8 *frbuf; /* buffer for nframes */ | 131 | __u8 *frbuf; /* buffer for nframes */ |
diff --git a/drivers/media/video/gspca/mars.c b/drivers/media/video/gspca/mars.c index 23f3dba8012a..88c2b02f380a 100644 --- a/drivers/media/video/gspca/mars.c +++ b/drivers/media/video/gspca/mars.c | |||
@@ -24,8 +24,8 @@ | |||
24 | #include "gspca.h" | 24 | #include "gspca.h" |
25 | #include "jpeg.h" | 25 | #include "jpeg.h" |
26 | 26 | ||
27 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 27 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
28 | static const char version[] = "2.1.5"; | 28 | static const char version[] = "2.1.7"; |
29 | 29 | ||
30 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); | 30 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); |
31 | MODULE_DESCRIPTION("GSPCA/Mars USB Camera Driver"); | 31 | MODULE_DESCRIPTION("GSPCA/Mars USB Camera Driver"); |
@@ -83,39 +83,53 @@ enum { | |||
83 | REG_HW_MI_63, | 83 | REG_HW_MI_63, |
84 | REG_HW_MI_64, | 84 | REG_HW_MI_64, |
85 | REG_HW_MI_F1 = 0xf1, | 85 | REG_HW_MI_F1 = 0xf1, |
86 | ATTR_TOTAL_MI_REG = 242 | 86 | ATTR_TOTAL_MI_REG = 0xf2 |
87 | }; | 87 | }; |
88 | 88 | ||
89 | static int pcam_reg_write(struct usb_device *dev, | 89 | /* the bytes to write are in gspca_dev->usb_buf */ |
90 | __u16 index, __u8 *value, int len) | 90 | static int reg_w(struct gspca_dev *gspca_dev, |
91 | __u16 index, int len) | ||
91 | { | 92 | { |
92 | int rc; | 93 | int rc; |
93 | 94 | ||
94 | rc = usb_control_msg(dev, | 95 | rc = usb_control_msg(gspca_dev->dev, |
95 | usb_sndbulkpipe(dev, 4), | 96 | usb_sndbulkpipe(gspca_dev->dev, 4), |
96 | 0x12, | 97 | 0x12, |
97 | /* ?? 0xc8 = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_??? !? */ | 98 | 0xc8, /* ?? */ |
98 | 0xc8, | ||
99 | 0, /* value */ | 99 | 0, /* value */ |
100 | index, value, len, 500); | 100 | index, gspca_dev->usb_buf, len, 500); |
101 | if (rc < 0) | 101 | if (rc < 0) |
102 | PDEBUG(D_ERR, "reg write [%02x] error %d", index, rc); | 102 | PDEBUG(D_ERR, "reg write [%02x] error %d", index, rc); |
103 | return rc; | 103 | return rc; |
104 | } | 104 | } |
105 | 105 | ||
106 | static void MISensor_BulkWrite(struct usb_device *dev, | 106 | static int reg_w_buf(struct gspca_dev *gspca_dev, |
107 | unsigned short *pch, | 107 | __u16 index, __u8 *buf, int len) |
108 | char Address) | ||
109 | { | 108 | { |
110 | __u8 data[6]; | 109 | int rc; |
110 | |||
111 | rc = usb_control_msg(gspca_dev->dev, | ||
112 | usb_sndbulkpipe(gspca_dev->dev, 4), | ||
113 | 0x12, | ||
114 | 0xc8, /* ?? */ | ||
115 | 0, /* value */ | ||
116 | index, buf, len, 500); | ||
117 | if (rc < 0) | ||
118 | PDEBUG(D_ERR, "reg write [%02x] error %d", index, rc); | ||
119 | return rc; | ||
120 | } | ||
111 | 121 | ||
112 | data[0] = 0x1f; | 122 | static void bulk_w(struct gspca_dev *gspca_dev, |
113 | data[1] = 0; /* control byte */ | 123 | __u16 *pch, |
114 | data[2] = Address; | 124 | __u16 Address) |
115 | data[3] = *pch >> 8; /* high byte */ | 125 | { |
116 | data[4] = *pch; /* low byte */ | 126 | gspca_dev->usb_buf[0] = 0x1f; |
127 | gspca_dev->usb_buf[1] = 0; /* control byte */ | ||
128 | gspca_dev->usb_buf[2] = Address; | ||
129 | gspca_dev->usb_buf[3] = *pch >> 8; /* high byte */ | ||
130 | gspca_dev->usb_buf[4] = *pch; /* low byte */ | ||
117 | 131 | ||
118 | pcam_reg_write(dev, Address, data, 5); | 132 | reg_w(gspca_dev, Address, 5); |
119 | } | 133 | } |
120 | 134 | ||
121 | /* this function is called at probe time */ | 135 | /* this function is called at probe time */ |
@@ -142,33 +156,30 @@ static int sd_open(struct gspca_dev *gspca_dev) | |||
142 | 156 | ||
143 | static void sd_start(struct gspca_dev *gspca_dev) | 157 | static void sd_start(struct gspca_dev *gspca_dev) |
144 | { | 158 | { |
145 | struct usb_device *dev = gspca_dev->dev; | ||
146 | int err_code; | 159 | int err_code; |
147 | __u8 data[12]; | 160 | __u8 *data; |
148 | __u16 MI_buf[242]; | 161 | __u16 *MI_buf; |
149 | int h_size, v_size; | 162 | int h_size, v_size; |
150 | int intpipe; | 163 | int intpipe; |
151 | /* struct usb_device *dev = pcam->dev; */ | ||
152 | |||
153 | memset(data, 0, sizeof data); | ||
154 | memset(MI_buf, 0, sizeof MI_buf); | ||
155 | 164 | ||
156 | PDEBUG(D_STREAM, "camera start, iface %d, alt 8", gspca_dev->iface); | 165 | PDEBUG(D_STREAM, "camera start, iface %d, alt 8", gspca_dev->iface); |
157 | if (usb_set_interface(dev, gspca_dev->iface, 8) < 0) { | 166 | if (usb_set_interface(gspca_dev->dev, gspca_dev->iface, 8) < 0) { |
158 | PDEBUG(D_ERR|D_STREAM, "Set packet size: set interface error"); | 167 | PDEBUG(D_ERR|D_STREAM, "Set packet size: set interface error"); |
159 | return; | 168 | return; |
160 | } | 169 | } |
161 | 170 | ||
171 | data = gspca_dev->usb_buf; | ||
162 | data[0] = 0x01; /* address */ | 172 | data[0] = 0x01; /* address */ |
163 | data[1] = 0x01; | 173 | data[1] = 0x01; |
164 | 174 | ||
165 | err_code = pcam_reg_write(dev, data[0], data, 2); | 175 | err_code = reg_w(gspca_dev, data[0], 2); |
166 | if (err_code < 0) | 176 | if (err_code < 0) |
167 | return; | 177 | return; |
168 | 178 | ||
169 | /* | 179 | /* |
170 | Initialize the MR97113 chip register | 180 | Initialize the MR97113 chip register |
171 | */ | 181 | */ |
182 | data = kmalloc(16, GFP_KERNEL); | ||
172 | data[0] = 0x00; /* address */ | 183 | data[0] = 0x00; /* address */ |
173 | data[1] = 0x0c | 0x01; /* reg 0 */ | 184 | data[1] = 0x0c | 0x01; /* reg 0 */ |
174 | data[2] = 0x01; /* reg 1 */ | 185 | data[2] = 0x01; /* reg 1 */ |
@@ -181,34 +192,34 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
181 | data[6] = 4; /* reg 5, H start */ | 192 | data[6] = 4; /* reg 5, H start */ |
182 | data[7] = 0xc0; /* reg 6, gamma 1.5 */ | 193 | data[7] = 0xc0; /* reg 6, gamma 1.5 */ |
183 | data[8] = 3; /* reg 7, V start */ | 194 | data[8] = 3; /* reg 7, V start */ |
184 | /* if(h_size == 320 ) */ | 195 | /* if (h_size == 320 ) */ |
185 | /* data[9]= 0x56; * reg 8, 24MHz, 2:1 scale down */ | 196 | /* data[9]= 0x56; * reg 8, 24MHz, 2:1 scale down */ |
186 | /* else */ | 197 | /* else */ |
187 | data[9] = 0x52; /* reg 8, 24MHz, no scale down */ | 198 | data[9] = 0x52; /* reg 8, 24MHz, no scale down */ |
188 | data[10] = 0x5d; /* reg 9, I2C device address | 199 | data[10] = 0x5d; /* reg 9, I2C device address |
189 | * [for PAS5101 (0x40)] [for MI (0x5d)] */ | 200 | * [for PAS5101 (0x40)] [for MI (0x5d)] */ |
190 | 201 | ||
191 | err_code = pcam_reg_write(dev, data[0], data, 11); | 202 | err_code = reg_w_buf(gspca_dev, data[0], data, 11); |
203 | kfree(data); | ||
192 | if (err_code < 0) | 204 | if (err_code < 0) |
193 | return; | 205 | return; |
194 | 206 | ||
207 | data = gspca_dev->usb_buf; | ||
195 | data[0] = 0x23; /* address */ | 208 | data[0] = 0x23; /* address */ |
196 | data[1] = 0x09; /* reg 35, append frame header */ | 209 | data[1] = 0x09; /* reg 35, append frame header */ |
197 | 210 | ||
198 | err_code = pcam_reg_write(dev, data[0], data, 2); | 211 | err_code = reg_w(gspca_dev, data[0], 2); |
199 | if (err_code < 0) { | 212 | if (err_code < 0) |
200 | PDEBUG(D_ERR, "Register write failed"); | ||
201 | return; | 213 | return; |
202 | } | ||
203 | 214 | ||
204 | data[0] = 0x3C; /* address */ | 215 | data[0] = 0x3c; /* address */ |
205 | /* if (pcam->width == 1280) */ | 216 | /* if (gspca_dev->width == 1280) */ |
206 | /* data[1] = 200; * reg 60, pc-cam frame size | 217 | /* data[1] = 200; * reg 60, pc-cam frame size |
207 | * (unit: 4KB) 800KB */ | 218 | * (unit: 4KB) 800KB */ |
208 | /* else */ | 219 | /* else */ |
209 | data[1] = 50; /* 50 reg 60, pc-cam frame size | 220 | data[1] = 50; /* 50 reg 60, pc-cam frame size |
210 | * (unit: 4KB) 200KB */ | 221 | * (unit: 4KB) 200KB */ |
211 | err_code = pcam_reg_write(dev, data[0], data, 2); | 222 | err_code = reg_w(gspca_dev, data[0], 2); |
212 | if (err_code < 0) | 223 | if (err_code < 0) |
213 | return; | 224 | return; |
214 | 225 | ||
@@ -250,19 +261,20 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
250 | /* auto dark-gain */ | 261 | /* auto dark-gain */ |
251 | data[0] = 0x5e; /* address */ | 262 | data[0] = 0x5e; /* address */ |
252 | 263 | ||
253 | err_code = pcam_reg_write(dev, data[0], data, 6); | 264 | err_code = reg_w(gspca_dev, data[0], 6); |
254 | if (err_code < 0) | 265 | if (err_code < 0) |
255 | return; | 266 | return; |
256 | 267 | ||
257 | data[0] = 0x67; | 268 | data[0] = 0x67; |
258 | data[1] = 0x13; /* reg 103, first pixel B, disable sharpness */ | 269 | data[1] = 0x13; /* reg 103, first pixel B, disable sharpness */ |
259 | err_code = pcam_reg_write(dev, data[0], data, 2); | 270 | err_code = reg_w(gspca_dev, data[0], 2); |
260 | if (err_code < 0) | 271 | if (err_code < 0) |
261 | return; | 272 | return; |
262 | 273 | ||
263 | /* | 274 | /* |
264 | * initialize the value of MI sensor... | 275 | * initialize the value of MI sensor... |
265 | */ | 276 | */ |
277 | MI_buf = kzalloc(ATTR_TOTAL_MI_REG * sizeof *MI_buf, GFP_KERNEL); | ||
266 | MI_buf[REG_HW_MI_1] = 0x000a; | 278 | MI_buf[REG_HW_MI_1] = 0x000a; |
267 | MI_buf[REG_HW_MI_2] = 0x000c; | 279 | MI_buf[REG_HW_MI_2] = 0x000c; |
268 | MI_buf[REG_HW_MI_3] = 0x0405; | 280 | MI_buf[REG_HW_MI_3] = 0x0405; |
@@ -304,48 +316,48 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
304 | } | 316 | } |
305 | MI_buf[0x20] = 0x1104; | 317 | MI_buf[0x20] = 0x1104; |
306 | 318 | ||
307 | MISensor_BulkWrite(dev, MI_buf + 1, 1); | 319 | bulk_w(gspca_dev, MI_buf + 1, 1); |
308 | MISensor_BulkWrite(dev, MI_buf + 2, 2); | 320 | bulk_w(gspca_dev, MI_buf + 2, 2); |
309 | MISensor_BulkWrite(dev, MI_buf + 3, 3); | 321 | bulk_w(gspca_dev, MI_buf + 3, 3); |
310 | MISensor_BulkWrite(dev, MI_buf + 4, 4); | 322 | bulk_w(gspca_dev, MI_buf + 4, 4); |
311 | MISensor_BulkWrite(dev, MI_buf + 5, 5); | 323 | bulk_w(gspca_dev, MI_buf + 5, 5); |
312 | MISensor_BulkWrite(dev, MI_buf + 6, 6); | 324 | bulk_w(gspca_dev, MI_buf + 6, 6); |
313 | MISensor_BulkWrite(dev, MI_buf + 7, 7); | 325 | bulk_w(gspca_dev, MI_buf + 7, 7); |
314 | MISensor_BulkWrite(dev, MI_buf + 9, 9); | 326 | bulk_w(gspca_dev, MI_buf + 9, 9); |
315 | MISensor_BulkWrite(dev, MI_buf + 0x0b, 0x0b); | 327 | bulk_w(gspca_dev, MI_buf + 0x0b, 0x0b); |
316 | MISensor_BulkWrite(dev, MI_buf + 0x0c, 0x0c); | 328 | bulk_w(gspca_dev, MI_buf + 0x0c, 0x0c); |
317 | MISensor_BulkWrite(dev, MI_buf + 0x0d, 0x0d); | 329 | bulk_w(gspca_dev, MI_buf + 0x0d, 0x0d); |
318 | MISensor_BulkWrite(dev, MI_buf + 0x1e, 0x1e); | 330 | bulk_w(gspca_dev, MI_buf + 0x1e, 0x1e); |
319 | MISensor_BulkWrite(dev, MI_buf + 0x20, 0x20); | 331 | bulk_w(gspca_dev, MI_buf + 0x20, 0x20); |
320 | MISensor_BulkWrite(dev, MI_buf + 0x2b, 0x2b); | 332 | bulk_w(gspca_dev, MI_buf + 0x2b, 0x2b); |
321 | MISensor_BulkWrite(dev, MI_buf + 0x2c, 0x2c); | 333 | bulk_w(gspca_dev, MI_buf + 0x2c, 0x2c); |
322 | MISensor_BulkWrite(dev, MI_buf + 0x2d, 0x2d); | 334 | bulk_w(gspca_dev, MI_buf + 0x2d, 0x2d); |
323 | MISensor_BulkWrite(dev, MI_buf + 0x2e, 0x2e); | 335 | bulk_w(gspca_dev, MI_buf + 0x2e, 0x2e); |
324 | MISensor_BulkWrite(dev, MI_buf + 0x35, 0x35); | 336 | bulk_w(gspca_dev, MI_buf + 0x35, 0x35); |
325 | MISensor_BulkWrite(dev, MI_buf + 0x5f, 0x5f); | 337 | bulk_w(gspca_dev, MI_buf + 0x5f, 0x5f); |
326 | MISensor_BulkWrite(dev, MI_buf + 0x60, 0x60); | 338 | bulk_w(gspca_dev, MI_buf + 0x60, 0x60); |
327 | MISensor_BulkWrite(dev, MI_buf + 0x61, 0x61); | 339 | bulk_w(gspca_dev, MI_buf + 0x61, 0x61); |
328 | MISensor_BulkWrite(dev, MI_buf + 0x62, 0x62); | 340 | bulk_w(gspca_dev, MI_buf + 0x62, 0x62); |
329 | MISensor_BulkWrite(dev, MI_buf + 0x63, 0x63); | 341 | bulk_w(gspca_dev, MI_buf + 0x63, 0x63); |
330 | MISensor_BulkWrite(dev, MI_buf + 0x64, 0x64); | 342 | bulk_w(gspca_dev, MI_buf + 0x64, 0x64); |
331 | MISensor_BulkWrite(dev, MI_buf + 0xf1, 0xf1); | 343 | bulk_w(gspca_dev, MI_buf + 0xf1, 0xf1); |
332 | 344 | kfree(MI_buf); | |
333 | intpipe = usb_sndintpipe(dev, 0); | 345 | |
334 | err_code = usb_clear_halt(dev, intpipe); | 346 | intpipe = usb_sndintpipe(gspca_dev->dev, 0); |
347 | err_code = usb_clear_halt(gspca_dev->dev, intpipe); | ||
335 | 348 | ||
336 | data[0] = 0x00; | 349 | data[0] = 0x00; |
337 | data[1] = 0x4d; /* ISOC transfering enable... */ | 350 | data[1] = 0x4d; /* ISOC transfering enable... */ |
338 | pcam_reg_write(dev, data[0], data, 2); | 351 | reg_w(gspca_dev, data[0], 2); |
339 | } | 352 | } |
340 | 353 | ||
341 | static void sd_stopN(struct gspca_dev *gspca_dev) | 354 | static void sd_stopN(struct gspca_dev *gspca_dev) |
342 | { | 355 | { |
343 | int result; | 356 | int result; |
344 | __u8 data[2]; | ||
345 | 357 | ||
346 | data[0] = 1; | 358 | gspca_dev->usb_buf[0] = 1; |
347 | data[1] = 0; | 359 | gspca_dev->usb_buf[1] = 0; |
348 | result = pcam_reg_write(gspca_dev->dev, data[0], data, 2); | 360 | result = reg_w(gspca_dev, gspca_dev->usb_buf[0], 2); |
349 | if (result < 0) | 361 | if (result < 0) |
350 | PDEBUG(D_ERR, "Camera Stop failed"); | 362 | PDEBUG(D_ERR, "Camera Stop failed"); |
351 | } | 363 | } |
diff --git a/drivers/media/video/gspca/ov519.c b/drivers/media/video/gspca/ov519.c index ba245bafcd6f..08d99c3b78e2 100644 --- a/drivers/media/video/gspca/ov519.c +++ b/drivers/media/video/gspca/ov519.c | |||
@@ -24,8 +24,8 @@ | |||
24 | 24 | ||
25 | #include "gspca.h" | 25 | #include "gspca.h" |
26 | 26 | ||
27 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 27 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
28 | static const char version[] = "2.1.5"; | 28 | static const char version[] = "2.1.7"; |
29 | 29 | ||
30 | MODULE_AUTHOR("Jean-Francois Moine <http://moinejf.free.fr>"); | 30 | MODULE_AUTHOR("Jean-Francois Moine <http://moinejf.free.fr>"); |
31 | MODULE_DESCRIPTION("OV519 USB Camera Driver"); | 31 | MODULE_DESCRIPTION("OV519 USB Camera Driver"); |
@@ -282,15 +282,14 @@ static unsigned char ov7670_abs_to_sm(unsigned char v) | |||
282 | static int reg_w(struct sd *sd, __u16 index, __u8 value) | 282 | static int reg_w(struct sd *sd, __u16 index, __u8 value) |
283 | { | 283 | { |
284 | int ret; | 284 | int ret; |
285 | __u8 data; | ||
286 | 285 | ||
287 | data = value; | 286 | sd->gspca_dev.usb_buf[0] = value; |
288 | ret = usb_control_msg(sd->gspca_dev.dev, | 287 | ret = usb_control_msg(sd->gspca_dev.dev, |
289 | usb_sndctrlpipe(sd->gspca_dev.dev, 0), | 288 | usb_sndctrlpipe(sd->gspca_dev.dev, 0), |
290 | 1, /* REQ_IO (ov518/519) */ | 289 | 1, /* REQ_IO (ov518/519) */ |
291 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 290 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
292 | 0, index, | 291 | 0, index, |
293 | &data, 1, 500); | 292 | sd->gspca_dev.usb_buf, 1, 500); |
294 | if (ret < 0) | 293 | if (ret < 0) |
295 | PDEBUG(D_ERR, "Write reg [%02x] %02x failed", index, value); | 294 | PDEBUG(D_ERR, "Write reg [%02x] %02x failed", index, value); |
296 | return ret; | 295 | return ret; |
@@ -301,16 +300,15 @@ static int reg_w(struct sd *sd, __u16 index, __u8 value) | |||
301 | static int reg_r(struct sd *sd, __u16 index) | 300 | static int reg_r(struct sd *sd, __u16 index) |
302 | { | 301 | { |
303 | int ret; | 302 | int ret; |
304 | __u8 data; | ||
305 | 303 | ||
306 | ret = usb_control_msg(sd->gspca_dev.dev, | 304 | ret = usb_control_msg(sd->gspca_dev.dev, |
307 | usb_rcvctrlpipe(sd->gspca_dev.dev, 0), | 305 | usb_rcvctrlpipe(sd->gspca_dev.dev, 0), |
308 | 1, /* REQ_IO */ | 306 | 1, /* REQ_IO */ |
309 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 307 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
310 | 0, index, &data, 1, 500); | 308 | 0, index, sd->gspca_dev.usb_buf, 1, 500); |
311 | 309 | ||
312 | if (ret >= 0) | 310 | if (ret >= 0) |
313 | ret = data; | 311 | ret = sd->gspca_dev.usb_buf[0]; |
314 | else | 312 | else |
315 | PDEBUG(D_ERR, "Read reg [0x%02x] failed", index); | 313 | PDEBUG(D_ERR, "Read reg [0x%02x] failed", index); |
316 | return ret; | 314 | return ret; |
@@ -321,16 +319,15 @@ static int reg_r8(struct sd *sd, | |||
321 | __u16 index) | 319 | __u16 index) |
322 | { | 320 | { |
323 | int ret; | 321 | int ret; |
324 | __u8 buf[8]; | ||
325 | 322 | ||
326 | ret = usb_control_msg(sd->gspca_dev.dev, | 323 | ret = usb_control_msg(sd->gspca_dev.dev, |
327 | usb_rcvctrlpipe(sd->gspca_dev.dev, 0), | 324 | usb_rcvctrlpipe(sd->gspca_dev.dev, 0), |
328 | 1, /* REQ_IO */ | 325 | 1, /* REQ_IO */ |
329 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 326 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
330 | 0, index, &buf[0], 8, 500); | 327 | 0, index, sd->gspca_dev.usb_buf, 8, 500); |
331 | 328 | ||
332 | if (ret >= 0) | 329 | if (ret >= 0) |
333 | ret = buf[0]; | 330 | ret = sd->gspca_dev.usb_buf[0]; |
334 | else | 331 | else |
335 | PDEBUG(D_ERR, "Read reg 8 [0x%02x] failed", index); | 332 | PDEBUG(D_ERR, "Read reg 8 [0x%02x] failed", index); |
336 | return ret; | 333 | return ret; |
diff --git a/drivers/media/video/gspca/pac207.c b/drivers/media/video/gspca/pac207.c index 5d68d3f42262..fa7abc411090 100644 --- a/drivers/media/video/gspca/pac207.c +++ b/drivers/media/video/gspca/pac207.c | |||
@@ -27,8 +27,8 @@ | |||
27 | 27 | ||
28 | #include "gspca.h" | 28 | #include "gspca.h" |
29 | 29 | ||
30 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 30 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
31 | static const char version[] = "2.1.5"; | 31 | static const char version[] = "2.1.7"; |
32 | 32 | ||
33 | MODULE_AUTHOR("Hans de Goede <j.w.r.degoede@hhs.nl>"); | 33 | MODULE_AUTHOR("Hans de Goede <j.w.r.degoede@hhs.nl>"); |
34 | MODULE_DESCRIPTION("Pixart PAC207"); | 34 | MODULE_DESCRIPTION("Pixart PAC207"); |
@@ -187,18 +187,18 @@ static const __u8 PacReg72[] = { 0x00, 0x00, 0x36, 0x00 }; | |||
187 | static const unsigned char pac207_sof_marker[5] = | 187 | static const unsigned char pac207_sof_marker[5] = |
188 | { 0xff, 0xff, 0x00, 0xff, 0x96 }; | 188 | { 0xff, 0xff, 0x00, 0xff, 0x96 }; |
189 | 189 | ||
190 | int pac207_write_regs(struct gspca_dev *gspca_dev, u16 index, | 190 | static int pac207_write_regs(struct gspca_dev *gspca_dev, u16 index, |
191 | const u8 *buffer, u16 length) | 191 | const u8 *buffer, u16 length) |
192 | { | 192 | { |
193 | struct usb_device *udev = gspca_dev->dev; | 193 | struct usb_device *udev = gspca_dev->dev; |
194 | int err; | 194 | int err; |
195 | u8 kbuf[8]; | ||
196 | 195 | ||
197 | memcpy(kbuf, buffer, length); | 196 | memcpy(gspca_dev->usb_buf, buffer, length); |
198 | 197 | ||
199 | err = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x01, | 198 | err = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x01, |
200 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, | 199 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, |
201 | 0x00, index, kbuf, length, PAC207_CTRL_TIMEOUT); | 200 | 0x00, index, |
201 | gspca_dev->usb_buf, length, PAC207_CTRL_TIMEOUT); | ||
202 | if (err < 0) | 202 | if (err < 0) |
203 | PDEBUG(D_ERR, | 203 | PDEBUG(D_ERR, |
204 | "Failed to write registers to index 0x%04X, error %d)", | 204 | "Failed to write registers to index 0x%04X, error %d)", |
@@ -227,12 +227,12 @@ int pac207_write_reg(struct gspca_dev *gspca_dev, u16 index, u16 value) | |||
227 | int pac207_read_reg(struct gspca_dev *gspca_dev, u16 index) | 227 | int pac207_read_reg(struct gspca_dev *gspca_dev, u16 index) |
228 | { | 228 | { |
229 | struct usb_device *udev = gspca_dev->dev; | 229 | struct usb_device *udev = gspca_dev->dev; |
230 | u8 buff; | ||
231 | int res; | 230 | int res; |
232 | 231 | ||
233 | res = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x00, | 232 | res = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x00, |
234 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, | 233 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, |
235 | 0x00, index, &buff, 1, PAC207_CTRL_TIMEOUT); | 234 | 0x00, index, |
235 | gspca_dev->usb_buf, 1, PAC207_CTRL_TIMEOUT); | ||
236 | if (res < 0) { | 236 | if (res < 0) { |
237 | PDEBUG(D_ERR, | 237 | PDEBUG(D_ERR, |
238 | "Failed to read a register (index 0x%04X, error %d)", | 238 | "Failed to read a register (index 0x%04X, error %d)", |
@@ -240,10 +240,9 @@ int pac207_read_reg(struct gspca_dev *gspca_dev, u16 index) | |||
240 | return res; | 240 | return res; |
241 | } | 241 | } |
242 | 242 | ||
243 | return buff; | 243 | return gspca_dev->usb_buf[0]; |
244 | } | 244 | } |
245 | 245 | ||
246 | |||
247 | /* this function is called at probe time */ | 246 | /* this function is called at probe time */ |
248 | static int sd_config(struct gspca_dev *gspca_dev, | 247 | static int sd_config(struct gspca_dev *gspca_dev, |
249 | const struct usb_device_id *id) | 248 | const struct usb_device_id *id) |
diff --git a/drivers/media/video/gspca/pac7311.c b/drivers/media/video/gspca/pac7311.c index 1a2347aa7157..5c052e31be4a 100644 --- a/drivers/media/video/gspca/pac7311.c +++ b/drivers/media/video/gspca/pac7311.c | |||
@@ -23,8 +23,8 @@ | |||
23 | 23 | ||
24 | #include "gspca.h" | 24 | #include "gspca.h" |
25 | 25 | ||
26 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 26 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
27 | static const char version[] = "2.1.5"; | 27 | static const char version[] = "2.1.7"; |
28 | 28 | ||
29 | MODULE_AUTHOR("Thomas Kaiser thomas@kaiser-linux.li"); | 29 | MODULE_AUTHOR("Thomas Kaiser thomas@kaiser-linux.li"); |
30 | MODULE_DESCRIPTION("Pixart PAC7311"); | 30 | MODULE_DESCRIPTION("Pixart PAC7311"); |
@@ -206,46 +206,43 @@ static const __u8 pac7311_jpeg_header[] = { | |||
206 | 0x11, 0x00, 0x3f, 0x00 | 206 | 0x11, 0x00, 0x3f, 0x00 |
207 | }; | 207 | }; |
208 | 208 | ||
209 | static void reg_w(struct usb_device *dev, | 209 | static void reg_w_buf(struct gspca_dev *gspca_dev, |
210 | __u16 index, | 210 | __u16 index, |
211 | const char *buffer, __u16 len) | 211 | const char *buffer, __u16 len) |
212 | { | 212 | { |
213 | __u8 tmpbuf[8]; | 213 | memcpy(gspca_dev->usb_buf, buffer, len); |
214 | 214 | usb_control_msg(gspca_dev->dev, | |
215 | memcpy(tmpbuf, buffer, len); | 215 | usb_sndctrlpipe(gspca_dev->dev, 0), |
216 | usb_control_msg(dev, | ||
217 | usb_sndctrlpipe(dev, 0), | ||
218 | 1, /* request */ | 216 | 1, /* request */ |
219 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 217 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
220 | 0, /* value */ | 218 | 0, /* value */ |
221 | index, tmpbuf, len, | 219 | index, gspca_dev->usb_buf, len, |
222 | 500); | 220 | 500); |
223 | } | 221 | } |
224 | 222 | ||
225 | static void pac7311_reg_read(struct usb_device *dev, __u16 index, | 223 | static __u8 reg_r(struct gspca_dev *gspca_dev, |
226 | __u8 *buffer) | 224 | __u16 index) |
227 | { | 225 | { |
228 | usb_control_msg(dev, | 226 | usb_control_msg(gspca_dev->dev, |
229 | usb_rcvctrlpipe(dev, 0), | 227 | usb_rcvctrlpipe(gspca_dev->dev, 0), |
230 | 0, /* request */ | 228 | 0, /* request */ |
231 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 229 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
232 | 0, /* value */ | 230 | 0, /* value */ |
233 | index, buffer, 1, | 231 | index, gspca_dev->usb_buf, 1, |
234 | 500); | 232 | 500); |
233 | return gspca_dev->usb_buf[0]; | ||
235 | } | 234 | } |
236 | 235 | ||
237 | static void pac7311_reg_write(struct usb_device *dev, | 236 | static void reg_w(struct gspca_dev *gspca_dev, |
238 | __u16 index, | 237 | __u16 index, |
239 | __u8 value) | 238 | __u8 value) |
240 | { | 239 | { |
241 | __u8 buf; | 240 | gspca_dev->usb_buf[0] = value; |
242 | 241 | usb_control_msg(gspca_dev->dev, | |
243 | buf = value; | 242 | usb_sndctrlpipe(gspca_dev->dev, 0), |
244 | usb_control_msg(dev, | ||
245 | usb_sndctrlpipe(dev, 0), | ||
246 | 0, /* request */ | 243 | 0, /* request */ |
247 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 244 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
248 | value, index, &buf, 1, | 245 | value, index, gspca_dev->usb_buf, 1, |
249 | 500); | 246 | 500); |
250 | } | 247 | } |
251 | 248 | ||
@@ -254,20 +251,19 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
254 | const struct usb_device_id *id) | 251 | const struct usb_device_id *id) |
255 | { | 252 | { |
256 | struct sd *sd = (struct sd *) gspca_dev; | 253 | struct sd *sd = (struct sd *) gspca_dev; |
257 | struct usb_device *dev = gspca_dev->dev; | ||
258 | struct cam *cam; | 254 | struct cam *cam; |
259 | 255 | ||
260 | PDEBUG(D_CONF, "Find Sensor PAC7311"); | 256 | PDEBUG(D_CONF, "Find Sensor PAC7311"); |
261 | pac7311_reg_write(dev, 0x78, 0x40); /* Bit_0=start stream, Bit_7=LED */ | 257 | reg_w(gspca_dev, 0x78, 0x40); /* Bit_0=start stream, Bit_7=LED */ |
262 | pac7311_reg_write(dev, 0x78, 0x40); /* Bit_0=start stream, Bit_7=LED */ | 258 | reg_w(gspca_dev, 0x78, 0x40); /* Bit_0=start stream, Bit_7=LED */ |
263 | pac7311_reg_write(dev, 0x78, 0x44); /* Bit_0=start stream, Bit_7=LED */ | 259 | reg_w(gspca_dev, 0x78, 0x44); /* Bit_0=start stream, Bit_7=LED */ |
264 | pac7311_reg_write(dev, 0xff, 0x04); | 260 | reg_w(gspca_dev, 0xff, 0x04); |
265 | pac7311_reg_write(dev, 0x27, 0x80); | 261 | reg_w(gspca_dev, 0x27, 0x80); |
266 | pac7311_reg_write(dev, 0x28, 0xca); | 262 | reg_w(gspca_dev, 0x28, 0xca); |
267 | pac7311_reg_write(dev, 0x29, 0x53); | 263 | reg_w(gspca_dev, 0x29, 0x53); |
268 | pac7311_reg_write(dev, 0x2a, 0x0e); | 264 | reg_w(gspca_dev, 0x2a, 0x0e); |
269 | pac7311_reg_write(dev, 0xff, 0x01); | 265 | reg_w(gspca_dev, 0xff, 0x01); |
270 | pac7311_reg_write(dev, 0x3e, 0x20); | 266 | reg_w(gspca_dev, 0x3e, 0x20); |
271 | 267 | ||
272 | cam = &gspca_dev->cam; | 268 | cam = &gspca_dev->cam; |
273 | cam->dev_name = (char *) id->driver_info; | 269 | cam->dev_name = (char *) id->driver_info; |
@@ -289,11 +285,11 @@ static void setbrightness(struct gspca_dev *gspca_dev) | |||
289 | 285 | ||
290 | /*jfm: inverted?*/ | 286 | /*jfm: inverted?*/ |
291 | brightness = BRIGHTNESS_MAX - sd->brightness; | 287 | brightness = BRIGHTNESS_MAX - sd->brightness; |
292 | pac7311_reg_write(gspca_dev->dev, 0xff, 0x04); | 288 | reg_w(gspca_dev, 0xff, 0x04); |
293 | /* pac7311_reg_write(gspca_dev->dev, 0x0e, 0x00); */ | 289 | /* reg_w(gspca_dev, 0x0e, 0x00); */ |
294 | pac7311_reg_write(gspca_dev->dev, 0x0f, brightness); | 290 | reg_w(gspca_dev, 0x0f, brightness); |
295 | /* load registers to sensor (Bit 0, auto clear) */ | 291 | /* load registers to sensor (Bit 0, auto clear) */ |
296 | pac7311_reg_write(gspca_dev->dev, 0x11, 0x01); | 292 | reg_w(gspca_dev, 0x11, 0x01); |
297 | PDEBUG(D_CONF|D_STREAM, "brightness: %i", brightness); | 293 | PDEBUG(D_CONF|D_STREAM, "brightness: %i", brightness); |
298 | } | 294 | } |
299 | 295 | ||
@@ -301,10 +297,10 @@ static void setcontrast(struct gspca_dev *gspca_dev) | |||
301 | { | 297 | { |
302 | struct sd *sd = (struct sd *) gspca_dev; | 298 | struct sd *sd = (struct sd *) gspca_dev; |
303 | 299 | ||
304 | pac7311_reg_write(gspca_dev->dev, 0xff, 0x01); | 300 | reg_w(gspca_dev, 0xff, 0x01); |
305 | pac7311_reg_write(gspca_dev->dev, 0x80, sd->contrast); | 301 | reg_w(gspca_dev, 0x80, sd->contrast); |
306 | /* load registers to sensor (Bit 0, auto clear) */ | 302 | /* load registers to sensor (Bit 0, auto clear) */ |
307 | pac7311_reg_write(gspca_dev->dev, 0x11, 0x01); | 303 | reg_w(gspca_dev, 0x11, 0x01); |
308 | PDEBUG(D_CONF|D_STREAM, "contrast: %i", sd->contrast); | 304 | PDEBUG(D_CONF|D_STREAM, "contrast: %i", sd->contrast); |
309 | } | 305 | } |
310 | 306 | ||
@@ -312,94 +308,93 @@ static void setcolors(struct gspca_dev *gspca_dev) | |||
312 | { | 308 | { |
313 | struct sd *sd = (struct sd *) gspca_dev; | 309 | struct sd *sd = (struct sd *) gspca_dev; |
314 | 310 | ||
315 | pac7311_reg_write(gspca_dev->dev, 0xff, 0x01); | 311 | reg_w(gspca_dev, 0xff, 0x01); |
316 | pac7311_reg_write(gspca_dev->dev, 0x10, sd->colors); | 312 | reg_w(gspca_dev, 0x10, sd->colors); |
317 | /* load registers to sensor (Bit 0, auto clear) */ | 313 | /* load registers to sensor (Bit 0, auto clear) */ |
318 | pac7311_reg_write(gspca_dev->dev, 0x11, 0x01); | 314 | reg_w(gspca_dev, 0x11, 0x01); |
319 | PDEBUG(D_CONF|D_STREAM, "color: %i", sd->colors); | 315 | PDEBUG(D_CONF|D_STREAM, "color: %i", sd->colors); |
320 | } | 316 | } |
321 | 317 | ||
322 | /* this function is called at open time */ | 318 | /* this function is called at open time */ |
323 | static int sd_open(struct gspca_dev *gspca_dev) | 319 | static int sd_open(struct gspca_dev *gspca_dev) |
324 | { | 320 | { |
325 | pac7311_reg_write(gspca_dev->dev, 0x78, 0x00); /* Turn on LED */ | 321 | reg_w(gspca_dev, 0x78, 0x00); /* Turn on LED */ |
326 | return 0; | 322 | return 0; |
327 | } | 323 | } |
328 | 324 | ||
329 | static void sd_start(struct gspca_dev *gspca_dev) | 325 | static void sd_start(struct gspca_dev *gspca_dev) |
330 | { | 326 | { |
331 | struct usb_device *dev = gspca_dev->dev; | ||
332 | struct sd *sd = (struct sd *) gspca_dev; | 327 | struct sd *sd = (struct sd *) gspca_dev; |
333 | 328 | ||
334 | pac7311_reg_write(dev, 0xff, 0x01); | 329 | reg_w(gspca_dev, 0xff, 0x01); |
335 | reg_w(dev, 0x0002, "\x48\x0a\x40\x08\x00\x00\x08\x00", 8); | 330 | reg_w_buf(gspca_dev, 0x0002, "\x48\x0a\x40\x08\x00\x00\x08\x00", 8); |
336 | reg_w(dev, 0x000a, "\x06\xff\x11\xff\x5a\x30\x90\x4c", 8); | 331 | reg_w_buf(gspca_dev, 0x000a, "\x06\xff\x11\xff\x5a\x30\x90\x4c", 8); |
337 | reg_w(dev, 0x0012, "\x00\x07\x00\x0a\x10\x00\xa0\x10", 8); | 332 | reg_w_buf(gspca_dev, 0x0012, "\x00\x07\x00\x0a\x10\x00\xa0\x10", 8); |
338 | reg_w(dev, 0x001a, "\x02\x00\x00\x00\x00\x0b\x01\x00", 8); | 333 | reg_w_buf(gspca_dev, 0x001a, "\x02\x00\x00\x00\x00\x0b\x01\x00", 8); |
339 | reg_w(dev, 0x0022, "\x00\x00\x00\x00\x00\x00\x00\x00", 8); | 334 | reg_w_buf(gspca_dev, 0x0022, "\x00\x00\x00\x00\x00\x00\x00\x00", 8); |
340 | reg_w(dev, 0x002a, "\x00\x00\x00", 3); | 335 | reg_w_buf(gspca_dev, 0x002a, "\x00\x00\x00", 3); |
341 | reg_w(dev, 0x003e, "\x00\x00\x78\x52\x4a\x52\x78\x6e", 8); | 336 | reg_w_buf(gspca_dev, 0x003e, "\x00\x00\x78\x52\x4a\x52\x78\x6e", 8); |
342 | reg_w(dev, 0x0046, "\x48\x46\x48\x6e\x5f\x49\x42\x49", 8); | 337 | reg_w_buf(gspca_dev, 0x0046, "\x48\x46\x48\x6e\x5f\x49\x42\x49", 8); |
343 | reg_w(dev, 0x004e, "\x5f\x5f\x49\x42\x49\x5f\x6e\x48", 8); | 338 | reg_w_buf(gspca_dev, 0x004e, "\x5f\x5f\x49\x42\x49\x5f\x6e\x48", 8); |
344 | reg_w(dev, 0x0056, "\x46\x48\x6e\x78\x52\x4a\x52\x78", 8); | 339 | reg_w_buf(gspca_dev, 0x0056, "\x46\x48\x6e\x78\x52\x4a\x52\x78", 8); |
345 | reg_w(dev, 0x005e, "\x00\x00\x09\x1b\x34\x49\x5c\x9b", 8); | 340 | reg_w_buf(gspca_dev, 0x005e, "\x00\x00\x09\x1b\x34\x49\x5c\x9b", 8); |
346 | reg_w(dev, 0x0066, "\xd0\xff", 2); | 341 | reg_w_buf(gspca_dev, 0x0066, "\xd0\xff", 2); |
347 | reg_w(dev, 0x0078, "\x44\x00\xf2\x01\x01\x80", 6); | 342 | reg_w_buf(gspca_dev, 0x0078, "\x44\x00\xf2\x01\x01\x80", 6); |
348 | reg_w(dev, 0x007f, "\x2a\x1c\x00\xc8\x02\x58\x03\x84", 8); | 343 | reg_w_buf(gspca_dev, 0x007f, "\x2a\x1c\x00\xc8\x02\x58\x03\x84", 8); |
349 | reg_w(dev, 0x0087, "\x12\x00\x1a\x04\x08\x0c\x10\x14", 8); | 344 | reg_w_buf(gspca_dev, 0x0087, "\x12\x00\x1a\x04\x08\x0c\x10\x14", 8); |
350 | reg_w(dev, 0x008f, "\x18\x20", 2); | 345 | reg_w_buf(gspca_dev, 0x008f, "\x18\x20", 2); |
351 | reg_w(dev, 0x0096, "\x01\x08\x04", 3); | 346 | reg_w_buf(gspca_dev, 0x0096, "\x01\x08\x04", 3); |
352 | reg_w(dev, 0x00a0, "\x44\x44\x44\x04", 4); | 347 | reg_w_buf(gspca_dev, 0x00a0, "\x44\x44\x44\x04", 4); |
353 | reg_w(dev, 0x00f0, "\x01\x00\x00\x00\x22\x00\x20\x00", 8); | 348 | reg_w_buf(gspca_dev, 0x00f0, "\x01\x00\x00\x00\x22\x00\x20\x00", 8); |
354 | reg_w(dev, 0x00f8, "\x3f\x00\x0a\x01\x00", 5); | 349 | reg_w_buf(gspca_dev, 0x00f8, "\x3f\x00\x0a\x01\x00", 5); |
355 | 350 | ||
356 | pac7311_reg_write(dev, 0xff, 0x04); | 351 | reg_w(gspca_dev, 0xff, 0x04); |
357 | pac7311_reg_write(dev, 0x02, 0x04); | 352 | reg_w(gspca_dev, 0x02, 0x04); |
358 | pac7311_reg_write(dev, 0x03, 0x54); | 353 | reg_w(gspca_dev, 0x03, 0x54); |
359 | pac7311_reg_write(dev, 0x04, 0x07); | 354 | reg_w(gspca_dev, 0x04, 0x07); |
360 | pac7311_reg_write(dev, 0x05, 0x2b); | 355 | reg_w(gspca_dev, 0x05, 0x2b); |
361 | pac7311_reg_write(dev, 0x06, 0x09); | 356 | reg_w(gspca_dev, 0x06, 0x09); |
362 | pac7311_reg_write(dev, 0x07, 0x0f); | 357 | reg_w(gspca_dev, 0x07, 0x0f); |
363 | pac7311_reg_write(dev, 0x08, 0x09); | 358 | reg_w(gspca_dev, 0x08, 0x09); |
364 | pac7311_reg_write(dev, 0x09, 0x00); | 359 | reg_w(gspca_dev, 0x09, 0x00); |
365 | pac7311_reg_write(dev, 0x0c, 0x07); | 360 | reg_w(gspca_dev, 0x0c, 0x07); |
366 | pac7311_reg_write(dev, 0x0d, 0x00); | 361 | reg_w(gspca_dev, 0x0d, 0x00); |
367 | pac7311_reg_write(dev, 0x0e, 0x00); | 362 | reg_w(gspca_dev, 0x0e, 0x00); |
368 | pac7311_reg_write(dev, 0x0f, 0x62); | 363 | reg_w(gspca_dev, 0x0f, 0x62); |
369 | pac7311_reg_write(dev, 0x10, 0x08); | 364 | reg_w(gspca_dev, 0x10, 0x08); |
370 | pac7311_reg_write(dev, 0x12, 0x07); | 365 | reg_w(gspca_dev, 0x12, 0x07); |
371 | pac7311_reg_write(dev, 0x13, 0x00); | 366 | reg_w(gspca_dev, 0x13, 0x00); |
372 | pac7311_reg_write(dev, 0x14, 0x00); | 367 | reg_w(gspca_dev, 0x14, 0x00); |
373 | pac7311_reg_write(dev, 0x15, 0x00); | 368 | reg_w(gspca_dev, 0x15, 0x00); |
374 | pac7311_reg_write(dev, 0x16, 0x00); | 369 | reg_w(gspca_dev, 0x16, 0x00); |
375 | pac7311_reg_write(dev, 0x17, 0x00); | 370 | reg_w(gspca_dev, 0x17, 0x00); |
376 | pac7311_reg_write(dev, 0x18, 0x00); | 371 | reg_w(gspca_dev, 0x18, 0x00); |
377 | pac7311_reg_write(dev, 0x19, 0x00); | 372 | reg_w(gspca_dev, 0x19, 0x00); |
378 | pac7311_reg_write(dev, 0x1a, 0x00); | 373 | reg_w(gspca_dev, 0x1a, 0x00); |
379 | pac7311_reg_write(dev, 0x1b, 0x03); | 374 | reg_w(gspca_dev, 0x1b, 0x03); |
380 | pac7311_reg_write(dev, 0x1c, 0xa0); | 375 | reg_w(gspca_dev, 0x1c, 0xa0); |
381 | pac7311_reg_write(dev, 0x1d, 0x01); | 376 | reg_w(gspca_dev, 0x1d, 0x01); |
382 | pac7311_reg_write(dev, 0x1e, 0xf4); | 377 | reg_w(gspca_dev, 0x1e, 0xf4); |
383 | pac7311_reg_write(dev, 0x21, 0x00); | 378 | reg_w(gspca_dev, 0x21, 0x00); |
384 | pac7311_reg_write(dev, 0x22, 0x08); | 379 | reg_w(gspca_dev, 0x22, 0x08); |
385 | pac7311_reg_write(dev, 0x24, 0x03); | 380 | reg_w(gspca_dev, 0x24, 0x03); |
386 | pac7311_reg_write(dev, 0x26, 0x00); | 381 | reg_w(gspca_dev, 0x26, 0x00); |
387 | pac7311_reg_write(dev, 0x27, 0x01); | 382 | reg_w(gspca_dev, 0x27, 0x01); |
388 | pac7311_reg_write(dev, 0x28, 0xca); | 383 | reg_w(gspca_dev, 0x28, 0xca); |
389 | pac7311_reg_write(dev, 0x29, 0x10); | 384 | reg_w(gspca_dev, 0x29, 0x10); |
390 | pac7311_reg_write(dev, 0x2a, 0x06); | 385 | reg_w(gspca_dev, 0x2a, 0x06); |
391 | pac7311_reg_write(dev, 0x2b, 0x78); | 386 | reg_w(gspca_dev, 0x2b, 0x78); |
392 | pac7311_reg_write(dev, 0x2c, 0x00); | 387 | reg_w(gspca_dev, 0x2c, 0x00); |
393 | pac7311_reg_write(dev, 0x2d, 0x00); | 388 | reg_w(gspca_dev, 0x2d, 0x00); |
394 | pac7311_reg_write(dev, 0x2e, 0x00); | 389 | reg_w(gspca_dev, 0x2e, 0x00); |
395 | pac7311_reg_write(dev, 0x2f, 0x00); | 390 | reg_w(gspca_dev, 0x2f, 0x00); |
396 | pac7311_reg_write(dev, 0x30, 0x23); | 391 | reg_w(gspca_dev, 0x30, 0x23); |
397 | pac7311_reg_write(dev, 0x31, 0x28); | 392 | reg_w(gspca_dev, 0x31, 0x28); |
398 | pac7311_reg_write(dev, 0x32, 0x04); | 393 | reg_w(gspca_dev, 0x32, 0x04); |
399 | pac7311_reg_write(dev, 0x33, 0x11); | 394 | reg_w(gspca_dev, 0x33, 0x11); |
400 | pac7311_reg_write(dev, 0x34, 0x00); | 395 | reg_w(gspca_dev, 0x34, 0x00); |
401 | pac7311_reg_write(dev, 0x35, 0x00); | 396 | reg_w(gspca_dev, 0x35, 0x00); |
402 | pac7311_reg_write(dev, 0x11, 0x01); | 397 | reg_w(gspca_dev, 0x11, 0x01); |
403 | setcontrast(gspca_dev); | 398 | setcontrast(gspca_dev); |
404 | setbrightness(gspca_dev); | 399 | setbrightness(gspca_dev); |
405 | setcolors(gspca_dev); | 400 | setcolors(gspca_dev); |
@@ -407,39 +402,39 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
407 | /* set correct resolution */ | 402 | /* set correct resolution */ |
408 | switch (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) { | 403 | switch (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) { |
409 | case 2: /* 160x120 */ | 404 | case 2: /* 160x120 */ |
410 | pac7311_reg_write(dev, 0xff, 0x04); | 405 | reg_w(gspca_dev, 0xff, 0x04); |
411 | pac7311_reg_write(dev, 0x02, 0x03); | 406 | reg_w(gspca_dev, 0x02, 0x03); |
412 | pac7311_reg_write(dev, 0xff, 0x01); | 407 | reg_w(gspca_dev, 0xff, 0x01); |
413 | pac7311_reg_write(dev, 0x08, 0x09); | 408 | reg_w(gspca_dev, 0x08, 0x09); |
414 | pac7311_reg_write(dev, 0x17, 0x20); | 409 | reg_w(gspca_dev, 0x17, 0x20); |
415 | pac7311_reg_write(dev, 0x1b, 0x00); | 410 | reg_w(gspca_dev, 0x1b, 0x00); |
416 | /* pac7311_reg_write(dev, 0x80, 0x69); */ | 411 | /* reg_w(gspca_dev, 0x80, 0x69); */ |
417 | pac7311_reg_write(dev, 0x87, 0x10); | 412 | reg_w(gspca_dev, 0x87, 0x10); |
418 | break; | 413 | break; |
419 | case 1: /* 320x240 */ | 414 | case 1: /* 320x240 */ |
420 | pac7311_reg_write(dev, 0xff, 0x04); | 415 | reg_w(gspca_dev, 0xff, 0x04); |
421 | pac7311_reg_write(dev, 0x02, 0x03); | 416 | reg_w(gspca_dev, 0x02, 0x03); |
422 | pac7311_reg_write(dev, 0xff, 0x01); | 417 | reg_w(gspca_dev, 0xff, 0x01); |
423 | pac7311_reg_write(dev, 0x08, 0x09); | 418 | reg_w(gspca_dev, 0x08, 0x09); |
424 | pac7311_reg_write(dev, 0x17, 0x30); | 419 | reg_w(gspca_dev, 0x17, 0x30); |
425 | /* pac7311_reg_write(dev, 0x80, 0x3f); */ | 420 | /* reg_w(gspca_dev, 0x80, 0x3f); */ |
426 | pac7311_reg_write(dev, 0x87, 0x11); | 421 | reg_w(gspca_dev, 0x87, 0x11); |
427 | break; | 422 | break; |
428 | case 0: /* 640x480 */ | 423 | case 0: /* 640x480 */ |
429 | pac7311_reg_write(dev, 0xff, 0x04); | 424 | reg_w(gspca_dev, 0xff, 0x04); |
430 | pac7311_reg_write(dev, 0x02, 0x03); | 425 | reg_w(gspca_dev, 0x02, 0x03); |
431 | pac7311_reg_write(dev, 0xff, 0x01); | 426 | reg_w(gspca_dev, 0xff, 0x01); |
432 | pac7311_reg_write(dev, 0x08, 0x08); | 427 | reg_w(gspca_dev, 0x08, 0x08); |
433 | pac7311_reg_write(dev, 0x17, 0x00); | 428 | reg_w(gspca_dev, 0x17, 0x00); |
434 | /* pac7311_reg_write(dev, 0x80, 0x1c); */ | 429 | /* reg_w(gspca_dev, 0x80, 0x1c); */ |
435 | pac7311_reg_write(dev, 0x87, 0x12); | 430 | reg_w(gspca_dev, 0x87, 0x12); |
436 | break; | 431 | break; |
437 | } | 432 | } |
438 | 433 | ||
439 | /* start stream */ | 434 | /* start stream */ |
440 | pac7311_reg_write(dev, 0xff, 0x01); | 435 | reg_w(gspca_dev, 0xff, 0x01); |
441 | pac7311_reg_write(dev, 0x78, 0x04); | 436 | reg_w(gspca_dev, 0x78, 0x04); |
442 | pac7311_reg_write(dev, 0x78, 0x05); | 437 | reg_w(gspca_dev, 0x78, 0x05); |
443 | 438 | ||
444 | if (sd->autogain) { | 439 | if (sd->autogain) { |
445 | sd->ag_cnt = AG_CNT_START; | 440 | sd->ag_cnt = AG_CNT_START; |
@@ -451,18 +446,16 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
451 | 446 | ||
452 | static void sd_stopN(struct gspca_dev *gspca_dev) | 447 | static void sd_stopN(struct gspca_dev *gspca_dev) |
453 | { | 448 | { |
454 | struct usb_device *dev = gspca_dev->dev; | 449 | reg_w(gspca_dev, 0xff, 0x04); |
455 | 450 | reg_w(gspca_dev, 0x27, 0x80); | |
456 | pac7311_reg_write(dev, 0xff, 0x04); | 451 | reg_w(gspca_dev, 0x28, 0xca); |
457 | pac7311_reg_write(dev, 0x27, 0x80); | 452 | reg_w(gspca_dev, 0x29, 0x53); |
458 | pac7311_reg_write(dev, 0x28, 0xca); | 453 | reg_w(gspca_dev, 0x2a, 0x0e); |
459 | pac7311_reg_write(dev, 0x29, 0x53); | 454 | reg_w(gspca_dev, 0xff, 0x01); |
460 | pac7311_reg_write(dev, 0x2a, 0x0e); | 455 | reg_w(gspca_dev, 0x3e, 0x20); |
461 | pac7311_reg_write(dev, 0xff, 0x01); | 456 | reg_w(gspca_dev, 0x78, 0x04); /* Bit_0=start stream, Bit_7=LED */ |
462 | pac7311_reg_write(dev, 0x3e, 0x20); | 457 | reg_w(gspca_dev, 0x78, 0x44); /* Bit_0=start stream, Bit_7=LED */ |
463 | pac7311_reg_write(dev, 0x78, 0x04); /* Bit_0=start stream, Bit_7=LED */ | 458 | reg_w(gspca_dev, 0x78, 0x44); /* Bit_0=start stream, Bit_7=LED */ |
464 | pac7311_reg_write(dev, 0x78, 0x44); /* Bit_0=start stream, Bit_7=LED */ | ||
465 | pac7311_reg_write(dev, 0x78, 0x44); /* Bit_0=start stream, Bit_7=LED */ | ||
466 | } | 459 | } |
467 | 460 | ||
468 | static void sd_stop0(struct gspca_dev *gspca_dev) | 461 | static void sd_stop0(struct gspca_dev *gspca_dev) |
@@ -472,18 +465,16 @@ static void sd_stop0(struct gspca_dev *gspca_dev) | |||
472 | /* this function is called at close time */ | 465 | /* this function is called at close time */ |
473 | static void sd_close(struct gspca_dev *gspca_dev) | 466 | static void sd_close(struct gspca_dev *gspca_dev) |
474 | { | 467 | { |
475 | struct usb_device *dev = gspca_dev->dev; | 468 | reg_w(gspca_dev, 0xff, 0x04); |
476 | 469 | reg_w(gspca_dev, 0x27, 0x80); | |
477 | pac7311_reg_write(dev, 0xff, 0x04); | 470 | reg_w(gspca_dev, 0x28, 0xca); |
478 | pac7311_reg_write(dev, 0x27, 0x80); | 471 | reg_w(gspca_dev, 0x29, 0x53); |
479 | pac7311_reg_write(dev, 0x28, 0xca); | 472 | reg_w(gspca_dev, 0x2a, 0x0e); |
480 | pac7311_reg_write(dev, 0x29, 0x53); | 473 | reg_w(gspca_dev, 0xff, 0x01); |
481 | pac7311_reg_write(dev, 0x2a, 0x0e); | 474 | reg_w(gspca_dev, 0x3e, 0x20); |
482 | pac7311_reg_write(dev, 0xff, 0x01); | 475 | reg_w(gspca_dev, 0x78, 0x04); /* Bit_0=start stream, Bit_7=LED */ |
483 | pac7311_reg_write(dev, 0x3e, 0x20); | 476 | reg_w(gspca_dev, 0x78, 0x44); /* Bit_0=start stream, Bit_7=LED */ |
484 | pac7311_reg_write(dev, 0x78, 0x04); /* Bit_0=start stream, Bit_7=LED */ | 477 | reg_w(gspca_dev, 0x78, 0x44); /* Bit_0=start stream, Bit_7=LED */ |
485 | pac7311_reg_write(dev, 0x78, 0x44); /* Bit_0=start stream, Bit_7=LED */ | ||
486 | pac7311_reg_write(dev, 0x78, 0x44); /* Bit_0=start stream, Bit_7=LED */ | ||
487 | } | 478 | } |
488 | 479 | ||
489 | static void setautogain(struct gspca_dev *gspca_dev, int luma) | 480 | static void setautogain(struct gspca_dev *gspca_dev, int luma) |
@@ -491,11 +482,9 @@ static void setautogain(struct gspca_dev *gspca_dev, int luma) | |||
491 | int luma_mean = 128; | 482 | int luma_mean = 128; |
492 | int luma_delta = 20; | 483 | int luma_delta = 20; |
493 | __u8 spring = 5; | 484 | __u8 spring = 5; |
494 | __u8 Pxclk; | ||
495 | int Gbright; | 485 | int Gbright; |
496 | 486 | ||
497 | pac7311_reg_read(gspca_dev->dev, 0x02, &Pxclk); | 487 | Gbright = reg_r(gspca_dev, 0x02); |
498 | Gbright = Pxclk; | ||
499 | PDEBUG(D_FRAM, "luma mean %d", luma); | 488 | PDEBUG(D_FRAM, "luma mean %d", luma); |
500 | if (luma < luma_mean - luma_delta || | 489 | if (luma < luma_mean - luma_delta || |
501 | luma > luma_mean + luma_delta) { | 490 | luma > luma_mean + luma_delta) { |
@@ -505,10 +494,10 @@ static void setautogain(struct gspca_dev *gspca_dev, int luma) | |||
505 | else if (Gbright < 4) | 494 | else if (Gbright < 4) |
506 | Gbright = 4; | 495 | Gbright = 4; |
507 | PDEBUG(D_FRAM, "gbright %d", Gbright); | 496 | PDEBUG(D_FRAM, "gbright %d", Gbright); |
508 | pac7311_reg_write(gspca_dev->dev, 0xff, 0x04); | 497 | reg_w(gspca_dev, 0xff, 0x04); |
509 | pac7311_reg_write(gspca_dev->dev, 0x0f, Gbright); | 498 | reg_w(gspca_dev, 0x0f, Gbright); |
510 | /* load registers to sensor (Bit 0, auto clear) */ | 499 | /* load registers to sensor (Bit 0, auto clear) */ |
511 | pac7311_reg_write(gspca_dev->dev, 0x11, 0x01); | 500 | reg_w(gspca_dev, 0x11, 0x01); |
512 | } | 501 | } |
513 | } | 502 | } |
514 | 503 | ||
@@ -623,11 +612,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, | |||
623 | 612 | ||
624 | static void getbrightness(struct gspca_dev *gspca_dev) | 613 | static void getbrightness(struct gspca_dev *gspca_dev) |
625 | { | 614 | { |
626 | /* __u8 brightness = 0; | 615 | /* sd->brightness = reg_r(gspca_dev, 0x08); |
627 | 616 | return sd->brightness; */ | |
628 | pac7311_reg_read(gspca_dev->dev, 0x0008, &brightness); | ||
629 | spca50x->brightness = brightness; | ||
630 | return spca50x->brightness; */ | ||
631 | /* PDEBUG(D_CONF, "Called pac7311_getbrightness: Not implemented yet"); */ | 617 | /* PDEBUG(D_CONF, "Called pac7311_getbrightness: Not implemented yet"); */ |
632 | } | 618 | } |
633 | 619 | ||
diff --git a/drivers/media/video/gspca/sonixb.c b/drivers/media/video/gspca/sonixb.c index 5d2313198807..ce8b28f504d3 100644 --- a/drivers/media/video/gspca/sonixb.c +++ b/drivers/media/video/gspca/sonixb.c | |||
@@ -384,64 +384,82 @@ static const __u8 tas5130_sensor_init[][8] = { | |||
384 | {0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10}, | 384 | {0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10}, |
385 | }; | 385 | }; |
386 | 386 | ||
387 | static void reg_r(struct usb_device *dev, | 387 | /* get one byte in gspca_dev->usb_buf */ |
388 | __u16 value, __u8 *buffer) | 388 | static void reg_r(struct gspca_dev *gspca_dev, |
389 | __u16 value) | ||
389 | { | 390 | { |
390 | usb_control_msg(dev, | 391 | usb_control_msg(gspca_dev->dev, |
391 | usb_rcvctrlpipe(dev, 0), | 392 | usb_rcvctrlpipe(gspca_dev->dev, 0), |
392 | 0, /* request */ | 393 | 0, /* request */ |
393 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, | 394 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, |
394 | value, | 395 | value, |
395 | 0, /* index */ | 396 | 0, /* index */ |
396 | buffer, 1, | 397 | gspca_dev->usb_buf, 1, |
397 | 500); | 398 | 500); |
398 | } | 399 | } |
399 | 400 | ||
400 | static void reg_w(struct usb_device *dev, | 401 | static void reg_w(struct gspca_dev *gspca_dev, |
401 | __u16 value, | 402 | __u16 value, |
402 | const __u8 *buffer, | 403 | const __u8 *buffer, |
403 | int len) | 404 | int len) |
404 | { | 405 | { |
405 | __u8 tmpbuf[48]; | ||
406 | |||
407 | #ifdef CONFIG_VIDEO_ADV_DEBUG | 406 | #ifdef CONFIG_VIDEO_ADV_DEBUG |
408 | if (len > sizeof tmpbuf) { | 407 | if (len > sizeof gspca_dev->usb_buf) { |
409 | PDEBUG(D_ERR|D_PACK, "reg_w: buffer overflow"); | 408 | PDEBUG(D_ERR|D_PACK, "reg_w: buffer overflow"); |
410 | return; | 409 | return; |
411 | } | 410 | } |
412 | #endif | 411 | #endif |
412 | memcpy(gspca_dev->usb_buf, buffer, len); | ||
413 | usb_control_msg(gspca_dev->dev, | ||
414 | usb_sndctrlpipe(gspca_dev->dev, 0), | ||
415 | 0x08, /* request */ | ||
416 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, | ||
417 | value, | ||
418 | 0, /* index */ | ||
419 | gspca_dev->usb_buf, len, | ||
420 | 500); | ||
421 | } | ||
422 | |||
423 | static void reg_w_big(struct gspca_dev *gspca_dev, | ||
424 | __u16 value, | ||
425 | const __u8 *buffer, | ||
426 | int len) | ||
427 | { | ||
428 | __u8 *tmpbuf; | ||
429 | |||
430 | tmpbuf = kmalloc(len, GFP_KERNEL); | ||
413 | memcpy(tmpbuf, buffer, len); | 431 | memcpy(tmpbuf, buffer, len); |
414 | usb_control_msg(dev, | 432 | usb_control_msg(gspca_dev->dev, |
415 | usb_sndctrlpipe(dev, 0), | 433 | usb_sndctrlpipe(gspca_dev->dev, 0), |
416 | 0x08, /* request */ | 434 | 0x08, /* request */ |
417 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, | 435 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, |
418 | value, | 436 | value, |
419 | 0, /* index */ | 437 | 0, /* index */ |
420 | tmpbuf, len, | 438 | tmpbuf, len, |
421 | 500); | 439 | 500); |
440 | kfree(tmpbuf); | ||
422 | } | 441 | } |
423 | 442 | ||
424 | static int i2c_w(struct usb_device *dev, const __u8 *buffer) | 443 | static int i2c_w(struct gspca_dev *gspca_dev, const __u8 *buffer) |
425 | { | 444 | { |
426 | int retry = 60; | 445 | int retry = 60; |
427 | __u8 ByteReceive; | ||
428 | 446 | ||
429 | /* is i2c ready */ | 447 | /* is i2c ready */ |
430 | reg_w(dev, 0x08, buffer, 8); | 448 | reg_w(gspca_dev, 0x08, buffer, 8); |
431 | while (retry--) { | 449 | while (retry--) { |
432 | msleep(10); | 450 | msleep(10); |
433 | reg_r(dev, 0x08, &ByteReceive); | 451 | reg_r(gspca_dev, 0x08); |
434 | if (ByteReceive == 4) | 452 | if (gspca_dev->usb_buf[0] == 4) |
435 | return 0; | 453 | return 0; |
436 | } | 454 | } |
437 | return -1; | 455 | return -1; |
438 | } | 456 | } |
439 | 457 | ||
440 | static void i2c_w_vector(struct usb_device *dev, | 458 | static void i2c_w_vector(struct gspca_dev *gspca_dev, |
441 | const __u8 buffer[][8], int len) | 459 | const __u8 buffer[][8], int len) |
442 | { | 460 | { |
443 | for (;;) { | 461 | for (;;) { |
444 | reg_w(dev, 0x08, *buffer, 8); | 462 | reg_w(gspca_dev, 0x08, *buffer, 8); |
445 | len -= 8; | 463 | len -= 8; |
446 | if (len <= 0) | 464 | if (len <= 0) |
447 | break; | 465 | break; |
@@ -460,7 +478,7 @@ static void setbrightness(struct gspca_dev *gspca_dev) | |||
460 | {0xa0, 0x60, 0x06, 0x11, 0x99, 0x04, 0x94, 0x15}; | 478 | {0xa0, 0x60, 0x06, 0x11, 0x99, 0x04, 0x94, 0x15}; |
461 | 479 | ||
462 | i2cOV6650[3] = sd->brightness; | 480 | i2cOV6650[3] = sd->brightness; |
463 | if (i2c_w(gspca_dev->dev, i2cOV6650) < 0) | 481 | if (i2c_w(gspca_dev, i2cOV6650) < 0) |
464 | goto err; | 482 | goto err; |
465 | break; | 483 | break; |
466 | } | 484 | } |
@@ -470,7 +488,7 @@ static void setbrightness(struct gspca_dev *gspca_dev) | |||
470 | 488 | ||
471 | /* change reg 0x06 */ | 489 | /* change reg 0x06 */ |
472 | i2cOV[3] = sd->brightness; | 490 | i2cOV[3] = sd->brightness; |
473 | if (i2c_w(gspca_dev->dev, i2cOV) < 0) | 491 | if (i2c_w(gspca_dev, i2cOV) < 0) |
474 | goto err; | 492 | goto err; |
475 | break; | 493 | break; |
476 | } | 494 | } |
@@ -480,11 +498,11 @@ static void setbrightness(struct gspca_dev *gspca_dev) | |||
480 | 498 | ||
481 | i2c1[3] = sd->brightness >> 3; | 499 | i2c1[3] = sd->brightness >> 3; |
482 | i2c1[2] = 0x0e; | 500 | i2c1[2] = 0x0e; |
483 | if (i2c_w(gspca_dev->dev, i2c1) < 0) | 501 | if (i2c_w(gspca_dev, i2c1) < 0) |
484 | goto err; | 502 | goto err; |
485 | i2c1[3] = 0x01; | 503 | i2c1[3] = 0x01; |
486 | i2c1[2] = 0x13; | 504 | i2c1[2] = 0x13; |
487 | if (i2c_w(gspca_dev->dev, i2c1) < 0) | 505 | if (i2c_w(gspca_dev, i2c1) < 0) |
488 | goto err; | 506 | goto err; |
489 | break; | 507 | break; |
490 | } | 508 | } |
@@ -500,18 +518,18 @@ static void setbrightness(struct gspca_dev *gspca_dev) | |||
500 | 518 | ||
501 | /* change reg 0x10 */ | 519 | /* change reg 0x10 */ |
502 | i2cpexpo[4] = 0xff - sd->brightness; | 520 | i2cpexpo[4] = 0xff - sd->brightness; |
503 | /* if(i2c_w(gspca_dev->dev,i2cpexpo1) < 0) | 521 | /* if(i2c_w(gspca_dev,i2cpexpo1) < 0) |
504 | goto err; */ | 522 | goto err; */ |
505 | /* if(i2c_w(gspca_dev->dev,i2cpdoit) < 0) | 523 | /* if(i2c_w(gspca_dev,i2cpdoit) < 0) |
506 | goto err; */ | 524 | goto err; */ |
507 | if (i2c_w(gspca_dev->dev, i2cpexpo) < 0) | 525 | if (i2c_w(gspca_dev, i2cpexpo) < 0) |
508 | goto err; | 526 | goto err; |
509 | if (i2c_w(gspca_dev->dev, i2cpdoit) < 0) | 527 | if (i2c_w(gspca_dev, i2cpdoit) < 0) |
510 | goto err; | 528 | goto err; |
511 | i2cp202[3] = sd->brightness >> 3; | 529 | i2cp202[3] = sd->brightness >> 3; |
512 | if (i2c_w(gspca_dev->dev, i2cp202) < 0) | 530 | if (i2c_w(gspca_dev, i2cp202) < 0) |
513 | goto err; | 531 | goto err; |
514 | if (i2c_w(gspca_dev->dev, i2cpdoit) < 0) | 532 | if (i2c_w(gspca_dev, i2cpdoit) < 0) |
515 | goto err; | 533 | goto err; |
516 | break; | 534 | break; |
517 | } | 535 | } |
@@ -522,7 +540,7 @@ static void setbrightness(struct gspca_dev *gspca_dev) | |||
522 | value = 0xff - sd->brightness; | 540 | value = 0xff - sd->brightness; |
523 | i2c[4] = value; | 541 | i2c[4] = value; |
524 | PDEBUG(D_CONF, "brightness %d : %d", value, i2c[4]); | 542 | PDEBUG(D_CONF, "brightness %d : %d", value, i2c[4]); |
525 | if (i2c_w(gspca_dev->dev, i2c) < 0) | 543 | if (i2c_w(gspca_dev, i2c) < 0) |
526 | goto err; | 544 | goto err; |
527 | break; | 545 | break; |
528 | } | 546 | } |
@@ -551,14 +569,14 @@ static void setsensorgain(struct gspca_dev *gspca_dev) | |||
551 | {0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10}; | 569 | {0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10}; |
552 | 570 | ||
553 | i2c[4] = 255 - gain; | 571 | i2c[4] = 255 - gain; |
554 | if (i2c_w(gspca_dev->dev, i2c) < 0) | 572 | if (i2c_w(gspca_dev, i2c) < 0) |
555 | goto err; | 573 | goto err; |
556 | break; | 574 | break; |
557 | } | 575 | } |
558 | case SENSOR_OV6650: { | 576 | case SENSOR_OV6650: { |
559 | __u8 i2c[] = {0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10}; | 577 | __u8 i2c[] = {0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10}; |
560 | i2c[3] = gain; | 578 | i2c[3] = gain; |
561 | if (i2c_w(gspca_dev->dev, i2c) < 0) | 579 | if (i2c_w(gspca_dev, i2c) < 0) |
562 | goto err; | 580 | goto err; |
563 | break; | 581 | break; |
564 | } | 582 | } |
@@ -578,10 +596,10 @@ static void setgain(struct gspca_dev *gspca_dev) | |||
578 | 596 | ||
579 | /* red and blue gain */ | 597 | /* red and blue gain */ |
580 | rgb_value = gain << 4 | gain; | 598 | rgb_value = gain << 4 | gain; |
581 | reg_w(gspca_dev->dev, 0x10, &rgb_value, 1); | 599 | reg_w(gspca_dev, 0x10, &rgb_value, 1); |
582 | /* green gain */ | 600 | /* green gain */ |
583 | rgb_value = gain; | 601 | rgb_value = gain; |
584 | reg_w(gspca_dev->dev, 0x11, &rgb_value, 1); | 602 | reg_w(gspca_dev, 0x11, &rgb_value, 1); |
585 | 603 | ||
586 | if (sd->sensor_has_gain) | 604 | if (sd->sensor_has_gain) |
587 | setsensorgain(gspca_dev); | 605 | setsensorgain(gspca_dev); |
@@ -604,7 +622,7 @@ static void setexposure(struct gspca_dev *gspca_dev) | |||
604 | if (reg > 15) | 622 | if (reg > 15) |
605 | reg = 15; | 623 | reg = 15; |
606 | reg = (reg << 4) | 0x0b; | 624 | reg = (reg << 4) | 0x0b; |
607 | reg_w(gspca_dev->dev, 0x19, ®, 1); | 625 | reg_w(gspca_dev, 0x19, ®, 1); |
608 | break; | 626 | break; |
609 | } | 627 | } |
610 | case SENSOR_OV6650: { | 628 | case SENSOR_OV6650: { |
@@ -613,7 +631,7 @@ static void setexposure(struct gspca_dev *gspca_dev) | |||
613 | if (i2c[3] > 15) | 631 | if (i2c[3] > 15) |
614 | i2c[3] = 15; | 632 | i2c[3] = 15; |
615 | i2c[3] |= 0xc0; | 633 | i2c[3] |= 0xc0; |
616 | if (i2c_w(gspca_dev->dev, i2c) < 0) | 634 | if (i2c_w(gspca_dev, i2c) < 0) |
617 | PDEBUG(D_ERR, "i2c error exposure"); | 635 | PDEBUG(D_ERR, "i2c error exposure"); |
618 | break; | 636 | break; |
619 | } | 637 | } |
@@ -721,22 +739,20 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
721 | sd->exposure = EXPOSURE_DEF; | 739 | sd->exposure = EXPOSURE_DEF; |
722 | sd->autogain = AUTOGAIN_DEF; | 740 | sd->autogain = AUTOGAIN_DEF; |
723 | if (sd->sensor == SENSOR_OV7630_3) /* jfm: from win trace */ | 741 | if (sd->sensor == SENSOR_OV7630_3) /* jfm: from win trace */ |
724 | reg_w(gspca_dev->dev, 0x01, probe_ov7630, sizeof probe_ov7630); | 742 | reg_w(gspca_dev, 0x01, probe_ov7630, sizeof probe_ov7630); |
725 | return 0; | 743 | return 0; |
726 | } | 744 | } |
727 | 745 | ||
728 | /* this function is called at open time */ | 746 | /* this function is called at open time */ |
729 | static int sd_open(struct gspca_dev *gspca_dev) | 747 | static int sd_open(struct gspca_dev *gspca_dev) |
730 | { | 748 | { |
731 | __u8 ByteReceive; | 749 | reg_r(gspca_dev, 0x00); |
732 | 750 | if (gspca_dev->usb_buf[0] != 0x10) | |
733 | reg_r(gspca_dev->dev, 0x00, &ByteReceive); | ||
734 | if (ByteReceive != 0x10) | ||
735 | return -ENODEV; | 751 | return -ENODEV; |
736 | return 0; | 752 | return 0; |
737 | } | 753 | } |
738 | 754 | ||
739 | static void pas106_i2cinit(struct usb_device *dev) | 755 | static void pas106_i2cinit(struct gspca_dev *gspca_dev) |
740 | { | 756 | { |
741 | int i; | 757 | int i; |
742 | const __u8 *data; | 758 | const __u8 *data; |
@@ -747,7 +763,7 @@ static void pas106_i2cinit(struct usb_device *dev) | |||
747 | while (--i >= 0) { | 763 | while (--i >= 0) { |
748 | memcpy(&i2c1[2], data, 2); | 764 | memcpy(&i2c1[2], data, 2); |
749 | /* copy 2 bytes from the template */ | 765 | /* copy 2 bytes from the template */ |
750 | if (i2c_w(dev, i2c1) < 0) | 766 | if (i2c_w(gspca_dev, i2c1) < 0) |
751 | PDEBUG(D_ERR, "i2c error pas106"); | 767 | PDEBUG(D_ERR, "i2c error pas106"); |
752 | data += 2; | 768 | data += 2; |
753 | } | 769 | } |
@@ -757,7 +773,6 @@ static void pas106_i2cinit(struct usb_device *dev) | |||
757 | static void sd_start(struct gspca_dev *gspca_dev) | 773 | static void sd_start(struct gspca_dev *gspca_dev) |
758 | { | 774 | { |
759 | struct sd *sd = (struct sd *) gspca_dev; | 775 | struct sd *sd = (struct sd *) gspca_dev; |
760 | struct usb_device *dev = gspca_dev->dev; | ||
761 | int mode, l; | 776 | int mode, l; |
762 | const __u8 *sn9c10x; | 777 | const __u8 *sn9c10x; |
763 | __u8 reg01, reg17; | 778 | __u8 reg01, reg17; |
@@ -835,75 +850,75 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
835 | } | 850 | } |
836 | 851 | ||
837 | /* reg 0x01 bit 2 video transfert on */ | 852 | /* reg 0x01 bit 2 video transfert on */ |
838 | reg_w(dev, 0x01, ®01, 1); | 853 | reg_w(gspca_dev, 0x01, ®01, 1); |
839 | /* reg 0x17 SensorClk enable inv Clk 0x60 */ | 854 | /* reg 0x17 SensorClk enable inv Clk 0x60 */ |
840 | reg_w(dev, 0x17, ®17, 1); | 855 | reg_w(gspca_dev, 0x17, ®17, 1); |
841 | /*fixme: for ov7630 102 | 856 | /*fixme: for ov7630 102 |
842 | reg_w(dev, 0x01, {0x06, sn9c10x[1]}, 2); */ | 857 | reg_w(gspca_dev, 0x01, {0x06, sn9c10x[1]}, 2); */ |
843 | /* Set the registers from the template */ | 858 | /* Set the registers from the template */ |
844 | reg_w(dev, 0x01, sn9c10x, l); | 859 | reg_w_big(gspca_dev, 0x01, sn9c10x, l); |
845 | switch (sd->sensor) { | 860 | switch (sd->sensor) { |
846 | case SENSOR_HV7131R: | 861 | case SENSOR_HV7131R: |
847 | i2c_w_vector(dev, hv7131_sensor_init, | 862 | i2c_w_vector(gspca_dev, hv7131_sensor_init, |
848 | sizeof hv7131_sensor_init); | 863 | sizeof hv7131_sensor_init); |
849 | break; | 864 | break; |
850 | case SENSOR_OV6650: | 865 | case SENSOR_OV6650: |
851 | i2c_w_vector(dev, ov6650_sensor_init, | 866 | i2c_w_vector(gspca_dev, ov6650_sensor_init, |
852 | sizeof ov6650_sensor_init); | 867 | sizeof ov6650_sensor_init); |
853 | break; | 868 | break; |
854 | case SENSOR_OV7630: | 869 | case SENSOR_OV7630: |
855 | i2c_w_vector(dev, ov7630_sensor_init_com, | 870 | i2c_w_vector(gspca_dev, ov7630_sensor_init_com, |
856 | sizeof ov7630_sensor_init_com); | 871 | sizeof ov7630_sensor_init_com); |
857 | msleep(200); | 872 | msleep(200); |
858 | i2c_w_vector(dev, ov7630_sensor_init, | 873 | i2c_w_vector(gspca_dev, ov7630_sensor_init, |
859 | sizeof ov7630_sensor_init); | 874 | sizeof ov7630_sensor_init); |
860 | break; | 875 | break; |
861 | case SENSOR_OV7630_3: | 876 | case SENSOR_OV7630_3: |
862 | i2c_w_vector(dev, ov7630_sensor_init_com, | 877 | i2c_w_vector(gspca_dev, ov7630_sensor_init_com, |
863 | sizeof ov7630_sensor_init_com); | 878 | sizeof ov7630_sensor_init_com); |
864 | msleep(200); | 879 | msleep(200); |
865 | i2c_w_vector(dev, ov7630_sensor_init_3, | 880 | i2c_w_vector(gspca_dev, ov7630_sensor_init_3, |
866 | sizeof ov7630_sensor_init_3); | 881 | sizeof ov7630_sensor_init_3); |
867 | break; | 882 | break; |
868 | case SENSOR_PAS106: | 883 | case SENSOR_PAS106: |
869 | pas106_i2cinit(dev); | 884 | pas106_i2cinit(gspca_dev); |
870 | break; | 885 | break; |
871 | case SENSOR_PAS202: | 886 | case SENSOR_PAS202: |
872 | i2c_w_vector(dev, pas202_sensor_init, | 887 | i2c_w_vector(gspca_dev, pas202_sensor_init, |
873 | sizeof pas202_sensor_init); | 888 | sizeof pas202_sensor_init); |
874 | break; | 889 | break; |
875 | case SENSOR_TAS5110: | 890 | case SENSOR_TAS5110: |
876 | i2c_w_vector(dev, tas5110_sensor_init, | 891 | i2c_w_vector(gspca_dev, tas5110_sensor_init, |
877 | sizeof tas5110_sensor_init); | 892 | sizeof tas5110_sensor_init); |
878 | break; | 893 | break; |
879 | default: | 894 | default: |
880 | /* case SENSOR_TAS5130CXX: */ | 895 | /* case SENSOR_TAS5130CXX: */ |
881 | i2c_w_vector(dev, tas5130_sensor_init, | 896 | i2c_w_vector(gspca_dev, tas5130_sensor_init, |
882 | sizeof tas5130_sensor_init); | 897 | sizeof tas5130_sensor_init); |
883 | break; | 898 | break; |
884 | } | 899 | } |
885 | /* H_size V_size 0x28, 0x1e maybe 640x480 */ | 900 | /* H_size V_size 0x28, 0x1e maybe 640x480 */ |
886 | reg_w(dev, 0x15, reg15, 2); | 901 | reg_w(gspca_dev, 0x15, reg15, 2); |
887 | /* compression register */ | 902 | /* compression register */ |
888 | reg_w(dev, 0x18, ®17_19[1], 1); | 903 | reg_w(gspca_dev, 0x18, ®17_19[1], 1); |
889 | if (sd->sensor != SENSOR_OV7630_3) { | 904 | if (sd->sensor != SENSOR_OV7630_3) { |
890 | /* H_start */ | 905 | /* H_start */ |
891 | reg_w(dev, 0x12, &sn9c10x[0x12 - 1], 1); | 906 | reg_w(gspca_dev, 0x12, &sn9c10x[0x12 - 1], 1); |
892 | /* V_START */ | 907 | /* V_START */ |
893 | reg_w(dev, 0x13, &sn9c10x[0x13 - 1], 1); | 908 | reg_w(gspca_dev, 0x13, &sn9c10x[0x13 - 1], 1); |
894 | } | 909 | } |
895 | /* reset 0x17 SensorClk enable inv Clk 0x60 */ | 910 | /* reset 0x17 SensorClk enable inv Clk 0x60 */ |
896 | /*fixme: ov7630 [17]=68 8f (+20 if 102)*/ | 911 | /*fixme: ov7630 [17]=68 8f (+20 if 102)*/ |
897 | reg_w(dev, 0x17, ®17_19[0], 1); | 912 | reg_w(gspca_dev, 0x17, ®17_19[0], 1); |
898 | /*MCKSIZE ->3 */ /*fixme: not ov7630*/ | 913 | /*MCKSIZE ->3 */ /*fixme: not ov7630*/ |
899 | if (sd->sensor != SENSOR_OV7630_3) | 914 | if (sd->sensor != SENSOR_OV7630_3) |
900 | reg_w(dev, 0x19, ®17_19[2], 1); | 915 | reg_w(gspca_dev, 0x19, ®17_19[2], 1); |
901 | /* AE_STRX AE_STRY AE_ENDX AE_ENDY */ | 916 | /* AE_STRX AE_STRY AE_ENDX AE_ENDY */ |
902 | reg_w(dev, 0x1c, &sn9c10x[0x1c - 1], 4); | 917 | reg_w(gspca_dev, 0x1c, &sn9c10x[0x1c - 1], 4); |
903 | /* Enable video transfert */ | 918 | /* Enable video transfert */ |
904 | reg_w(dev, 0x01, &sn9c10x[0], 1); | 919 | reg_w(gspca_dev, 0x01, &sn9c10x[0], 1); |
905 | /* Compression */ | 920 | /* Compression */ |
906 | reg_w(dev, 0x18, ®17_19[1], 2); | 921 | reg_w(gspca_dev, 0x18, ®17_19[1], 2); |
907 | msleep(20); | 922 | msleep(20); |
908 | 923 | ||
909 | setgain(gspca_dev); | 924 | setgain(gspca_dev); |
@@ -919,7 +934,7 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
919 | __u8 ByteSend; | 934 | __u8 ByteSend; |
920 | 935 | ||
921 | ByteSend = 0x09; /* 0X00 */ | 936 | ByteSend = 0x09; /* 0X00 */ |
922 | reg_w(gspca_dev->dev, 0x01, &ByteSend, 1); | 937 | reg_w(gspca_dev, 0x01, &ByteSend, 1); |
923 | } | 938 | } |
924 | 939 | ||
925 | static void sd_stop0(struct gspca_dev *gspca_dev) | 940 | static void sd_stop0(struct gspca_dev *gspca_dev) |
diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c index 4cb1421b8807..30e840dca481 100644 --- a/drivers/media/video/gspca/sonixj.c +++ b/drivers/media/video/gspca/sonixj.c | |||
@@ -24,8 +24,8 @@ | |||
24 | #include "gspca.h" | 24 | #include "gspca.h" |
25 | #include "jpeg.h" | 25 | #include "jpeg.h" |
26 | 26 | ||
27 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 27 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
28 | static const char version[] = "2.1.5"; | 28 | static const char version[] = "2.1.7"; |
29 | 29 | ||
30 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); | 30 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); |
31 | MODULE_DESCRIPTION("GSPCA/SONIX JPEG USB Camera Driver"); | 31 | MODULE_DESCRIPTION("GSPCA/SONIX JPEG USB Camera Driver"); |
@@ -512,42 +512,40 @@ static const __u8 qtable4[] = { | |||
512 | 0x29, 0x29, 0x29, 0x29 | 512 | 0x29, 0x29, 0x29, 0x29 |
513 | }; | 513 | }; |
514 | 514 | ||
515 | static void reg_r(struct usb_device *dev, | 515 | /* read <len> bytes (len < sizeof gspca_dev->usb_buf) to gspca_dev->usb_buf */ |
516 | __u16 value, | 516 | static void reg_r(struct gspca_dev *gspca_dev, |
517 | __u8 *buffer, int len) | 517 | __u16 value, int len) |
518 | { | 518 | { |
519 | usb_control_msg(dev, | 519 | usb_control_msg(gspca_dev->dev, |
520 | usb_rcvctrlpipe(dev, 0), | 520 | usb_rcvctrlpipe(gspca_dev->dev, 0), |
521 | 0, | 521 | 0, |
522 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, | 522 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, |
523 | value, 0, | 523 | value, 0, |
524 | buffer, len, | 524 | gspca_dev->usb_buf, len, |
525 | 500); | 525 | 500); |
526 | } | 526 | } |
527 | 527 | ||
528 | static void reg_w(struct usb_device *dev, | 528 | static void reg_w(struct gspca_dev *gspca_dev, |
529 | __u16 value, | 529 | __u16 value, |
530 | const __u8 *buffer, | 530 | const __u8 *buffer, |
531 | int len) | 531 | int len) |
532 | { | 532 | { |
533 | if (len < 16) { | 533 | if (len <= sizeof gspca_dev->usb_buf) { |
534 | __u8 tmpbuf[16]; | 534 | memcpy(gspca_dev->usb_buf, buffer, len); |
535 | 535 | usb_control_msg(gspca_dev->dev, | |
536 | memcpy(tmpbuf, buffer, len); | 536 | usb_sndctrlpipe(gspca_dev->dev, 0), |
537 | usb_control_msg(dev, | ||
538 | usb_sndctrlpipe(dev, 0), | ||
539 | 0x08, | 537 | 0x08, |
540 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, | 538 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, |
541 | value, 0, | 539 | value, 0, |
542 | tmpbuf, len, | 540 | gspca_dev->usb_buf, len, |
543 | 500); | 541 | 500); |
544 | } else { | 542 | } else { |
545 | __u8 *tmpbuf; | 543 | __u8 *tmpbuf; |
546 | 544 | ||
547 | tmpbuf = kmalloc(len, GFP_KERNEL); | 545 | tmpbuf = kmalloc(len, GFP_KERNEL); |
548 | memcpy(tmpbuf, buffer, len); | 546 | memcpy(tmpbuf, buffer, len); |
549 | usb_control_msg(dev, | 547 | usb_control_msg(gspca_dev->dev, |
550 | usb_sndctrlpipe(dev, 0), | 548 | usb_sndctrlpipe(gspca_dev->dev, 0), |
551 | 0x08, | 549 | 0x08, |
552 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, | 550 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, |
553 | value, 0, | 551 | value, 0, |
@@ -557,12 +555,11 @@ static void reg_w(struct usb_device *dev, | |||
557 | } | 555 | } |
558 | } | 556 | } |
559 | 557 | ||
560 | /* write 2 bytes */ | 558 | /* I2C write 2 bytes */ |
561 | static void i2c_w2(struct gspca_dev *gspca_dev, | 559 | static void i2c_w2(struct gspca_dev *gspca_dev, |
562 | const __u8 *buffer) | 560 | const __u8 *buffer) |
563 | { | 561 | { |
564 | struct sd *sd = (struct sd *) gspca_dev; | 562 | struct sd *sd = (struct sd *) gspca_dev; |
565 | struct usb_device *dev = gspca_dev->dev; | ||
566 | __u8 mode[8]; | 563 | __u8 mode[8]; |
567 | 564 | ||
568 | /* is i2c ready */ | 565 | /* is i2c ready */ |
@@ -574,22 +571,21 @@ static void i2c_w2(struct gspca_dev *gspca_dev, | |||
574 | mode[5] = 0; | 571 | mode[5] = 0; |
575 | mode[6] = 0; | 572 | mode[6] = 0; |
576 | mode[7] = 0x10; | 573 | mode[7] = 0x10; |
577 | reg_w(dev, 0x08, mode, 8); | 574 | reg_w(gspca_dev, 0x08, mode, 8); |
578 | } | 575 | } |
579 | 576 | ||
580 | /* write 8 bytes */ | 577 | /* I2C write 8 bytes */ |
581 | static void i2c_w8(struct usb_device *dev, const __u8 *buffer) | 578 | static void i2c_w8(struct gspca_dev *gspca_dev, |
579 | const __u8 *buffer) | ||
582 | { | 580 | { |
583 | reg_w(dev, 0x08, buffer, 8); | 581 | reg_w(gspca_dev, 0x08, buffer, 8); |
584 | msleep(1); | 582 | msleep(1); |
585 | } | 583 | } |
586 | 584 | ||
587 | /* read 5 bytes */ | 585 | /* read 5 bytes in gspca_dev->usb_buf */ |
588 | static void i2c_r5(struct gspca_dev *gspca_dev, __u8 reg, | 586 | static void i2c_r5(struct gspca_dev *gspca_dev, __u8 reg) |
589 | __u8 *buffer) | ||
590 | { | 587 | { |
591 | struct sd *sd = (struct sd *) gspca_dev; | 588 | struct sd *sd = (struct sd *) gspca_dev; |
592 | struct usb_device *dev = gspca_dev->dev; | ||
593 | __u8 mode[8]; | 589 | __u8 mode[8]; |
594 | 590 | ||
595 | mode[0] = sd->i2c_ctrl_reg | 0x10; | 591 | mode[0] = sd->i2c_ctrl_reg | 0x10; |
@@ -600,40 +596,39 @@ static void i2c_r5(struct gspca_dev *gspca_dev, __u8 reg, | |||
600 | mode[5] = 0; | 596 | mode[5] = 0; |
601 | mode[6] = 0; | 597 | mode[6] = 0; |
602 | mode[7] = 0x10; | 598 | mode[7] = 0x10; |
603 | i2c_w8(dev, mode); | 599 | i2c_w8(gspca_dev, mode); |
604 | mode[0] = sd->i2c_ctrl_reg | (5 << 4) | 0x02; | 600 | mode[0] = sd->i2c_ctrl_reg | (5 << 4) | 0x02; |
605 | mode[2] = 0; | 601 | mode[2] = 0; |
606 | i2c_w8(dev, mode); | 602 | i2c_w8(gspca_dev, mode); |
607 | reg_r(dev, 0x0a, buffer, 5); | 603 | reg_r(gspca_dev, 0x0a, 5); |
608 | } | 604 | } |
609 | 605 | ||
610 | static int probesensor(struct gspca_dev *gspca_dev) | 606 | static int probesensor(struct gspca_dev *gspca_dev) |
611 | { | 607 | { |
612 | struct sd *sd = (struct sd *) gspca_dev; | 608 | struct sd *sd = (struct sd *) gspca_dev; |
613 | struct usb_device *dev = gspca_dev->dev; | ||
614 | __u8 reg02; | 609 | __u8 reg02; |
615 | static const __u8 datasend[] = { 2, 0 }; | 610 | static const __u8 datasend[] = { 2, 0 }; |
616 | /* reg val1 val2 val3 val4 */ | 611 | /* reg val1 val2 val3 val4 */ |
617 | __u8 datarecd[6]; | ||
618 | 612 | ||
619 | i2c_w2(gspca_dev, datasend); | 613 | i2c_w2(gspca_dev, datasend); |
620 | /* should write 0xa1 0x11 0x02 0x00 0x00 0x00 0x00 the 0x10 is add by i2cw */ | 614 | /* should write 0xa1 0x11 0x02 0x00 0x00 0x00 0x00 the 0x10 is add by i2cw */ |
621 | msleep(10); | 615 | msleep(10); |
622 | reg02 = 0x66; | 616 | reg02 = 0x66; |
623 | reg_w(dev, 0x02, ®02, 1); /* Gpio on */ | 617 | reg_w(gspca_dev, 0x02, ®02, 1); /* Gpio on */ |
624 | msleep(10); | 618 | msleep(10); |
625 | i2c_r5(gspca_dev, 0, datarecd); /* read sensor id */ | 619 | i2c_r5(gspca_dev, 0); /* read sensor id */ |
626 | if (datarecd[0] == 0x02 | 620 | if (gspca_dev->usb_buf[0] == 0x02 |
627 | && datarecd[1] == 0x09 | 621 | && gspca_dev->usb_buf[1] == 0x09 |
628 | && datarecd[2] == 0x01 | 622 | && gspca_dev->usb_buf[2] == 0x01 |
629 | && datarecd[3] == 0x00 | 623 | && gspca_dev->usb_buf[3] == 0x00 |
630 | && datarecd[4] == 0x00) { | 624 | && gspca_dev->usb_buf[4] == 0x00) { |
631 | PDEBUG(D_PROBE, "Find Sensor sn9c102P HV7131R"); | 625 | PDEBUG(D_PROBE, "Find Sensor sn9c102P HV7131R"); |
632 | sd->sensor = SENSOR_HV7131R; | 626 | sd->sensor = SENSOR_HV7131R; |
633 | return SENSOR_HV7131R; | 627 | return SENSOR_HV7131R; |
634 | } | 628 | } |
635 | PDEBUG(D_PROBE, "Find Sensor %d %d %d", | 629 | PDEBUG(D_PROBE, "Find Sensor %d %d %d", |
636 | datarecd[0], datarecd[1], datarecd[2]); | 630 | gspca_dev->usb_buf[0], gspca_dev->usb_buf[1], |
631 | gspca_dev->usb_buf[2]); | ||
637 | PDEBUG(D_PROBE, "Sensor sn9c102P Not found"); | 632 | PDEBUG(D_PROBE, "Sensor sn9c102P Not found"); |
638 | return -ENODEV; | 633 | return -ENODEV; |
639 | } | 634 | } |
@@ -642,7 +637,6 @@ static int configure_gpio(struct gspca_dev *gspca_dev, | |||
642 | const __u8 *sn9c1xx) | 637 | const __u8 *sn9c1xx) |
643 | { | 638 | { |
644 | struct sd *sd = (struct sd *) gspca_dev; | 639 | struct sd *sd = (struct sd *) gspca_dev; |
645 | struct usb_device *dev = gspca_dev->dev; | ||
646 | __u8 data; | 640 | __u8 data; |
647 | __u8 regF1; | 641 | __u8 regF1; |
648 | const __u8 *reg9a; | 642 | const __u8 *reg9a; |
@@ -655,14 +649,15 @@ static int configure_gpio(struct gspca_dev *gspca_dev, | |||
655 | 649 | ||
656 | 650 | ||
657 | regF1 = 0x00; | 651 | regF1 = 0x00; |
658 | reg_w(dev, 0xf1, ®F1, 1); | 652 | reg_w(gspca_dev, 0xf1, ®F1, 1); |
659 | 653 | ||
660 | reg_w(dev, 0x01, &sn9c1xx[0], 1); /*fixme:jfm was [1] en v1*/ | 654 | reg_w(gspca_dev, 0x01, &sn9c1xx[0], 1); |
655 | /*fixme:jfm was [1] en v1*/ | ||
661 | 656 | ||
662 | /* configure gpio */ | 657 | /* configure gpio */ |
663 | reg_w(dev, 0x01, &sn9c1xx[1], 2); | 658 | reg_w(gspca_dev, 0x01, &sn9c1xx[1], 2); |
664 | reg_w(dev, 0x08, &sn9c1xx[8], 2); | 659 | reg_w(gspca_dev, 0x08, &sn9c1xx[8], 2); |
665 | reg_w(dev, 0x17, &sn9c1xx[0x17], 3); | 660 | reg_w(gspca_dev, 0x17, &sn9c1xx[0x17], 3); |
666 | switch (sd->customid) { | 661 | switch (sd->customid) { |
667 | case SN9C325: | 662 | case SN9C325: |
668 | reg9a = reg9a_sn9c325; | 663 | reg9a = reg9a_sn9c325; |
@@ -674,37 +669,37 @@ static int configure_gpio(struct gspca_dev *gspca_dev, | |||
674 | reg9a = reg9a_def; | 669 | reg9a = reg9a_def; |
675 | break; | 670 | break; |
676 | } | 671 | } |
677 | reg_w(dev, 0x9a, reg9a, 6); | 672 | reg_w(gspca_dev, 0x9a, reg9a, 6); |
678 | 673 | ||
679 | data = 0x60; /*fixme:jfm 60 00 00 (3) */ | 674 | data = 0x60; /*fixme:jfm 60 00 00 (3) */ |
680 | reg_w(dev, 0xd4, &data, 1); | 675 | reg_w(gspca_dev, 0xd4, &data, 1); |
681 | 676 | ||
682 | reg_w(dev, 0x03, &sn9c1xx[3], 0x0f); | 677 | reg_w(gspca_dev, 0x03, &sn9c1xx[3], 0x0f); |
683 | 678 | ||
684 | switch (sd->customid) { | 679 | switch (sd->customid) { |
685 | case SN9C120: /* from win trace */ | 680 | case SN9C120: /* from win trace */ |
686 | data = 0x61; | 681 | data = 0x61; |
687 | reg_w(dev, 0x01, &data, 1); | 682 | reg_w(gspca_dev, 0x01, &data, 1); |
688 | data = 0x20; | 683 | data = 0x20; |
689 | reg_w(dev, 0x17, &data, 1); | 684 | reg_w(gspca_dev, 0x17, &data, 1); |
690 | data = 0x60; | 685 | data = 0x60; |
691 | reg_w(dev, 0x01, &data, 1); | 686 | reg_w(gspca_dev, 0x01, &data, 1); |
692 | break; | 687 | break; |
693 | case SN9C325: | 688 | case SN9C325: |
694 | data = 0x43; | 689 | data = 0x43; |
695 | reg_w(dev, 0x01, &data, 1); | 690 | reg_w(gspca_dev, 0x01, &data, 1); |
696 | data = 0xae; | 691 | data = 0xae; |
697 | reg_w(dev, 0x17, &data, 1); | 692 | reg_w(gspca_dev, 0x17, &data, 1); |
698 | data = 0x42; | 693 | data = 0x42; |
699 | reg_w(dev, 0x01, &data, 1); | 694 | reg_w(gspca_dev, 0x01, &data, 1); |
700 | break; | 695 | break; |
701 | default: | 696 | default: |
702 | data = 0x43; | 697 | data = 0x43; |
703 | reg_w(dev, 0x01, &data, 1); | 698 | reg_w(gspca_dev, 0x01, &data, 1); |
704 | data = 0x61; | 699 | data = 0x61; |
705 | reg_w(dev, 0x17, &data, 1); | 700 | reg_w(gspca_dev, 0x17, &data, 1); |
706 | data = 0x42; | 701 | data = 0x42; |
707 | reg_w(dev, 0x01, &data, 1); | 702 | reg_w(gspca_dev, 0x01, &data, 1); |
708 | } | 703 | } |
709 | 704 | ||
710 | if (sd->sensor == SENSOR_HV7131R) { | 705 | if (sd->sensor == SENSOR_HV7131R) { |
@@ -717,24 +712,22 @@ static int configure_gpio(struct gspca_dev *gspca_dev, | |||
717 | static void hv7131R_InitSensor(struct gspca_dev *gspca_dev) | 712 | static void hv7131R_InitSensor(struct gspca_dev *gspca_dev) |
718 | { | 713 | { |
719 | int i = 0; | 714 | int i = 0; |
720 | struct usb_device *dev = gspca_dev->dev; | ||
721 | static const __u8 SetSensorClk[] = /* 0x08 Mclk */ | 715 | static const __u8 SetSensorClk[] = /* 0x08 Mclk */ |
722 | { 0xa1, 0x11, 0x01, 0x18, 0x00, 0x00, 0x00, 0x10 }; | 716 | { 0xa1, 0x11, 0x01, 0x18, 0x00, 0x00, 0x00, 0x10 }; |
723 | 717 | ||
724 | while (hv7131r_sensor_init[i][0]) { | 718 | while (hv7131r_sensor_init[i][0]) { |
725 | i2c_w8(dev, hv7131r_sensor_init[i]); | 719 | i2c_w8(gspca_dev, hv7131r_sensor_init[i]); |
726 | i++; | 720 | i++; |
727 | } | 721 | } |
728 | i2c_w8(dev, SetSensorClk); | 722 | i2c_w8(gspca_dev, SetSensorClk); |
729 | } | 723 | } |
730 | 724 | ||
731 | static void mi0360_InitSensor(struct gspca_dev *gspca_dev) | 725 | static void mi0360_InitSensor(struct gspca_dev *gspca_dev) |
732 | { | 726 | { |
733 | int i = 0; | 727 | int i = 0; |
734 | struct usb_device *dev = gspca_dev->dev; | ||
735 | 728 | ||
736 | while (mi0360_sensor_init[i][0]) { | 729 | while (mi0360_sensor_init[i][0]) { |
737 | i2c_w8(dev, mi0360_sensor_init[i]); | 730 | i2c_w8(gspca_dev, mi0360_sensor_init[i]); |
738 | i++; | 731 | i++; |
739 | } | 732 | } |
740 | } | 733 | } |
@@ -742,21 +735,19 @@ static void mi0360_InitSensor(struct gspca_dev *gspca_dev) | |||
742 | static void mo4000_InitSensor(struct gspca_dev *gspca_dev) | 735 | static void mo4000_InitSensor(struct gspca_dev *gspca_dev) |
743 | { | 736 | { |
744 | int i = 0; | 737 | int i = 0; |
745 | struct usb_device *dev = gspca_dev->dev; | ||
746 | 738 | ||
747 | while (mo4000_sensor_init[i][0]) { | 739 | while (mo4000_sensor_init[i][0]) { |
748 | i2c_w8(dev, mo4000_sensor_init[i]); | 740 | i2c_w8(gspca_dev, mo4000_sensor_init[i]); |
749 | i++; | 741 | i++; |
750 | } | 742 | } |
751 | } | 743 | } |
752 | 744 | ||
753 | static void ov7648_InitSensor(struct gspca_dev *gspca_dev) | 745 | static void ov7648_InitSensor(struct gspca_dev *gspca_dev) |
754 | { | 746 | { |
755 | struct usb_device *dev = gspca_dev->dev; | ||
756 | int i = 0; | 747 | int i = 0; |
757 | 748 | ||
758 | while (ov7648_sensor_init[i][0]) { | 749 | while (ov7648_sensor_init[i][0]) { |
759 | i2c_w8(dev, ov7648_sensor_init[i]); | 750 | i2c_w8(gspca_dev, ov7648_sensor_init[i]); |
760 | i++; | 751 | i++; |
761 | } | 752 | } |
762 | } | 753 | } |
@@ -764,10 +755,9 @@ static void ov7648_InitSensor(struct gspca_dev *gspca_dev) | |||
764 | static void ov7660_InitSensor(struct gspca_dev *gspca_dev) | 755 | static void ov7660_InitSensor(struct gspca_dev *gspca_dev) |
765 | { | 756 | { |
766 | int i = 0; | 757 | int i = 0; |
767 | struct usb_device *dev = gspca_dev->dev; | ||
768 | 758 | ||
769 | while (ov7660_sensor_init[i][0]) { | 759 | while (ov7660_sensor_init[i][0]) { |
770 | i2c_w8(dev, ov7660_sensor_init[i]); | 760 | i2c_w8(gspca_dev, ov7660_sensor_init[i]); |
771 | i++; | 761 | i++; |
772 | } | 762 | } |
773 | } | 763 | } |
@@ -1005,51 +995,52 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
1005 | static int sd_open(struct gspca_dev *gspca_dev) | 995 | static int sd_open(struct gspca_dev *gspca_dev) |
1006 | { | 996 | { |
1007 | struct sd *sd = (struct sd *) gspca_dev; | 997 | struct sd *sd = (struct sd *) gspca_dev; |
1008 | struct usb_device *dev = gspca_dev->dev; | ||
1009 | /* const __u8 *sn9c1xx; */ | 998 | /* const __u8 *sn9c1xx; */ |
1010 | __u8 regF1; | 999 | __u8 regF1; |
1011 | __u8 regGpio[] = { 0x29, 0x74 }; | 1000 | __u8 regGpio[] = { 0x29, 0x74 }; |
1012 | 1001 | ||
1013 | /* setup a selector by customid */ | 1002 | /* setup a selector by customid */ |
1014 | regF1 = 0x01; | 1003 | regF1 = 0x01; |
1015 | reg_w(dev, 0xf1, ®F1, 1); | 1004 | reg_w(gspca_dev, 0xf1, ®F1, 1); |
1016 | reg_r(dev, 0x00, ®F1, 1); /* -> regF1 = 0x00 */ | 1005 | reg_r(gspca_dev, 0x00, 1); /* -> regF1 = 0x00 */ |
1017 | reg_w(dev, 0xf1, ®F1, 1); | 1006 | regF1 = gspca_dev->usb_buf[0]; |
1018 | reg_r(dev, 0x00, ®F1, 1); | 1007 | reg_w(gspca_dev, 0xf1, ®F1, 1); |
1008 | reg_r(gspca_dev, 0x00, 1); | ||
1009 | regF1 = gspca_dev->usb_buf[0]; | ||
1019 | switch (sd->customid) { | 1010 | switch (sd->customid) { |
1020 | case SN9C102P: | 1011 | case SN9C102P: |
1021 | if (regF1 != 0x11) | 1012 | if (regF1 != 0x11) |
1022 | return -ENODEV; | 1013 | return -ENODEV; |
1023 | reg_w(dev, 0x02, ®Gpio[1], 1); | 1014 | reg_w(gspca_dev, 0x02, ®Gpio[1], 1); |
1024 | break; | 1015 | break; |
1025 | case SN9C105: | 1016 | case SN9C105: |
1026 | if (regF1 != 0x11) | 1017 | if (regF1 != 0x11) |
1027 | return -ENODEV; | 1018 | return -ENODEV; |
1028 | reg_w(dev, 0x02, regGpio, 2); | 1019 | reg_w(gspca_dev, 0x02, regGpio, 2); |
1029 | break; | 1020 | break; |
1030 | case SN9C110: | 1021 | case SN9C110: |
1031 | if (regF1 != 0x12) | 1022 | if (regF1 != 0x12) |
1032 | return -ENODEV; | 1023 | return -ENODEV; |
1033 | regGpio[1] = 0x62; | 1024 | regGpio[1] = 0x62; |
1034 | reg_w(dev, 0x02, ®Gpio[1], 1); | 1025 | reg_w(gspca_dev, 0x02, ®Gpio[1], 1); |
1035 | break; | 1026 | break; |
1036 | case SN9C120: | 1027 | case SN9C120: |
1037 | if (regF1 != 0x12) | 1028 | if (regF1 != 0x12) |
1038 | return -ENODEV; | 1029 | return -ENODEV; |
1039 | regGpio[1] = 0x70; | 1030 | regGpio[1] = 0x70; |
1040 | reg_w(dev, 0x02, regGpio, 2); | 1031 | reg_w(gspca_dev, 0x02, regGpio, 2); |
1041 | break; | 1032 | break; |
1042 | default: | 1033 | default: |
1043 | /* case SN9C325: */ | 1034 | /* case SN9C325: */ |
1044 | if (regF1 != 0x12) | 1035 | if (regF1 != 0x12) |
1045 | return -ENODEV; | 1036 | return -ENODEV; |
1046 | regGpio[1] = 0x62; | 1037 | regGpio[1] = 0x62; |
1047 | reg_w(dev, 0x02, ®Gpio[1], 1); | 1038 | reg_w(gspca_dev, 0x02, ®Gpio[1], 1); |
1048 | break; | 1039 | break; |
1049 | } | 1040 | } |
1050 | 1041 | ||
1051 | regF1 = 0x01; | 1042 | regF1 = 0x01; |
1052 | reg_w(dev, 0xf1, ®F1, 1); | 1043 | reg_w(gspca_dev, 0xf1, ®F1, 1); |
1053 | 1044 | ||
1054 | return 0; | 1045 | return 0; |
1055 | } | 1046 | } |
@@ -1073,7 +1064,7 @@ static unsigned int setexposure(struct gspca_dev *gspca_dev, | |||
1073 | Expodoit[3] = expo >> 16; | 1064 | Expodoit[3] = expo >> 16; |
1074 | Expodoit[4] = expo >> 8; | 1065 | Expodoit[4] = expo >> 8; |
1075 | Expodoit[5] = expo; | 1066 | Expodoit[5] = expo; |
1076 | i2c_w8(gspca_dev->dev, Expodoit); | 1067 | i2c_w8(gspca_dev, Expodoit); |
1077 | break; | 1068 | break; |
1078 | } | 1069 | } |
1079 | case SENSOR_MI0360: { | 1070 | case SENSOR_MI0360: { |
@@ -1086,9 +1077,9 @@ static unsigned int setexposure(struct gspca_dev *gspca_dev, | |||
1086 | expo = 0x0001; | 1077 | expo = 0x0001; |
1087 | expoMi[3] = expo >> 8; | 1078 | expoMi[3] = expo >> 8; |
1088 | expoMi[4] = expo; | 1079 | expoMi[4] = expo; |
1089 | i2c_w8(gspca_dev->dev, expoMi); | 1080 | i2c_w8(gspca_dev, expoMi); |
1090 | i2c_w8(gspca_dev->dev, doit); | 1081 | i2c_w8(gspca_dev, doit); |
1091 | i2c_w8(gspca_dev->dev, sensorgo); | 1082 | i2c_w8(gspca_dev, sensorgo); |
1092 | break; | 1083 | break; |
1093 | } | 1084 | } |
1094 | case SENSOR_MO4000: { | 1085 | case SENSOR_MO4000: { |
@@ -1102,11 +1093,11 @@ static unsigned int setexposure(struct gspca_dev *gspca_dev, | |||
1102 | else if (expo < 0x0001) | 1093 | else if (expo < 0x0001) |
1103 | expo = 0x0001; | 1094 | expo = 0x0001; |
1104 | expoMof[3] = (expo & 0x03fc) >> 2; | 1095 | expoMof[3] = (expo & 0x03fc) >> 2; |
1105 | i2c_w8(gspca_dev->dev, expoMof); | 1096 | i2c_w8(gspca_dev, expoMof); |
1106 | expoMo10[3] = ((expo & 0x1c00) >> 10) | 1097 | expoMo10[3] = ((expo & 0x1c00) >> 10) |
1107 | | ((expo & 0x0003) << 4); | 1098 | | ((expo & 0x0003) << 4); |
1108 | i2c_w8(gspca_dev->dev, expoMo10); | 1099 | i2c_w8(gspca_dev, expoMo10); |
1109 | i2c_w8(gspca_dev->dev, gainMo); | 1100 | i2c_w8(gspca_dev, gainMo); |
1110 | PDEBUG(D_CONF, "set exposure %d", | 1101 | PDEBUG(D_CONF, "set exposure %d", |
1111 | ((expoMo10[3] & 0x07) << 10) | 1102 | ((expoMo10[3] & 0x07) << 10) |
1112 | | (expoMof[3] << 2) | 1103 | | (expoMof[3] << 2) |
@@ -1145,7 +1136,7 @@ static void setbrightness(struct gspca_dev *gspca_dev) | |||
1145 | } | 1136 | } |
1146 | 1137 | ||
1147 | k2 = sd->brightness >> 10; | 1138 | k2 = sd->brightness >> 10; |
1148 | reg_w(gspca_dev->dev, 0x96, &k2, 1); | 1139 | reg_w(gspca_dev, 0x96, &k2, 1); |
1149 | } | 1140 | } |
1150 | 1141 | ||
1151 | static void setcontrast(struct gspca_dev *gspca_dev) | 1142 | static void setcontrast(struct gspca_dev *gspca_dev) |
@@ -1160,7 +1151,7 @@ static void setcontrast(struct gspca_dev *gspca_dev) | |||
1160 | contrast[2] = k2; | 1151 | contrast[2] = k2; |
1161 | contrast[0] = (k2 + 1) >> 1; | 1152 | contrast[0] = (k2 + 1) >> 1; |
1162 | contrast[4] = (k2 + 1) / 5; | 1153 | contrast[4] = (k2 + 1) / 5; |
1163 | reg_w(gspca_dev->dev, 0x84, contrast, 6); | 1154 | reg_w(gspca_dev, 0x84, contrast, 6); |
1164 | } | 1155 | } |
1165 | 1156 | ||
1166 | static void setcolors(struct gspca_dev *gspca_dev) | 1157 | static void setcolors(struct gspca_dev *gspca_dev) |
@@ -1174,14 +1165,13 @@ static void setcolors(struct gspca_dev *gspca_dev) | |||
1174 | data = (colour + 32) & 0x7f; /* blue */ | 1165 | data = (colour + 32) & 0x7f; /* blue */ |
1175 | else | 1166 | else |
1176 | data = (-colour + 32) & 0x7f; /* red */ | 1167 | data = (-colour + 32) & 0x7f; /* red */ |
1177 | reg_w(gspca_dev->dev, 0x05, &data, 1); | 1168 | reg_w(gspca_dev, 0x05, &data, 1); |
1178 | } | 1169 | } |
1179 | 1170 | ||
1180 | /* -- start the camera -- */ | 1171 | /* -- start the camera -- */ |
1181 | static void sd_start(struct gspca_dev *gspca_dev) | 1172 | static void sd_start(struct gspca_dev *gspca_dev) |
1182 | { | 1173 | { |
1183 | struct sd *sd = (struct sd *) gspca_dev; | 1174 | struct sd *sd = (struct sd *) gspca_dev; |
1184 | struct usb_device *dev = gspca_dev->dev; | ||
1185 | int i; | 1175 | int i; |
1186 | __u8 data; | 1176 | __u8 data; |
1187 | __u8 reg1; | 1177 | __u8 reg1; |
@@ -1203,45 +1193,45 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
1203 | /*fixme:jfm this sequence should appear at end of sd_start */ | 1193 | /*fixme:jfm this sequence should appear at end of sd_start */ |
1204 | /* with | 1194 | /* with |
1205 | data = 0x44; | 1195 | data = 0x44; |
1206 | reg_w(dev, 0x01, &data, 1); */ | 1196 | reg_w(gspca_dev, 0x01, &data, 1); */ |
1207 | reg_w(dev, 0x15, &sn9c1xx[0x15], 1); | 1197 | reg_w(gspca_dev, 0x15, &sn9c1xx[0x15], 1); |
1208 | reg_w(dev, 0x16, &sn9c1xx[0x16], 1); | 1198 | reg_w(gspca_dev, 0x16, &sn9c1xx[0x16], 1); |
1209 | reg_w(dev, 0x12, &sn9c1xx[0x12], 1); | 1199 | reg_w(gspca_dev, 0x12, &sn9c1xx[0x12], 1); |
1210 | reg_w(dev, 0x13, &sn9c1xx[0x13], 1); | 1200 | reg_w(gspca_dev, 0x13, &sn9c1xx[0x13], 1); |
1211 | reg_w(dev, 0x18, &sn9c1xx[0x18], 1); | 1201 | reg_w(gspca_dev, 0x18, &sn9c1xx[0x18], 1); |
1212 | reg_w(dev, 0xd2, &DC29[0], 1); | 1202 | reg_w(gspca_dev, 0xd2, &DC29[0], 1); |
1213 | reg_w(dev, 0xd3, &DC29[1], 1); | 1203 | reg_w(gspca_dev, 0xd3, &DC29[1], 1); |
1214 | reg_w(dev, 0xc6, &DC29[2], 1); | 1204 | reg_w(gspca_dev, 0xc6, &DC29[2], 1); |
1215 | reg_w(dev, 0xc7, &DC29[3], 1); | 1205 | reg_w(gspca_dev, 0xc7, &DC29[3], 1); |
1216 | reg_w(dev, 0xc8, &DC29[4], 1); | 1206 | reg_w(gspca_dev, 0xc8, &DC29[4], 1); |
1217 | reg_w(dev, 0xc9, &DC29[5], 1); | 1207 | reg_w(gspca_dev, 0xc9, &DC29[5], 1); |
1218 | /*fixme:jfm end of ending sequence */ | 1208 | /*fixme:jfm end of ending sequence */ |
1219 | reg_w(dev, 0x18, &sn9c1xx[0x18], 1); | 1209 | reg_w(gspca_dev, 0x18, &sn9c1xx[0x18], 1); |
1220 | if (sd->customid == SN9C325) | 1210 | if (sd->customid == SN9C325) |
1221 | data = 0xae; | 1211 | data = 0xae; |
1222 | else | 1212 | else |
1223 | data = 0x60; | 1213 | data = 0x60; |
1224 | reg_w(dev, 0x17, &data, 1); | 1214 | reg_w(gspca_dev, 0x17, &data, 1); |
1225 | reg_w(dev, 0x05, &sn9c1xx[5], 1); | 1215 | reg_w(gspca_dev, 0x05, &sn9c1xx[5], 1); |
1226 | reg_w(dev, 0x07, &sn9c1xx[7], 1); | 1216 | reg_w(gspca_dev, 0x07, &sn9c1xx[7], 1); |
1227 | reg_w(dev, 0x06, &sn9c1xx[6], 1); | 1217 | reg_w(gspca_dev, 0x06, &sn9c1xx[6], 1); |
1228 | reg_w(dev, 0x14, &sn9c1xx[0x14], 1); | 1218 | reg_w(gspca_dev, 0x14, &sn9c1xx[0x14], 1); |
1229 | if (sd->customid == SN9C325) { | 1219 | if (sd->customid == SN9C325) { |
1230 | reg_w(dev, 0x20, regsn20_sn9c325, 0x11); | 1220 | reg_w(gspca_dev, 0x20, regsn20_sn9c325, 0x11); |
1231 | for (i = 0; i < 8; i++) | 1221 | for (i = 0; i < 8; i++) |
1232 | reg_w(dev, 0x84, reg84_sn9c325, 0x15); | 1222 | reg_w(gspca_dev, 0x84, reg84_sn9c325, 0x15); |
1233 | data = 0x0a; | 1223 | data = 0x0a; |
1234 | reg_w(dev, 0x9a, &data, 1); | 1224 | reg_w(gspca_dev, 0x9a, &data, 1); |
1235 | data = 0x60; | 1225 | data = 0x60; |
1236 | reg_w(dev, 0x99, &data, 1); | 1226 | reg_w(gspca_dev, 0x99, &data, 1); |
1237 | } else { | 1227 | } else { |
1238 | reg_w(dev, 0x20, regsn20, 0x11); | 1228 | reg_w(gspca_dev, 0x20, regsn20, 0x11); |
1239 | for (i = 0; i < 8; i++) | 1229 | for (i = 0; i < 8; i++) |
1240 | reg_w(dev, 0x84, reg84, 0x15); | 1230 | reg_w(gspca_dev, 0x84, reg84, 0x15); |
1241 | data = 0x08; | 1231 | data = 0x08; |
1242 | reg_w(dev, 0x9a, &data, 1); | 1232 | reg_w(gspca_dev, 0x9a, &data, 1); |
1243 | data = 0x59; | 1233 | data = 0x59; |
1244 | reg_w(dev, 0x99, &data, 1); | 1234 | reg_w(gspca_dev, 0x99, &data, 1); |
1245 | } | 1235 | } |
1246 | 1236 | ||
1247 | mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv; | 1237 | mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv; |
@@ -1294,38 +1284,38 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
1294 | } | 1284 | } |
1295 | break; | 1285 | break; |
1296 | } | 1286 | } |
1297 | reg_w(dev, 0xc0, C0, 6); | 1287 | reg_w(gspca_dev, 0xc0, C0, 6); |
1298 | switch (sd->customid) { | 1288 | switch (sd->customid) { |
1299 | case SN9C120: /*jfm ?? */ | 1289 | case SN9C120: /*jfm ?? */ |
1300 | reg_w(dev, 0xca, CA_sn9c120, 4); | 1290 | reg_w(gspca_dev, 0xca, CA_sn9c120, 4); |
1301 | break; | 1291 | break; |
1302 | default: | 1292 | default: |
1303 | reg_w(dev, 0xca, CA, 4); | 1293 | reg_w(gspca_dev, 0xca, CA, 4); |
1304 | break; | 1294 | break; |
1305 | } | 1295 | } |
1306 | switch (sd->customid) { | 1296 | switch (sd->customid) { |
1307 | case SN9C120: /*jfm ?? */ | 1297 | case SN9C120: /*jfm ?? */ |
1308 | case SN9C325: | 1298 | case SN9C325: |
1309 | reg_w(dev, 0xce, CE_sn9c325, 4); | 1299 | reg_w(gspca_dev, 0xce, CE_sn9c325, 4); |
1310 | break; | 1300 | break; |
1311 | default: | 1301 | default: |
1312 | reg_w(dev, 0xce, CE, 4); | 1302 | reg_w(gspca_dev, 0xce, CE, 4); |
1313 | /* ?? {0x1e, 0xdd, 0x2d, 0xe7} */ | 1303 | /* ?? {0x1e, 0xdd, 0x2d, 0xe7} */ |
1314 | break; | 1304 | break; |
1315 | } | 1305 | } |
1316 | 1306 | ||
1317 | /* here change size mode 0 -> VGA; 1 -> CIF */ | 1307 | /* here change size mode 0 -> VGA; 1 -> CIF */ |
1318 | data = 0x40 | sn9c1xx[0x18] | (mode << 4); | 1308 | data = 0x40 | sn9c1xx[0x18] | (mode << 4); |
1319 | reg_w(dev, 0x18, &data, 1); | 1309 | reg_w(gspca_dev, 0x18, &data, 1); |
1320 | 1310 | ||
1321 | reg_w(dev, 0x100, qtable4, 0x40); | 1311 | reg_w(gspca_dev, 0x100, qtable4, 0x40); |
1322 | reg_w(dev, 0x140, qtable4 + 0x40, 0x40); | 1312 | reg_w(gspca_dev, 0x140, qtable4 + 0x40, 0x40); |
1323 | 1313 | ||
1324 | data = sn9c1xx[0x18] | (mode << 4); | 1314 | data = sn9c1xx[0x18] | (mode << 4); |
1325 | reg_w(dev, 0x18, &data, 1); | 1315 | reg_w(gspca_dev, 0x18, &data, 1); |
1326 | 1316 | ||
1327 | reg_w(dev, 0x17, ®17, 1); | 1317 | reg_w(gspca_dev, 0x17, ®17, 1); |
1328 | reg_w(dev, 0x01, ®1, 1); | 1318 | reg_w(gspca_dev, 0x01, ®1, 1); |
1329 | setbrightness(gspca_dev); | 1319 | setbrightness(gspca_dev); |
1330 | setcontrast(gspca_dev); | 1320 | setcontrast(gspca_dev); |
1331 | } | 1321 | } |
@@ -1333,7 +1323,6 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
1333 | static void sd_stopN(struct gspca_dev *gspca_dev) | 1323 | static void sd_stopN(struct gspca_dev *gspca_dev) |
1334 | { | 1324 | { |
1335 | struct sd *sd = (struct sd *) gspca_dev; | 1325 | struct sd *sd = (struct sd *) gspca_dev; |
1336 | struct usb_device *dev = gspca_dev->dev; | ||
1337 | static const __u8 stophv7131[] = | 1326 | static const __u8 stophv7131[] = |
1338 | { 0xa1, 0x11, 0x02, 0x09, 0x00, 0x00, 0x00, 0x10 }; | 1327 | { 0xa1, 0x11, 0x02, 0x09, 0x00, 0x00, 0x00, 0x10 }; |
1339 | static const __u8 stopmi0360[] = | 1328 | static const __u8 stopmi0360[] = |
@@ -1345,11 +1334,11 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
1345 | data = 0x0b; | 1334 | data = 0x0b; |
1346 | switch (sd->sensor) { | 1335 | switch (sd->sensor) { |
1347 | case SENSOR_HV7131R: | 1336 | case SENSOR_HV7131R: |
1348 | i2c_w8(dev, stophv7131); | 1337 | i2c_w8(gspca_dev, stophv7131); |
1349 | data = 0x2b; | 1338 | data = 0x2b; |
1350 | break; | 1339 | break; |
1351 | case SENSOR_MI0360: | 1340 | case SENSOR_MI0360: |
1352 | i2c_w8(dev, stopmi0360); | 1341 | i2c_w8(gspca_dev, stopmi0360); |
1353 | data = 0x29; | 1342 | data = 0x29; |
1354 | break; | 1343 | break; |
1355 | case SENSOR_MO4000: | 1344 | case SENSOR_MO4000: |
@@ -1362,12 +1351,12 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
1362 | break; | 1351 | break; |
1363 | } | 1352 | } |
1364 | sn9c1xx = sn_tb[(int) sd->sensor]; | 1353 | sn9c1xx = sn_tb[(int) sd->sensor]; |
1365 | reg_w(dev, 0x01, &sn9c1xx[1], 1); | 1354 | reg_w(gspca_dev, 0x01, &sn9c1xx[1], 1); |
1366 | reg_w(dev, 0x17, &sn9c1xx[0x17], 1); | 1355 | reg_w(gspca_dev, 0x17, &sn9c1xx[0x17], 1); |
1367 | reg_w(dev, 0x01, &sn9c1xx[1], 1); | 1356 | reg_w(gspca_dev, 0x01, &sn9c1xx[1], 1); |
1368 | reg_w(dev, 0x01, &data, 1); | 1357 | reg_w(gspca_dev, 0x01, &data, 1); |
1369 | regF1 = 0x01; | 1358 | regF1 = 0x01; |
1370 | reg_w(dev, 0xf1, ®F1, 1); | 1359 | reg_w(gspca_dev, 0xf1, ®F1, 1); |
1371 | } | 1360 | } |
1372 | 1361 | ||
1373 | static void sd_stop0(struct gspca_dev *gspca_dev) | 1362 | static void sd_stop0(struct gspca_dev *gspca_dev) |
@@ -1463,33 +1452,35 @@ static unsigned int getexposure(struct gspca_dev *gspca_dev) | |||
1463 | { | 1452 | { |
1464 | struct sd *sd = (struct sd *) gspca_dev; | 1453 | struct sd *sd = (struct sd *) gspca_dev; |
1465 | __u8 hexpo, mexpo, lexpo; | 1454 | __u8 hexpo, mexpo, lexpo; |
1466 | __u8 expo[6]; | ||
1467 | 1455 | ||
1468 | switch (sd->sensor) { | 1456 | switch (sd->sensor) { |
1469 | case SENSOR_HV7131R: | 1457 | case SENSOR_HV7131R: |
1470 | /* read sensor exposure */ | 1458 | /* read sensor exposure */ |
1471 | i2c_r5(gspca_dev, 0x25, expo); | 1459 | i2c_r5(gspca_dev, 0x25); |
1472 | return (expo[0] << 16) | (expo[1] << 8) | expo[2]; | 1460 | return (gspca_dev->usb_buf[0] << 16) |
1461 | | (gspca_dev->usb_buf[1] << 8) | ||
1462 | | gspca_dev->usb_buf[2]; | ||
1473 | case SENSOR_MI0360: | 1463 | case SENSOR_MI0360: |
1474 | /* read sensor exposure */ | 1464 | /* read sensor exposure */ |
1475 | i2c_r5(gspca_dev, 0x09, expo); | 1465 | i2c_r5(gspca_dev, 0x09); |
1476 | return (expo[0] << 8) | expo[1]; | 1466 | return (gspca_dev->usb_buf[0] << 8) |
1467 | | gspca_dev->usb_buf[1]; | ||
1477 | case SENSOR_MO4000: | 1468 | case SENSOR_MO4000: |
1478 | i2c_r5(gspca_dev, 0x0e, expo); | 1469 | i2c_r5(gspca_dev, 0x0e); |
1479 | hexpo = 0; /* expo[1] & 0x07; */ | 1470 | hexpo = 0; /* gspca_dev->usb_buf[1] & 0x07; */ |
1480 | mexpo = 0x40; /* expo[2] &0xff; */ | 1471 | mexpo = 0x40; /* gspca_dev->usb_buf[2] & 0xff; */ |
1481 | lexpo = (expo[1] & 0x30) >> 4; | 1472 | lexpo = (gspca_dev->usb_buf[1] & 0x30) >> 4; |
1482 | PDEBUG(D_CONF, "exposure %d", | 1473 | PDEBUG(D_CONF, "exposure %d", |
1483 | (hexpo << 10) | (mexpo << 2) | lexpo); | 1474 | (hexpo << 10) | (mexpo << 2) | lexpo); |
1484 | return (hexpo << 10) | (mexpo << 2) | lexpo; | 1475 | return (hexpo << 10) | (mexpo << 2) | lexpo; |
1485 | default: | 1476 | default: |
1486 | /* case SENSOR_OV7660: */ | 1477 | /* case SENSOR_OV7660: */ |
1487 | /* read sensor exposure */ | 1478 | /* read sensor exposure */ |
1488 | i2c_r5(gspca_dev, 0x04, expo); | 1479 | i2c_r5(gspca_dev, 0x04); |
1489 | hexpo = expo[3] & 0x2f; | 1480 | hexpo = gspca_dev->usb_buf[3] & 0x2f; |
1490 | lexpo = expo[0] & 0x02; | 1481 | lexpo = gspca_dev->usb_buf[0] & 0x02; |
1491 | i2c_r5(gspca_dev, 0x08, expo); | 1482 | i2c_r5(gspca_dev, 0x08); |
1492 | mexpo = expo[2]; | 1483 | mexpo = gspca_dev->usb_buf[2]; |
1493 | return (hexpo << 10) | (mexpo << 2) | lexpo; | 1484 | return (hexpo << 10) | (mexpo << 2) | lexpo; |
1494 | } | 1485 | } |
1495 | } | 1486 | } |
diff --git a/drivers/media/video/gspca/spca500.c b/drivers/media/video/gspca/spca500.c index d00f0f76e0e3..156206118795 100644 --- a/drivers/media/video/gspca/spca500.c +++ b/drivers/media/video/gspca/spca500.c | |||
@@ -24,8 +24,8 @@ | |||
24 | #include "gspca.h" | 24 | #include "gspca.h" |
25 | #include "jpeg.h" | 25 | #include "jpeg.h" |
26 | 26 | ||
27 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 27 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
28 | static const char version[] = "2.1.5"; | 28 | static const char version[] = "2.1.7"; |
29 | 29 | ||
30 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); | 30 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); |
31 | MODULE_DESCRIPTION("GSPCA/SPCA500 USB Camera Driver"); | 31 | MODULE_DESCRIPTION("GSPCA/SPCA500 USB Camera Driver"); |
@@ -372,26 +372,27 @@ static const __u8 qtable_pocketdv[2][64] = { | |||
372 | 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28} | 372 | 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28} |
373 | }; | 373 | }; |
374 | 374 | ||
375 | static void reg_r(struct usb_device *dev, | 375 | /* read 'len' bytes to gspca_dev->usb_buf */ |
376 | __u16 index, | 376 | static void reg_r(struct gspca_dev *gspca_dev, |
377 | __u8 *buffer, __u16 length) | 377 | __u16 index, |
378 | __u16 length) | ||
378 | { | 379 | { |
379 | usb_control_msg(dev, | 380 | usb_control_msg(gspca_dev->dev, |
380 | usb_rcvctrlpipe(dev, 0), | 381 | usb_rcvctrlpipe(gspca_dev->dev, 0), |
381 | 0, | 382 | 0, |
382 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 383 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
383 | 0, /* value */ | 384 | 0, /* value */ |
384 | index, buffer, length, 500); | 385 | index, gspca_dev->usb_buf, length, 500); |
385 | } | 386 | } |
386 | 387 | ||
387 | static int reg_w(struct usb_device *dev, | 388 | static int reg_w(struct gspca_dev *gspca_dev, |
388 | __u16 req, __u16 index, __u16 value) | 389 | __u16 req, __u16 index, __u16 value) |
389 | { | 390 | { |
390 | int ret; | 391 | int ret; |
391 | 392 | ||
392 | PDEBUG(D_USBO, "reg write: [0x%02x] = 0x%02x", index, value); | 393 | PDEBUG(D_USBO, "reg write: [0x%02x] = 0x%02x", index, value); |
393 | ret = usb_control_msg(dev, | 394 | ret = usb_control_msg(gspca_dev->dev, |
394 | usb_sndctrlpipe(dev, 0), | 395 | usb_sndctrlpipe(gspca_dev->dev, 0), |
395 | req, | 396 | req, |
396 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 397 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
397 | value, index, NULL, 0, 500); | 398 | value, index, NULL, 0, 500); |
@@ -401,28 +402,27 @@ static int reg_w(struct usb_device *dev, | |||
401 | } | 402 | } |
402 | 403 | ||
403 | /* returns: negative is error, pos or zero is data */ | 404 | /* returns: negative is error, pos or zero is data */ |
404 | static int reg_r_12(struct usb_device *dev, | 405 | static int reg_r_12(struct gspca_dev *gspca_dev, |
405 | __u16 req, /* bRequest */ | 406 | __u16 req, /* bRequest */ |
406 | __u16 index, /* wIndex */ | 407 | __u16 index, /* wIndex */ |
407 | __u16 length) /* wLength (1 or 2 only) */ | 408 | __u16 length) /* wLength (1 or 2 only) */ |
408 | { | 409 | { |
409 | int ret; | 410 | int ret; |
410 | __u8 buf[2]; | ||
411 | 411 | ||
412 | buf[1] = 0; | 412 | gspca_dev->usb_buf[1] = 0; |
413 | ret = usb_control_msg(dev, | 413 | ret = usb_control_msg(gspca_dev->dev, |
414 | usb_rcvctrlpipe(dev, 0), | 414 | usb_rcvctrlpipe(gspca_dev->dev, 0), |
415 | req, | 415 | req, |
416 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 416 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
417 | 0, /* value */ | 417 | 0, /* value */ |
418 | index, | 418 | index, |
419 | buf, length, | 419 | gspca_dev->usb_buf, length, |
420 | 500); /* timeout */ | 420 | 500); /* timeout */ |
421 | if (ret < 0) { | 421 | if (ret < 0) { |
422 | PDEBUG(D_ERR, "reg_r_12 err %d", ret); | 422 | PDEBUG(D_ERR, "reg_r_12 err %d", ret); |
423 | return -1; | 423 | return -1; |
424 | } | 424 | } |
425 | return (buf[1] << 8) + buf[0]; | 425 | return (gspca_dev->usb_buf[1] << 8) + gspca_dev->usb_buf[0]; |
426 | } | 426 | } |
427 | 427 | ||
428 | /* | 428 | /* |
@@ -430,13 +430,13 @@ static int reg_r_12(struct usb_device *dev, | |||
430 | * a reg_read call. | 430 | * a reg_read call. |
431 | * Returns: negative is error or timeout, zero is success. | 431 | * Returns: negative is error or timeout, zero is success. |
432 | */ | 432 | */ |
433 | static int reg_r_wait(struct usb_device *dev, | 433 | static int reg_r_wait(struct gspca_dev *gspca_dev, |
434 | __u16 reg, __u16 index, __u16 value) | 434 | __u16 reg, __u16 index, __u16 value) |
435 | { | 435 | { |
436 | int ret, cnt = 20; | 436 | int ret, cnt = 20; |
437 | 437 | ||
438 | while (--cnt > 0) { | 438 | while (--cnt > 0) { |
439 | ret = reg_r_12(dev, reg, index, 1); | 439 | ret = reg_r_12(gspca_dev, reg, index, 1); |
440 | if (ret == value) | 440 | if (ret == value) |
441 | return 0; | 441 | return 0; |
442 | msleep(50); | 442 | msleep(50); |
@@ -447,11 +447,10 @@ static int reg_r_wait(struct usb_device *dev, | |||
447 | static int write_vector(struct gspca_dev *gspca_dev, | 447 | static int write_vector(struct gspca_dev *gspca_dev, |
448 | const __u16 data[][3]) | 448 | const __u16 data[][3]) |
449 | { | 449 | { |
450 | struct usb_device *dev = gspca_dev->dev; | ||
451 | int ret, i = 0; | 450 | int ret, i = 0; |
452 | 451 | ||
453 | while (data[i][0] != 0 || data[i][1] != 0 || data[i][2] != 0) { | 452 | while (data[i][0] != 0 || data[i][1] != 0 || data[i][2] != 0) { |
454 | ret = reg_w(dev, data[i][0], data[i][2], data[i][1]); | 453 | ret = reg_w(gspca_dev, data[i][0], data[i][2], data[i][1]); |
455 | if (ret < 0) | 454 | if (ret < 0) |
456 | return ret; | 455 | return ret; |
457 | i++; | 456 | i++; |
@@ -465,19 +464,18 @@ static int spca50x_setup_qtable(struct gspca_dev *gspca_dev, | |||
465 | unsigned int cbase, | 464 | unsigned int cbase, |
466 | const __u8 qtable[2][64]) | 465 | const __u8 qtable[2][64]) |
467 | { | 466 | { |
468 | struct usb_device *dev = gspca_dev->dev; | ||
469 | int i, err; | 467 | int i, err; |
470 | 468 | ||
471 | /* loop over y components */ | 469 | /* loop over y components */ |
472 | for (i = 0; i < 64; i++) { | 470 | for (i = 0; i < 64; i++) { |
473 | err = reg_w(dev, request, ybase + i, qtable[0][i]); | 471 | err = reg_w(gspca_dev, request, ybase + i, qtable[0][i]); |
474 | if (err < 0) | 472 | if (err < 0) |
475 | return err; | 473 | return err; |
476 | } | 474 | } |
477 | 475 | ||
478 | /* loop over c components */ | 476 | /* loop over c components */ |
479 | for (i = 0; i < 64; i++) { | 477 | for (i = 0; i < 64; i++) { |
480 | err = reg_w(dev, request, cbase + i, qtable[1][i]); | 478 | err = reg_w(gspca_dev, request, cbase + i, qtable[1][i]); |
481 | if (err < 0) | 479 | if (err < 0) |
482 | return err; | 480 | return err; |
483 | } | 481 | } |
@@ -486,37 +484,33 @@ static int spca50x_setup_qtable(struct gspca_dev *gspca_dev, | |||
486 | 484 | ||
487 | static void spca500_ping310(struct gspca_dev *gspca_dev) | 485 | static void spca500_ping310(struct gspca_dev *gspca_dev) |
488 | { | 486 | { |
489 | __u8 Data[2]; | 487 | reg_r(gspca_dev, 0x0d04, 2); |
490 | |||
491 | reg_r(gspca_dev->dev, 0x0d04, Data, 2); | ||
492 | PDEBUG(D_STREAM, "ClickSmart310 ping 0x0d04 0x%02x 0x%02x", | 488 | PDEBUG(D_STREAM, "ClickSmart310 ping 0x0d04 0x%02x 0x%02x", |
493 | Data[0], Data[1]); | 489 | gspca_dev->usb_buf[0], gspca_dev->usb_buf[1]); |
494 | } | 490 | } |
495 | 491 | ||
496 | static void spca500_clksmart310_init(struct gspca_dev *gspca_dev) | 492 | static void spca500_clksmart310_init(struct gspca_dev *gspca_dev) |
497 | { | 493 | { |
498 | __u8 Data[2]; | 494 | reg_r(gspca_dev, 0x0d05, 2); |
499 | |||
500 | reg_r(gspca_dev->dev, 0x0d05, Data, 2); | ||
501 | PDEBUG(D_STREAM, "ClickSmart310 init 0x0d05 0x%02x 0x%02x", | 495 | PDEBUG(D_STREAM, "ClickSmart310 init 0x0d05 0x%02x 0x%02x", |
502 | Data[0], Data[1]); | 496 | gspca_dev->usb_buf[0], gspca_dev->usb_buf[1]); |
503 | reg_w(gspca_dev->dev, 0x00, 0x8167, 0x5a); | 497 | reg_w(gspca_dev, 0x00, 0x8167, 0x5a); |
504 | spca500_ping310(gspca_dev); | 498 | spca500_ping310(gspca_dev); |
505 | 499 | ||
506 | reg_w(gspca_dev->dev, 0x00, 0x8168, 0x22); | 500 | reg_w(gspca_dev, 0x00, 0x8168, 0x22); |
507 | reg_w(gspca_dev->dev, 0x00, 0x816a, 0xc0); | 501 | reg_w(gspca_dev, 0x00, 0x816a, 0xc0); |
508 | reg_w(gspca_dev->dev, 0x00, 0x816b, 0x0b); | 502 | reg_w(gspca_dev, 0x00, 0x816b, 0x0b); |
509 | reg_w(gspca_dev->dev, 0x00, 0x8169, 0x25); | 503 | reg_w(gspca_dev, 0x00, 0x8169, 0x25); |
510 | reg_w(gspca_dev->dev, 0x00, 0x8157, 0x5b); | 504 | reg_w(gspca_dev, 0x00, 0x8157, 0x5b); |
511 | reg_w(gspca_dev->dev, 0x00, 0x8158, 0x5b); | 505 | reg_w(gspca_dev, 0x00, 0x8158, 0x5b); |
512 | reg_w(gspca_dev->dev, 0x00, 0x813f, 0x03); | 506 | reg_w(gspca_dev, 0x00, 0x813f, 0x03); |
513 | reg_w(gspca_dev->dev, 0x00, 0x8151, 0x4a); | 507 | reg_w(gspca_dev, 0x00, 0x8151, 0x4a); |
514 | reg_w(gspca_dev->dev, 0x00, 0x8153, 0x78); | 508 | reg_w(gspca_dev, 0x00, 0x8153, 0x78); |
515 | reg_w(gspca_dev->dev, 0x00, 0x0d01, 0x04); | 509 | reg_w(gspca_dev, 0x00, 0x0d01, 0x04); |
516 | /* 00 for adjust shutter */ | 510 | /* 00 for adjust shutter */ |
517 | reg_w(gspca_dev->dev, 0x00, 0x0d02, 0x01); | 511 | reg_w(gspca_dev, 0x00, 0x0d02, 0x01); |
518 | reg_w(gspca_dev->dev, 0x00, 0x8169, 0x25); | 512 | reg_w(gspca_dev, 0x00, 0x8169, 0x25); |
519 | reg_w(gspca_dev->dev, 0x00, 0x0d01, 0x02); | 513 | reg_w(gspca_dev, 0x00, 0x0d01, 0x02); |
520 | } | 514 | } |
521 | 515 | ||
522 | static void spca500_setmode(struct gspca_dev *gspca_dev, | 516 | static void spca500_setmode(struct gspca_dev *gspca_dev, |
@@ -525,14 +519,14 @@ static void spca500_setmode(struct gspca_dev *gspca_dev, | |||
525 | int mode; | 519 | int mode; |
526 | 520 | ||
527 | /* set x multiplier */ | 521 | /* set x multiplier */ |
528 | reg_w(gspca_dev->dev, 0, 0x8001, xmult); | 522 | reg_w(gspca_dev, 0, 0x8001, xmult); |
529 | 523 | ||
530 | /* set y multiplier */ | 524 | /* set y multiplier */ |
531 | reg_w(gspca_dev->dev, 0, 0x8002, ymult); | 525 | reg_w(gspca_dev, 0, 0x8002, ymult); |
532 | 526 | ||
533 | /* use compressed mode, VGA, with mode specific subsample */ | 527 | /* use compressed mode, VGA, with mode specific subsample */ |
534 | mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv; | 528 | mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv; |
535 | reg_w(gspca_dev->dev, 0, 0x8003, mode << 4); | 529 | reg_w(gspca_dev, 0, 0x8003, mode << 4); |
536 | } | 530 | } |
537 | 531 | ||
538 | static int spca500_full_reset(struct gspca_dev *gspca_dev) | 532 | static int spca500_full_reset(struct gspca_dev *gspca_dev) |
@@ -540,18 +534,18 @@ static int spca500_full_reset(struct gspca_dev *gspca_dev) | |||
540 | int err; | 534 | int err; |
541 | 535 | ||
542 | /* send the reset command */ | 536 | /* send the reset command */ |
543 | err = reg_w(gspca_dev->dev, 0xe0, 0x0001, 0x0000); | 537 | err = reg_w(gspca_dev, 0xe0, 0x0001, 0x0000); |
544 | if (err < 0) | 538 | if (err < 0) |
545 | return err; | 539 | return err; |
546 | 540 | ||
547 | /* wait for the reset to complete */ | 541 | /* wait for the reset to complete */ |
548 | err = reg_r_wait(gspca_dev->dev, 0x06, 0x0000, 0x0000); | 542 | err = reg_r_wait(gspca_dev, 0x06, 0x0000, 0x0000); |
549 | if (err < 0) | 543 | if (err < 0) |
550 | return err; | 544 | return err; |
551 | err = reg_w(gspca_dev->dev, 0xe0, 0x0000, 0x0000); | 545 | err = reg_w(gspca_dev, 0xe0, 0x0000, 0x0000); |
552 | if (err < 0) | 546 | if (err < 0) |
553 | return err; | 547 | return err; |
554 | err = reg_r_wait(gspca_dev->dev, 0x06, 0, 0); | 548 | err = reg_r_wait(gspca_dev, 0x06, 0, 0); |
555 | if (err < 0) { | 549 | if (err < 0) { |
556 | PDEBUG(D_ERR, "reg_r_wait() failed"); | 550 | PDEBUG(D_ERR, "reg_r_wait() failed"); |
557 | return err; | 551 | return err; |
@@ -568,15 +562,13 @@ static int spca500_full_reset(struct gspca_dev *gspca_dev) | |||
568 | /* up-port the same feature as in 2.4.x kernel */ | 562 | /* up-port the same feature as in 2.4.x kernel */ |
569 | static int spca500_synch310(struct gspca_dev *gspca_dev) | 563 | static int spca500_synch310(struct gspca_dev *gspca_dev) |
570 | { | 564 | { |
571 | __u8 Data; | ||
572 | |||
573 | if (usb_set_interface(gspca_dev->dev, gspca_dev->iface, 0) < 0) { | 565 | if (usb_set_interface(gspca_dev->dev, gspca_dev->iface, 0) < 0) { |
574 | PDEBUG(D_ERR, "Set packet size: set interface error"); | 566 | PDEBUG(D_ERR, "Set packet size: set interface error"); |
575 | goto error; | 567 | goto error; |
576 | } | 568 | } |
577 | spca500_ping310(gspca_dev); | 569 | spca500_ping310(gspca_dev); |
578 | 570 | ||
579 | reg_r(gspca_dev->dev, 0x0d00, &Data, 1); | 571 | reg_r(gspca_dev, 0x0d00, 1); |
580 | 572 | ||
581 | /* need alt setting here */ | 573 | /* need alt setting here */ |
582 | PDEBUG(D_PACK, "ClickSmart310 sync alt: %d", gspca_dev->alt); | 574 | PDEBUG(D_PACK, "ClickSmart310 sync alt: %d", gspca_dev->alt); |
@@ -600,12 +592,12 @@ static void spca500_reinit(struct gspca_dev *gspca_dev) | |||
600 | 592 | ||
601 | /* some unknow command from Aiptek pocket dv and family300 */ | 593 | /* some unknow command from Aiptek pocket dv and family300 */ |
602 | 594 | ||
603 | reg_w(gspca_dev->dev, 0x00, 0x0d01, 0x01); | 595 | reg_w(gspca_dev, 0x00, 0x0d01, 0x01); |
604 | reg_w(gspca_dev->dev, 0x00, 0x0d03, 0x00); | 596 | reg_w(gspca_dev, 0x00, 0x0d03, 0x00); |
605 | reg_w(gspca_dev->dev, 0x00, 0x0d02, 0x01); | 597 | reg_w(gspca_dev, 0x00, 0x0d02, 0x01); |
606 | 598 | ||
607 | /* enable drop packet */ | 599 | /* enable drop packet */ |
608 | reg_w(gspca_dev->dev, 0x00, 0x850a, 0x0001); | 600 | reg_w(gspca_dev, 0x00, 0x850a, 0x0001); |
609 | 601 | ||
610 | err = spca50x_setup_qtable(gspca_dev, 0x00, 0x8800, 0x8840, | 602 | err = spca50x_setup_qtable(gspca_dev, 0x00, 0x8800, 0x8840, |
611 | qtable_pocketdv); | 603 | qtable_pocketdv); |
@@ -613,22 +605,23 @@ static void spca500_reinit(struct gspca_dev *gspca_dev) | |||
613 | PDEBUG(D_ERR|D_STREAM, "spca50x_setup_qtable failed on init"); | 605 | PDEBUG(D_ERR|D_STREAM, "spca50x_setup_qtable failed on init"); |
614 | 606 | ||
615 | /* set qtable index */ | 607 | /* set qtable index */ |
616 | reg_w(gspca_dev->dev, 0x00, 0x8880, 2); | 608 | reg_w(gspca_dev, 0x00, 0x8880, 2); |
617 | /* family cam Quicksmart stuff */ | 609 | /* family cam Quicksmart stuff */ |
618 | reg_w(gspca_dev->dev, 0x00, 0x800a, 0x00); | 610 | reg_w(gspca_dev, 0x00, 0x800a, 0x00); |
619 | /* Set agc transfer: synced inbetween frames */ | 611 | /* Set agc transfer: synced inbetween frames */ |
620 | reg_w(gspca_dev->dev, 0x00, 0x820f, 0x01); | 612 | reg_w(gspca_dev, 0x00, 0x820f, 0x01); |
621 | /* Init SDRAM - needed for SDRAM access */ | 613 | /* Init SDRAM - needed for SDRAM access */ |
622 | reg_w(gspca_dev->dev, 0x00, 0x870a, 0x04); | 614 | reg_w(gspca_dev, 0x00, 0x870a, 0x04); |
623 | /*Start init sequence or stream */ | 615 | /*Start init sequence or stream */ |
624 | 616 | reg_w(gspca_dev, 0, 0x8003, 0x00); | |
625 | reg_w(gspca_dev->dev, 0, 0x8003, 0x00); | ||
626 | /* switch to video camera mode */ | 617 | /* switch to video camera mode */ |
627 | reg_w(gspca_dev->dev, 0x00, 0x8000, 0x0004); | 618 | reg_w(gspca_dev, 0x00, 0x8000, 0x0004); |
628 | msleep(2000); | 619 | msleep(2000); |
629 | if (reg_r_wait(gspca_dev->dev, 0, 0x8000, 0x44) != 0) | 620 | if (reg_r_wait(gspca_dev, 0, 0x8000, 0x44) != 0) { |
630 | reg_r(gspca_dev->dev, 0x816b, &Data, 1); | 621 | reg_r(gspca_dev, 0x816b, 1); |
631 | reg_w(gspca_dev->dev, 0x00, 0x816b, Data); | 622 | Data = gspca_dev->usb_buf[0]; |
623 | reg_w(gspca_dev, 0x00, 0x816b, Data); | ||
624 | } | ||
632 | } | 625 | } |
633 | 626 | ||
634 | /* this function is called at probe time */ | 627 | /* this function is called at probe time */ |
@@ -785,9 +778,10 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
785 | } | 778 | } |
786 | 779 | ||
787 | /* is there a sensor here ? */ | 780 | /* is there a sensor here ? */ |
788 | reg_r(gspca_dev->dev, 0x8a04, &Data, 1); | 781 | reg_r(gspca_dev, 0x8a04, 1); |
789 | PDEBUG(D_STREAM, "Spca500 Sensor Address 0x%02X", Data); | 782 | PDEBUG(D_STREAM, "Spca500 Sensor Address 0x%02x", |
790 | PDEBUG(D_STREAM, "Spca500 curr_mode: %d Xmult: 0x%02X, Ymult: 0x%02X", | 783 | gspca_dev->usb_buf[0]); |
784 | PDEBUG(D_STREAM, "Spca500 curr_mode: %d Xmult: 0x%02x, Ymult: 0x%02x", | ||
791 | gspca_dev->curr_mode, xmult, ymult); | 785 | gspca_dev->curr_mode, xmult, ymult); |
792 | 786 | ||
793 | /* setup qtable */ | 787 | /* setup qtable */ |
@@ -796,33 +790,34 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
796 | spca500_setmode(gspca_dev, xmult, ymult); | 790 | spca500_setmode(gspca_dev, xmult, ymult); |
797 | 791 | ||
798 | /* enable drop packet */ | 792 | /* enable drop packet */ |
799 | reg_w(gspca_dev->dev, 0x00, 0x850a, 0x0001); | 793 | reg_w(gspca_dev, 0x00, 0x850a, 0x0001); |
800 | reg_w(gspca_dev->dev, 0x00, 0x8880, 3); | 794 | reg_w(gspca_dev, 0x00, 0x8880, 3); |
801 | err = spca50x_setup_qtable(gspca_dev, | 795 | err = spca50x_setup_qtable(gspca_dev, |
802 | 0x00, 0x8800, 0x8840, | 796 | 0x00, 0x8800, 0x8840, |
803 | qtable_creative_pccam); | 797 | qtable_creative_pccam); |
804 | if (err < 0) | 798 | if (err < 0) |
805 | PDEBUG(D_ERR, "spca50x_setup_qtable failed"); | 799 | PDEBUG(D_ERR, "spca50x_setup_qtable failed"); |
806 | /* Init SDRAM - needed for SDRAM access */ | 800 | /* Init SDRAM - needed for SDRAM access */ |
807 | reg_w(gspca_dev->dev, 0x00, 0x870a, 0x04); | 801 | reg_w(gspca_dev, 0x00, 0x870a, 0x04); |
808 | 802 | ||
809 | /* switch to video camera mode */ | 803 | /* switch to video camera mode */ |
810 | reg_w(gspca_dev->dev, 0x00, 0x8000, 0x0004); | 804 | reg_w(gspca_dev, 0x00, 0x8000, 0x0004); |
811 | msleep(500); | 805 | msleep(500); |
812 | if (reg_r_wait(gspca_dev->dev, 0, 0x8000, 0x44) != 0) | 806 | if (reg_r_wait(gspca_dev, 0, 0x8000, 0x44) != 0) |
813 | PDEBUG(D_ERR, "reg_r_wait() failed"); | 807 | PDEBUG(D_ERR, "reg_r_wait() failed"); |
814 | 808 | ||
815 | reg_r(gspca_dev->dev, 0x816b, &Data, 1); | 809 | reg_r(gspca_dev, 0x816b, 1); |
816 | reg_w(gspca_dev->dev, 0x00, 0x816b, Data); | 810 | Data = gspca_dev->usb_buf[0]; |
811 | reg_w(gspca_dev, 0x00, 0x816b, Data); | ||
817 | 812 | ||
818 | spca500_synch310(gspca_dev); | 813 | spca500_synch310(gspca_dev); |
819 | 814 | ||
820 | write_vector(gspca_dev, spca500_visual_defaults); | 815 | write_vector(gspca_dev, spca500_visual_defaults); |
821 | spca500_setmode(gspca_dev, xmult, ymult); | 816 | spca500_setmode(gspca_dev, xmult, ymult); |
822 | /* enable drop packet */ | 817 | /* enable drop packet */ |
823 | reg_w(gspca_dev->dev, 0x00, 0x850a, 0x0001); | 818 | reg_w(gspca_dev, 0x00, 0x850a, 0x0001); |
824 | PDEBUG(D_ERR, "failed to enable drop packet"); | 819 | PDEBUG(D_ERR, "failed to enable drop packet"); |
825 | reg_w(gspca_dev->dev, 0x00, 0x8880, 3); | 820 | reg_w(gspca_dev, 0x00, 0x8880, 3); |
826 | err = spca50x_setup_qtable(gspca_dev, | 821 | err = spca50x_setup_qtable(gspca_dev, |
827 | 0x00, 0x8800, 0x8840, | 822 | 0x00, 0x8800, 0x8840, |
828 | qtable_creative_pccam); | 823 | qtable_creative_pccam); |
@@ -830,16 +825,17 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
830 | PDEBUG(D_ERR, "spca50x_setup_qtable failed"); | 825 | PDEBUG(D_ERR, "spca50x_setup_qtable failed"); |
831 | 826 | ||
832 | /* Init SDRAM - needed for SDRAM access */ | 827 | /* Init SDRAM - needed for SDRAM access */ |
833 | reg_w(gspca_dev->dev, 0x00, 0x870a, 0x04); | 828 | reg_w(gspca_dev, 0x00, 0x870a, 0x04); |
834 | 829 | ||
835 | /* switch to video camera mode */ | 830 | /* switch to video camera mode */ |
836 | reg_w(gspca_dev->dev, 0x00, 0x8000, 0x0004); | 831 | reg_w(gspca_dev, 0x00, 0x8000, 0x0004); |
837 | 832 | ||
838 | if (reg_r_wait(gspca_dev->dev, 0, 0x8000, 0x44) != 0) | 833 | if (reg_r_wait(gspca_dev, 0, 0x8000, 0x44) != 0) |
839 | PDEBUG(D_ERR, "reg_r_wait() failed"); | 834 | PDEBUG(D_ERR, "reg_r_wait() failed"); |
840 | 835 | ||
841 | reg_r(gspca_dev->dev, 0x816b, &Data, 1); | 836 | reg_r(gspca_dev, 0x816b, 1); |
842 | reg_w(gspca_dev->dev, 0x00, 0x816b, Data); | 837 | Data = gspca_dev->usb_buf[0]; |
838 | reg_w(gspca_dev, 0x00, 0x816b, Data); | ||
843 | break; | 839 | break; |
844 | case CreativePCCam300: /* Creative PC-CAM 300 640x480 CCD */ | 840 | case CreativePCCam300: /* Creative PC-CAM 300 640x480 CCD */ |
845 | case IntelPocketPCCamera: /* FIXME: Temporary fix for | 841 | case IntelPocketPCCamera: /* FIXME: Temporary fix for |
@@ -852,10 +848,10 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
852 | PDEBUG(D_ERR, "spca500_full_reset failed"); | 848 | PDEBUG(D_ERR, "spca500_full_reset failed"); |
853 | 849 | ||
854 | /* enable drop packet */ | 850 | /* enable drop packet */ |
855 | err = reg_w(gspca_dev->dev, 0x00, 0x850a, 0x0001); | 851 | err = reg_w(gspca_dev, 0x00, 0x850a, 0x0001); |
856 | if (err < 0) | 852 | if (err < 0) |
857 | PDEBUG(D_ERR, "failed to enable drop packet"); | 853 | PDEBUG(D_ERR, "failed to enable drop packet"); |
858 | reg_w(gspca_dev->dev, 0x00, 0x8880, 3); | 854 | reg_w(gspca_dev, 0x00, 0x8880, 3); |
859 | err = spca50x_setup_qtable(gspca_dev, | 855 | err = spca50x_setup_qtable(gspca_dev, |
860 | 0x00, 0x8800, 0x8840, | 856 | 0x00, 0x8800, 0x8840, |
861 | qtable_creative_pccam); | 857 | qtable_creative_pccam); |
@@ -863,16 +859,17 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
863 | PDEBUG(D_ERR, "spca50x_setup_qtable failed"); | 859 | PDEBUG(D_ERR, "spca50x_setup_qtable failed"); |
864 | 860 | ||
865 | spca500_setmode(gspca_dev, xmult, ymult); | 861 | spca500_setmode(gspca_dev, xmult, ymult); |
866 | reg_w(gspca_dev->dev, 0x20, 0x0001, 0x0004); | 862 | reg_w(gspca_dev, 0x20, 0x0001, 0x0004); |
867 | 863 | ||
868 | /* switch to video camera mode */ | 864 | /* switch to video camera mode */ |
869 | reg_w(gspca_dev->dev, 0x00, 0x8000, 0x0004); | 865 | reg_w(gspca_dev, 0x00, 0x8000, 0x0004); |
870 | 866 | ||
871 | if (reg_r_wait(gspca_dev->dev, 0, 0x8000, 0x44) != 0) | 867 | if (reg_r_wait(gspca_dev, 0, 0x8000, 0x44) != 0) |
872 | PDEBUG(D_ERR, "reg_r_wait() failed"); | 868 | PDEBUG(D_ERR, "reg_r_wait() failed"); |
873 | 869 | ||
874 | reg_r(gspca_dev->dev, 0x816b, &Data, 1); | 870 | reg_r(gspca_dev, 0x816b, 1); |
875 | reg_w(gspca_dev->dev, 0x00, 0x816b, Data); | 871 | Data = gspca_dev->usb_buf[0]; |
872 | reg_w(gspca_dev, 0x00, 0x816b, Data); | ||
876 | 873 | ||
877 | /* write_vector(gspca_dev, spca500_visual_defaults); */ | 874 | /* write_vector(gspca_dev, spca500_visual_defaults); */ |
878 | break; | 875 | break; |
@@ -883,8 +880,8 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
883 | if (err < 0) | 880 | if (err < 0) |
884 | PDEBUG(D_ERR, "spca500_full_reset failed"); | 881 | PDEBUG(D_ERR, "spca500_full_reset failed"); |
885 | /* enable drop packet */ | 882 | /* enable drop packet */ |
886 | reg_w(gspca_dev->dev, 0x00, 0x850a, 0x0001); | 883 | reg_w(gspca_dev, 0x00, 0x850a, 0x0001); |
887 | reg_w(gspca_dev->dev, 0x00, 0x8880, 0); | 884 | reg_w(gspca_dev, 0x00, 0x8880, 0); |
888 | err = spca50x_setup_qtable(gspca_dev, | 885 | err = spca50x_setup_qtable(gspca_dev, |
889 | 0x00, 0x8800, 0x8840, | 886 | 0x00, 0x8800, 0x8840, |
890 | qtable_kodak_ez200); | 887 | qtable_kodak_ez200); |
@@ -892,16 +889,17 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
892 | PDEBUG(D_ERR, "spca50x_setup_qtable failed"); | 889 | PDEBUG(D_ERR, "spca50x_setup_qtable failed"); |
893 | spca500_setmode(gspca_dev, xmult, ymult); | 890 | spca500_setmode(gspca_dev, xmult, ymult); |
894 | 891 | ||
895 | reg_w(gspca_dev->dev, 0x20, 0x0001, 0x0004); | 892 | reg_w(gspca_dev, 0x20, 0x0001, 0x0004); |
896 | 893 | ||
897 | /* switch to video camera mode */ | 894 | /* switch to video camera mode */ |
898 | reg_w(gspca_dev->dev, 0x00, 0x8000, 0x0004); | 895 | reg_w(gspca_dev, 0x00, 0x8000, 0x0004); |
899 | 896 | ||
900 | if (reg_r_wait(gspca_dev->dev, 0, 0x8000, 0x44) != 0) | 897 | if (reg_r_wait(gspca_dev, 0, 0x8000, 0x44) != 0) |
901 | PDEBUG(D_ERR, "reg_r_wait() failed"); | 898 | PDEBUG(D_ERR, "reg_r_wait() failed"); |
902 | 899 | ||
903 | reg_r(gspca_dev->dev, 0x816b, &Data, 1); | 900 | reg_r(gspca_dev, 0x816b, 1); |
904 | reg_w(gspca_dev->dev, 0x00, 0x816b, Data); | 901 | Data = gspca_dev->usb_buf[0]; |
902 | reg_w(gspca_dev, 0x00, 0x816b, Data); | ||
905 | 903 | ||
906 | /* write_vector(gspca_dev, spca500_visual_defaults); */ | 904 | /* write_vector(gspca_dev, spca500_visual_defaults); */ |
907 | break; | 905 | break; |
@@ -916,56 +914,58 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
916 | case ToptroIndus: | 914 | case ToptroIndus: |
917 | case AgfaCl20: | 915 | case AgfaCl20: |
918 | spca500_reinit(gspca_dev); | 916 | spca500_reinit(gspca_dev); |
919 | reg_w(gspca_dev->dev, 0x00, 0x0d01, 0x01); | 917 | reg_w(gspca_dev, 0x00, 0x0d01, 0x01); |
920 | /* enable drop packet */ | 918 | /* enable drop packet */ |
921 | reg_w(gspca_dev->dev, 0x00, 0x850a, 0x0001); | 919 | reg_w(gspca_dev, 0x00, 0x850a, 0x0001); |
922 | 920 | ||
923 | err = spca50x_setup_qtable(gspca_dev, | 921 | err = spca50x_setup_qtable(gspca_dev, |
924 | 0x00, 0x8800, 0x8840, qtable_pocketdv); | 922 | 0x00, 0x8800, 0x8840, qtable_pocketdv); |
925 | if (err < 0) | 923 | if (err < 0) |
926 | PDEBUG(D_ERR, "spca50x_setup_qtable failed"); | 924 | PDEBUG(D_ERR, "spca50x_setup_qtable failed"); |
927 | reg_w(gspca_dev->dev, 0x00, 0x8880, 2); | 925 | reg_w(gspca_dev, 0x00, 0x8880, 2); |
928 | 926 | ||
929 | /* familycam Quicksmart pocketDV stuff */ | 927 | /* familycam Quicksmart pocketDV stuff */ |
930 | reg_w(gspca_dev->dev, 0x00, 0x800a, 0x00); | 928 | reg_w(gspca_dev, 0x00, 0x800a, 0x00); |
931 | /* Set agc transfer: synced inbetween frames */ | 929 | /* Set agc transfer: synced inbetween frames */ |
932 | reg_w(gspca_dev->dev, 0x00, 0x820f, 0x01); | 930 | reg_w(gspca_dev, 0x00, 0x820f, 0x01); |
933 | /* Init SDRAM - needed for SDRAM access */ | 931 | /* Init SDRAM - needed for SDRAM access */ |
934 | reg_w(gspca_dev->dev, 0x00, 0x870a, 0x04); | 932 | reg_w(gspca_dev, 0x00, 0x870a, 0x04); |
935 | 933 | ||
936 | spca500_setmode(gspca_dev, xmult, ymult); | 934 | spca500_setmode(gspca_dev, xmult, ymult); |
937 | /* switch to video camera mode */ | 935 | /* switch to video camera mode */ |
938 | reg_w(gspca_dev->dev, 0x00, 0x8000, 0x0004); | 936 | reg_w(gspca_dev, 0x00, 0x8000, 0x0004); |
939 | 937 | ||
940 | reg_r_wait(gspca_dev->dev, 0, 0x8000, 0x44); | 938 | reg_r_wait(gspca_dev, 0, 0x8000, 0x44); |
941 | 939 | ||
942 | reg_r(gspca_dev->dev, 0x816b, &Data, 1); | 940 | reg_r(gspca_dev, 0x816b, 1); |
943 | reg_w(gspca_dev->dev, 0x00, 0x816b, Data); | 941 | Data = gspca_dev->usb_buf[0]; |
942 | reg_w(gspca_dev, 0x00, 0x816b, Data); | ||
944 | break; | 943 | break; |
945 | case LogitechTraveler: | 944 | case LogitechTraveler: |
946 | case LogitechClickSmart510: | 945 | case LogitechClickSmart510: |
947 | reg_w(gspca_dev->dev, 0x02, 0x00, 0x00); | 946 | reg_w(gspca_dev, 0x02, 0x00, 0x00); |
948 | /* enable drop packet */ | 947 | /* enable drop packet */ |
949 | reg_w(gspca_dev->dev, 0x00, 0x850a, 0x0001); | 948 | reg_w(gspca_dev, 0x00, 0x850a, 0x0001); |
950 | 949 | ||
951 | err = spca50x_setup_qtable(gspca_dev, | 950 | err = spca50x_setup_qtable(gspca_dev, |
952 | 0x00, 0x8800, | 951 | 0x00, 0x8800, |
953 | 0x8840, qtable_creative_pccam); | 952 | 0x8840, qtable_creative_pccam); |
954 | if (err < 0) | 953 | if (err < 0) |
955 | PDEBUG(D_ERR, "spca50x_setup_qtable failed"); | 954 | PDEBUG(D_ERR, "spca50x_setup_qtable failed"); |
956 | reg_w(gspca_dev->dev, 0x00, 0x8880, 3); | 955 | reg_w(gspca_dev, 0x00, 0x8880, 3); |
957 | reg_w(gspca_dev->dev, 0x00, 0x800a, 0x00); | 956 | reg_w(gspca_dev, 0x00, 0x800a, 0x00); |
958 | /* Init SDRAM - needed for SDRAM access */ | 957 | /* Init SDRAM - needed for SDRAM access */ |
959 | reg_w(gspca_dev->dev, 0x00, 0x870a, 0x04); | 958 | reg_w(gspca_dev, 0x00, 0x870a, 0x04); |
960 | 959 | ||
961 | spca500_setmode(gspca_dev, xmult, ymult); | 960 | spca500_setmode(gspca_dev, xmult, ymult); |
962 | 961 | ||
963 | /* switch to video camera mode */ | 962 | /* switch to video camera mode */ |
964 | reg_w(gspca_dev->dev, 0x00, 0x8000, 0x0004); | 963 | reg_w(gspca_dev, 0x00, 0x8000, 0x0004); |
965 | reg_r_wait(gspca_dev->dev, 0, 0x8000, 0x44); | 964 | reg_r_wait(gspca_dev, 0, 0x8000, 0x44); |
966 | 965 | ||
967 | reg_r(gspca_dev->dev, 0x816b, &Data, 1); | 966 | reg_r(gspca_dev, 0x816b, 1); |
968 | reg_w(gspca_dev->dev, 0x00, 0x816b, Data); | 967 | Data = gspca_dev->usb_buf[0]; |
968 | reg_w(gspca_dev, 0x00, 0x816b, Data); | ||
969 | write_vector(gspca_dev, Clicksmart510_defaults); | 969 | write_vector(gspca_dev, Clicksmart510_defaults); |
970 | break; | 970 | break; |
971 | } | 971 | } |
@@ -973,14 +973,13 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
973 | 973 | ||
974 | static void sd_stopN(struct gspca_dev *gspca_dev) | 974 | static void sd_stopN(struct gspca_dev *gspca_dev) |
975 | { | 975 | { |
976 | __u8 data; | 976 | reg_w(gspca_dev, 0, 0x8003, 0x00); |
977 | |||
978 | reg_w(gspca_dev->dev, 0, 0x8003, 0x00); | ||
979 | 977 | ||
980 | /* switch to video camera mode */ | 978 | /* switch to video camera mode */ |
981 | reg_w(gspca_dev->dev, 0x00, 0x8000, 0x0004); | 979 | reg_w(gspca_dev, 0x00, 0x8000, 0x0004); |
982 | reg_r(gspca_dev->dev, 0x8000, &data, 1); | 980 | reg_r(gspca_dev, 0x8000, 1); |
983 | PDEBUG(D_STREAM, "stop SPCA500 done reg8000: 0x%2x", data); | 981 | PDEBUG(D_STREAM, "stop SPCA500 done reg8000: 0x%2x", |
982 | gspca_dev->usb_buf[0]); | ||
984 | } | 983 | } |
985 | 984 | ||
986 | static void sd_stop0(struct gspca_dev *gspca_dev) | 985 | static void sd_stop0(struct gspca_dev *gspca_dev) |
@@ -1043,7 +1042,7 @@ static void setbrightness(struct gspca_dev *gspca_dev) | |||
1043 | { | 1042 | { |
1044 | struct sd *sd = (struct sd *) gspca_dev; | 1043 | struct sd *sd = (struct sd *) gspca_dev; |
1045 | 1044 | ||
1046 | reg_w(gspca_dev->dev, 0x00, 0x8167, | 1045 | reg_w(gspca_dev, 0x00, 0x8167, |
1047 | (__u8) (sd->brightness - 128)); | 1046 | (__u8) (sd->brightness - 128)); |
1048 | } | 1047 | } |
1049 | 1048 | ||
@@ -1052,7 +1051,7 @@ static void getbrightness(struct gspca_dev *gspca_dev) | |||
1052 | struct sd *sd = (struct sd *) gspca_dev; | 1051 | struct sd *sd = (struct sd *) gspca_dev; |
1053 | int ret; | 1052 | int ret; |
1054 | 1053 | ||
1055 | ret = reg_r_12(gspca_dev->dev, 0x00, 0x8167, 1); | 1054 | ret = reg_r_12(gspca_dev, 0x00, 0x8167, 1); |
1056 | if (ret >= 0) | 1055 | if (ret >= 0) |
1057 | sd->brightness = ret + 128; | 1056 | sd->brightness = ret + 128; |
1058 | } | 1057 | } |
@@ -1061,7 +1060,7 @@ static void setcontrast(struct gspca_dev *gspca_dev) | |||
1061 | { | 1060 | { |
1062 | struct sd *sd = (struct sd *) gspca_dev; | 1061 | struct sd *sd = (struct sd *) gspca_dev; |
1063 | 1062 | ||
1064 | reg_w(gspca_dev->dev, 0x00, 0x8168, sd->contrast); | 1063 | reg_w(gspca_dev, 0x00, 0x8168, sd->contrast); |
1065 | } | 1064 | } |
1066 | 1065 | ||
1067 | static void getcontrast(struct gspca_dev *gspca_dev) | 1066 | static void getcontrast(struct gspca_dev *gspca_dev) |
@@ -1069,7 +1068,7 @@ static void getcontrast(struct gspca_dev *gspca_dev) | |||
1069 | struct sd *sd = (struct sd *) gspca_dev; | 1068 | struct sd *sd = (struct sd *) gspca_dev; |
1070 | int ret; | 1069 | int ret; |
1071 | 1070 | ||
1072 | ret = reg_r_12(gspca_dev->dev, 0x0, 0x8168, 1); | 1071 | ret = reg_r_12(gspca_dev, 0x0, 0x8168, 1); |
1073 | if (ret >= 0) | 1072 | if (ret >= 0) |
1074 | sd->contrast = ret; | 1073 | sd->contrast = ret; |
1075 | } | 1074 | } |
@@ -1078,7 +1077,7 @@ static void setcolors(struct gspca_dev *gspca_dev) | |||
1078 | { | 1077 | { |
1079 | struct sd *sd = (struct sd *) gspca_dev; | 1078 | struct sd *sd = (struct sd *) gspca_dev; |
1080 | 1079 | ||
1081 | reg_w(gspca_dev->dev, 0x00, 0x8169, sd->colors); | 1080 | reg_w(gspca_dev, 0x00, 0x8169, sd->colors); |
1082 | } | 1081 | } |
1083 | 1082 | ||
1084 | static void getcolors(struct gspca_dev *gspca_dev) | 1083 | static void getcolors(struct gspca_dev *gspca_dev) |
@@ -1086,7 +1085,7 @@ static void getcolors(struct gspca_dev *gspca_dev) | |||
1086 | struct sd *sd = (struct sd *) gspca_dev; | 1085 | struct sd *sd = (struct sd *) gspca_dev; |
1087 | int ret; | 1086 | int ret; |
1088 | 1087 | ||
1089 | ret = reg_r_12(gspca_dev->dev, 0x0, 0x8169, 1); | 1088 | ret = reg_r_12(gspca_dev, 0x0, 0x8169, 1); |
1090 | if (ret >= 0) | 1089 | if (ret >= 0) |
1091 | sd->colors = ret; | 1090 | sd->colors = ret; |
1092 | } | 1091 | } |
diff --git a/drivers/media/video/gspca/spca501.c b/drivers/media/video/gspca/spca501.c index 2064dc008af1..8cee6748d38f 100644 --- a/drivers/media/video/gspca/spca501.c +++ b/drivers/media/video/gspca/spca501.c | |||
@@ -23,8 +23,8 @@ | |||
23 | 23 | ||
24 | #include "gspca.h" | 24 | #include "gspca.h" |
25 | 25 | ||
26 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 26 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
27 | static const char version[] = "2.1.5"; | 27 | static const char version[] = "2.1.7"; |
28 | 28 | ||
29 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); | 29 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); |
30 | MODULE_DESCRIPTION("GSPCA/SPCA501 USB Camera Driver"); | 30 | MODULE_DESCRIPTION("GSPCA/SPCA501 USB Camera Driver"); |
@@ -1826,28 +1826,27 @@ static int reg_write(struct usb_device *dev, | |||
1826 | } | 1826 | } |
1827 | 1827 | ||
1828 | /* returns: negative is error, pos or zero is data */ | 1828 | /* returns: negative is error, pos or zero is data */ |
1829 | static int reg_read(struct usb_device *dev, | 1829 | static int reg_read(struct gspca_dev *gspca_dev, |
1830 | __u16 req, /* bRequest */ | 1830 | __u16 req, /* bRequest */ |
1831 | __u16 index, /* wIndex */ | 1831 | __u16 index, /* wIndex */ |
1832 | __u16 length) /* wLength (1 or 2 only) */ | 1832 | __u16 length) /* wLength (1 or 2 only) */ |
1833 | { | 1833 | { |
1834 | int ret; | 1834 | int ret; |
1835 | __u8 buf[2]; | ||
1836 | 1835 | ||
1837 | buf[1] = 0; | 1836 | gspca_dev->usb_buf[1] = 0; |
1838 | ret = usb_control_msg(dev, | 1837 | ret = usb_control_msg(gspca_dev->dev, |
1839 | usb_rcvctrlpipe(dev, 0), | 1838 | usb_rcvctrlpipe(gspca_dev->dev, 0), |
1840 | req, | 1839 | req, |
1841 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 1840 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
1842 | 0, /* value */ | 1841 | 0, /* value */ |
1843 | index, | 1842 | index, |
1844 | buf, length, | 1843 | gspca_dev->usb_buf, length, |
1845 | 500); /* timeout */ | 1844 | 500); /* timeout */ |
1846 | if (ret < 0) { | 1845 | if (ret < 0) { |
1847 | PDEBUG(D_ERR, "reg_read err %d", ret); | 1846 | PDEBUG(D_ERR, "reg_read err %d", ret); |
1848 | return -1; | 1847 | return -1; |
1849 | } | 1848 | } |
1850 | return (buf[1] << 8) + buf[0]; | 1849 | return (gspca_dev->usb_buf[1] << 8) + gspca_dev->usb_buf[0]; |
1851 | } | 1850 | } |
1852 | 1851 | ||
1853 | static int write_vector(struct gspca_dev *gspca_dev, | 1852 | static int write_vector(struct gspca_dev *gspca_dev, |
@@ -1883,7 +1882,7 @@ static void getbrightness(struct gspca_dev *gspca_dev) | |||
1883 | struct sd *sd = (struct sd *) gspca_dev; | 1882 | struct sd *sd = (struct sd *) gspca_dev; |
1884 | __u16 brightness; | 1883 | __u16 brightness; |
1885 | 1884 | ||
1886 | brightness = reg_read(gspca_dev->dev, SPCA501_REG_CCDSP, 0x11, 2); | 1885 | brightness = reg_read(gspca_dev, SPCA501_REG_CCDSP, 0x11, 2); |
1887 | sd->brightness = brightness << 1; | 1886 | sd->brightness = brightness << 1; |
1888 | } | 1887 | } |
1889 | 1888 | ||
@@ -1913,8 +1912,8 @@ static void getcolors(struct gspca_dev *gspca_dev) | |||
1913 | { | 1912 | { |
1914 | struct sd *sd = (struct sd *) gspca_dev; | 1913 | struct sd *sd = (struct sd *) gspca_dev; |
1915 | 1914 | ||
1916 | sd->colors = reg_read(gspca_dev->dev, SPCA501_REG_CCDSP, 0x0c, 2); | 1915 | sd->colors = reg_read(gspca_dev, SPCA501_REG_CCDSP, 0x0c, 2); |
1917 | /* sd->hue = (reg_read(gspca_dev->dev, SPCA501_REG_CCDSP, 0x13, */ | 1916 | /* sd->hue = (reg_read(gspca_dev, SPCA501_REG_CCDSP, 0x13, */ |
1918 | /* 2) & 0xFF) << 8; */ | 1917 | /* 2) & 0xFF) << 8; */ |
1919 | } | 1918 | } |
1920 | 1919 | ||
diff --git a/drivers/media/video/gspca/spca505.c b/drivers/media/video/gspca/spca505.c index 5d28d23b8375..ddea6e140aa8 100644 --- a/drivers/media/video/gspca/spca505.c +++ b/drivers/media/video/gspca/spca505.c | |||
@@ -23,8 +23,8 @@ | |||
23 | 23 | ||
24 | #include "gspca.h" | 24 | #include "gspca.h" |
25 | 25 | ||
26 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 26 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
27 | static const char version[] = "2.1.5"; | 27 | static const char version[] = "2.1.7"; |
28 | 28 | ||
29 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); | 29 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); |
30 | MODULE_DESCRIPTION("GSPCA/SPCA505 USB Camera Driver"); | 30 | MODULE_DESCRIPTION("GSPCA/SPCA505 USB Camera Driver"); |
@@ -593,29 +593,27 @@ static int reg_write(struct usb_device *dev, | |||
593 | } | 593 | } |
594 | 594 | ||
595 | /* returns: negative is error, pos or zero is data */ | 595 | /* returns: negative is error, pos or zero is data */ |
596 | static int reg_read(struct usb_device *dev, | 596 | static int reg_read(struct gspca_dev *gspca_dev, |
597 | __u16 reg, /* bRequest */ | 597 | __u16 reg, /* bRequest */ |
598 | __u16 index, /* wIndex */ | 598 | __u16 index, /* wIndex */ |
599 | __u16 length) /* wLength (1 or 2 only) */ | 599 | __u16 length) /* wLength (1 or 2 only) */ |
600 | { | 600 | { |
601 | int ret; | 601 | int ret; |
602 | __u8 buf[4]; | ||
603 | 602 | ||
604 | buf[1] = 0; | 603 | gspca_dev->usb_buf[1] = 0; |
605 | ret = usb_control_msg(dev, | 604 | ret = usb_control_msg(gspca_dev->dev, |
606 | usb_rcvctrlpipe(dev, 0), | 605 | usb_rcvctrlpipe(gspca_dev->dev, 0), |
607 | reg, | 606 | reg, |
608 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 607 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
609 | (__u16) 0, /* value */ | 608 | (__u16) 0, /* value */ |
610 | (__u16) index, | 609 | (__u16) index, |
611 | buf, | 610 | gspca_dev->usb_buf, length, |
612 | length, | ||
613 | 500); /* timeout */ | 611 | 500); /* timeout */ |
614 | if (ret < 0) { | 612 | if (ret < 0) { |
615 | PDEBUG(D_ERR, "reg_read err %d", ret); | 613 | PDEBUG(D_ERR, "reg_read err %d", ret); |
616 | return -1; | 614 | return -1; |
617 | } | 615 | } |
618 | return (buf[1] << 8) + buf[0]; | 616 | return (gspca_dev->usb_buf[1] << 8) + gspca_dev->usb_buf[0]; |
619 | } | 617 | } |
620 | 618 | ||
621 | static int write_vector(struct gspca_dev *gspca_dev, | 619 | static int write_vector(struct gspca_dev *gspca_dev, |
@@ -697,7 +695,7 @@ static int sd_open(struct gspca_dev *gspca_dev) | |||
697 | write_vector(gspca_dev, spca505b_open_data_ccd); | 695 | write_vector(gspca_dev, spca505b_open_data_ccd); |
698 | else | 696 | else |
699 | write_vector(gspca_dev, spca505_open_data_ccd); | 697 | write_vector(gspca_dev, spca505_open_data_ccd); |
700 | ret = reg_read(gspca_dev->dev, 6, 0x16, 2); | 698 | ret = reg_read(gspca_dev, 6, 0x16, 2); |
701 | 699 | ||
702 | if (ret < 0) { | 700 | if (ret < 0) { |
703 | PDEBUG(D_ERR|D_STREAM, | 701 | PDEBUG(D_ERR|D_STREAM, |
@@ -874,8 +872,8 @@ static void getbrightness(struct gspca_dev *gspca_dev) | |||
874 | struct sd *sd = (struct sd *) gspca_dev; | 872 | struct sd *sd = (struct sd *) gspca_dev; |
875 | 873 | ||
876 | sd->brightness = 255 | 874 | sd->brightness = 255 |
877 | - ((reg_read(gspca_dev->dev, 5, 0x01, 1) >> 2) | 875 | - ((reg_read(gspca_dev, 5, 0x01, 1) >> 2) |
878 | + (reg_read(gspca_dev->dev, 5, 0x0, 1) << 6)); | 876 | + (reg_read(gspca_dev, 5, 0x0, 1) << 6)); |
879 | } | 877 | } |
880 | 878 | ||
881 | static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) | 879 | static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) |
diff --git a/drivers/media/video/gspca/spca506.c b/drivers/media/video/gspca/spca506.c index 2d249b00bdcd..143203c1fd9f 100644 --- a/drivers/media/video/gspca/spca506.c +++ b/drivers/media/video/gspca/spca506.c | |||
@@ -25,8 +25,8 @@ | |||
25 | 25 | ||
26 | #include "gspca.h" | 26 | #include "gspca.h" |
27 | 27 | ||
28 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 28 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
29 | static const char version[] = "2.1.5"; | 29 | static const char version[] = "2.1.7"; |
30 | 30 | ||
31 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); | 31 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); |
32 | MODULE_DESCRIPTION("GSPCA/SPCA506 USB Camera Driver"); | 32 | MODULE_DESCRIPTION("GSPCA/SPCA506 USB Camera Driver"); |
@@ -153,17 +153,18 @@ static struct v4l2_pix_format vga_mode[] = { | |||
153 | #define SAA7113_hue 0x0d /* defaults 0x00 */ | 153 | #define SAA7113_hue 0x0d /* defaults 0x00 */ |
154 | #define SAA7113_I2C_BASE_WRITE 0x4a | 154 | #define SAA7113_I2C_BASE_WRITE 0x4a |
155 | 155 | ||
156 | static void reg_r(struct usb_device *dev, | 156 | /* read 'len' bytes to gspca_dev->usb_buf */ |
157 | static void reg_r(struct gspca_dev *gspca_dev, | ||
157 | __u16 req, | 158 | __u16 req, |
158 | __u16 index, | 159 | __u16 index, |
159 | __u8 *buffer, __u16 length) | 160 | __u16 length) |
160 | { | 161 | { |
161 | usb_control_msg(dev, | 162 | usb_control_msg(gspca_dev->dev, |
162 | usb_rcvctrlpipe(dev, 0), | 163 | usb_rcvctrlpipe(gspca_dev->dev, 0), |
163 | req, | 164 | req, |
164 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 165 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
165 | 0, /* value */ | 166 | 0, /* value */ |
166 | index, buffer, length, | 167 | index, gspca_dev->usb_buf, length, |
167 | 500); | 168 | 500); |
168 | } | 169 | } |
169 | 170 | ||
@@ -189,13 +190,12 @@ static void spca506_WriteI2c(struct gspca_dev *gspca_dev, __u16 valeur, | |||
189 | __u16 reg) | 190 | __u16 reg) |
190 | { | 191 | { |
191 | int retry = 60; | 192 | int retry = 60; |
192 | __u8 Data[2]; | ||
193 | 193 | ||
194 | reg_w(gspca_dev->dev, 0x07, reg, 0x0001); | 194 | reg_w(gspca_dev->dev, 0x07, reg, 0x0001); |
195 | reg_w(gspca_dev->dev, 0x07, valeur, 0x0000); | 195 | reg_w(gspca_dev->dev, 0x07, valeur, 0x0000); |
196 | while (retry--) { | 196 | while (retry--) { |
197 | reg_r(gspca_dev->dev, 0x07, 0x0003, Data, 2); | 197 | reg_r(gspca_dev, 0x07, 0x0003, 2); |
198 | if ((Data[0] | Data[1]) == 0x00) | 198 | if ((gspca_dev->usb_buf[0] | gspca_dev->usb_buf[1]) == 0x00) |
199 | break; | 199 | break; |
200 | } | 200 | } |
201 | } | 201 | } |
@@ -203,21 +203,19 @@ static void spca506_WriteI2c(struct gspca_dev *gspca_dev, __u16 valeur, | |||
203 | static int spca506_ReadI2c(struct gspca_dev *gspca_dev, __u16 reg) | 203 | static int spca506_ReadI2c(struct gspca_dev *gspca_dev, __u16 reg) |
204 | { | 204 | { |
205 | int retry = 60; | 205 | int retry = 60; |
206 | __u8 Data[2]; | ||
207 | __u8 value; | ||
208 | 206 | ||
209 | reg_w(gspca_dev->dev, 0x07, SAA7113_I2C_BASE_WRITE, 0x0004); | 207 | reg_w(gspca_dev->dev, 0x07, SAA7113_I2C_BASE_WRITE, 0x0004); |
210 | reg_w(gspca_dev->dev, 0x07, reg, 0x0001); | 208 | reg_w(gspca_dev->dev, 0x07, reg, 0x0001); |
211 | reg_w(gspca_dev->dev, 0x07, 0x01, 0x0002); | 209 | reg_w(gspca_dev->dev, 0x07, 0x01, 0x0002); |
212 | while (--retry) { | 210 | while (--retry) { |
213 | reg_r(gspca_dev->dev, 0x07, 0x0003, Data, 2); | 211 | reg_r(gspca_dev, 0x07, 0x0003, 2); |
214 | if ((Data[0] | Data[1]) == 0x00) | 212 | if ((gspca_dev->usb_buf[0] | gspca_dev->usb_buf[1]) == 0x00) |
215 | break; | 213 | break; |
216 | } | 214 | } |
217 | if (retry == 0) | 215 | if (retry == 0) |
218 | return -1; | 216 | return -1; |
219 | reg_r(gspca_dev->dev, 0x07, 0x0000, &value, 1); | 217 | reg_r(gspca_dev, 0x07, 0x0000, 1); |
220 | return value; | 218 | return gspca_dev->usb_buf[0]; |
221 | } | 219 | } |
222 | 220 | ||
223 | static void spca506_SetNormeInput(struct gspca_dev *gspca_dev, | 221 | static void spca506_SetNormeInput(struct gspca_dev *gspca_dev, |
@@ -437,7 +435,6 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
437 | struct usb_device *dev = gspca_dev->dev; | 435 | struct usb_device *dev = gspca_dev->dev; |
438 | __u16 norme; | 436 | __u16 norme; |
439 | __u16 channel; | 437 | __u16 channel; |
440 | __u8 Data[2]; | ||
441 | 438 | ||
442 | /**************************************/ | 439 | /**************************************/ |
443 | reg_w(dev, 0x03, 0x00, 0x0004); | 440 | reg_w(dev, 0x03, 0x00, 0x0004); |
@@ -555,8 +552,8 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
555 | /* compress setting and size */ | 552 | /* compress setting and size */ |
556 | /* set i2c luma */ | 553 | /* set i2c luma */ |
557 | reg_w(dev, 0x02, 0x01, 0x0000); | 554 | reg_w(dev, 0x02, 0x01, 0x0000); |
558 | reg_w(dev, 0x03, 0x12, 0x000); | 555 | reg_w(dev, 0x03, 0x12, 0x0000); |
559 | reg_r(dev, 0x04, 0x0001, Data, 2); | 556 | reg_r(gspca_dev, 0x04, 0x0001, 2); |
560 | PDEBUG(D_STREAM, "webcam started"); | 557 | PDEBUG(D_STREAM, "webcam started"); |
561 | spca506_GetNormeInput(gspca_dev, &norme, &channel); | 558 | spca506_GetNormeInput(gspca_dev, &norme, &channel); |
562 | spca506_SetNormeInput(gspca_dev, norme, channel); | 559 | spca506_SetNormeInput(gspca_dev, norme, channel); |
diff --git a/drivers/media/video/gspca/spca508.c b/drivers/media/video/gspca/spca508.c index 7f262f23841e..d8cd93866a4a 100644 --- a/drivers/media/video/gspca/spca508.c +++ b/drivers/media/video/gspca/spca508.c | |||
@@ -22,8 +22,8 @@ | |||
22 | 22 | ||
23 | #include "gspca.h" | 23 | #include "gspca.h" |
24 | 24 | ||
25 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 25 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
26 | static const char version[] = "2.1.5"; | 26 | static const char version[] = "2.1.7"; |
27 | 27 | ||
28 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); | 28 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); |
29 | MODULE_DESCRIPTION("GSPCA/SPCA508 USB Camera Driver"); | 29 | MODULE_DESCRIPTION("GSPCA/SPCA508 USB Camera Driver"); |
@@ -1433,26 +1433,26 @@ static int reg_write(struct usb_device *dev, | |||
1433 | 1433 | ||
1434 | /* read 1 byte */ | 1434 | /* read 1 byte */ |
1435 | /* returns: negative is error, pos or zero is data */ | 1435 | /* returns: negative is error, pos or zero is data */ |
1436 | static int reg_read(struct usb_device *dev, | 1436 | static int reg_read(struct gspca_dev *gspca_dev, |
1437 | __u16 index) /* wIndex */ | 1437 | __u16 index) /* wIndex */ |
1438 | { | 1438 | { |
1439 | int ret; | 1439 | int ret; |
1440 | __u8 data; | ||
1441 | 1440 | ||
1442 | ret = usb_control_msg(dev, | 1441 | ret = usb_control_msg(gspca_dev->dev, |
1443 | usb_rcvctrlpipe(dev, 0), | 1442 | usb_rcvctrlpipe(gspca_dev->dev, 0), |
1444 | 0, /* register */ | 1443 | 0, /* register */ |
1445 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 1444 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
1446 | (__u16) 0, /* value */ | 1445 | 0, /* value */ |
1447 | index, | 1446 | index, |
1448 | &data, 1, | 1447 | gspca_dev->usb_buf, 1, |
1449 | 500); /* timeout */ | 1448 | 500); /* timeout */ |
1450 | PDEBUG(D_USBI, "reg read i:%04x --> %02x", index, data); | 1449 | PDEBUG(D_USBI, "reg read i:%04x --> %02x", |
1450 | index, gspca_dev->usb_buf[0]); | ||
1451 | if (ret < 0) { | 1451 | if (ret < 0) { |
1452 | PDEBUG(D_ERR|D_USBI, "reg_read err %d", ret); | 1452 | PDEBUG(D_ERR|D_USBI, "reg_read err %d", ret); |
1453 | return ret; | 1453 | return ret; |
1454 | } | 1454 | } |
1455 | return data; | 1455 | return gspca_dev->usb_buf[0]; |
1456 | } | 1456 | } |
1457 | 1457 | ||
1458 | static int write_vector(struct gspca_dev *gspca_dev, | 1458 | static int write_vector(struct gspca_dev *gspca_dev, |
@@ -1475,15 +1475,12 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
1475 | const struct usb_device_id *id) | 1475 | const struct usb_device_id *id) |
1476 | { | 1476 | { |
1477 | struct sd *sd = (struct sd *) gspca_dev; | 1477 | struct sd *sd = (struct sd *) gspca_dev; |
1478 | struct usb_device *dev = gspca_dev->dev; | ||
1479 | struct cam *cam; | 1478 | struct cam *cam; |
1480 | __u16 vendor; | ||
1481 | __u16 product; | 1479 | __u16 product; |
1482 | int data1, data2; | 1480 | int data1, data2; |
1483 | 1481 | ||
1484 | vendor = id->idVendor; | ||
1485 | product = id->idProduct; | 1482 | product = id->idProduct; |
1486 | switch (vendor) { | 1483 | switch (id->idVendor) { |
1487 | case 0x0130: /* Clone webcam */ | 1484 | case 0x0130: /* Clone webcam */ |
1488 | /* switch (product) { */ | 1485 | /* switch (product) { */ |
1489 | /* case 0x0130: */ | 1486 | /* case 0x0130: */ |
@@ -1535,15 +1532,15 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
1535 | * prove that we can communicate with the device. This works, which | 1532 | * prove that we can communicate with the device. This works, which |
1536 | * confirms at we are communicating properly and that the device | 1533 | * confirms at we are communicating properly and that the device |
1537 | * is a 508. */ | 1534 | * is a 508. */ |
1538 | data1 = reg_read(dev, 0x8104); | 1535 | data1 = reg_read(gspca_dev, 0x8104); |
1539 | data2 = reg_read(dev, 0x8105); | 1536 | data2 = reg_read(gspca_dev, 0x8105); |
1540 | PDEBUG(D_PROBE, "Webcam Vendor ID: 0x%02x%02x", data2, data1); | 1537 | PDEBUG(D_PROBE, "Webcam Vendor ID: 0x%02x%02x", data2, data1); |
1541 | 1538 | ||
1542 | data1 = reg_read(dev, 0x8106); | 1539 | data1 = reg_read(gspca_dev, 0x8106); |
1543 | data2 = reg_read(dev, 0x8107); | 1540 | data2 = reg_read(gspca_dev, 0x8107); |
1544 | PDEBUG(D_PROBE, "Webcam Product ID: 0x%02x%02x", data2, data1); | 1541 | PDEBUG(D_PROBE, "Webcam Product ID: 0x%02x%02x", data2, data1); |
1545 | 1542 | ||
1546 | data1 = reg_read(dev, 0x8621); | 1543 | data1 = reg_read(gspca_dev, 0x8621); |
1547 | PDEBUG(D_PROBE, "Window 1 average luminance: %d", data1); | 1544 | PDEBUG(D_PROBE, "Window 1 average luminance: %d", data1); |
1548 | 1545 | ||
1549 | cam = &gspca_dev->cam; | 1546 | cam = &gspca_dev->cam; |
@@ -1711,7 +1708,7 @@ static void getbrightness(struct gspca_dev *gspca_dev) | |||
1711 | { | 1708 | { |
1712 | struct sd *sd = (struct sd *) gspca_dev; | 1709 | struct sd *sd = (struct sd *) gspca_dev; |
1713 | 1710 | ||
1714 | sd->brightness = reg_read(gspca_dev->dev, 0x8651); | 1711 | sd->brightness = reg_read(gspca_dev, 0x8651); |
1715 | } | 1712 | } |
1716 | 1713 | ||
1717 | static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) | 1714 | static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) |
diff --git a/drivers/media/video/gspca/spca561.c b/drivers/media/video/gspca/spca561.c index f0770ee595d8..b659bd0f788d 100644 --- a/drivers/media/video/gspca/spca561.c +++ b/drivers/media/video/gspca/spca561.c | |||
@@ -24,8 +24,8 @@ | |||
24 | 24 | ||
25 | #include "gspca.h" | 25 | #include "gspca.h" |
26 | 26 | ||
27 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 27 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
28 | static const char version[] = "2.1.5"; | 28 | static const char version[] = "2.1.7"; |
29 | 29 | ||
30 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); | 30 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); |
31 | MODULE_DESCRIPTION("GSPCA/SPCA561 USB Camera Driver"); | 31 | MODULE_DESCRIPTION("GSPCA/SPCA561 USB Camera Driver"); |
@@ -177,27 +177,28 @@ static void write_vector(struct gspca_dev *gspca_dev, | |||
177 | } | 177 | } |
178 | } | 178 | } |
179 | 179 | ||
180 | static void reg_r(struct usb_device *dev, | 180 | /* read 'len' bytes to gspca_dev->usb_buf */ |
181 | __u16 index, __u8 *buffer, __u16 length) | 181 | static void reg_r(struct gspca_dev *gspca_dev, |
182 | __u16 index, __u16 length) | ||
182 | { | 183 | { |
183 | usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), | 184 | usb_control_msg(gspca_dev->dev, |
185 | usb_rcvctrlpipe(gspca_dev->dev, 0), | ||
184 | 0, /* request */ | 186 | 0, /* request */ |
185 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 187 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
186 | 0, /* value */ | 188 | 0, /* value */ |
187 | index, buffer, length, 500); | 189 | index, gspca_dev->usb_buf, length, 500); |
188 | } | 190 | } |
189 | 191 | ||
190 | static void reg_w_buf(struct usb_device *dev, | 192 | static void reg_w_buf(struct gspca_dev *gspca_dev, |
191 | __u16 index, const __u8 *buffer, __u16 len) | 193 | __u16 index, const __u8 *buffer, __u16 len) |
192 | { | 194 | { |
193 | __u8 tmpbuf[8]; | 195 | memcpy(gspca_dev->usb_buf, buffer, len); |
194 | 196 | usb_control_msg(gspca_dev->dev, | |
195 | memcpy(tmpbuf, buffer, len); | 197 | usb_sndctrlpipe(gspca_dev->dev, 0), |
196 | usb_control_msg(dev, usb_sndctrlpipe(dev, 0), | ||
197 | 0, /* request */ | 198 | 0, /* request */ |
198 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 199 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
199 | 0, /* value */ | 200 | 0, /* value */ |
200 | index, tmpbuf, len, 500); | 201 | index, gspca_dev->usb_buf, len, 500); |
201 | } | 202 | } |
202 | 203 | ||
203 | static void i2c_init(struct gspca_dev *gspca_dev, __u8 mode) | 204 | static void i2c_init(struct gspca_dev *gspca_dev, __u8 mode) |
@@ -211,7 +212,6 @@ static void i2c_write(struct gspca_dev *gspca_dev, __u16 valeur, __u16 reg) | |||
211 | int retry = 60; | 212 | int retry = 60; |
212 | __u8 DataLow; | 213 | __u8 DataLow; |
213 | __u8 DataHight; | 214 | __u8 DataHight; |
214 | __u8 Data; | ||
215 | 215 | ||
216 | DataLow = valeur; | 216 | DataLow = valeur; |
217 | DataHight = valeur >> 8; | 217 | DataHight = valeur >> 8; |
@@ -219,8 +219,8 @@ static void i2c_write(struct gspca_dev *gspca_dev, __u16 valeur, __u16 reg) | |||
219 | reg_w_val(gspca_dev->dev, DataLow, 0x8805); | 219 | reg_w_val(gspca_dev->dev, DataLow, 0x8805); |
220 | reg_w_val(gspca_dev->dev, DataHight, 0x8800); | 220 | reg_w_val(gspca_dev->dev, DataHight, 0x8800); |
221 | while (retry--) { | 221 | while (retry--) { |
222 | reg_r(gspca_dev->dev, 0x8803, &Data, 1); | 222 | reg_r(gspca_dev, 0x8803, 1); |
223 | if (!Data) | 223 | if (!gspca_dev->usb_buf[0]) |
224 | break; | 224 | break; |
225 | } | 225 | } |
226 | } | 226 | } |
@@ -230,20 +230,21 @@ static int i2c_read(struct gspca_dev *gspca_dev, __u16 reg, __u8 mode) | |||
230 | int retry = 60; | 230 | int retry = 60; |
231 | __u8 value; | 231 | __u8 value; |
232 | __u8 vallsb; | 232 | __u8 vallsb; |
233 | __u8 Data; | ||
234 | 233 | ||
235 | reg_w_val(gspca_dev->dev, 0x92, 0x8804); | 234 | reg_w_val(gspca_dev->dev, 0x92, 0x8804); |
236 | reg_w_val(gspca_dev->dev, reg, 0x8801); | 235 | reg_w_val(gspca_dev->dev, reg, 0x8801); |
237 | reg_w_val(gspca_dev->dev, (mode | 0x01), 0x8802); | 236 | reg_w_val(gspca_dev->dev, (mode | 0x01), 0x8802); |
238 | while (retry--) { | 237 | while (retry--) { |
239 | reg_r(gspca_dev->dev, 0x8803, &Data, 1); | 238 | reg_r(gspca_dev, 0x8803, 1); |
240 | if (!Data) | 239 | if (!gspca_dev->usb_buf) |
241 | break; | 240 | break; |
242 | } | 241 | } |
243 | if (retry == 0) | 242 | if (retry == 0) |
244 | return -1; | 243 | return -1; |
245 | reg_r(gspca_dev->dev, 0x8800, &value, 1); | 244 | reg_r(gspca_dev, 0x8800, 1); |
246 | reg_r(gspca_dev->dev, 0x8805, &vallsb, 1); | 245 | value = gspca_dev->usb_buf[0]; |
246 | reg_r(gspca_dev, 0x8805, 1); | ||
247 | vallsb = gspca_dev->usb_buf[0]; | ||
247 | return ((int) value << 8) | vallsb; | 248 | return ((int) value << 8) | vallsb; |
248 | } | 249 | } |
249 | 250 | ||
@@ -541,7 +542,7 @@ static void sensor_mapwrite(struct gspca_dev *gspca_dev, | |||
541 | while (sensormap[i][0]) { | 542 | while (sensormap[i][0]) { |
542 | usbval[0] = sensormap[i][1]; | 543 | usbval[0] = sensormap[i][1]; |
543 | usbval[1] = sensormap[i][1] >> 8; | 544 | usbval[1] = sensormap[i][1] >> 8; |
544 | reg_w_buf(gspca_dev->dev, sensormap[i][0], usbval, 2); | 545 | reg_w_buf(gspca_dev, sensormap[i][0], usbval, 2); |
545 | i++; | 546 | i++; |
546 | } | 547 | } |
547 | } | 548 | } |
@@ -559,7 +560,6 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
559 | const struct usb_device_id *id) | 560 | const struct usb_device_id *id) |
560 | { | 561 | { |
561 | struct sd *sd = (struct sd *) gspca_dev; | 562 | struct sd *sd = (struct sd *) gspca_dev; |
562 | struct usb_device *dev = gspca_dev->dev; | ||
563 | struct cam *cam; | 563 | struct cam *cam; |
564 | __u16 vendor, product; | 564 | __u16 vendor, product; |
565 | __u8 data1, data2; | 565 | __u8 data1, data2; |
@@ -568,11 +568,15 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
568 | * prove that we can communicate with the device. This works, which | 568 | * prove that we can communicate with the device. This works, which |
569 | * confirms at we are communicating properly and that the device | 569 | * confirms at we are communicating properly and that the device |
570 | * is a 561. */ | 570 | * is a 561. */ |
571 | reg_r(dev, 0x8104, &data1, 1); | 571 | reg_r(gspca_dev, 0x8104, 1); |
572 | reg_r(dev, 0x8105, &data2, 1); | 572 | data1 = gspca_dev->usb_buf[0]; |
573 | reg_r(gspca_dev, 0x8105, 1); | ||
574 | data2 = gspca_dev->usb_buf[0]; | ||
573 | vendor = (data2 << 8) | data1; | 575 | vendor = (data2 << 8) | data1; |
574 | reg_r(dev, 0x8106, &data1, 1); | 576 | reg_r(gspca_dev, 0x8106, 1); |
575 | reg_r(dev, 0x8107, &data2, 1); | 577 | data1 = gspca_dev->usb_buf[0]; |
578 | reg_r(gspca_dev, 0x8107, 1); | ||
579 | data2 = gspca_dev->usb_buf[0]; | ||
576 | product = (data2 << 8) | data1; | 580 | product = (data2 << 8) | data1; |
577 | if (vendor != id->idVendor || product != id->idProduct) { | 581 | if (vendor != id->idVendor || product != id->idProduct) { |
578 | PDEBUG(D_PROBE, "Bad vendor / product from device"); | 582 | PDEBUG(D_PROBE, "Bad vendor / product from device"); |
@@ -656,8 +660,8 @@ static void setcontrast(struct gspca_dev *gspca_dev) | |||
656 | Reg8391[0] = expotimes & 0xff; /* exposure */ | 660 | Reg8391[0] = expotimes & 0xff; /* exposure */ |
657 | Reg8391[1] = 0x18 | (expotimes >> 8); | 661 | Reg8391[1] = 0x18 | (expotimes >> 8); |
658 | Reg8391[2] = sd->brightness; /* gain */ | 662 | Reg8391[2] = sd->brightness; /* gain */ |
659 | reg_w_buf(dev, 0x8391, Reg8391, 8); | 663 | reg_w_buf(gspca_dev, 0x8391, Reg8391, 8); |
660 | reg_w_buf(dev, 0x8390, Reg8391, 8); | 664 | reg_w_buf(gspca_dev, 0x8390, Reg8391, 8); |
661 | break; | 665 | break; |
662 | } | 666 | } |
663 | } | 667 | } |
@@ -714,10 +718,11 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
714 | * is sufficient to push raw frames at ~20fps */ | 718 | * is sufficient to push raw frames at ~20fps */ |
715 | reg_w_val(dev, 0x8500, mode); | 719 | reg_w_val(dev, 0x8500, mode); |
716 | } /* -- qq@kuku.eu.org */ | 720 | } /* -- qq@kuku.eu.org */ |
717 | reg_w_buf(dev, 0x8307, Reg8307, 2); | 721 | reg_w_buf(gspca_dev, 0x8307, Reg8307, 2); |
718 | reg_w_val(dev, 0x8700, Clck); /* 0x8f 0x85 0x27 clock */ | 722 | reg_w_val(gspca_dev->dev, 0x8700, Clck); |
719 | reg_w_val(dev, 0x8112, 0x1e | 0x20); | 723 | /* 0x8f 0x85 0x27 clock */ |
720 | reg_w_val(dev, 0x850b, 0x03); | 724 | reg_w_val(gspca_dev->dev, 0x8112, 0x1e | 0x20); |
725 | reg_w_val(gspca_dev->dev, 0x850b, 0x03); | ||
721 | setcontrast(gspca_dev); | 726 | setcontrast(gspca_dev); |
722 | break; | 727 | break; |
723 | } | 728 | } |
@@ -752,10 +757,14 @@ static void setautogain(struct gspca_dev *gspca_dev) | |||
752 | 757 | ||
753 | switch (sd->chip_revision) { | 758 | switch (sd->chip_revision) { |
754 | case Rev072A: | 759 | case Rev072A: |
755 | reg_r(gspca_dev->dev, 0x8621, &Gr, 1); | 760 | reg_r(gspca_dev, 0x8621, 1); |
756 | reg_r(gspca_dev->dev, 0x8622, &R, 1); | 761 | Gr = gspca_dev->usb_buf[0]; |
757 | reg_r(gspca_dev->dev, 0x8623, &B, 1); | 762 | reg_r(gspca_dev, 0x8622, 1); |
758 | reg_r(gspca_dev->dev, 0x8624, &Gb, 1); | 763 | R = gspca_dev->usb_buf[0]; |
764 | reg_r(gspca_dev, 0x8623, 1); | ||
765 | B = gspca_dev->usb_buf[0]; | ||
766 | reg_r(gspca_dev, 0x8624, 1); | ||
767 | Gb = gspca_dev->usb_buf[0]; | ||
759 | y = (77 * R + 75 * (Gr + Gb) + 29 * B) >> 8; | 768 | y = (77 * R + 75 * (Gr + Gb) + 29 * B) >> 8; |
760 | /* u= (128*B-(43*(Gr+Gb+R))) >> 8; */ | 769 | /* u= (128*B-(43*(Gr+Gb+R))) >> 8; */ |
761 | /* v= (128*R-(53*(Gr+Gb))-21*B) >> 8; */ | 770 | /* v= (128*R-(53*(Gr+Gb))-21*B) >> 8; */ |
@@ -867,20 +876,19 @@ static void setbrightness(struct gspca_dev *gspca_dev) | |||
867 | static void getbrightness(struct gspca_dev *gspca_dev) | 876 | static void getbrightness(struct gspca_dev *gspca_dev) |
868 | { | 877 | { |
869 | struct sd *sd = (struct sd *) gspca_dev; | 878 | struct sd *sd = (struct sd *) gspca_dev; |
870 | __u8 value; | ||
871 | __u16 tot; | 879 | __u16 tot; |
872 | 880 | ||
873 | switch (sd->chip_revision) { | 881 | switch (sd->chip_revision) { |
874 | case Rev072A: | 882 | case Rev072A: |
875 | tot = 0; | 883 | tot = 0; |
876 | reg_r(gspca_dev->dev, 0x8611, &value, 1); | 884 | reg_r(gspca_dev, 0x8611, 1); |
877 | tot += value; | 885 | tot += gspca_dev->usb_buf[0]; |
878 | reg_r(gspca_dev->dev, 0x8612, &value, 1); | 886 | reg_r(gspca_dev, 0x8612, 1); |
879 | tot += value; | 887 | tot += gspca_dev->usb_buf[0]; |
880 | reg_r(gspca_dev->dev, 0x8613, &value, 1); | 888 | reg_r(gspca_dev, 0x8613, 1); |
881 | tot += value; | 889 | tot += gspca_dev->usb_buf[0]; |
882 | reg_r(gspca_dev->dev, 0x8614, &value, 1); | 890 | reg_r(gspca_dev, 0x8614, 1); |
883 | tot += value; | 891 | tot += gspca_dev->usb_buf[0]; |
884 | sd->brightness = tot >> 2; | 892 | sd->brightness = tot >> 2; |
885 | break; | 893 | break; |
886 | default: | 894 | default: |
@@ -893,20 +901,19 @@ static void getbrightness(struct gspca_dev *gspca_dev) | |||
893 | static void getcontrast(struct gspca_dev *gspca_dev) | 901 | static void getcontrast(struct gspca_dev *gspca_dev) |
894 | { | 902 | { |
895 | struct sd *sd = (struct sd *) gspca_dev; | 903 | struct sd *sd = (struct sd *) gspca_dev; |
896 | __u8 value; | ||
897 | __u16 tot; | 904 | __u16 tot; |
898 | 905 | ||
899 | switch (sd->chip_revision) { | 906 | switch (sd->chip_revision) { |
900 | case Rev072A: | 907 | case Rev072A: |
901 | tot = 0; | 908 | tot = 0; |
902 | reg_r(gspca_dev->dev, 0x8651, &value, 1); | 909 | reg_r(gspca_dev, 0x8651, 1); |
903 | tot += value; | 910 | tot += gspca_dev->usb_buf[0]; |
904 | reg_r(gspca_dev->dev, 0x8652, &value, 1); | 911 | reg_r(gspca_dev, 0x8652, 1); |
905 | tot += value; | 912 | tot += gspca_dev->usb_buf[0]; |
906 | reg_r(gspca_dev->dev, 0x8653, &value, 1); | 913 | reg_r(gspca_dev, 0x8653, 1); |
907 | tot += value; | 914 | tot += gspca_dev->usb_buf[0]; |
908 | reg_r(gspca_dev->dev, 0x8654, &value, 1); | 915 | reg_r(gspca_dev, 0x8654, 1); |
909 | tot += value; | 916 | tot += gspca_dev->usb_buf[0]; |
910 | sd->contrast = tot << 6; | 917 | sd->contrast = tot << 6; |
911 | break; | 918 | break; |
912 | default: | 919 | default: |
diff --git a/drivers/media/video/gspca/stk014.c b/drivers/media/video/gspca/stk014.c index d676cd16aa74..c78ee0d3e59b 100644 --- a/drivers/media/video/gspca/stk014.c +++ b/drivers/media/video/gspca/stk014.c | |||
@@ -23,8 +23,8 @@ | |||
23 | #include "gspca.h" | 23 | #include "gspca.h" |
24 | #include "jpeg.h" | 24 | #include "jpeg.h" |
25 | 25 | ||
26 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 26 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
27 | static const char version[] = "2.1.5"; | 27 | static const char version[] = "2.1.7"; |
28 | 28 | ||
29 | MODULE_AUTHOR("Jean-Francois Moine <http://moinejf.free.fr>"); | 29 | MODULE_AUTHOR("Jean-Francois Moine <http://moinejf.free.fr>"); |
30 | MODULE_DESCRIPTION("Syntek DV4000 (STK014) USB Camera Driver"); | 30 | MODULE_DESCRIPTION("Syntek DV4000 (STK014) USB Camera Driver"); |
@@ -127,7 +127,7 @@ static struct v4l2_pix_format vga_mode[] = { | |||
127 | 127 | ||
128 | /* -- read a register -- */ | 128 | /* -- read a register -- */ |
129 | static int reg_r(struct gspca_dev *gspca_dev, | 129 | static int reg_r(struct gspca_dev *gspca_dev, |
130 | __u16 index, __u8 *buf) | 130 | __u16 index) |
131 | { | 131 | { |
132 | struct usb_device *dev = gspca_dev->dev; | 132 | struct usb_device *dev = gspca_dev->dev; |
133 | int ret; | 133 | int ret; |
@@ -137,11 +137,13 @@ static int reg_r(struct gspca_dev *gspca_dev, | |||
137 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 137 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
138 | 0x00, | 138 | 0x00, |
139 | index, | 139 | index, |
140 | buf, 1, | 140 | gspca_dev->usb_buf, 1, |
141 | 500); | 141 | 500); |
142 | if (ret < 0) | 142 | if (ret < 0) { |
143 | PDEBUG(D_ERR, "reg_r err %d", ret); | 143 | PDEBUG(D_ERR, "reg_r err %d", ret); |
144 | return ret; | 144 | return ret; |
145 | } | ||
146 | return gspca_dev->usb_buf[0]; | ||
145 | } | 147 | } |
146 | 148 | ||
147 | /* -- write a register -- */ | 149 | /* -- write a register -- */ |
@@ -164,58 +166,55 @@ static int reg_w(struct gspca_dev *gspca_dev, | |||
164 | return ret; | 166 | return ret; |
165 | } | 167 | } |
166 | 168 | ||
167 | /* -- get a value -- */ | 169 | /* -- get a bulk value (4 bytes) -- */ |
168 | static int rcv_val(struct gspca_dev *gspca_dev, | 170 | static int rcv_val(struct gspca_dev *gspca_dev, |
169 | int ads, | 171 | int ads) |
170 | int len) | ||
171 | { | 172 | { |
172 | struct usb_device *dev = gspca_dev->dev; | 173 | struct usb_device *dev = gspca_dev->dev; |
173 | int alen, ret; | 174 | int alen, ret; |
174 | unsigned char bulk_buf[4]; | ||
175 | 175 | ||
176 | reg_w(gspca_dev, 0x634, (ads >> 16) & 0xff); | 176 | reg_w(gspca_dev, 0x634, (ads >> 16) & 0xff); |
177 | reg_w(gspca_dev, 0x635, (ads >> 8) & 0xff); | 177 | reg_w(gspca_dev, 0x635, (ads >> 8) & 0xff); |
178 | reg_w(gspca_dev, 0x636, ads & 0xff); | 178 | reg_w(gspca_dev, 0x636, ads & 0xff); |
179 | reg_w(gspca_dev, 0x637, 0); | 179 | reg_w(gspca_dev, 0x637, 0); |
180 | reg_w(gspca_dev, 0x638, len & 0xff); | 180 | reg_w(gspca_dev, 0x638, 4); /* len & 0xff */ |
181 | reg_w(gspca_dev, 0x639, len >> 8); | 181 | reg_w(gspca_dev, 0x639, 0); /* len >> 8 */ |
182 | reg_w(gspca_dev, 0x63a, 0); | 182 | reg_w(gspca_dev, 0x63a, 0); |
183 | reg_w(gspca_dev, 0x63b, 0); | 183 | reg_w(gspca_dev, 0x63b, 0); |
184 | reg_w(gspca_dev, 0x630, 5); | 184 | reg_w(gspca_dev, 0x630, 5); |
185 | if (len > sizeof bulk_buf) | ||
186 | return -1; | ||
187 | ret = usb_bulk_msg(dev, | 185 | ret = usb_bulk_msg(dev, |
188 | usb_rcvbulkpipe(dev, 5), | 186 | usb_rcvbulkpipe(dev, 5), |
189 | bulk_buf, | 187 | gspca_dev->usb_buf, |
190 | len, | 188 | 4, /* length */ |
191 | &alen, | 189 | &alen, |
192 | 500); /* timeout in milliseconds */ | 190 | 500); /* timeout in milliseconds */ |
193 | return ret; | 191 | return ret; |
194 | } | 192 | } |
195 | 193 | ||
196 | /* -- send a value -- */ | 194 | /* -- send a bulk value -- */ |
197 | static int snd_val(struct gspca_dev *gspca_dev, | 195 | static int snd_val(struct gspca_dev *gspca_dev, |
198 | int ads, | 196 | int ads, |
199 | unsigned int val) | 197 | unsigned int val) |
200 | { | 198 | { |
201 | struct usb_device *dev = gspca_dev->dev; | 199 | struct usb_device *dev = gspca_dev->dev; |
202 | int alen, ret; | 200 | int alen, ret; |
203 | __u8 value, seq; | 201 | __u8 seq = 0; |
204 | unsigned char bulk_buf[4]; | ||
205 | 202 | ||
206 | if (ads == 0x003f08) { | 203 | if (ads == 0x003f08) { |
207 | ret = reg_r(gspca_dev, 0x0704, &value); | 204 | ret = reg_r(gspca_dev, 0x0704); |
208 | if (ret < 0) | 205 | if (ret < 0) |
209 | goto ko; | 206 | goto ko; |
210 | ret = reg_r(gspca_dev, 0x0705, &seq); | 207 | ret = reg_r(gspca_dev, 0x0705); |
211 | if (ret < 0) | 208 | if (ret < 0) |
212 | goto ko; | 209 | goto ko; |
213 | ret = reg_r(gspca_dev, 0x0650, &value); | 210 | seq = ret; /* keep the sequence number */ |
211 | ret = reg_r(gspca_dev, 0x0650); | ||
214 | if (ret < 0) | 212 | if (ret < 0) |
215 | goto ko; | 213 | goto ko; |
216 | reg_w(gspca_dev, 0x654, seq); | 214 | reg_w(gspca_dev, 0x654, seq); |
217 | } else | 215 | } else { |
218 | reg_w(gspca_dev, 0x654, (ads >> 16) & 0xff); | 216 | reg_w(gspca_dev, 0x654, (ads >> 16) & 0xff); |
217 | } | ||
219 | reg_w(gspca_dev, 0x655, (ads >> 8) & 0xff); | 218 | reg_w(gspca_dev, 0x655, (ads >> 8) & 0xff); |
220 | reg_w(gspca_dev, 0x656, ads & 0xff); | 219 | reg_w(gspca_dev, 0x656, ads & 0xff); |
221 | reg_w(gspca_dev, 0x657, 0); | 220 | reg_w(gspca_dev, 0x657, 0); |
@@ -224,13 +223,13 @@ static int snd_val(struct gspca_dev *gspca_dev, | |||
224 | reg_w(gspca_dev, 0x65a, 0); | 223 | reg_w(gspca_dev, 0x65a, 0); |
225 | reg_w(gspca_dev, 0x65b, 0); | 224 | reg_w(gspca_dev, 0x65b, 0); |
226 | reg_w(gspca_dev, 0x650, 5); | 225 | reg_w(gspca_dev, 0x650, 5); |
227 | bulk_buf[0] = (val >> 24) & 0xff; | 226 | gspca_dev->usb_buf[0] = val >> 24; |
228 | bulk_buf[1] = (val >> 16) & 0xff; | 227 | gspca_dev->usb_buf[1] = val >> 16; |
229 | bulk_buf[2] = (val >> 8) & 0xff; | 228 | gspca_dev->usb_buf[2] = val >> 8; |
230 | bulk_buf[3] = val & 0xff; | 229 | gspca_dev->usb_buf[3] = val; |
231 | ret = usb_bulk_msg(dev, | 230 | ret = usb_bulk_msg(dev, |
232 | usb_sndbulkpipe(dev, 6), | 231 | usb_sndbulkpipe(dev, 6), |
233 | bulk_buf, | 232 | gspca_dev->usb_buf, |
234 | 4, | 233 | 4, |
235 | &alen, | 234 | &alen, |
236 | 500); /* timeout in milliseconds */ | 235 | 500); /* timeout in milliseconds */ |
@@ -303,7 +302,7 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
303 | cam->dev_name = (char *) id->driver_info; | 302 | cam->dev_name = (char *) id->driver_info; |
304 | cam->epaddr = 0x02; | 303 | cam->epaddr = 0x02; |
305 | gspca_dev->cam.cam_mode = vga_mode; | 304 | gspca_dev->cam.cam_mode = vga_mode; |
306 | gspca_dev->cam.nmodes = sizeof vga_mode / sizeof vga_mode[0]; | 305 | gspca_dev->cam.nmodes = ARRAY_SIZE(vga_mode); |
307 | sd->brightness = BRIGHTNESS_DEF; | 306 | sd->brightness = BRIGHTNESS_DEF; |
308 | sd->contrast = CONTRAST_DEF; | 307 | sd->contrast = CONTRAST_DEF; |
309 | sd->colors = COLOR_DEF; | 308 | sd->colors = COLOR_DEF; |
@@ -314,16 +313,15 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
314 | /* this function is called at open time */ | 313 | /* this function is called at open time */ |
315 | static int sd_open(struct gspca_dev *gspca_dev) | 314 | static int sd_open(struct gspca_dev *gspca_dev) |
316 | { | 315 | { |
317 | __u8 value; | ||
318 | int ret; | 316 | int ret; |
319 | 317 | ||
320 | /* check if the device responds */ | 318 | /* check if the device responds */ |
321 | usb_set_interface(gspca_dev->dev, gspca_dev->iface, 1); | 319 | usb_set_interface(gspca_dev->dev, gspca_dev->iface, 1); |
322 | ret = reg_r(gspca_dev, 0x0740, &value); | 320 | ret = reg_r(gspca_dev, 0x0740); |
323 | if (ret < 0) | 321 | if (ret < 0) |
324 | return ret; | 322 | return ret; |
325 | if (value != 0xff) { | 323 | if (ret != 0xff) { |
326 | PDEBUG(D_ERR|D_STREAM, "init reg: 0x%02x", value); | 324 | PDEBUG(D_ERR|D_STREAM, "init reg: 0x%02x", ret); |
327 | return -1; | 325 | return -1; |
328 | } | 326 | } |
329 | return 0; | 327 | return 0; |
@@ -332,7 +330,6 @@ static int sd_open(struct gspca_dev *gspca_dev) | |||
332 | /* -- start the camera -- */ | 330 | /* -- start the camera -- */ |
333 | static void sd_start(struct gspca_dev *gspca_dev) | 331 | static void sd_start(struct gspca_dev *gspca_dev) |
334 | { | 332 | { |
335 | __u8 dum; | ||
336 | int ret, value; | 333 | int ret, value; |
337 | 334 | ||
338 | /* work on alternate 1 */ | 335 | /* work on alternate 1 */ |
@@ -355,11 +352,11 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
355 | gspca_dev->iface, gspca_dev->alt); | 352 | gspca_dev->iface, gspca_dev->alt); |
356 | goto out; | 353 | goto out; |
357 | } | 354 | } |
358 | ret = reg_r(gspca_dev, 0x0630, &dum); | 355 | ret = reg_r(gspca_dev, 0x0630); |
359 | if (ret < 0) | 356 | if (ret < 0) |
360 | goto out; | 357 | goto out; |
361 | rcv_val(gspca_dev, 0x000020, 4); /* << (value ff ff ff ff) */ | 358 | rcv_val(gspca_dev, 0x000020); /* << (value ff ff ff ff) */ |
362 | ret = reg_r(gspca_dev, 0x0650, &dum); | 359 | ret = reg_r(gspca_dev, 0x0650); |
363 | if (ret < 0) | 360 | if (ret < 0) |
364 | goto out; | 361 | goto out; |
365 | snd_val(gspca_dev, 0x000020, 0xffffffff); | 362 | snd_val(gspca_dev, 0x000020, 0xffffffff); |
@@ -389,14 +386,13 @@ out: | |||
389 | static void sd_stopN(struct gspca_dev *gspca_dev) | 386 | static void sd_stopN(struct gspca_dev *gspca_dev) |
390 | { | 387 | { |
391 | struct usb_device *dev = gspca_dev->dev; | 388 | struct usb_device *dev = gspca_dev->dev; |
392 | __u8 value; | ||
393 | 389 | ||
394 | set_par(gspca_dev, 0x02000000); | 390 | set_par(gspca_dev, 0x02000000); |
395 | set_par(gspca_dev, 0x02000000); | 391 | set_par(gspca_dev, 0x02000000); |
396 | usb_set_interface(dev, gspca_dev->iface, 1); | 392 | usb_set_interface(dev, gspca_dev->iface, 1); |
397 | reg_r(gspca_dev, 0x0630, &value); | 393 | reg_r(gspca_dev, 0x0630); |
398 | rcv_val(gspca_dev, 0x000020, 4); /* << (value ff ff ff ff) */ | 394 | rcv_val(gspca_dev, 0x000020); /* << (value ff ff ff ff) */ |
399 | reg_r(gspca_dev, 0x0650, &value); | 395 | reg_r(gspca_dev, 0x0650); |
400 | snd_val(gspca_dev, 0x000020, 0xffffffff); | 396 | snd_val(gspca_dev, 0x000020, 0xffffffff); |
401 | reg_w(gspca_dev, 0x0620, 0); | 397 | reg_w(gspca_dev, 0x0620, 0); |
402 | reg_w(gspca_dev, 0x0630, 0); | 398 | reg_w(gspca_dev, 0x0630, 0); |
@@ -538,10 +534,10 @@ static int sd_querymenu(struct gspca_dev *gspca_dev, | |||
538 | } | 534 | } |
539 | 535 | ||
540 | /* sub-driver description */ | 536 | /* sub-driver description */ |
541 | static struct sd_desc sd_desc = { | 537 | static const struct sd_desc sd_desc = { |
542 | .name = MODULE_NAME, | 538 | .name = MODULE_NAME, |
543 | .ctrls = sd_ctrls, | 539 | .ctrls = sd_ctrls, |
544 | .nctrls = sizeof sd_ctrls / sizeof sd_ctrls[0], | 540 | .nctrls = ARRAY_SIZE(sd_ctrls), |
545 | .config = sd_config, | 541 | .config = sd_config, |
546 | .open = sd_open, | 542 | .open = sd_open, |
547 | .start = sd_start, | 543 | .start = sd_start, |
@@ -554,7 +550,7 @@ static struct sd_desc sd_desc = { | |||
554 | 550 | ||
555 | /* -- module initialisation -- */ | 551 | /* -- module initialisation -- */ |
556 | #define DVNM(name) .driver_info = (kernel_ulong_t) name | 552 | #define DVNM(name) .driver_info = (kernel_ulong_t) name |
557 | static __devinitdata struct usb_device_id device_table[] = { | 553 | static const __devinitdata struct usb_device_id device_table[] = { |
558 | {USB_DEVICE(0x05e1, 0x0893), DVNM("Syntek DV4000")}, | 554 | {USB_DEVICE(0x05e1, 0x0893), DVNM("Syntek DV4000")}, |
559 | {} | 555 | {} |
560 | }; | 556 | }; |
diff --git a/drivers/media/video/gspca/sunplus.c b/drivers/media/video/gspca/sunplus.c index f66594a113a7..acd4a077198a 100644 --- a/drivers/media/video/gspca/sunplus.c +++ b/drivers/media/video/gspca/sunplus.c | |||
@@ -24,8 +24,8 @@ | |||
24 | #include "gspca.h" | 24 | #include "gspca.h" |
25 | #include "jpeg.h" | 25 | #include "jpeg.h" |
26 | 26 | ||
27 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 27 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
28 | static const char version[] = "2.1.5"; | 28 | static const char version[] = "2.1.7"; |
29 | 29 | ||
30 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); | 30 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); |
31 | MODULE_DESCRIPTION("GSPCA/SPCA5xx USB Camera Driver"); | 31 | MODULE_DESCRIPTION("GSPCA/SPCA5xx USB Camera Driver"); |
@@ -452,7 +452,7 @@ static const __u8 qtable_spca504_default[2][64] = { | |||
452 | 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e} | 452 | 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e} |
453 | }; | 453 | }; |
454 | 454 | ||
455 | static void spca5xxRegRead(struct usb_device *dev, | 455 | static void reg_r(struct usb_device *dev, |
456 | __u16 req, | 456 | __u16 req, |
457 | __u16 index, | 457 | __u16 index, |
458 | __u8 *buffer, __u16 length) | 458 | __u8 *buffer, __u16 length) |
@@ -466,7 +466,7 @@ static void spca5xxRegRead(struct usb_device *dev, | |||
466 | 500); | 466 | 500); |
467 | } | 467 | } |
468 | 468 | ||
469 | static void spca5xxRegWrite(struct usb_device *dev, | 469 | static void reg_w(struct usb_device *dev, |
470 | __u16 req, | 470 | __u16 req, |
471 | __u16 value, | 471 | __u16 value, |
472 | __u16 index, | 472 | __u16 index, |
@@ -480,7 +480,8 @@ static void spca5xxRegWrite(struct usb_device *dev, | |||
480 | 500); | 480 | 500); |
481 | } | 481 | } |
482 | 482 | ||
483 | static int reg_write(struct usb_device *dev, | 483 | /* write req / index / value */ |
484 | static int reg_w_riv(struct usb_device *dev, | ||
484 | __u16 req, __u16 index, __u16 value) | 485 | __u16 req, __u16 index, __u16 value) |
485 | { | 486 | { |
486 | int ret; | 487 | int ret; |
@@ -490,57 +491,56 @@ static int reg_write(struct usb_device *dev, | |||
490 | req, | 491 | req, |
491 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 492 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
492 | value, index, NULL, 0, 500); | 493 | value, index, NULL, 0, 500); |
493 | PDEBUG(D_PACK, "reg write: 0x%02x,0x%02x:0x%02x, 0x%x", | 494 | PDEBUG(D_USBO, "reg write: 0x%02x,0x%02x:0x%02x, %d", |
494 | req, index, value, ret); | 495 | req, index, value, ret); |
495 | if (ret < 0) | 496 | if (ret < 0) |
496 | PDEBUG(D_ERR, "reg write: error %d", ret); | 497 | PDEBUG(D_ERR, "reg write: error %d", ret); |
497 | return ret; | 498 | return ret; |
498 | } | 499 | } |
499 | 500 | ||
500 | static int reg_read_info(struct usb_device *dev, | 501 | /* read 1 byte */ |
502 | static int reg_r_1(struct gspca_dev *gspca_dev, | ||
501 | __u16 value) /* wValue */ | 503 | __u16 value) /* wValue */ |
502 | { | 504 | { |
503 | int ret; | 505 | int ret; |
504 | __u8 data; | ||
505 | 506 | ||
506 | ret = usb_control_msg(dev, | 507 | ret = usb_control_msg(gspca_dev->dev, |
507 | usb_rcvctrlpipe(dev, 0), | 508 | usb_rcvctrlpipe(gspca_dev->dev, 0), |
508 | 0x20, /* request */ | 509 | 0x20, /* request */ |
509 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 510 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
510 | value, | 511 | value, |
511 | 0, /* index */ | 512 | 0, /* index */ |
512 | &data, 1, | 513 | gspca_dev->usb_buf, 1, |
513 | 500); /* timeout */ | 514 | 500); /* timeout */ |
514 | if (ret < 0) { | 515 | if (ret < 0) { |
515 | PDEBUG(D_ERR, "reg_read_info err %d", ret); | 516 | PDEBUG(D_ERR, "reg_r_1 err %d", ret); |
516 | return 0; | 517 | return 0; |
517 | } | 518 | } |
518 | return data; | 519 | return gspca_dev->usb_buf[0]; |
519 | } | 520 | } |
520 | 521 | ||
521 | /* returns: negative is error, pos or zero is data */ | 522 | /* read 1 or 2 bytes - returns < 0 if error */ |
522 | static int reg_read(struct usb_device *dev, | 523 | static int reg_r_12(struct gspca_dev *gspca_dev, |
523 | __u16 req, /* bRequest */ | 524 | __u16 req, /* bRequest */ |
524 | __u16 index, /* wIndex */ | 525 | __u16 index, /* wIndex */ |
525 | __u16 length) /* wLength (1 or 2 only) */ | 526 | __u16 length) /* wLength (1 or 2 only) */ |
526 | { | 527 | { |
527 | int ret; | 528 | int ret; |
528 | __u8 buf[2]; | ||
529 | 529 | ||
530 | buf[1] = 0; | 530 | gspca_dev->usb_buf[1] = 0; |
531 | ret = usb_control_msg(dev, | 531 | ret = usb_control_msg(gspca_dev->dev, |
532 | usb_rcvctrlpipe(dev, 0), | 532 | usb_rcvctrlpipe(gspca_dev->dev, 0), |
533 | req, | 533 | req, |
534 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 534 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
535 | 0, /* value */ | 535 | 0, /* value */ |
536 | index, | 536 | index, |
537 | buf, length, | 537 | gspca_dev->usb_buf, length, |
538 | 500); | 538 | 500); |
539 | if (ret < 0) { | 539 | if (ret < 0) { |
540 | PDEBUG(D_ERR, "reg_read err %d", ret); | 540 | PDEBUG(D_ERR, "reg_read err %d", ret); |
541 | return -1; | 541 | return -1; |
542 | } | 542 | } |
543 | return (buf[1] << 8) + buf[0]; | 543 | return (gspca_dev->usb_buf[1] << 8) + gspca_dev->usb_buf[0]; |
544 | } | 544 | } |
545 | 545 | ||
546 | static int write_vector(struct gspca_dev *gspca_dev, | 546 | static int write_vector(struct gspca_dev *gspca_dev, |
@@ -550,7 +550,7 @@ static int write_vector(struct gspca_dev *gspca_dev, | |||
550 | int ret, i = 0; | 550 | int ret, i = 0; |
551 | 551 | ||
552 | while (data[i][0] != 0 || data[i][1] != 0 || data[i][2] != 0) { | 552 | while (data[i][0] != 0 || data[i][1] != 0 || data[i][2] != 0) { |
553 | ret = reg_write(dev, data[i][0], data[i][2], data[i][1]); | 553 | ret = reg_w_riv(dev, data[i][0], data[i][2], data[i][1]); |
554 | if (ret < 0) { | 554 | if (ret < 0) { |
555 | PDEBUG(D_ERR, | 555 | PDEBUG(D_ERR, |
556 | "Register write failed for 0x%x,0x%x,0x%x", | 556 | "Register write failed for 0x%x,0x%x,0x%x", |
@@ -573,14 +573,14 @@ static int spca50x_setup_qtable(struct gspca_dev *gspca_dev, | |||
573 | 573 | ||
574 | /* loop over y components */ | 574 | /* loop over y components */ |
575 | for (i = 0; i < 64; i++) { | 575 | for (i = 0; i < 64; i++) { |
576 | err = reg_write(dev, request, ybase + i, qtable[0][i]); | 576 | err = reg_w_riv(dev, request, ybase + i, qtable[0][i]); |
577 | if (err < 0) | 577 | if (err < 0) |
578 | return err; | 578 | return err; |
579 | } | 579 | } |
580 | 580 | ||
581 | /* loop over c components */ | 581 | /* loop over c components */ |
582 | for (i = 0; i < 64; i++) { | 582 | for (i = 0; i < 64; i++) { |
583 | err = reg_write(dev, request, cbase + i, qtable[1][i]); | 583 | err = reg_w_riv(dev, request, cbase + i, qtable[1][i]); |
584 | if (err < 0) | 584 | if (err < 0) |
585 | return err; | 585 | return err; |
586 | } | 586 | } |
@@ -593,14 +593,14 @@ static void spca504_acknowledged_command(struct gspca_dev *gspca_dev, | |||
593 | struct usb_device *dev = gspca_dev->dev; | 593 | struct usb_device *dev = gspca_dev->dev; |
594 | __u8 notdone; | 594 | __u8 notdone; |
595 | 595 | ||
596 | reg_write(dev, req, idx, val); | 596 | reg_w_riv(dev, req, idx, val); |
597 | notdone = reg_read(dev, 0x01, 0x0001, 1); | 597 | notdone = reg_r_12(gspca_dev, 0x01, 0x0001, 1); |
598 | reg_write(dev, req, idx, val); | 598 | reg_w_riv(dev, req, idx, val); |
599 | 599 | ||
600 | PDEBUG(D_FRAM, "before wait 0x%x", notdone); | 600 | PDEBUG(D_FRAM, "before wait 0x%x", notdone); |
601 | 601 | ||
602 | msleep(200); | 602 | msleep(200); |
603 | notdone = reg_read(dev, 0x01, 0x0001, 1); | 603 | notdone = reg_r_12(gspca_dev, 0x01, 0x0001, 1); |
604 | PDEBUG(D_FRAM, "after wait 0x%x", notdone); | 604 | PDEBUG(D_FRAM, "after wait 0x%x", notdone); |
605 | } | 605 | } |
606 | 606 | ||
@@ -612,8 +612,8 @@ static void spca504A_acknowledged_command(struct gspca_dev *gspca_dev, | |||
612 | __u8 status; | 612 | __u8 status; |
613 | __u8 endcode; | 613 | __u8 endcode; |
614 | 614 | ||
615 | reg_write(dev, req, idx, val); | 615 | reg_w_riv(dev, req, idx, val); |
616 | status = reg_read(dev, 0x01, 0x0001, 1); | 616 | status = reg_r_12(gspca_dev, 0x01, 0x0001, 1); |
617 | endcode = stat; | 617 | endcode = stat; |
618 | PDEBUG(D_FRAM, "Status 0x%x Need 0x%x", status, stat); | 618 | PDEBUG(D_FRAM, "Status 0x%x Need 0x%x", status, stat); |
619 | if (!count) | 619 | if (!count) |
@@ -622,8 +622,8 @@ static void spca504A_acknowledged_command(struct gspca_dev *gspca_dev, | |||
622 | while (--count > 0) { | 622 | while (--count > 0) { |
623 | msleep(10); | 623 | msleep(10); |
624 | /* gsmart mini2 write a each wait setting 1 ms is enought */ | 624 | /* gsmart mini2 write a each wait setting 1 ms is enought */ |
625 | /* reg_write(dev, req, idx, val); */ | 625 | /* reg_w_riv(dev, req, idx, val); */ |
626 | status = reg_read(dev, 0x01, 0x0001, 1); | 626 | status = reg_r_12(gspca_dev, 0x01, 0x0001, 1); |
627 | if (status == endcode) { | 627 | if (status == endcode) { |
628 | PDEBUG(D_FRAM, "status 0x%x after wait 0x%x", | 628 | PDEBUG(D_FRAM, "status 0x%x after wait 0x%x", |
629 | status, 200 - count); | 629 | status, 200 - count); |
@@ -632,34 +632,31 @@ static void spca504A_acknowledged_command(struct gspca_dev *gspca_dev, | |||
632 | } | 632 | } |
633 | } | 633 | } |
634 | 634 | ||
635 | static int spca504B_PollingDataReady(struct usb_device *dev) | 635 | static int spca504B_PollingDataReady(struct gspca_dev *gspca_dev) |
636 | { | 636 | { |
637 | __u8 DataReady; | ||
638 | int count = 10; | 637 | int count = 10; |
639 | 638 | ||
640 | while (--count > 0) { | 639 | while (--count > 0) { |
641 | spca5xxRegRead(dev, 0x21, 0, &DataReady, 1); | 640 | reg_r(gspca_dev->dev, 0x21, 0, gspca_dev->usb_buf, 1); |
642 | if ((DataReady & 0x01) == 0) | 641 | if ((gspca_dev->usb_buf[0] & 0x01) == 0) |
643 | break; | 642 | break; |
644 | msleep(10); | 643 | msleep(10); |
645 | } | 644 | } |
646 | return DataReady; | 645 | return gspca_dev->usb_buf[0]; |
647 | } | 646 | } |
648 | 647 | ||
649 | static void spca504B_WaitCmdStatus(struct gspca_dev *gspca_dev) | 648 | static void spca504B_WaitCmdStatus(struct gspca_dev *gspca_dev) |
650 | { | 649 | { |
651 | struct usb_device *dev = gspca_dev->dev; | 650 | struct usb_device *dev = gspca_dev->dev; |
652 | __u8 DataReady; | ||
653 | int count = 50; | 651 | int count = 50; |
654 | 652 | ||
655 | while (--count > 0) { | 653 | while (--count > 0) { |
656 | spca5xxRegRead(dev, 0x21, 1, &DataReady, 1); | 654 | reg_r(dev, 0x21, 1, gspca_dev->usb_buf, 1); |
657 | 655 | if (gspca_dev->usb_buf[0] != 0) { | |
658 | if (DataReady) { | 656 | gspca_dev->usb_buf[0] = 0; |
659 | DataReady = 0; | 657 | reg_w(dev, 0x21, 0, 1, gspca_dev->usb_buf, 1); |
660 | spca5xxRegWrite(dev, 0x21, 0, 1, &DataReady, 1); | 658 | reg_r(dev, 0x21, 1, gspca_dev->usb_buf, 1); |
661 | spca5xxRegRead(dev, 0x21, 1, &DataReady, 1); | 659 | spca504B_PollingDataReady(gspca_dev); |
662 | spca504B_PollingDataReady(dev); | ||
663 | break; | 660 | break; |
664 | } | 661 | } |
665 | msleep(10); | 662 | msleep(10); |
@@ -669,14 +666,15 @@ static void spca504B_WaitCmdStatus(struct gspca_dev *gspca_dev) | |||
669 | static void spca50x_GetFirmware(struct gspca_dev *gspca_dev) | 666 | static void spca50x_GetFirmware(struct gspca_dev *gspca_dev) |
670 | { | 667 | { |
671 | struct usb_device *dev = gspca_dev->dev; | 668 | struct usb_device *dev = gspca_dev->dev; |
672 | __u8 FW[5]; | 669 | __u8 *data; |
673 | __u8 ProductInfo[64]; | ||
674 | 670 | ||
675 | spca5xxRegRead(dev, 0x20, 0, FW, 5); | 671 | data = kmalloc(64, GFP_KERNEL); |
672 | reg_r(dev, 0x20, 0, data, 5); | ||
676 | PDEBUG(D_STREAM, "FirmWare : %d %d %d %d %d ", | 673 | PDEBUG(D_STREAM, "FirmWare : %d %d %d %d %d ", |
677 | FW[0], FW[1], FW[2], FW[3], FW[4]); | 674 | data[0], data[1], data[2], data[3], data[4]); |
678 | spca5xxRegRead(dev, 0x23, 0, ProductInfo, 64); | 675 | reg_r(dev, 0x23, 0, data, 64); |
679 | spca5xxRegRead(dev, 0x23, 1, ProductInfo, 64); | 676 | reg_r(dev, 0x23, 1, data, 64); |
677 | kfree(data); | ||
680 | } | 678 | } |
681 | 679 | ||
682 | static void spca504B_SetSizeType(struct gspca_dev *gspca_dev) | 680 | static void spca504B_SetSizeType(struct gspca_dev *gspca_dev) |
@@ -691,32 +689,35 @@ static void spca504B_SetSizeType(struct gspca_dev *gspca_dev) | |||
691 | Type = 0; | 689 | Type = 0; |
692 | switch (sd->bridge) { | 690 | switch (sd->bridge) { |
693 | case BRIDGE_SPCA533: | 691 | case BRIDGE_SPCA533: |
694 | spca5xxRegWrite(dev, 0x31, 0, 0, NULL, 0); | 692 | reg_w(dev, 0x31, 0, 0, NULL, 0); |
695 | spca504B_WaitCmdStatus(gspca_dev); | 693 | spca504B_WaitCmdStatus(gspca_dev); |
696 | rc = spca504B_PollingDataReady(dev); | 694 | rc = spca504B_PollingDataReady(gspca_dev); |
697 | spca50x_GetFirmware(gspca_dev); | 695 | spca50x_GetFirmware(gspca_dev); |
698 | Type = 2; | 696 | gspca_dev->usb_buf[0] = 2; /* type */ |
699 | spca5xxRegWrite(dev, 0x24, 0, 8, &Type, 1); | 697 | reg_w(dev, 0x24, 0, 8, gspca_dev->usb_buf, 1); |
700 | spca5xxRegRead(dev, 0x24, 8, &Type, 1); | 698 | reg_r(dev, 0x24, 8, gspca_dev->usb_buf, 1); |
701 | 699 | ||
702 | spca5xxRegWrite(dev, 0x25, 0, 4, &Size, 1); | 700 | gspca_dev->usb_buf[0] = Size; |
703 | spca5xxRegRead(dev, 0x25, 4, &Size, 1); | 701 | reg_w(dev, 0x25, 0, 4, gspca_dev->usb_buf, 1); |
704 | rc = spca504B_PollingDataReady(dev); | 702 | reg_r(dev, 0x25, 4, gspca_dev->usb_buf, 1); /* size */ |
703 | rc = spca504B_PollingDataReady(gspca_dev); | ||
705 | 704 | ||
706 | /* Init the cam width height with some values get on init ? */ | 705 | /* Init the cam width height with some values get on init ? */ |
707 | spca5xxRegWrite(dev, 0x31, 0, 4, NULL, 0); | 706 | reg_w(dev, 0x31, 0, 4, NULL, 0); |
708 | spca504B_WaitCmdStatus(gspca_dev); | 707 | spca504B_WaitCmdStatus(gspca_dev); |
709 | rc = spca504B_PollingDataReady(dev); | 708 | rc = spca504B_PollingDataReady(gspca_dev); |
710 | break; | 709 | break; |
711 | default: | 710 | default: |
712 | /* case BRIDGE_SPCA504B: */ | 711 | /* case BRIDGE_SPCA504B: */ |
713 | /* case BRIDGE_SPCA536: */ | 712 | /* case BRIDGE_SPCA536: */ |
713 | gspca_dev->usb_buf[0] = Size; | ||
714 | reg_w(dev, 0x25, 0, 4, gspca_dev->usb_buf, 1); | ||
715 | reg_r(dev, 0x25, 4, gspca_dev->usb_buf, 1); /* size */ | ||
714 | Type = 6; | 716 | Type = 6; |
715 | spca5xxRegWrite(dev, 0x25, 0, 4, &Size, 1); | 717 | gspca_dev->usb_buf[0] = Type; |
716 | spca5xxRegRead(dev, 0x25, 4, &Size, 1); | 718 | reg_w(dev, 0x27, 0, 0, gspca_dev->usb_buf, 1); |
717 | spca5xxRegWrite(dev, 0x27, 0, 0, &Type, 1); | 719 | reg_r(dev, 0x27, 0, gspca_dev->usb_buf, 1); /* type */ |
718 | spca5xxRegRead(dev, 0x27, 0, &Type, 1); | 720 | rc = spca504B_PollingDataReady(gspca_dev); |
719 | rc = spca504B_PollingDataReady(dev); | ||
720 | break; | 721 | break; |
721 | case BRIDGE_SPCA504: | 722 | case BRIDGE_SPCA504: |
722 | Size += 3; | 723 | Size += 3; |
@@ -733,21 +734,20 @@ static void spca504B_SetSizeType(struct gspca_dev *gspca_dev) | |||
733 | break; | 734 | break; |
734 | case BRIDGE_SPCA504C: | 735 | case BRIDGE_SPCA504C: |
735 | /* capture mode */ | 736 | /* capture mode */ |
736 | reg_write(dev, 0xa0, (0x0500 | (Size & 0x0f)), 0x0); | 737 | reg_w_riv(dev, 0xa0, (0x0500 | (Size & 0x0f)), 0x00); |
737 | reg_write(dev, 0x20, 0x01, 0x0500 | (Size & 0x0f)); | 738 | reg_w_riv(dev, 0x20, 0x01, 0x0500 | (Size & 0x0f)); |
738 | break; | 739 | break; |
739 | } | 740 | } |
740 | } | 741 | } |
741 | 742 | ||
742 | static void spca504_wait_status(struct gspca_dev *gspca_dev) | 743 | static void spca504_wait_status(struct gspca_dev *gspca_dev) |
743 | { | 744 | { |
744 | struct usb_device *dev = gspca_dev->dev; | ||
745 | int cnt; | 745 | int cnt; |
746 | 746 | ||
747 | cnt = 256; | 747 | cnt = 256; |
748 | while (--cnt > 0) { | 748 | while (--cnt > 0) { |
749 | /* With this we get the status, when return 0 it's all ok */ | 749 | /* With this we get the status, when return 0 it's all ok */ |
750 | if (reg_read(dev, 0x06, 0x00, 1) == 0) | 750 | if (reg_r_12(gspca_dev, 0x06, 0x00, 1) == 0) |
751 | return; | 751 | return; |
752 | msleep(10); | 752 | msleep(10); |
753 | } | 753 | } |
@@ -756,11 +756,11 @@ static void spca504_wait_status(struct gspca_dev *gspca_dev) | |||
756 | static void spca504B_setQtable(struct gspca_dev *gspca_dev) | 756 | static void spca504B_setQtable(struct gspca_dev *gspca_dev) |
757 | { | 757 | { |
758 | struct usb_device *dev = gspca_dev->dev; | 758 | struct usb_device *dev = gspca_dev->dev; |
759 | __u8 Data = 3; | ||
760 | 759 | ||
761 | spca5xxRegWrite(dev, 0x26, 0, 0, &Data, 1); | 760 | gspca_dev->usb_buf[0] = 3; |
762 | spca5xxRegRead(dev, 0x26, 0, &Data, 1); | 761 | reg_w(dev, 0x26, 0, 0, gspca_dev->usb_buf, 1); |
763 | spca504B_PollingDataReady(dev); | 762 | reg_r(dev, 0x26, 0, gspca_dev->usb_buf, 1); |
763 | spca504B_PollingDataReady(gspca_dev); | ||
764 | } | 764 | } |
765 | 765 | ||
766 | static void sp5xx_initContBrigHueRegisters(struct gspca_dev *gspca_dev) | 766 | static void sp5xx_initContBrigHueRegisters(struct gspca_dev *gspca_dev) |
@@ -777,24 +777,24 @@ static void sp5xx_initContBrigHueRegisters(struct gspca_dev *gspca_dev) | |||
777 | default: | 777 | default: |
778 | /* case BRIDGE_SPCA533: */ | 778 | /* case BRIDGE_SPCA533: */ |
779 | /* case BRIDGE_SPCA504B: */ | 779 | /* case BRIDGE_SPCA504B: */ |
780 | spca5xxRegWrite(dev, 0, 0, 0x21a7, NULL, 0); /* brightness */ | 780 | reg_w(dev, 0, 0, 0x21a7, NULL, 0); /* brightness */ |
781 | spca5xxRegWrite(dev, 0, 0x20, 0x21a8, NULL, 0); /* contrast */ | 781 | reg_w(dev, 0, 0x20, 0x21a8, NULL, 0); /* contrast */ |
782 | spca5xxRegWrite(dev, 0, 0, 0x21ad, NULL, 0); /* hue */ | 782 | reg_w(dev, 0, 0, 0x21ad, NULL, 0); /* hue */ |
783 | spca5xxRegWrite(dev, 0, 1, 0x21ac, NULL, 0); /* sat/hue */ | 783 | reg_w(dev, 0, 1, 0x21ac, NULL, 0); /* sat/hue */ |
784 | spca5xxRegWrite(dev, 0, 0x20, 0x21ae, NULL, 0); /* saturation */ | 784 | reg_w(dev, 0, 0x20, 0x21ae, NULL, 0); /* saturation */ |
785 | spca5xxRegWrite(dev, 0, 0, 0x21a3, NULL, 0); /* gamma */ | 785 | reg_w(dev, 0, 0, 0x21a3, NULL, 0); /* gamma */ |
786 | break; | 786 | break; |
787 | case BRIDGE_SPCA536: | 787 | case BRIDGE_SPCA536: |
788 | spca5xxRegWrite(dev, 0, 0, 0x20f0, NULL, 0); | 788 | reg_w(dev, 0, 0, 0x20f0, NULL, 0); |
789 | spca5xxRegWrite(dev, 0, 0x21, 0x20f1, NULL, 0); | 789 | reg_w(dev, 0, 0x21, 0x20f1, NULL, 0); |
790 | spca5xxRegWrite(dev, 0, 0x40, 0x20f5, NULL, 0); | 790 | reg_w(dev, 0, 0x40, 0x20f5, NULL, 0); |
791 | spca5xxRegWrite(dev, 0, 1, 0x20f4, NULL, 0); | 791 | reg_w(dev, 0, 1, 0x20f4, NULL, 0); |
792 | spca5xxRegWrite(dev, 0, 0x40, 0x20f6, NULL, 0); | 792 | reg_w(dev, 0, 0x40, 0x20f6, NULL, 0); |
793 | spca5xxRegWrite(dev, 0, 0, 0x2089, NULL, 0); | 793 | reg_w(dev, 0, 0, 0x2089, NULL, 0); |
794 | break; | 794 | break; |
795 | } | 795 | } |
796 | if (pollreg) | 796 | if (pollreg) |
797 | spca504B_PollingDataReady(dev); | 797 | spca504B_PollingDataReady(gspca_dev); |
798 | } | 798 | } |
799 | 799 | ||
800 | /* this function is called at probe time */ | 800 | /* this function is called at probe time */ |
@@ -872,7 +872,8 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
872 | case 0x504a: | 872 | case 0x504a: |
873 | /* try to get the firmware as some cam answer 2.0.1.2.2 | 873 | /* try to get the firmware as some cam answer 2.0.1.2.2 |
874 | * and should be a spca504b then overwrite that setting */ | 874 | * and should be a spca504b then overwrite that setting */ |
875 | spca5xxRegRead(dev, 0x20, 0, &fw, 1); | 875 | reg_r(dev, 0x20, 0, gspca_dev->usb_buf, 1); |
876 | fw = gspca_dev->usb_buf[0]; | ||
876 | if (fw == 1) { | 877 | if (fw == 1) { |
877 | sd->subtype = AiptekMiniPenCam13; | 878 | sd->subtype = AiptekMiniPenCam13; |
878 | sd->bridge = BRIDGE_SPCA504; | 879 | sd->bridge = BRIDGE_SPCA504; |
@@ -1048,38 +1049,37 @@ static int sd_open(struct gspca_dev *gspca_dev) | |||
1048 | struct sd *sd = (struct sd *) gspca_dev; | 1049 | struct sd *sd = (struct sd *) gspca_dev; |
1049 | struct usb_device *dev = gspca_dev->dev; | 1050 | struct usb_device *dev = gspca_dev->dev; |
1050 | int rc; | 1051 | int rc; |
1051 | __u8 Data; | ||
1052 | __u8 i; | 1052 | __u8 i; |
1053 | __u8 info[6]; | 1053 | __u8 info[6]; |
1054 | int err_code; | 1054 | int err_code; |
1055 | 1055 | ||
1056 | switch (sd->bridge) { | 1056 | switch (sd->bridge) { |
1057 | case BRIDGE_SPCA504B: | 1057 | case BRIDGE_SPCA504B: |
1058 | spca5xxRegWrite(dev, 0x1d, 0, 0, NULL, 0); | 1058 | reg_w(dev, 0x1d, 0, 0, NULL, 0); |
1059 | spca5xxRegWrite(dev, 0, 1, 0x2306, NULL, 0); | 1059 | reg_w(dev, 0, 1, 0x2306, NULL, 0); |
1060 | spca5xxRegWrite(dev, 0, 0, 0x0d04, NULL, 0); | 1060 | reg_w(dev, 0, 0, 0x0d04, NULL, 0); |
1061 | spca5xxRegWrite(dev, 0, 0, 0x2000, NULL, 0); | 1061 | reg_w(dev, 0, 0, 0x2000, NULL, 0); |
1062 | spca5xxRegWrite(dev, 0, 0x13, 0x2301, NULL, 0); | 1062 | reg_w(dev, 0, 0x13, 0x2301, NULL, 0); |
1063 | spca5xxRegWrite(dev, 0, 0, 0x2306, NULL, 0); | 1063 | reg_w(dev, 0, 0, 0x2306, NULL, 0); |
1064 | /* fall thru */ | 1064 | /* fall thru */ |
1065 | case BRIDGE_SPCA533: | 1065 | case BRIDGE_SPCA533: |
1066 | rc = spca504B_PollingDataReady(dev); | 1066 | rc = spca504B_PollingDataReady(gspca_dev); |
1067 | spca50x_GetFirmware(gspca_dev); | 1067 | spca50x_GetFirmware(gspca_dev); |
1068 | break; | 1068 | break; |
1069 | case BRIDGE_SPCA536: | 1069 | case BRIDGE_SPCA536: |
1070 | spca50x_GetFirmware(gspca_dev); | 1070 | spca50x_GetFirmware(gspca_dev); |
1071 | spca5xxRegRead(dev, 0x00, 0x5002, &Data, 1); | 1071 | reg_r(dev, 0x00, 0x5002, gspca_dev->usb_buf, 1); |
1072 | Data = 0; | 1072 | gspca_dev->usb_buf[0] = 0; |
1073 | spca5xxRegWrite(dev, 0x24, 0, 0, &Data, 1); | 1073 | reg_w(dev, 0x24, 0, 0, gspca_dev->usb_buf, 1); |
1074 | spca5xxRegRead(dev, 0x24, 0, &Data, 1); | 1074 | reg_r(dev, 0x24, 0, gspca_dev->usb_buf, 1); |
1075 | rc = spca504B_PollingDataReady(dev); | 1075 | rc = spca504B_PollingDataReady(gspca_dev); |
1076 | spca5xxRegWrite(dev, 0x34, 0, 0, NULL, 0); | 1076 | reg_w(dev, 0x34, 0, 0, NULL, 0); |
1077 | spca504B_WaitCmdStatus(gspca_dev); | 1077 | spca504B_WaitCmdStatus(gspca_dev); |
1078 | break; | 1078 | break; |
1079 | case BRIDGE_SPCA504C: /* pccam600 */ | 1079 | case BRIDGE_SPCA504C: /* pccam600 */ |
1080 | PDEBUG(D_STREAM, "Opening SPCA504 (PC-CAM 600)"); | 1080 | PDEBUG(D_STREAM, "Opening SPCA504 (PC-CAM 600)"); |
1081 | reg_write(dev, 0xe0, 0x0000, 0x0000); | 1081 | reg_w_riv(dev, 0xe0, 0x0000, 0x0000); |
1082 | reg_write(dev, 0xe0, 0x0000, 0x0001); /* reset */ | 1082 | reg_w_riv(dev, 0xe0, 0x0000, 0x0001); /* reset */ |
1083 | spca504_wait_status(gspca_dev); | 1083 | spca504_wait_status(gspca_dev); |
1084 | if (sd->subtype == LogitechClickSmart420) | 1084 | if (sd->subtype == LogitechClickSmart420) |
1085 | write_vector(gspca_dev, | 1085 | write_vector(gspca_dev, |
@@ -1100,7 +1100,7 @@ static int sd_open(struct gspca_dev *gspca_dev) | |||
1100 | if (sd->subtype == AiptekMiniPenCam13) { | 1100 | if (sd->subtype == AiptekMiniPenCam13) { |
1101 | /*****************************/ | 1101 | /*****************************/ |
1102 | for (i = 0; i < 6; i++) | 1102 | for (i = 0; i < 6; i++) |
1103 | info[i] = reg_read_info(dev, i); | 1103 | info[i] = reg_r_1(gspca_dev, i); |
1104 | PDEBUG(D_STREAM, | 1104 | PDEBUG(D_STREAM, |
1105 | "Read info: %d %d %d %d %d %d." | 1105 | "Read info: %d %d %d %d %d %d." |
1106 | " Should be 1,0,2,2,0,0", | 1106 | " Should be 1,0,2,2,0,0", |
@@ -1126,14 +1126,14 @@ static int sd_open(struct gspca_dev *gspca_dev) | |||
1126 | 6, 0, 0x86, 1); */ | 1126 | 6, 0, 0x86, 1); */ |
1127 | /* spca504A_acknowledged_command (gspca_dev, 0x24, | 1127 | /* spca504A_acknowledged_command (gspca_dev, 0x24, |
1128 | 0, 0, 0x9D, 1); */ | 1128 | 0, 0, 0x9D, 1); */ |
1129 | reg_write(dev, 0x0, 0x270c, 0x5); /* L92 sno1t.txt */ | 1129 | reg_w_riv(dev, 0x0, 0x270c, 0x05); /* L92 sno1t.txt */ |
1130 | reg_write(dev, 0x0, 0x2310, 0x5); | 1130 | reg_w_riv(dev, 0x0, 0x2310, 0x05); |
1131 | spca504A_acknowledged_command(gspca_dev, 0x01, | 1131 | spca504A_acknowledged_command(gspca_dev, 0x01, |
1132 | 0x0f, 0, 0xff, 0); | 1132 | 0x0f, 0, 0xff, 0); |
1133 | } | 1133 | } |
1134 | /* setup qtable */ | 1134 | /* setup qtable */ |
1135 | reg_write(dev, 0, 0x2000, 0); | 1135 | reg_w_riv(dev, 0, 0x2000, 0); |
1136 | reg_write(dev, 0, 0x2883, 1); | 1136 | reg_w_riv(dev, 0, 0x2883, 1); |
1137 | err_code = spca50x_setup_qtable(gspca_dev, | 1137 | err_code = spca50x_setup_qtable(gspca_dev, |
1138 | 0x00, 0x2800, | 1138 | 0x00, 0x2800, |
1139 | 0x2840, | 1139 | 0x2840, |
@@ -1166,20 +1166,20 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
1166 | /* case BRIDGE_SPCA536: */ | 1166 | /* case BRIDGE_SPCA536: */ |
1167 | if (sd->subtype == MegapixV4 || | 1167 | if (sd->subtype == MegapixV4 || |
1168 | sd->subtype == LogitechClickSmart820) { | 1168 | sd->subtype == LogitechClickSmart820) { |
1169 | spca5xxRegWrite(dev, 0xf0, 0, 0, NULL, 0); | 1169 | reg_w(dev, 0xf0, 0, 0, NULL, 0); |
1170 | spca504B_WaitCmdStatus(gspca_dev); | 1170 | spca504B_WaitCmdStatus(gspca_dev); |
1171 | spca5xxRegRead(dev, 0xf0, 4, NULL, 0); | 1171 | reg_r(dev, 0xf0, 4, NULL, 0); |
1172 | spca504B_WaitCmdStatus(gspca_dev); | 1172 | spca504B_WaitCmdStatus(gspca_dev); |
1173 | } else { | 1173 | } else { |
1174 | spca5xxRegWrite(dev, 0x31, 0, 4, NULL, 0); | 1174 | reg_w(dev, 0x31, 0, 4, NULL, 0); |
1175 | spca504B_WaitCmdStatus(gspca_dev); | 1175 | spca504B_WaitCmdStatus(gspca_dev); |
1176 | rc = spca504B_PollingDataReady(dev); | 1176 | rc = spca504B_PollingDataReady(gspca_dev); |
1177 | } | 1177 | } |
1178 | break; | 1178 | break; |
1179 | case BRIDGE_SPCA504: | 1179 | case BRIDGE_SPCA504: |
1180 | if (sd->subtype == AiptekMiniPenCam13) { | 1180 | if (sd->subtype == AiptekMiniPenCam13) { |
1181 | for (i = 0; i < 6; i++) | 1181 | for (i = 0; i < 6; i++) |
1182 | info[i] = reg_read_info(dev, i); | 1182 | info[i] = reg_r_1(gspca_dev, i); |
1183 | PDEBUG(D_STREAM, | 1183 | PDEBUG(D_STREAM, |
1184 | "Read info: %d %d %d %d %d %d." | 1184 | "Read info: %d %d %d %d %d %d." |
1185 | " Should be 1,0,2,2,0,0", | 1185 | " Should be 1,0,2,2,0,0", |
@@ -1197,7 +1197,7 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
1197 | } else { | 1197 | } else { |
1198 | spca504_acknowledged_command(gspca_dev, 0x24, 8, 3); | 1198 | spca504_acknowledged_command(gspca_dev, 0x24, 8, 3); |
1199 | for (i = 0; i < 6; i++) | 1199 | for (i = 0; i < 6; i++) |
1200 | info[i] = reg_read_info(dev, i); | 1200 | info[i] = reg_r_1(gspca_dev, i); |
1201 | PDEBUG(D_STREAM, | 1201 | PDEBUG(D_STREAM, |
1202 | "Read info: %d %d %d %d %d %d." | 1202 | "Read info: %d %d %d %d %d %d." |
1203 | " Should be 1,0,2,2,0,0", | 1203 | " Should be 1,0,2,2,0,0", |
@@ -1207,8 +1207,8 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
1207 | spca504_acknowledged_command(gspca_dev, 0x24, 0, 0); | 1207 | spca504_acknowledged_command(gspca_dev, 0x24, 0, 0); |
1208 | } | 1208 | } |
1209 | spca504B_SetSizeType(gspca_dev); | 1209 | spca504B_SetSizeType(gspca_dev); |
1210 | reg_write(dev, 0x0, 0x270c, 0x5); /* L92 sno1t.txt */ | 1210 | reg_w_riv(dev, 0x0, 0x270c, 0x05); /* L92 sno1t.txt */ |
1211 | reg_write(dev, 0x0, 0x2310, 0x5); | 1211 | reg_w_riv(dev, 0x0, 0x2310, 0x05); |
1212 | break; | 1212 | break; |
1213 | case BRIDGE_SPCA504C: | 1213 | case BRIDGE_SPCA504C: |
1214 | if (sd->subtype == LogitechClickSmart420) { | 1214 | if (sd->subtype == LogitechClickSmart420) { |
@@ -1217,13 +1217,13 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
1217 | } else { | 1217 | } else { |
1218 | write_vector(gspca_dev, spca504_pccam600_init_data); | 1218 | write_vector(gspca_dev, spca504_pccam600_init_data); |
1219 | } | 1219 | } |
1220 | enable = (sd->autogain ? 0x4 : 0x1); | 1220 | enable = (sd->autogain ? 0x04 : 0x01); |
1221 | reg_write(dev, 0x0c, 0x0000, enable); /* auto exposure */ | 1221 | reg_w_riv(dev, 0x0c, 0x0000, enable); /* auto exposure */ |
1222 | reg_write(dev, 0xb0, 0x0000, enable); /* auto whiteness */ | 1222 | reg_w_riv(dev, 0xb0, 0x0000, enable); /* auto whiteness */ |
1223 | 1223 | ||
1224 | /* set default exposure compensation and whiteness balance */ | 1224 | /* set default exposure compensation and whiteness balance */ |
1225 | reg_write(dev, 0x30, 0x0001, 800); /* ~ 20 fps */ | 1225 | reg_w_riv(dev, 0x30, 0x0001, 800); /* ~ 20 fps */ |
1226 | reg_write(dev, 0x30, 0x0002, 1600); | 1226 | reg_w_riv(dev, 0x30, 0x0002, 1600); |
1227 | spca504B_SetSizeType(gspca_dev); | 1227 | spca504B_SetSizeType(gspca_dev); |
1228 | break; | 1228 | break; |
1229 | } | 1229 | } |
@@ -1240,13 +1240,13 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
1240 | /* case BRIDGE_SPCA533: */ | 1240 | /* case BRIDGE_SPCA533: */ |
1241 | /* case BRIDGE_SPCA536: */ | 1241 | /* case BRIDGE_SPCA536: */ |
1242 | /* case BRIDGE_SPCA504B: */ | 1242 | /* case BRIDGE_SPCA504B: */ |
1243 | spca5xxRegWrite(dev, 0x31, 0, 0, NULL, 0); | 1243 | reg_w(dev, 0x31, 0, 0, NULL, 0); |
1244 | spca504B_WaitCmdStatus(gspca_dev); | 1244 | spca504B_WaitCmdStatus(gspca_dev); |
1245 | spca504B_PollingDataReady(dev); | 1245 | spca504B_PollingDataReady(gspca_dev); |
1246 | break; | 1246 | break; |
1247 | case BRIDGE_SPCA504: | 1247 | case BRIDGE_SPCA504: |
1248 | case BRIDGE_SPCA504C: | 1248 | case BRIDGE_SPCA504C: |
1249 | reg_write(dev, 0x00, 0x2000, 0x0000); | 1249 | reg_w_riv(dev, 0x00, 0x2000, 0x0000); |
1250 | 1250 | ||
1251 | if (sd->subtype == AiptekMiniPenCam13) { | 1251 | if (sd->subtype == AiptekMiniPenCam13) { |
1252 | /* spca504a aiptek */ | 1252 | /* spca504a aiptek */ |
@@ -1258,7 +1258,7 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
1258 | 0x0f, 0x00, 0xff, 1); | 1258 | 0x0f, 0x00, 0xff, 1); |
1259 | } else { | 1259 | } else { |
1260 | spca504_acknowledged_command(gspca_dev, 0x24, 0, 0); | 1260 | spca504_acknowledged_command(gspca_dev, 0x24, 0, 0); |
1261 | reg_write(dev, 0x01, 0x000f, 0x0); | 1261 | reg_w_riv(dev, 0x01, 0x000f, 0x00); |
1262 | } | 1262 | } |
1263 | break; | 1263 | break; |
1264 | } | 1264 | } |
@@ -1383,10 +1383,10 @@ static void setbrightness(struct gspca_dev *gspca_dev) | |||
1383 | /* case BRIDGE_SPCA504B: */ | 1383 | /* case BRIDGE_SPCA504B: */ |
1384 | /* case BRIDGE_SPCA504: */ | 1384 | /* case BRIDGE_SPCA504: */ |
1385 | /* case BRIDGE_SPCA504C: */ | 1385 | /* case BRIDGE_SPCA504C: */ |
1386 | reg_write(dev, 0x0, 0x21a7, sd->brightness); | 1386 | reg_w_riv(dev, 0x0, 0x21a7, sd->brightness); |
1387 | break; | 1387 | break; |
1388 | case BRIDGE_SPCA536: | 1388 | case BRIDGE_SPCA536: |
1389 | reg_write(dev, 0x0, 0x20f0, sd->brightness); | 1389 | reg_w_riv(dev, 0x0, 0x20f0, sd->brightness); |
1390 | break; | 1390 | break; |
1391 | } | 1391 | } |
1392 | } | 1392 | } |
@@ -1394,7 +1394,6 @@ static void setbrightness(struct gspca_dev *gspca_dev) | |||
1394 | static void getbrightness(struct gspca_dev *gspca_dev) | 1394 | static void getbrightness(struct gspca_dev *gspca_dev) |
1395 | { | 1395 | { |
1396 | struct sd *sd = (struct sd *) gspca_dev; | 1396 | struct sd *sd = (struct sd *) gspca_dev; |
1397 | struct usb_device *dev = gspca_dev->dev; | ||
1398 | __u16 brightness = 0; | 1397 | __u16 brightness = 0; |
1399 | 1398 | ||
1400 | switch (sd->bridge) { | 1399 | switch (sd->bridge) { |
@@ -1403,10 +1402,10 @@ static void getbrightness(struct gspca_dev *gspca_dev) | |||
1403 | /* case BRIDGE_SPCA504B: */ | 1402 | /* case BRIDGE_SPCA504B: */ |
1404 | /* case BRIDGE_SPCA504: */ | 1403 | /* case BRIDGE_SPCA504: */ |
1405 | /* case BRIDGE_SPCA504C: */ | 1404 | /* case BRIDGE_SPCA504C: */ |
1406 | brightness = reg_read(dev, 0x0, 0x21a7, 2); | 1405 | brightness = reg_r_12(gspca_dev, 0x00, 0x21a7, 2); |
1407 | break; | 1406 | break; |
1408 | case BRIDGE_SPCA536: | 1407 | case BRIDGE_SPCA536: |
1409 | brightness = reg_read(dev, 0x0, 0x20f0, 2); | 1408 | brightness = reg_r_12(gspca_dev, 0x00, 0x20f0, 2); |
1410 | break; | 1409 | break; |
1411 | } | 1410 | } |
1412 | sd->brightness = ((brightness & 0xff) - 128) % 255; | 1411 | sd->brightness = ((brightness & 0xff) - 128) % 255; |
@@ -1423,10 +1422,10 @@ static void setcontrast(struct gspca_dev *gspca_dev) | |||
1423 | /* case BRIDGE_SPCA504B: */ | 1422 | /* case BRIDGE_SPCA504B: */ |
1424 | /* case BRIDGE_SPCA504: */ | 1423 | /* case BRIDGE_SPCA504: */ |
1425 | /* case BRIDGE_SPCA504C: */ | 1424 | /* case BRIDGE_SPCA504C: */ |
1426 | reg_write(dev, 0x0, 0x21a8, sd->contrast); | 1425 | reg_w_riv(dev, 0x0, 0x21a8, sd->contrast); |
1427 | break; | 1426 | break; |
1428 | case BRIDGE_SPCA536: | 1427 | case BRIDGE_SPCA536: |
1429 | reg_write(dev, 0x0, 0x20f1, sd->contrast); | 1428 | reg_w_riv(dev, 0x0, 0x20f1, sd->contrast); |
1430 | break; | 1429 | break; |
1431 | } | 1430 | } |
1432 | } | 1431 | } |
@@ -1434,7 +1433,6 @@ static void setcontrast(struct gspca_dev *gspca_dev) | |||
1434 | static void getcontrast(struct gspca_dev *gspca_dev) | 1433 | static void getcontrast(struct gspca_dev *gspca_dev) |
1435 | { | 1434 | { |
1436 | struct sd *sd = (struct sd *) gspca_dev; | 1435 | struct sd *sd = (struct sd *) gspca_dev; |
1437 | struct usb_device *dev = gspca_dev->dev; | ||
1438 | 1436 | ||
1439 | switch (sd->bridge) { | 1437 | switch (sd->bridge) { |
1440 | default: | 1438 | default: |
@@ -1442,10 +1440,10 @@ static void getcontrast(struct gspca_dev *gspca_dev) | |||
1442 | /* case BRIDGE_SPCA504B: */ | 1440 | /* case BRIDGE_SPCA504B: */ |
1443 | /* case BRIDGE_SPCA504: */ | 1441 | /* case BRIDGE_SPCA504: */ |
1444 | /* case BRIDGE_SPCA504C: */ | 1442 | /* case BRIDGE_SPCA504C: */ |
1445 | sd->contrast = reg_read(dev, 0x0, 0x21a8, 2); | 1443 | sd->contrast = reg_r_12(gspca_dev, 0x00, 0x21a8, 2); |
1446 | break; | 1444 | break; |
1447 | case BRIDGE_SPCA536: | 1445 | case BRIDGE_SPCA536: |
1448 | sd->contrast = reg_read(dev, 0x0, 0x20f1, 2); | 1446 | sd->contrast = reg_r_12(gspca_dev, 0x00, 0x20f1, 2); |
1449 | break; | 1447 | break; |
1450 | } | 1448 | } |
1451 | } | 1449 | } |
@@ -1461,10 +1459,10 @@ static void setcolors(struct gspca_dev *gspca_dev) | |||
1461 | /* case BRIDGE_SPCA504B: */ | 1459 | /* case BRIDGE_SPCA504B: */ |
1462 | /* case BRIDGE_SPCA504: */ | 1460 | /* case BRIDGE_SPCA504: */ |
1463 | /* case BRIDGE_SPCA504C: */ | 1461 | /* case BRIDGE_SPCA504C: */ |
1464 | reg_write(dev, 0x0, 0x21ae, sd->colors); | 1462 | reg_w_riv(dev, 0x0, 0x21ae, sd->colors); |
1465 | break; | 1463 | break; |
1466 | case BRIDGE_SPCA536: | 1464 | case BRIDGE_SPCA536: |
1467 | reg_write(dev, 0x0, 0x20f6, sd->colors); | 1465 | reg_w_riv(dev, 0x0, 0x20f6, sd->colors); |
1468 | break; | 1466 | break; |
1469 | } | 1467 | } |
1470 | } | 1468 | } |
@@ -1472,7 +1470,6 @@ static void setcolors(struct gspca_dev *gspca_dev) | |||
1472 | static void getcolors(struct gspca_dev *gspca_dev) | 1470 | static void getcolors(struct gspca_dev *gspca_dev) |
1473 | { | 1471 | { |
1474 | struct sd *sd = (struct sd *) gspca_dev; | 1472 | struct sd *sd = (struct sd *) gspca_dev; |
1475 | struct usb_device *dev = gspca_dev->dev; | ||
1476 | 1473 | ||
1477 | switch (sd->bridge) { | 1474 | switch (sd->bridge) { |
1478 | default: | 1475 | default: |
@@ -1480,10 +1477,10 @@ static void getcolors(struct gspca_dev *gspca_dev) | |||
1480 | /* case BRIDGE_SPCA504B: */ | 1477 | /* case BRIDGE_SPCA504B: */ |
1481 | /* case BRIDGE_SPCA504: */ | 1478 | /* case BRIDGE_SPCA504: */ |
1482 | /* case BRIDGE_SPCA504C: */ | 1479 | /* case BRIDGE_SPCA504C: */ |
1483 | sd->colors = reg_read(dev, 0x0, 0x21ae, 2) >> 1; | 1480 | sd->colors = reg_r_12(gspca_dev, 0x00, 0x21ae, 2) >> 1; |
1484 | break; | 1481 | break; |
1485 | case BRIDGE_SPCA536: | 1482 | case BRIDGE_SPCA536: |
1486 | sd->colors = reg_read(dev, 0x0, 0x20f6, 2) >> 1; | 1483 | sd->colors = reg_r_12(gspca_dev, 0x00, 0x20f6, 2) >> 1; |
1487 | break; | 1484 | break; |
1488 | } | 1485 | } |
1489 | } | 1486 | } |
diff --git a/drivers/media/video/gspca/t613.c b/drivers/media/video/gspca/t613.c index 299f84584e82..00f47e463a05 100644 --- a/drivers/media/video/gspca/t613.c +++ b/drivers/media/video/gspca/t613.c | |||
@@ -26,8 +26,8 @@ | |||
26 | 26 | ||
27 | #define MODULE_NAME "t613" | 27 | #define MODULE_NAME "t613" |
28 | #include "gspca.h" | 28 | #include "gspca.h" |
29 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 29 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
30 | static const char version[] = "2.1.5"; | 30 | static const char version[] = "2.1.7"; |
31 | 31 | ||
32 | #define MAX_GAMMA 0x10 /* 0 to 15 */ | 32 | #define MAX_GAMMA 0x10 /* 0 to 15 */ |
33 | 33 | ||
@@ -365,48 +365,49 @@ static const __u8 tas5130a_sensor_init[][8] = { | |||
365 | {}, | 365 | {}, |
366 | }; | 366 | }; |
367 | 367 | ||
368 | static void t16RegRead(struct usb_device *dev, | 368 | /* read 1 byte */ |
369 | __u16 index, __u8 *buffer, __u16 length) | 369 | static int reg_r_1(struct gspca_dev *gspca_dev, |
370 | __u16 index) | ||
370 | { | 371 | { |
371 | usb_control_msg(dev, | 372 | usb_control_msg(gspca_dev->dev, |
372 | usb_rcvctrlpipe(dev, 0), | 373 | usb_rcvctrlpipe(gspca_dev->dev, 0), |
373 | 0, /* request */ | 374 | 0, /* request */ |
374 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 375 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
375 | 0, /* value */ | 376 | 0, /* value */ |
376 | index, buffer, length, 500); | 377 | index, |
378 | gspca_dev->usb_buf, 1, 500); | ||
379 | return gspca_dev->usb_buf[0]; | ||
377 | } | 380 | } |
378 | 381 | ||
379 | static void t16RegWrite(struct usb_device *dev, | 382 | static void reg_w(struct gspca_dev *gspca_dev, |
380 | __u16 value, | 383 | __u16 value, |
381 | __u16 index, | 384 | __u16 index, |
382 | const __u8 *buffer, __u16 len) | 385 | const __u8 *buffer, __u16 len) |
383 | { | 386 | { |
384 | if (buffer == NULL) { | 387 | if (buffer == NULL) { |
385 | usb_control_msg(dev, | 388 | usb_control_msg(gspca_dev->dev, |
386 | usb_sndctrlpipe(dev, 0), | 389 | usb_sndctrlpipe(gspca_dev->dev, 0), |
387 | 0, | 390 | 0, |
388 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, | 391 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, |
389 | value, index, | 392 | value, index, |
390 | NULL, 0, 500); | 393 | NULL, 0, 500); |
391 | return; | 394 | return; |
392 | } | 395 | } |
393 | if (len < 16) { | 396 | if (len <= sizeof gspca_dev->usb_buf) { |
394 | __u8 tmpbuf[16]; | 397 | memcpy(gspca_dev->usb_buf, buffer, len); |
395 | 398 | usb_control_msg(gspca_dev->dev, | |
396 | memcpy(tmpbuf, buffer, len); | 399 | usb_sndctrlpipe(gspca_dev->dev, 0), |
397 | usb_control_msg(dev, | ||
398 | usb_sndctrlpipe(dev, 0), | ||
399 | 0, | 400 | 0, |
400 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, | 401 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, |
401 | value, index, | 402 | value, index, |
402 | tmpbuf, len, 500); | 403 | gspca_dev->usb_buf, len, 500); |
403 | } else { | 404 | } else { |
404 | __u8 *tmpbuf; | 405 | __u8 *tmpbuf; |
405 | 406 | ||
406 | tmpbuf = kmalloc(len, GFP_KERNEL); | 407 | tmpbuf = kmalloc(len, GFP_KERNEL); |
407 | memcpy(tmpbuf, buffer, len); | 408 | memcpy(tmpbuf, buffer, len); |
408 | usb_control_msg(dev, | 409 | usb_control_msg(gspca_dev->dev, |
409 | usb_sndctrlpipe(dev, 0), | 410 | usb_sndctrlpipe(gspca_dev->dev, 0), |
410 | 0, | 411 | 0, |
411 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, | 412 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, |
412 | value, index, | 413 | value, index, |
@@ -443,8 +444,6 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
443 | 444 | ||
444 | static int init_default_parameters(struct gspca_dev *gspca_dev) | 445 | static int init_default_parameters(struct gspca_dev *gspca_dev) |
445 | { | 446 | { |
446 | struct usb_device *dev = gspca_dev->dev; | ||
447 | |||
448 | /* some of this registers are not really neded, because | 447 | /* some of this registers are not really neded, because |
449 | * they are overriden by setbrigthness, setcontrast, etc, | 448 | * they are overriden by setbrigthness, setcontrast, etc, |
450 | * but wont hurt anyway, and can help someone with similar webcam | 449 | * but wont hurt anyway, and can help someone with similar webcam |
@@ -509,49 +508,49 @@ static int init_default_parameters(struct gspca_dev *gspca_dev) | |||
509 | static const __u8 nset10[6] = | 508 | static const __u8 nset10[6] = |
510 | { 0x0c, 0x03, 0xab, 0x10, 0x81, 0x20 }; | 509 | { 0x0c, 0x03, 0xab, 0x10, 0x81, 0x20 }; |
511 | 510 | ||
512 | t16RegWrite(dev, 0x01, 0x0000, n1, 0x06); | 511 | reg_w(gspca_dev, 0x01, 0x0000, n1, 0x06); |
513 | t16RegWrite(dev, 0x01, 0x0000, nset, 0x06); | 512 | reg_w(gspca_dev, 0x01, 0x0000, nset, 0x06); |
514 | t16RegRead(dev, 0x0063, &test_byte, 1); | 513 | reg_r_1(gspca_dev, 0x0063); |
515 | t16RegWrite(dev, 0x01, 0x0000, n2, 0x02); | 514 | reg_w(gspca_dev, 0x01, 0x0000, n2, 0x02); |
516 | 515 | ||
517 | while (read_indexs[i] != 0x00) { | 516 | while (read_indexs[i] != 0x00) { |
518 | t16RegRead(dev, read_indexs[i], &test_byte, 1); | 517 | test_byte = reg_r_1(gspca_dev, read_indexs[i]); |
519 | PDEBUG(D_CONF, "Reg 0x%x => 0x%x", read_indexs[i], | 518 | PDEBUG(D_CONF, "Reg 0x%02x => 0x%02x", read_indexs[i], |
520 | test_byte); | 519 | test_byte); |
521 | i++; | 520 | i++; |
522 | } | 521 | } |
523 | 522 | ||
524 | t16RegWrite(dev, 0x01, 0x0000, n3, 0x06); | 523 | reg_w(gspca_dev, 0x01, 0x0000, n3, 0x06); |
525 | t16RegWrite(dev, 0x01, 0x0000, n4, 0x46); | 524 | reg_w(gspca_dev, 0x01, 0x0000, n4, 0x46); |
526 | t16RegRead(dev, 0x0080, &test_byte, 1); | 525 | reg_r_1(gspca_dev, 0x0080); |
527 | t16RegWrite(dev, 0x00, 0x2c80, NULL, 0); | 526 | reg_w(gspca_dev, 0x00, 0x2c80, NULL, 0); |
528 | t16RegWrite(dev, 0x01, 0x0000, nset2, 0x14); | 527 | reg_w(gspca_dev, 0x01, 0x0000, nset2, 0x14); |
529 | t16RegWrite(dev, 0x01, 0x0000, nset3, 0x12); | 528 | reg_w(gspca_dev, 0x01, 0x0000, nset3, 0x12); |
530 | t16RegWrite(dev, 0x01, 0x0000, nset4, 0x12); | 529 | reg_w(gspca_dev, 0x01, 0x0000, nset4, 0x12); |
531 | t16RegWrite(dev, 0x00, 0x3880, NULL, 0); | 530 | reg_w(gspca_dev, 0x00, 0x3880, NULL, 0); |
532 | t16RegWrite(dev, 0x00, 0x3880, NULL, 0); | 531 | reg_w(gspca_dev, 0x00, 0x3880, NULL, 0); |
533 | t16RegWrite(dev, 0x00, 0x338e, NULL, 0); | 532 | reg_w(gspca_dev, 0x00, 0x338e, NULL, 0); |
534 | t16RegWrite(dev, 0x01, 0x0000, nset5, 0x04); | 533 | reg_w(gspca_dev, 0x01, 0x0000, nset5, 0x04); |
535 | t16RegWrite(dev, 0x00, 0x00a9, NULL, 0); | 534 | reg_w(gspca_dev, 0x00, 0x00a9, NULL, 0); |
536 | t16RegWrite(dev, 0x01, 0x0000, nset6, 0x22); | 535 | reg_w(gspca_dev, 0x01, 0x0000, nset6, 0x22); |
537 | t16RegWrite(dev, 0x00, 0x86bb, NULL, 0); | 536 | reg_w(gspca_dev, 0x00, 0x86bb, NULL, 0); |
538 | t16RegWrite(dev, 0x00, 0x4aa6, NULL, 0); | 537 | reg_w(gspca_dev, 0x00, 0x4aa6, NULL, 0); |
539 | 538 | ||
540 | t16RegWrite(dev, 0x01, 0x0000, missing, 0x08); | 539 | reg_w(gspca_dev, 0x01, 0x0000, missing, 0x08); |
541 | 540 | ||
542 | t16RegWrite(dev, 0x00, 0x2087, NULL, 0); | 541 | reg_w(gspca_dev, 0x00, 0x2087, NULL, 0); |
543 | t16RegWrite(dev, 0x00, 0x2088, NULL, 0); | 542 | reg_w(gspca_dev, 0x00, 0x2088, NULL, 0); |
544 | t16RegWrite(dev, 0x00, 0x2089, NULL, 0); | 543 | reg_w(gspca_dev, 0x00, 0x2089, NULL, 0); |
545 | 544 | ||
546 | t16RegWrite(dev, 0x01, 0x0000, nset7, 0x04); | 545 | reg_w(gspca_dev, 0x01, 0x0000, nset7, 0x04); |
547 | t16RegWrite(dev, 0x01, 0x0000, nset10, 0x06); | 546 | reg_w(gspca_dev, 0x01, 0x0000, nset10, 0x06); |
548 | t16RegWrite(dev, 0x01, 0x0000, nset8, 0x06); | 547 | reg_w(gspca_dev, 0x01, 0x0000, nset8, 0x06); |
549 | t16RegWrite(dev, 0x01, 0x0000, nset9, 0x04); | 548 | reg_w(gspca_dev, 0x01, 0x0000, nset9, 0x04); |
550 | 549 | ||
551 | t16RegWrite(dev, 0x00, 0x2880, NULL, 0); | 550 | reg_w(gspca_dev, 0x00, 0x2880, NULL, 0); |
552 | t16RegWrite(dev, 0x01, 0x0000, nset2, 0x14); | 551 | reg_w(gspca_dev, 0x01, 0x0000, nset2, 0x14); |
553 | t16RegWrite(dev, 0x01, 0x0000, nset3, 0x12); | 552 | reg_w(gspca_dev, 0x01, 0x0000, nset3, 0x12); |
554 | t16RegWrite(dev, 0x01, 0x0000, nset4, 0x12); | 553 | reg_w(gspca_dev, 0x01, 0x0000, nset4, 0x12); |
555 | 554 | ||
556 | return 0; | 555 | return 0; |
557 | } | 556 | } |
@@ -559,7 +558,6 @@ static int init_default_parameters(struct gspca_dev *gspca_dev) | |||
559 | static void setbrightness(struct gspca_dev *gspca_dev) | 558 | static void setbrightness(struct gspca_dev *gspca_dev) |
560 | { | 559 | { |
561 | struct sd *sd = (struct sd *) gspca_dev; | 560 | struct sd *sd = (struct sd *) gspca_dev; |
562 | struct usb_device *dev = gspca_dev->dev; | ||
563 | unsigned int brightness; | 561 | unsigned int brightness; |
564 | __u8 set6[4] = { 0x8f, 0x26, 0xc3, 0x80 }; | 562 | __u8 set6[4] = { 0x8f, 0x26, 0xc3, 0x80 }; |
565 | brightness = sd->brightness; | 563 | brightness = sd->brightness; |
@@ -571,13 +569,12 @@ static void setbrightness(struct gspca_dev *gspca_dev) | |||
571 | set6[3] = 0x00 + ((brightness - 7) * 0xa); | 569 | set6[3] = 0x00 + ((brightness - 7) * 0xa); |
572 | } | 570 | } |
573 | 571 | ||
574 | t16RegWrite(dev, 0x01, 0x0000, set6, 4); | 572 | reg_w(gspca_dev, 0x01, 0x0000, set6, 4); |
575 | } | 573 | } |
576 | 574 | ||
577 | static void setflip(struct gspca_dev *gspca_dev) | 575 | static void setflip(struct gspca_dev *gspca_dev) |
578 | { | 576 | { |
579 | struct sd *sd = (struct sd *) gspca_dev; | 577 | struct sd *sd = (struct sd *) gspca_dev; |
580 | struct usb_device *dev = gspca_dev->dev; | ||
581 | 578 | ||
582 | __u8 flipcmd[8] = | 579 | __u8 flipcmd[8] = |
583 | { 0x62, 0x07, 0x63, 0x03, 0x64, 0x00, 0x60, 0x09 }; | 580 | { 0x62, 0x07, 0x63, 0x03, 0x64, 0x00, 0x60, 0x09 }; |
@@ -585,15 +582,14 @@ static void setflip(struct gspca_dev *gspca_dev) | |||
585 | if (sd->mirror == 1) | 582 | if (sd->mirror == 1) |
586 | flipcmd[3] = 0x01; | 583 | flipcmd[3] = 0x01; |
587 | 584 | ||
588 | t16RegWrite(dev, 0x01, 0x0000, flipcmd, 8); | 585 | reg_w(gspca_dev, 0x01, 0x0000, flipcmd, 8); |
589 | } | 586 | } |
590 | 587 | ||
591 | static void seteffect(struct gspca_dev *gspca_dev) | 588 | static void seteffect(struct gspca_dev *gspca_dev) |
592 | { | 589 | { |
593 | struct sd *sd = (struct sd *) gspca_dev; | 590 | struct sd *sd = (struct sd *) gspca_dev; |
594 | struct usb_device *dev = gspca_dev->dev; | ||
595 | 591 | ||
596 | t16RegWrite(dev, 0x01, 0x0000, effects_table[sd->effect], 0x06); | 592 | reg_w(gspca_dev, 0x01, 0x0000, effects_table[sd->effect], 0x06); |
597 | if (sd->effect == 1 || sd->effect == 5) { | 593 | if (sd->effect == 1 || sd->effect == 5) { |
598 | PDEBUG(D_CONF, | 594 | PDEBUG(D_CONF, |
599 | "This effect have been disabled for webcam \"safety\""); | 595 | "This effect have been disabled for webcam \"safety\""); |
@@ -601,15 +597,14 @@ static void seteffect(struct gspca_dev *gspca_dev) | |||
601 | } | 597 | } |
602 | 598 | ||
603 | if (sd->effect == 1 || sd->effect == 4) | 599 | if (sd->effect == 1 || sd->effect == 4) |
604 | t16RegWrite(dev, 0x00, 0x4aa6, NULL, 0); | 600 | reg_w(gspca_dev, 0x00, 0x4aa6, NULL, 0); |
605 | else | 601 | else |
606 | t16RegWrite(dev, 0x00, 0xfaa6, NULL, 0); | 602 | reg_w(gspca_dev, 0x00, 0xfaa6, NULL, 0); |
607 | } | 603 | } |
608 | 604 | ||
609 | static void setwhitebalance(struct gspca_dev *gspca_dev) | 605 | static void setwhitebalance(struct gspca_dev *gspca_dev) |
610 | { | 606 | { |
611 | struct sd *sd = (struct sd *) gspca_dev; | 607 | struct sd *sd = (struct sd *) gspca_dev; |
612 | struct usb_device *dev = gspca_dev->dev; | ||
613 | 608 | ||
614 | __u8 white_balance[8] = | 609 | __u8 white_balance[8] = |
615 | { 0x87, 0x20, 0x88, 0x20, 0x89, 0x20, 0x80, 0x38 }; | 610 | { 0x87, 0x20, 0x88, 0x20, 0x89, 0x20, 0x80, 0x38 }; |
@@ -617,25 +612,23 @@ static void setwhitebalance(struct gspca_dev *gspca_dev) | |||
617 | if (sd->whitebalance == 1) | 612 | if (sd->whitebalance == 1) |
618 | white_balance[7] = 0x3c; | 613 | white_balance[7] = 0x3c; |
619 | 614 | ||
620 | t16RegWrite(dev, 0x01, 0x0000, white_balance, 8); | 615 | reg_w(gspca_dev, 0x01, 0x0000, white_balance, 8); |
621 | } | 616 | } |
622 | 617 | ||
623 | static void setlightfreq(struct gspca_dev *gspca_dev) | 618 | static void setlightfreq(struct gspca_dev *gspca_dev) |
624 | { | 619 | { |
625 | struct sd *sd = (struct sd *) gspca_dev; | 620 | struct sd *sd = (struct sd *) gspca_dev; |
626 | struct usb_device *dev = gspca_dev->dev; | ||
627 | __u8 freq[4] = { 0x66, 0x40, 0xa8, 0xe8 }; | 621 | __u8 freq[4] = { 0x66, 0x40, 0xa8, 0xe8 }; |
628 | 622 | ||
629 | if (sd->freq == 2) /* 60hz */ | 623 | if (sd->freq == 2) /* 60hz */ |
630 | freq[1] = 0x00; | 624 | freq[1] = 0x00; |
631 | 625 | ||
632 | t16RegWrite(dev, 0x1, 0x0000, freq, 0x4); | 626 | reg_w(gspca_dev, 0x1, 0x0000, freq, 0x4); |
633 | } | 627 | } |
634 | 628 | ||
635 | static void setcontrast(struct gspca_dev *gspca_dev) | 629 | static void setcontrast(struct gspca_dev *gspca_dev) |
636 | { | 630 | { |
637 | struct sd *sd = (struct sd *) gspca_dev; | 631 | struct sd *sd = (struct sd *) gspca_dev; |
638 | struct usb_device *dev = gspca_dev->dev; | ||
639 | unsigned int contrast = sd->contrast; | 632 | unsigned int contrast = sd->contrast; |
640 | __u16 reg_to_write = 0x00; | 633 | __u16 reg_to_write = 0x00; |
641 | 634 | ||
@@ -644,17 +637,16 @@ static void setcontrast(struct gspca_dev *gspca_dev) | |||
644 | else | 637 | else |
645 | reg_to_write = (0x00a9 + ((contrast - 7) * 0x200)); | 638 | reg_to_write = (0x00a9 + ((contrast - 7) * 0x200)); |
646 | 639 | ||
647 | t16RegWrite(dev, 0x00, reg_to_write, NULL, 0); | 640 | reg_w(gspca_dev, 0x00, reg_to_write, NULL, 0); |
648 | } | 641 | } |
649 | 642 | ||
650 | static void setcolors(struct gspca_dev *gspca_dev) | 643 | static void setcolors(struct gspca_dev *gspca_dev) |
651 | { | 644 | { |
652 | struct sd *sd = (struct sd *) gspca_dev; | 645 | struct sd *sd = (struct sd *) gspca_dev; |
653 | struct usb_device *dev = gspca_dev->dev; | ||
654 | __u16 reg_to_write; | 646 | __u16 reg_to_write; |
655 | 647 | ||
656 | reg_to_write = 0xc0bb + sd->colors * 0x100; | 648 | reg_to_write = 0xc0bb + sd->colors * 0x100; |
657 | t16RegWrite(dev, 0x00, reg_to_write, NULL, 0); | 649 | reg_w(gspca_dev, 0x00, reg_to_write, NULL, 0); |
658 | } | 650 | } |
659 | 651 | ||
660 | static void setgamma(struct gspca_dev *gspca_dev) | 652 | static void setgamma(struct gspca_dev *gspca_dev) |
@@ -664,12 +656,11 @@ static void setgamma(struct gspca_dev *gspca_dev) | |||
664 | static void setsharpness(struct gspca_dev *gspca_dev) | 656 | static void setsharpness(struct gspca_dev *gspca_dev) |
665 | { | 657 | { |
666 | struct sd *sd = (struct sd *) gspca_dev; | 658 | struct sd *sd = (struct sd *) gspca_dev; |
667 | struct usb_device *dev = gspca_dev->dev; | ||
668 | __u16 reg_to_write; | 659 | __u16 reg_to_write; |
669 | 660 | ||
670 | reg_to_write = 0x0aa6 + 0x1000 * sd->sharpness; | 661 | reg_to_write = 0x0aa6 + 0x1000 * sd->sharpness; |
671 | 662 | ||
672 | t16RegWrite(dev, 0x00, reg_to_write, NULL, 0); | 663 | reg_w(gspca_dev, 0x00, reg_to_write, NULL, 0); |
673 | } | 664 | } |
674 | 665 | ||
675 | static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) | 666 | static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) |
@@ -837,13 +828,12 @@ static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val) | |||
837 | static int sd_setlowlight(struct gspca_dev *gspca_dev, __s32 val) | 828 | static int sd_setlowlight(struct gspca_dev *gspca_dev, __s32 val) |
838 | { | 829 | { |
839 | struct sd *sd = (struct sd *) gspca_dev; | 830 | struct sd *sd = (struct sd *) gspca_dev; |
840 | struct usb_device *dev = gspca_dev->dev; | ||
841 | 831 | ||
842 | sd->autogain = val; | 832 | sd->autogain = val; |
843 | if (val != 0) | 833 | if (val != 0) |
844 | t16RegWrite(dev, 0x00, 0xf48e, NULL, 0); | 834 | reg_w(gspca_dev, 0x00, 0xf48e, NULL, 0); |
845 | else | 835 | else |
846 | t16RegWrite(dev, 0x00, 0xb48e, NULL, 0); | 836 | reg_w(gspca_dev, 0x00, 0xb48e, NULL, 0); |
847 | return 0; | 837 | return 0; |
848 | } | 838 | } |
849 | 839 | ||
@@ -857,9 +847,7 @@ static int sd_getlowlight(struct gspca_dev *gspca_dev, __s32 *val) | |||
857 | 847 | ||
858 | static void sd_start(struct gspca_dev *gspca_dev) | 848 | static void sd_start(struct gspca_dev *gspca_dev) |
859 | { | 849 | { |
860 | struct usb_device *dev = gspca_dev->dev; | ||
861 | int mode; | 850 | int mode; |
862 | __u8 test_byte; | ||
863 | 851 | ||
864 | static const __u8 t1[] = { 0x66, 0x00, 0xa8, 0xe8 }; | 852 | static const __u8 t1[] = { 0x66, 0x00, 0xa8, 0xe8 }; |
865 | __u8 t2[] = { 0x07, 0x00, 0x0d, 0x60, 0x0e, 0x80 }; | 853 | __u8 t2[] = { 0x07, 0x00, 0x0d, 0x60, 0x0e, 0x80 }; |
@@ -886,21 +874,21 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
886 | break; | 874 | break; |
887 | } | 875 | } |
888 | 876 | ||
889 | t16RegWrite(dev, 0x01, 0x0000, tas5130a_sensor_init[0], 0x8); | 877 | reg_w(gspca_dev, 0x01, 0x0000, tas5130a_sensor_init[0], 0x8); |
890 | t16RegWrite(dev, 0x01, 0x0000, tas5130a_sensor_init[1], 0x8); | 878 | reg_w(gspca_dev, 0x01, 0x0000, tas5130a_sensor_init[1], 0x8); |
891 | t16RegWrite(dev, 0x01, 0x0000, tas5130a_sensor_init[2], 0x8); | 879 | reg_w(gspca_dev, 0x01, 0x0000, tas5130a_sensor_init[2], 0x8); |
892 | t16RegWrite(dev, 0x01, 0x0000, tas5130a_sensor_init[3], 0x8); | 880 | reg_w(gspca_dev, 0x01, 0x0000, tas5130a_sensor_init[3], 0x8); |
893 | t16RegWrite(dev, 0x00, 0x3c80, NULL, 0); | 881 | reg_w(gspca_dev, 0x00, 0x3c80, NULL, 0); |
894 | /* just in case and to keep sync with logs (for mine) */ | 882 | /* just in case and to keep sync with logs (for mine) */ |
895 | t16RegWrite(dev, 0x01, 0x0000, tas5130a_sensor_init[3], 0x8); | 883 | reg_w(gspca_dev, 0x01, 0x0000, tas5130a_sensor_init[3], 0x8); |
896 | t16RegWrite(dev, 0x00, 0x3c80, NULL, 0); | 884 | reg_w(gspca_dev, 0x00, 0x3c80, NULL, 0); |
897 | /* just in case and to keep sync with logs (for mine) */ | 885 | /* just in case and to keep sync with logs (for mine) */ |
898 | t16RegWrite(dev, 0x01, 0x0000, t1, 4); | 886 | reg_w(gspca_dev, 0x01, 0x0000, t1, 4); |
899 | t16RegWrite(dev, 0x01, 0x0000, t2, 6); | 887 | reg_w(gspca_dev, 0x01, 0x0000, t2, 6); |
900 | t16RegRead(dev, 0x0012, &test_byte, 0x01); | 888 | reg_r_1(gspca_dev, 0x0012); |
901 | t16RegWrite(dev, 0x01, 0x0000, t3, 0x10); | 889 | reg_w(gspca_dev, 0x01, 0x0000, t3, 0x10); |
902 | t16RegWrite(dev, 0x00, 0x0013, NULL, 0); | 890 | reg_w(gspca_dev, 0x00, 0x0013, NULL, 0); |
903 | t16RegWrite(dev, 0x01, 0x0000, t4, 0x4); | 891 | reg_w(gspca_dev, 0x01, 0x0000, t4, 0x4); |
904 | /* restart on each start, just in case, sometimes regs goes wrong | 892 | /* restart on each start, just in case, sometimes regs goes wrong |
905 | * when using controls from app */ | 893 | * when using controls from app */ |
906 | setbrightness(gspca_dev); | 894 | setbrightness(gspca_dev); |
diff --git a/drivers/media/video/gspca/tv8532.c b/drivers/media/video/gspca/tv8532.c index f9bffd67991e..0b793899095f 100644 --- a/drivers/media/video/gspca/tv8532.c +++ b/drivers/media/video/gspca/tv8532.c | |||
@@ -22,8 +22,8 @@ | |||
22 | 22 | ||
23 | #include "gspca.h" | 23 | #include "gspca.h" |
24 | 24 | ||
25 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 25 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
26 | static const char version[] = "2.1.5"; | 26 | static const char version[] = "2.1.7"; |
27 | 27 | ||
28 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); | 28 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); |
29 | MODULE_DESCRIPTION("TV8532 USB Camera Driver"); | 29 | MODULE_DESCRIPTION("TV8532 USB Camera Driver"); |
@@ -168,63 +168,74 @@ static const __u32 tv_8532_eeprom_data[] = { | |||
168 | 0x0c0509f1, 0 | 168 | 0x0c0509f1, 0 |
169 | }; | 169 | }; |
170 | 170 | ||
171 | static void reg_r(struct usb_device *dev, | 171 | static int reg_r(struct gspca_dev *gspca_dev, |
172 | __u16 index, __u8 *buffer) | 172 | __u16 index) |
173 | { | 173 | { |
174 | usb_control_msg(dev, | 174 | usb_control_msg(gspca_dev->dev, |
175 | usb_rcvctrlpipe(dev, 0), | 175 | usb_rcvctrlpipe(gspca_dev->dev, 0), |
176 | TV8532_REQ_RegRead, | 176 | TV8532_REQ_RegRead, |
177 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 177 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
178 | 0, /* value */ | 178 | 0, /* value */ |
179 | index, buffer, sizeof(__u8), | 179 | index, gspca_dev->usb_buf, 1, |
180 | 500); | 180 | 500); |
181 | return gspca_dev->usb_buf[0]; | ||
181 | } | 182 | } |
182 | 183 | ||
183 | static void reg_w(struct usb_device *dev, | 184 | /* write 1 byte */ |
184 | __u16 index, __u8 *buffer, __u16 length) | 185 | static void reg_w_1(struct gspca_dev *gspca_dev, |
186 | __u16 index, __u8 value) | ||
185 | { | 187 | { |
186 | usb_control_msg(dev, | 188 | gspca_dev->usb_buf[0] = value; |
187 | usb_sndctrlpipe(dev, 0), | 189 | usb_control_msg(gspca_dev->dev, |
190 | usb_sndctrlpipe(gspca_dev->dev, 0), | ||
188 | TV8532_REQ_RegWrite, | 191 | TV8532_REQ_RegWrite, |
189 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 192 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
190 | 0, /* value */ | 193 | 0, /* value */ |
191 | index, buffer, length, 500); | 194 | index, gspca_dev->usb_buf, 1, 500); |
195 | } | ||
196 | |||
197 | /* write 2 bytes */ | ||
198 | static void reg_w_2(struct gspca_dev *gspca_dev, | ||
199 | __u16 index, __u8 val1, __u8 val2) | ||
200 | { | ||
201 | gspca_dev->usb_buf[0] = val1; | ||
202 | gspca_dev->usb_buf[1] = val2; | ||
203 | usb_control_msg(gspca_dev->dev, | ||
204 | usb_sndctrlpipe(gspca_dev->dev, 0), | ||
205 | TV8532_REQ_RegWrite, | ||
206 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
207 | 0, /* value */ | ||
208 | index, gspca_dev->usb_buf, 2, 500); | ||
192 | } | 209 | } |
193 | 210 | ||
194 | static void tv_8532WriteEEprom(struct gspca_dev *gspca_dev) | 211 | static void tv_8532WriteEEprom(struct gspca_dev *gspca_dev) |
195 | { | 212 | { |
196 | int i = 0; | 213 | int i = 0; |
197 | __u8 reg, data0, data1, data2, datacmd; | 214 | __u8 reg, data0, data1, data2; |
198 | struct usb_device *dev = gspca_dev->dev; | ||
199 | 215 | ||
200 | datacmd = 0xb0;; | 216 | reg_w_1(gspca_dev, TV8532_GPIO, 0xb0); |
201 | reg_w(dev, TV8532_GPIO, &datacmd, 1); | 217 | reg_w_1(gspca_dev, TV8532_CTRL, TV8532_CMD_EEprom_Open); |
202 | datacmd = TV8532_CMD_EEprom_Open; | ||
203 | reg_w(dev, TV8532_CTRL, &datacmd, 1); | ||
204 | /* msleep(1); */ | 218 | /* msleep(1); */ |
205 | while (tv_8532_eeprom_data[i]) { | 219 | while (tv_8532_eeprom_data[i]) { |
206 | reg = (tv_8532_eeprom_data[i] & 0xff000000) >> 24; | 220 | reg = (tv_8532_eeprom_data[i] & 0xff000000) >> 24; |
207 | reg_w(dev, TV8532_EEprom_Add, ®, 1); | 221 | reg_w_1(gspca_dev, TV8532_EEprom_Add, reg); |
208 | /* msleep(1); */ | 222 | /* msleep(1); */ |
209 | data0 = (tv_8532_eeprom_data[i] & 0x000000ff); | 223 | data0 = (tv_8532_eeprom_data[i] & 0x000000ff); |
210 | reg_w(dev, TV8532_EEprom_DataL, &data0, 1); | 224 | reg_w_1(gspca_dev, TV8532_EEprom_DataL, data0); |
211 | /* msleep(1); */ | 225 | /* msleep(1); */ |
212 | data1 = (tv_8532_eeprom_data[i] & 0x0000FF00) >> 8; | 226 | data1 = (tv_8532_eeprom_data[i] & 0x0000ff00) >> 8; |
213 | reg_w(dev, TV8532_EEprom_DataM, &data1, 1); | 227 | reg_w_1(gspca_dev, TV8532_EEprom_DataM, data1); |
214 | /* msleep(1); */ | 228 | /* msleep(1); */ |
215 | data2 = (tv_8532_eeprom_data[i] & 0x00FF0000) >> 16; | 229 | data2 = (tv_8532_eeprom_data[i] & 0x00ff0000) >> 16; |
216 | reg_w(dev, TV8532_EEprom_DataH, &data2, 1); | 230 | reg_w_1(gspca_dev, TV8532_EEprom_DataH, data2); |
217 | /* msleep(1); */ | 231 | /* msleep(1); */ |
218 | datacmd = 0; | 232 | reg_w_1(gspca_dev, TV8532_EEprom_Write, 0); |
219 | reg_w(dev, TV8532_EEprom_Write, &datacmd, 1); | ||
220 | /* msleep(10); */ | 233 | /* msleep(10); */ |
221 | i++; | 234 | i++; |
222 | } | 235 | } |
223 | datacmd = i; | 236 | reg_w_1(gspca_dev, TV8532_EEprom_TableLength, i); |
224 | reg_w(dev, TV8532_EEprom_TableLength, &datacmd, 1); | ||
225 | /* msleep(1); */ | 237 | /* msleep(1); */ |
226 | datacmd = TV8532_CMD_EEprom_Close; | 238 | reg_w_1(gspca_dev, TV8532_CTRL, TV8532_CMD_EEprom_Close); |
227 | reg_w(dev, TV8532_CTRL, &datacmd, 1); | ||
228 | msleep(10); | 239 | msleep(10); |
229 | } | 240 | } |
230 | 241 | ||
@@ -250,154 +261,121 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
250 | 261 | ||
251 | static void tv_8532ReadRegisters(struct gspca_dev *gspca_dev) | 262 | static void tv_8532ReadRegisters(struct gspca_dev *gspca_dev) |
252 | { | 263 | { |
253 | struct usb_device *dev = gspca_dev->dev; | ||
254 | __u8 data; | 264 | __u8 data; |
255 | /* __u16 vid, pid; */ | ||
256 | 265 | ||
257 | reg_r(dev, 0x0001, &data); | 266 | data = reg_r(gspca_dev, 0x0001); |
258 | PDEBUG(D_USBI, "register 0x01-> %x", data); | 267 | PDEBUG(D_USBI, "register 0x01-> %x", data); |
259 | reg_r(dev, 0x0002, &data); | 268 | data = reg_r(gspca_dev, 0x0002); |
260 | PDEBUG(D_USBI, "register 0x02-> %x", data); | 269 | PDEBUG(D_USBI, "register 0x02-> %x", data); |
261 | reg_r(dev, TV8532_ADWIDTH_L, &data); | 270 | reg_r(gspca_dev, TV8532_ADWIDTH_L); |
262 | reg_r(dev, TV8532_ADWIDTH_H, &data); | 271 | reg_r(gspca_dev, TV8532_ADWIDTH_H); |
263 | reg_r(dev, TV8532_QUANT_COMP, &data); | 272 | reg_r(gspca_dev, TV8532_QUANT_COMP); |
264 | reg_r(dev, TV8532_MODE_PACKET, &data); | 273 | reg_r(gspca_dev, TV8532_MODE_PACKET); |
265 | reg_r(dev, TV8532_SETCLK, &data); | 274 | reg_r(gspca_dev, TV8532_SETCLK); |
266 | reg_r(dev, TV8532_POINT_L, &data); | 275 | reg_r(gspca_dev, TV8532_POINT_L); |
267 | reg_r(dev, TV8532_POINT_H, &data); | 276 | reg_r(gspca_dev, TV8532_POINT_H); |
268 | reg_r(dev, TV8532_POINTB_L, &data); | 277 | reg_r(gspca_dev, TV8532_POINTB_L); |
269 | reg_r(dev, TV8532_POINTB_H, &data); | 278 | reg_r(gspca_dev, TV8532_POINTB_H); |
270 | reg_r(dev, TV8532_BUDGET_L, &data); | 279 | reg_r(gspca_dev, TV8532_BUDGET_L); |
271 | reg_r(dev, TV8532_BUDGET_H, &data); | 280 | reg_r(gspca_dev, TV8532_BUDGET_H); |
272 | reg_r(dev, TV8532_VID_L, &data); | 281 | reg_r(gspca_dev, TV8532_VID_L); |
273 | reg_r(dev, TV8532_VID_H, &data); | 282 | reg_r(gspca_dev, TV8532_VID_H); |
274 | reg_r(dev, TV8532_PID_L, &data); | 283 | reg_r(gspca_dev, TV8532_PID_L); |
275 | reg_r(dev, TV8532_PID_H, &data); | 284 | reg_r(gspca_dev, TV8532_PID_H); |
276 | reg_r(dev, TV8532_DeviceID, &data); | 285 | reg_r(gspca_dev, TV8532_DeviceID); |
277 | reg_r(dev, TV8532_AD_COLBEGIN_L, &data); | 286 | reg_r(gspca_dev, TV8532_AD_COLBEGIN_L); |
278 | reg_r(dev, TV8532_AD_COLBEGIN_H, &data); | 287 | reg_r(gspca_dev, TV8532_AD_COLBEGIN_H); |
279 | reg_r(dev, TV8532_AD_ROWBEGIN_L, &data); | 288 | reg_r(gspca_dev, TV8532_AD_ROWBEGIN_L); |
280 | reg_r(dev, TV8532_AD_ROWBEGIN_H, &data); | 289 | reg_r(gspca_dev, TV8532_AD_ROWBEGIN_H); |
281 | } | 290 | } |
282 | 291 | ||
283 | static void tv_8532_setReg(struct gspca_dev *gspca_dev) | 292 | static void tv_8532_setReg(struct gspca_dev *gspca_dev) |
284 | { | 293 | { |
285 | struct usb_device *dev = gspca_dev->dev; | 294 | reg_w_1(gspca_dev, TV8532_AD_COLBEGIN_L, |
286 | __u8 data; | 295 | ADCBEGINL); /* 0x10 */ |
287 | __u8 value[2] = { 0, 0 }; | 296 | reg_w_1(gspca_dev, TV8532_AD_COLBEGIN_H, |
288 | 297 | ADCBEGINH); /* also digital gain */ | |
289 | data = ADCBEGINL; | 298 | reg_w_1(gspca_dev, TV8532_PART_CTRL, |
290 | reg_w(dev, TV8532_AD_COLBEGIN_L, &data, 1); /* 0x10 */ | 299 | TV8532_CMD_UPDATE); /* 0x00<-0x84 */ |
291 | data = ADCBEGINH; /* also digital gain */ | 300 | |
292 | reg_w(dev, TV8532_AD_COLBEGIN_H, &data, 1); | 301 | reg_w_1(gspca_dev, TV8532_GPIO_OE, 0x0a); |
293 | data = TV8532_CMD_UPDATE; | ||
294 | reg_w(dev, TV8532_PART_CTRL, &data, 1); /* 0x00<-0x84 */ | ||
295 | |||
296 | data = 0x0a; | ||
297 | reg_w(dev, TV8532_GPIO_OE, &data, 1); | ||
298 | /******************************************************/ | 302 | /******************************************************/ |
299 | data = ADHEIGHL; | 303 | reg_w_1(gspca_dev, TV8532_ADHEIGHT_L, ADHEIGHL); /* 0e */ |
300 | reg_w(dev, TV8532_ADHEIGHT_L, &data, 1); /* 0e */ | 304 | reg_w_1(gspca_dev, TV8532_ADHEIGHT_H, ADHEIGHH); /* 0f */ |
301 | data = ADHEIGHH; | 305 | reg_w_2(gspca_dev, TV8532_EXPOSURE, |
302 | reg_w(dev, TV8532_ADHEIGHT_H, &data, 1); /* 0f */ | 306 | EXPOL, EXPOH); /* 350d 0x014c; 1c */ |
303 | value[0] = EXPOL; | 307 | reg_w_1(gspca_dev, TV8532_AD_COLBEGIN_L, |
304 | value[1] = EXPOH; /* 350d 0x014c; */ | 308 | ADCBEGINL); /* 0x10 */ |
305 | reg_w(dev, TV8532_EXPOSURE, value, 2); /* 1c */ | 309 | reg_w_1(gspca_dev, TV8532_AD_COLBEGIN_H, |
306 | data = ADCBEGINL; | 310 | ADCBEGINH); /* also digital gain */ |
307 | reg_w(dev, TV8532_AD_COLBEGIN_L, &data, 1); /* 0x10 */ | 311 | reg_w_1(gspca_dev, TV8532_AD_ROWBEGIN_L, |
308 | data = ADCBEGINH; /* also digital gain */ | 312 | ADRBEGINL); /* 0x14 */ |
309 | reg_w(dev, TV8532_AD_COLBEGIN_H, &data, 1); | 313 | |
310 | data = ADRBEGINL; | 314 | reg_w_1(gspca_dev, TV8532_AD_SLOPE, 0x00); /* 0x91 */ |
311 | reg_w(dev, TV8532_AD_ROWBEGIN_L, &data, 1); /* 0x14 */ | 315 | reg_w_1(gspca_dev, TV8532_AD_BITCTRL, 0x02); /* 0x94 */ |
312 | 316 | ||
313 | data = 0x00; | 317 | reg_w_1(gspca_dev, TV8532_CTRL, |
314 | reg_w(dev, TV8532_AD_SLOPE, &data, 1); /* 0x91 */ | 318 | TV8532_CMD_EEprom_Close); /* 0x01 */ |
315 | data = 0x02; | 319 | |
316 | reg_w(dev, TV8532_AD_BITCTRL, &data, 1); /* 0x94 */ | 320 | reg_w_1(gspca_dev, TV8532_AD_SLOPE, 0x00); /* 0x91 */ |
317 | 321 | reg_w_1(gspca_dev, TV8532_PART_CTRL, | |
318 | 322 | TV8532_CMD_UPDATE); /* 0x00<-0x84 */ | |
319 | data = TV8532_CMD_EEprom_Close; | ||
320 | reg_w(dev, TV8532_CTRL, &data, 1); /* 0x01 */ | ||
321 | |||
322 | data = 0x00; | ||
323 | reg_w(dev, TV8532_AD_SLOPE, &data, 1); /* 0x91 */ | ||
324 | data = TV8532_CMD_UPDATE; | ||
325 | reg_w(dev, TV8532_PART_CTRL, &data, 1); /* 0x00<-0x84 */ | ||
326 | } | 323 | } |
327 | 324 | ||
328 | static void tv_8532_PollReg(struct gspca_dev *gspca_dev) | 325 | static void tv_8532_PollReg(struct gspca_dev *gspca_dev) |
329 | { | 326 | { |
330 | struct usb_device *dev = gspca_dev->dev; | ||
331 | __u8 data; | ||
332 | int i; | 327 | int i; |
333 | 328 | ||
334 | /* strange polling from tgc */ | 329 | /* strange polling from tgc */ |
335 | for (i = 0; i < 10; i++) { | 330 | for (i = 0; i < 10; i++) { |
336 | data = TESTCLK; /* 0x48; //0x08; */ | 331 | reg_w_1(gspca_dev, TV8532_SETCLK, |
337 | reg_w(dev, TV8532_SETCLK, &data, 1); /* 0x2c */ | 332 | TESTCLK); /* 0x48; //0x08; 0x2c */ |
338 | data = TV8532_CMD_UPDATE; | 333 | reg_w_1(gspca_dev, TV8532_PART_CTRL, TV8532_CMD_UPDATE); |
339 | reg_w(dev, TV8532_PART_CTRL, &data, 1); | 334 | reg_w_1(gspca_dev, TV8532_UDP_UPDATE, 0x01); /* 0x31 */ |
340 | data = 0x01; | ||
341 | reg_w(dev, TV8532_UDP_UPDATE, &data, 1); /* 0x31 */ | ||
342 | } | 335 | } |
343 | } | 336 | } |
344 | 337 | ||
345 | /* this function is called at open time */ | 338 | /* this function is called at open time */ |
346 | static int sd_open(struct gspca_dev *gspca_dev) | 339 | static int sd_open(struct gspca_dev *gspca_dev) |
347 | { | 340 | { |
348 | struct usb_device *dev = gspca_dev->dev; | 341 | reg_w_1(gspca_dev, TV8532_AD_SLOPE, 0x32); |
349 | __u8 data; | 342 | reg_w_1(gspca_dev, TV8532_AD_BITCTRL, 0x00); |
350 | __u8 dataStart; | ||
351 | __u8 value[2]; | ||
352 | |||
353 | data = 0x32; | ||
354 | reg_w(dev, TV8532_AD_SLOPE, &data, 1); | ||
355 | data = 0; | ||
356 | reg_w(dev, TV8532_AD_BITCTRL, &data, 1); | ||
357 | tv_8532ReadRegisters(gspca_dev); | 343 | tv_8532ReadRegisters(gspca_dev); |
358 | data = 0x0b; | 344 | reg_w_1(gspca_dev, TV8532_GPIO_OE, 0x0b); |
359 | reg_w(dev, TV8532_GPIO_OE, &data, 1); | 345 | reg_w_2(gspca_dev, TV8532_ADHEIGHT_L, ADHEIGHL, |
360 | value[0] = ADHEIGHL; | 346 | ADHEIGHH); /* 401d 0x0169; 0e */ |
361 | value[1] = ADHEIGHH; /* 401d 0x0169; */ | 347 | reg_w_2(gspca_dev, TV8532_EXPOSURE, EXPOL, |
362 | reg_w(dev, TV8532_ADHEIGHT_L, value, 2); /* 0e */ | 348 | EXPOH); /* 350d 0x014c; 1c */ |
363 | value[0] = EXPOL; | 349 | reg_w_1(gspca_dev, TV8532_ADWIDTH_L, ADWIDTHL); /* 0x20; 0x0c */ |
364 | value[1] = EXPOH; /* 350d 0x014c; */ | 350 | reg_w_1(gspca_dev, TV8532_ADWIDTH_H, ADWIDTHH); /* 0x0d */ |
365 | reg_w(dev, TV8532_EXPOSURE, value, 2); /* 1c */ | ||
366 | data = ADWIDTHL; /* 0x20; */ | ||
367 | reg_w(dev, TV8532_ADWIDTH_L, &data, 1); /* 0x0c */ | ||
368 | data = ADWIDTHH; | ||
369 | reg_w(dev, TV8532_ADWIDTH_H, &data, 1); /* 0x0d */ | ||
370 | 351 | ||
371 | /*******************************************************************/ | 352 | /*******************************************************************/ |
372 | data = TESTCOMP; /* 0x72 compressed mode */ | 353 | reg_w_1(gspca_dev, TV8532_QUANT_COMP, |
373 | reg_w(dev, TV8532_QUANT_COMP, &data, 1); /* 0x28 */ | 354 | TESTCOMP); /* 0x72 compressed mode 0x28 */ |
374 | data = TESTLINE; /* 0x84; // CIF | 4 packet */ | 355 | reg_w_1(gspca_dev, TV8532_MODE_PACKET, |
375 | reg_w(dev, TV8532_MODE_PACKET, &data, 1); /* 0x29 */ | 356 | TESTLINE); /* 0x84; // CIF | 4 packet 0x29 */ |
376 | 357 | ||
377 | /************************************************/ | 358 | /************************************************/ |
378 | data = TESTCLK; /* 0x48; //0x08; */ | 359 | reg_w_1(gspca_dev, TV8532_SETCLK, |
379 | reg_w(dev, TV8532_SETCLK, &data, 1); /* 0x2c */ | 360 | TESTCLK); /* 0x48; //0x08; 0x2c */ |
380 | data = TESTPTL; /* 0x38; */ | 361 | reg_w_1(gspca_dev, TV8532_POINT_L, |
381 | reg_w(dev, TV8532_POINT_L, &data, 1); /* 0x2d */ | 362 | TESTPTL); /* 0x38; 0x2d */ |
382 | data = TESTPTH; /* 0x04; */ | 363 | reg_w_1(gspca_dev, TV8532_POINT_H, |
383 | reg_w(dev, TV8532_POINT_H, &data, 1); /* 0x2e */ | 364 | TESTPTH); /* 0x04; 0x2e */ |
384 | dataStart = TESTPTBL; /* 0x04; */ | 365 | reg_w_1(gspca_dev, TV8532_POINTB_L, |
385 | reg_w(dev, TV8532_POINTB_L, &dataStart, 1); /* 0x2f */ | 366 | TESTPTBL); /* 0x04; 0x2f */ |
386 | data = TESTPTBH; /* 0x04; */ | 367 | reg_w_1(gspca_dev, TV8532_POINTB_H, |
387 | reg_w(dev, TV8532_POINTB_H, &data, 1); /* 0x30 */ | 368 | TESTPTBH); /* 0x04; 0x30 */ |
388 | data = TV8532_CMD_UPDATE; | 369 | reg_w_1(gspca_dev, TV8532_PART_CTRL, |
389 | reg_w(dev, TV8532_PART_CTRL, &data, 1); /* 0x00<-0x84 */ | 370 | TV8532_CMD_UPDATE); /* 0x00<-0x84 */ |
390 | /*************************************************/ | 371 | /*************************************************/ |
391 | data = 0x01; | 372 | reg_w_1(gspca_dev, TV8532_UDP_UPDATE, 0x01); /* 0x31 */ |
392 | reg_w(dev, TV8532_UDP_UPDATE, &data, 1); /* 0x31 */ | ||
393 | msleep(200); | 373 | msleep(200); |
394 | data = 0x00; | 374 | reg_w_1(gspca_dev, TV8532_UDP_UPDATE, 0x00); /* 0x31 */ |
395 | reg_w(dev, TV8532_UDP_UPDATE, &data, 1); /* 0x31 */ | ||
396 | /*************************************************/ | 375 | /*************************************************/ |
397 | tv_8532_setReg(gspca_dev); | 376 | tv_8532_setReg(gspca_dev); |
398 | /*************************************************/ | 377 | /*************************************************/ |
399 | data = 0x0b; | 378 | reg_w_1(gspca_dev, TV8532_GPIO_OE, 0x0b); |
400 | reg_w(dev, TV8532_GPIO_OE, &data, 1); | ||
401 | /*************************************************/ | 379 | /*************************************************/ |
402 | tv_8532_setReg(gspca_dev); | 380 | tv_8532_setReg(gspca_dev); |
403 | /*************************************************/ | 381 | /*************************************************/ |
@@ -408,94 +386,72 @@ static int sd_open(struct gspca_dev *gspca_dev) | |||
408 | static void setbrightness(struct gspca_dev *gspca_dev) | 386 | static void setbrightness(struct gspca_dev *gspca_dev) |
409 | { | 387 | { |
410 | struct sd *sd = (struct sd *) gspca_dev; | 388 | struct sd *sd = (struct sd *) gspca_dev; |
411 | __u8 value[2]; | ||
412 | __u8 data; | ||
413 | int brightness = sd->brightness; | 389 | int brightness = sd->brightness; |
414 | 390 | ||
415 | value[1] = (brightness >> 8) & 0xff; | 391 | reg_w_2(gspca_dev, TV8532_EXPOSURE, |
416 | value[0] = (brightness) & 0xff; | 392 | brightness >> 8, brightness); /* 1c */ |
417 | reg_w(gspca_dev->dev, TV8532_EXPOSURE, value, 2); /* 1c */ | 393 | reg_w_1(gspca_dev, TV8532_PART_CTRL, TV8532_CMD_UPDATE); |
418 | data = TV8532_CMD_UPDATE; | ||
419 | reg_w(gspca_dev->dev, TV8532_PART_CTRL, &data, 1); | ||
420 | } | 394 | } |
421 | 395 | ||
422 | /* -- start the camera -- */ | 396 | /* -- start the camera -- */ |
423 | static void sd_start(struct gspca_dev *gspca_dev) | 397 | static void sd_start(struct gspca_dev *gspca_dev) |
424 | { | 398 | { |
425 | struct usb_device *dev = gspca_dev->dev; | 399 | reg_w_1(gspca_dev, TV8532_AD_SLOPE, 0x32); |
426 | __u8 data; | 400 | reg_w_1(gspca_dev, TV8532_AD_BITCTRL, 0x00); |
427 | __u8 value[2]; | ||
428 | |||
429 | data = 0x32; | ||
430 | reg_w(dev, TV8532_AD_SLOPE, &data, 1); | ||
431 | data = 0; | ||
432 | reg_w(dev, TV8532_AD_BITCTRL, &data, 1); | ||
433 | tv_8532ReadRegisters(gspca_dev); | 401 | tv_8532ReadRegisters(gspca_dev); |
434 | data = 0x0b; | 402 | reg_w_1(gspca_dev, TV8532_GPIO_OE, 0x0b); |
435 | reg_w(dev, TV8532_GPIO_OE, &data, 1); | 403 | reg_w_2(gspca_dev, TV8532_ADHEIGHT_L, |
436 | value[0] = ADHEIGHL; | 404 | ADHEIGHL, ADHEIGHH); /* 401d 0x0169; 0e */ |
437 | value[1] = ADHEIGHH; /* 401d 0x0169; */ | 405 | /* reg_w_2(gspca_dev, TV8532_EXPOSURE, |
438 | reg_w(dev, TV8532_ADHEIGHT_L, value, 2); /* 0e */ | 406 | EXPOL, EXPOH); * 350d 0x014c; 1c */ |
439 | /* value[0] = EXPOL; value[1] =EXPOH; * 350d 0x014c; */ | ||
440 | /* reg_w(dev,TV8532_REQ_RegWrite,0,TV8532_EXPOSURE,value,2); * 1c */ | ||
441 | setbrightness(gspca_dev); | 407 | setbrightness(gspca_dev); |
442 | 408 | ||
443 | data = ADWIDTHL; /* 0x20; */ | 409 | reg_w_1(gspca_dev, TV8532_ADWIDTH_L, ADWIDTHL); /* 0x20; 0x0c */ |
444 | reg_w(dev, TV8532_ADWIDTH_L, &data, 1); /* 0x0c */ | 410 | reg_w_1(gspca_dev, TV8532_ADWIDTH_H, ADWIDTHH); /* 0x0d */ |
445 | data = ADWIDTHH; | ||
446 | reg_w(dev, TV8532_ADWIDTH_H, &data, 1); /* 0x0d */ | ||
447 | 411 | ||
448 | /************************************************/ | 412 | /************************************************/ |
449 | data = TESTCOMP; /* 0x72 compressed mode */ | 413 | reg_w_1(gspca_dev, TV8532_QUANT_COMP, |
450 | reg_w(dev, TV8532_QUANT_COMP, &data, 1); /* 0x28 */ | 414 | TESTCOMP); /* 0x72 compressed mode 0x28 */ |
451 | if (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) { | 415 | if (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) { |
452 | /* 176x144 */ | 416 | /* 176x144 */ |
453 | data = QCIFLINE; /* 0x84; // CIF | 4 packet */ | 417 | reg_w_1(gspca_dev, TV8532_MODE_PACKET, |
454 | reg_w(dev, TV8532_MODE_PACKET, &data, 1); /* 0x29 */ | 418 | QCIFLINE); /* 0x84; // CIF | 4 packet 0x29 */ |
455 | } else { | 419 | } else { |
456 | /* 352x288 */ | 420 | /* 352x288 */ |
457 | data = TESTLINE; /* 0x84; // CIF | 4 packet */ | 421 | reg_w_1(gspca_dev, TV8532_MODE_PACKET, |
458 | reg_w(dev, TV8532_MODE_PACKET, &data, 1); /* 0x29 */ | 422 | TESTLINE); /* 0x84; // CIF | 4 packet 0x29 */ |
459 | } | 423 | } |
460 | /************************************************/ | 424 | /************************************************/ |
461 | data = TESTCLK; /* 0x48; //0x08; */ | 425 | reg_w_1(gspca_dev, TV8532_SETCLK, |
462 | reg_w(dev, TV8532_SETCLK, &data, 1); /* 0x2c */ | 426 | TESTCLK); /* 0x48; //0x08; 0x2c */ |
463 | data = TESTPTL; /* 0x38; */ | 427 | reg_w_1(gspca_dev, TV8532_POINT_L, |
464 | reg_w(dev, TV8532_POINT_L, &data, 1); /* 0x2d */ | 428 | TESTPTL); /* 0x38; 0x2d */ |
465 | data = TESTPTH; /* 0x04; */ | 429 | reg_w_1(gspca_dev, TV8532_POINT_H, |
466 | reg_w(dev, TV8532_POINT_H, &data, 1); /* 0x2e */ | 430 | TESTPTH); /* 0x04; 0x2e */ |
467 | data = TESTPTBL; /* 0x04; */ | 431 | reg_w_1(gspca_dev, TV8532_POINTB_L, |
468 | reg_w(dev, TV8532_POINTB_L, &data, 1); /* 0x2f */ | 432 | TESTPTBL); /* 0x04; 0x2f */ |
469 | data = TESTPTBH; /* 0x04; */ | 433 | reg_w_1(gspca_dev, TV8532_POINTB_H, |
470 | reg_w(dev, TV8532_POINTB_H, &data, 1); /* 0x30 */ | 434 | TESTPTBH); /* 0x04; 0x30 */ |
471 | data = TV8532_CMD_UPDATE; | 435 | reg_w_1(gspca_dev, TV8532_PART_CTRL, |
472 | reg_w(dev, TV8532_PART_CTRL, &data, 1); /* 0x00<-0x84 */ | 436 | TV8532_CMD_UPDATE); /* 0x00<-0x84 */ |
473 | /************************************************/ | 437 | /************************************************/ |
474 | data = 0x01; | 438 | reg_w_1(gspca_dev, TV8532_UDP_UPDATE, 0x01); /* 0x31 */ |
475 | reg_w(dev, TV8532_UDP_UPDATE, &data, 1); /* 0x31 */ | ||
476 | msleep(200); | 439 | msleep(200); |
477 | data = 0x00; | 440 | reg_w_1(gspca_dev, TV8532_UDP_UPDATE, 0x00); /* 0x31 */ |
478 | reg_w(dev, TV8532_UDP_UPDATE, &data, 1); /* 0x31 */ | ||
479 | /************************************************/ | 441 | /************************************************/ |
480 | tv_8532_setReg(gspca_dev); | 442 | tv_8532_setReg(gspca_dev); |
481 | /************************************************/ | 443 | /************************************************/ |
482 | data = 0x0b; | 444 | reg_w_1(gspca_dev, TV8532_GPIO_OE, 0x0b); |
483 | reg_w(dev, TV8532_GPIO_OE, &data, 1); | ||
484 | /************************************************/ | 445 | /************************************************/ |
485 | tv_8532_setReg(gspca_dev); | 446 | tv_8532_setReg(gspca_dev); |
486 | /************************************************/ | 447 | /************************************************/ |
487 | tv_8532_PollReg(gspca_dev); | 448 | tv_8532_PollReg(gspca_dev); |
488 | data = 0x00; | 449 | reg_w_1(gspca_dev, TV8532_UDP_UPDATE, 0x00); /* 0x31 */ |
489 | reg_w(dev, TV8532_UDP_UPDATE, &data, 1); /* 0x31 */ | ||
490 | } | 450 | } |
491 | 451 | ||
492 | static void sd_stopN(struct gspca_dev *gspca_dev) | 452 | static void sd_stopN(struct gspca_dev *gspca_dev) |
493 | { | 453 | { |
494 | struct usb_device *dev = gspca_dev->dev; | 454 | reg_w_1(gspca_dev, TV8532_GPIO_OE, 0x0b); |
495 | __u8 data; | ||
496 | |||
497 | data = 0x0b; | ||
498 | reg_w(dev, TV8532_GPIO_OE, &data, 1); | ||
499 | } | 455 | } |
500 | 456 | ||
501 | static void sd_stop0(struct gspca_dev *gspca_dev) | 457 | static void sd_stop0(struct gspca_dev *gspca_dev) |
diff --git a/drivers/media/video/gspca/vc032x.c b/drivers/media/video/gspca/vc032x.c index 668e024aaa8f..dd7c1389f38d 100644 --- a/drivers/media/video/gspca/vc032x.c +++ b/drivers/media/video/gspca/vc032x.c | |||
@@ -1227,17 +1227,18 @@ static const struct sensor_info sensor_info_data[] = { | |||
1227 | {SENSOR_MI1310_SOC, 0x80 | 0x5d, 0x00, 0x143a, 0x24, 0x25, 0x01}, | 1227 | {SENSOR_MI1310_SOC, 0x80 | 0x5d, 0x00, 0x143a, 0x24, 0x25, 0x01}, |
1228 | }; | 1228 | }; |
1229 | 1229 | ||
1230 | static void reg_r(struct usb_device *dev, | 1230 | /* read 'len' bytes in gspca_dev->usb_buf */ |
1231 | __u16 req, | 1231 | static void reg_r(struct gspca_dev *gspca_dev, |
1232 | __u16 index, | 1232 | __u16 req, |
1233 | __u8 *buffer, __u16 length) | 1233 | __u16 index, |
1234 | __u16 len) | ||
1234 | { | 1235 | { |
1235 | usb_control_msg(dev, | 1236 | usb_control_msg(gspca_dev->dev, |
1236 | usb_rcvctrlpipe(dev, 0), | 1237 | usb_rcvctrlpipe(gspca_dev->dev, 0), |
1237 | req, | 1238 | req, |
1238 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 1239 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
1239 | 1, /* value */ | 1240 | 1, /* value */ |
1240 | index, buffer, length, | 1241 | index, gspca_dev->usb_buf, len, |
1241 | 500); | 1242 | 500); |
1242 | } | 1243 | } |
1243 | 1244 | ||
@@ -1254,55 +1255,55 @@ static void reg_w(struct usb_device *dev, | |||
1254 | 500); | 1255 | 500); |
1255 | } | 1256 | } |
1256 | 1257 | ||
1257 | static void vc032x_read_sensor_register(struct usb_device *dev, | 1258 | static void read_sensor_register(struct gspca_dev *gspca_dev, |
1258 | __u16 address, __u16 *value) | 1259 | __u16 address, __u16 *value) |
1259 | { | 1260 | { |
1261 | struct usb_device *dev = gspca_dev->dev; | ||
1260 | __u8 ldata, mdata, hdata; | 1262 | __u8 ldata, mdata, hdata; |
1261 | __u8 tmpvalue = 0; | ||
1262 | int retry = 50; | 1263 | int retry = 50; |
1263 | ldata = 0; | 1264 | |
1264 | mdata = 0; | ||
1265 | hdata = 0; | ||
1266 | *value = 0; | 1265 | *value = 0; |
1267 | 1266 | ||
1268 | reg_r(dev, 0xa1, 0xb33f, &tmpvalue, 1); | 1267 | reg_r(gspca_dev, 0xa1, 0xb33f, 1); |
1269 | /*PDEBUG(D_PROBE, " I2c Bus Busy Wait 0x%02X ", tmpvalue); */ | 1268 | /*PDEBUG(D_PROBE, " I2c Bus Busy Wait 0x%02X ", tmpvalue); */ |
1270 | if (!(tmpvalue & 0x02)) { | 1269 | if (!(gspca_dev->usb_buf[0] & 0x02)) { |
1271 | PDEBUG(D_ERR, "I2c Bus Busy Wait %d", tmpvalue & 0x02); | 1270 | PDEBUG(D_ERR, "I2c Bus Busy Wait %d", |
1271 | gspca_dev->usb_buf[0] & 0x02); | ||
1272 | return; | 1272 | return; |
1273 | } | 1273 | } |
1274 | reg_w(dev, 0xa0, address, 0xb33a); | 1274 | reg_w(dev, 0xa0, address, 0xb33a); |
1275 | reg_w(dev, 0xa0, 0x02, 0xb339); | 1275 | reg_w(dev, 0xa0, 0x02, 0xb339); |
1276 | 1276 | ||
1277 | tmpvalue = 0; | 1277 | reg_r(gspca_dev, 0xa1, 0xb33b, 1); |
1278 | reg_r(dev, 0xa1, 0xb33b, &tmpvalue, 1); | 1278 | while (retry-- && gspca_dev->usb_buf[0]) { |
1279 | while (retry-- && tmpvalue) { | 1279 | reg_r(gspca_dev, 0xa1, 0xb33b, 1); |
1280 | reg_r(dev, 0xa1, 0xb33b, &tmpvalue, 1); | ||
1281 | /* PDEBUG(D_PROBE, "Read again 0xb33b %d", tmpvalue); */ | 1280 | /* PDEBUG(D_PROBE, "Read again 0xb33b %d", tmpvalue); */ |
1282 | msleep(1); | 1281 | msleep(1); |
1283 | } | 1282 | } |
1284 | reg_r(dev, 0xa1, 0xb33e, &hdata, 1); | 1283 | reg_r(gspca_dev, 0xa1, 0xb33e, 1); |
1285 | reg_r(dev, 0xa1, 0xb33d, &mdata, 1); | 1284 | hdata = gspca_dev->usb_buf[0]; |
1286 | reg_r(dev, 0xa1, 0xb33c, &ldata, 1); | 1285 | reg_r(gspca_dev, 0xa1, 0xb33d, 1); |
1286 | mdata = gspca_dev->usb_buf[0]; | ||
1287 | reg_r(gspca_dev, 0xa1, 0xb33c, 1); | ||
1288 | ldata = gspca_dev->usb_buf[0]; | ||
1287 | PDEBUG(D_PROBE, "Read Sensor h (0x%02X) m (0x%02X) l (0x%02X)", | 1289 | PDEBUG(D_PROBE, "Read Sensor h (0x%02X) m (0x%02X) l (0x%02X)", |
1288 | hdata, mdata, ldata); | 1290 | hdata, mdata, ldata); |
1289 | tmpvalue = 0; | 1291 | reg_r(gspca_dev, 0xa1, 0xb334, 1); |
1290 | reg_r(dev, 0xa1, 0xb334, &tmpvalue, 1); | 1292 | if (gspca_dev->usb_buf[0] == 0x02) |
1291 | if (tmpvalue == 0x02) | ||
1292 | *value = (ldata << 8) + mdata; | 1293 | *value = (ldata << 8) + mdata; |
1293 | else | 1294 | else |
1294 | *value = ldata; | 1295 | *value = ldata; |
1295 | } | 1296 | } |
1297 | |||
1296 | static int vc032x_probe_sensor(struct gspca_dev *gspca_dev) | 1298 | static int vc032x_probe_sensor(struct gspca_dev *gspca_dev) |
1297 | { | 1299 | { |
1298 | struct usb_device *dev = gspca_dev->dev; | 1300 | struct usb_device *dev = gspca_dev->dev; |
1299 | int i; | 1301 | int i; |
1300 | __u8 data; | ||
1301 | __u16 value; | 1302 | __u16 value; |
1302 | const struct sensor_info *ptsensor_info; | 1303 | const struct sensor_info *ptsensor_info; |
1303 | 1304 | ||
1304 | reg_r(dev, 0xa1, 0xbfcf, &data, 1); | 1305 | reg_r(gspca_dev, 0xa1, 0xbfcf, 1); |
1305 | PDEBUG(D_PROBE, "check sensor header %d", data); | 1306 | PDEBUG(D_PROBE, "check sensor header %d", gspca_dev->usb_buf[0]); |
1306 | for (i = 0; i < ARRAY_SIZE(sensor_info_data); i++) { | 1307 | for (i = 0; i < ARRAY_SIZE(sensor_info_data); i++) { |
1307 | ptsensor_info = &sensor_info_data[i]; | 1308 | ptsensor_info = &sensor_info_data[i]; |
1308 | reg_w(dev, 0xa0, 0x02, 0xb334); | 1309 | reg_w(dev, 0xa0, 0x02, 0xb334); |
@@ -1315,7 +1316,7 @@ static int vc032x_probe_sensor(struct gspca_dev *gspca_dev) | |||
1315 | "check sensor VC032X -> %d Add -> ox%02X!", | 1316 | "check sensor VC032X -> %d Add -> ox%02X!", |
1316 | i, ptsensor_info->I2cAdd); */ | 1317 | i, ptsensor_info->I2cAdd); */ |
1317 | reg_w(dev, 0xa0, ptsensor_info->op, 0xb301); | 1318 | reg_w(dev, 0xa0, ptsensor_info->op, 0xb301); |
1318 | vc032x_read_sensor_register(dev, ptsensor_info->IdAdd, &value); | 1319 | read_sensor_register(gspca_dev, ptsensor_info->IdAdd, &value); |
1319 | if (value == ptsensor_info->VpId) { | 1320 | if (value == ptsensor_info->VpId) { |
1320 | /* PDEBUG(D_PROBE, "find sensor VC032X -> ox%04X!", | 1321 | /* PDEBUG(D_PROBE, "find sensor VC032X -> ox%04X!", |
1321 | ptsensor_info->VpId); */ | 1322 | ptsensor_info->VpId); */ |
@@ -1325,14 +1326,14 @@ static int vc032x_probe_sensor(struct gspca_dev *gspca_dev) | |||
1325 | return -1; | 1326 | return -1; |
1326 | } | 1327 | } |
1327 | 1328 | ||
1328 | static __u8 i2c_write(struct usb_device *dev, | 1329 | static __u8 i2c_write(struct gspca_dev *gspca_dev, |
1329 | __u8 reg, const __u8 *val, __u8 size) | 1330 | __u8 reg, const __u8 *val, __u8 size) |
1330 | { | 1331 | { |
1331 | __u8 retbyte; | 1332 | struct usb_device *dev = gspca_dev->dev; |
1332 | 1333 | ||
1333 | if (size > 3 || size < 1) | 1334 | if (size > 3 || size < 1) |
1334 | return -EINVAL; | 1335 | return -EINVAL; |
1335 | reg_r(dev, 0xa1, 0xb33f, &retbyte, 1); | 1336 | reg_r(gspca_dev, 0xa1, 0xb33f, 1); |
1336 | reg_w(dev, 0xa0, size, 0xb334); | 1337 | reg_w(dev, 0xa0, size, 0xb334); |
1337 | reg_w(dev, 0xa0, reg, 0xb33a); | 1338 | reg_w(dev, 0xa0, reg, 0xb33a); |
1338 | switch (size) { | 1339 | switch (size) { |
@@ -1353,8 +1354,8 @@ static __u8 i2c_write(struct usb_device *dev, | |||
1353 | return -EINVAL; | 1354 | return -EINVAL; |
1354 | } | 1355 | } |
1355 | reg_w(dev, 0xa0, 0x01, 0xb339); | 1356 | reg_w(dev, 0xa0, 0x01, 0xb339); |
1356 | reg_r(dev, 0xa1, 0xb33b, &retbyte, 1); | 1357 | reg_r(gspca_dev, 0xa1, 0xb33b, 1); |
1357 | return retbyte == 0; | 1358 | return gspca_dev->usb_buf[0] == 0; |
1358 | } | 1359 | } |
1359 | 1360 | ||
1360 | static void put_tab_to_reg(struct gspca_dev *gspca_dev, | 1361 | static void put_tab_to_reg(struct gspca_dev *gspca_dev, |
@@ -1382,10 +1383,10 @@ static void usb_exchange(struct gspca_dev *gspca_dev, | |||
1382 | ((data[i][0])<<8) | data[i][1]); | 1383 | ((data[i][0])<<8) | data[i][1]); |
1383 | break; | 1384 | break; |
1384 | case 0xaa: /* i2c op */ | 1385 | case 0xaa: /* i2c op */ |
1385 | i2c_write(dev, data[i][1], &data[i][2], 1); | 1386 | i2c_write(gspca_dev, data[i][1], &data[i][2], 1); |
1386 | break; | 1387 | break; |
1387 | case 0xbb: /* i2c op */ | 1388 | case 0xbb: /* i2c op */ |
1388 | i2c_write(dev, data[i][0], &data[i][1], 2); | 1389 | i2c_write(gspca_dev, data[i][0], &data[i][1], 2); |
1389 | break; | 1390 | break; |
1390 | case 0xdd: | 1391 | case 0xdd: |
1391 | msleep(data[i][2] + 10); | 1392 | msleep(data[i][2] + 10); |
@@ -1417,7 +1418,6 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
1417 | struct sd *sd = (struct sd *) gspca_dev; | 1418 | struct sd *sd = (struct sd *) gspca_dev; |
1418 | struct usb_device *dev = gspca_dev->dev; | 1419 | struct usb_device *dev = gspca_dev->dev; |
1419 | struct cam *cam; | 1420 | struct cam *cam; |
1420 | __u8 tmp2[4]; | ||
1421 | int sensor; | 1421 | int sensor; |
1422 | __u16 product; | 1422 | __u16 product; |
1423 | 1423 | ||
@@ -1488,10 +1488,10 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
1488 | sd->lightfreq = FREQ_DEF; | 1488 | sd->lightfreq = FREQ_DEF; |
1489 | 1489 | ||
1490 | if (sd->bridge == BRIDGE_VC0321) { | 1490 | if (sd->bridge == BRIDGE_VC0321) { |
1491 | reg_r(dev, 0x8a, 0, tmp2, 3); | 1491 | reg_r(gspca_dev, 0x8a, 0, 3); |
1492 | reg_w(dev, 0x87, 0x00, 0x0f0f); | 1492 | reg_w(dev, 0x87, 0x00, 0x0f0f); |
1493 | 1493 | ||
1494 | reg_r(dev, 0x8b, 0, tmp2, 3); | 1494 | reg_r(gspca_dev, 0x8b, 0, 3); |
1495 | reg_w(dev, 0x88, 0x00, 0x0202); | 1495 | reg_w(dev, 0x88, 0x00, 0x0202); |
1496 | } | 1496 | } |
1497 | return 0; | 1497 | return 0; |
@@ -1525,7 +1525,6 @@ static void setlightfreq(struct gspca_dev *gspca_dev) | |||
1525 | static void sd_start(struct gspca_dev *gspca_dev) | 1525 | static void sd_start(struct gspca_dev *gspca_dev) |
1526 | { | 1526 | { |
1527 | struct sd *sd = (struct sd *) gspca_dev; | 1527 | struct sd *sd = (struct sd *) gspca_dev; |
1528 | /* __u8 tmp2; */ | ||
1529 | const __u8 *GammaT = NULL; | 1528 | const __u8 *GammaT = NULL; |
1530 | const __u8 *MatrixT = NULL; | 1529 | const __u8 *MatrixT = NULL; |
1531 | int mode; | 1530 | int mode; |
@@ -1627,7 +1626,7 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
1627 | reg_w(gspca_dev->dev, 0xa0, 0x40, 0xb824); | 1626 | reg_w(gspca_dev->dev, 0xa0, 0x40, 0xb824); |
1628 | */ | 1627 | */ |
1629 | /* Only works for HV7131R ?? | 1628 | /* Only works for HV7131R ?? |
1630 | reg_r (gspca_dev->dev, 0xa1, 0xb881, &tmp2, 1); | 1629 | reg_r (gspca_dev, 0xa1, 0xb881, 1); |
1631 | reg_w(gspca_dev->dev, 0xa0, 0xfe01, 0xb881); | 1630 | reg_w(gspca_dev->dev, 0xa0, 0xfe01, 0xb881); |
1632 | reg_w(gspca_dev->dev, 0xa0, 0x79, 0xb801); | 1631 | reg_w(gspca_dev->dev, 0xa0, 0x79, 0xb801); |
1633 | */ | 1632 | */ |
diff --git a/drivers/media/video/gspca/zc3xx.c b/drivers/media/video/gspca/zc3xx.c index bac45a193653..548c4c8c3f33 100644 --- a/drivers/media/video/gspca/zc3xx.c +++ b/drivers/media/video/gspca/zc3xx.c | |||
@@ -24,8 +24,8 @@ | |||
24 | 24 | ||
25 | #include "gspca.h" | 25 | #include "gspca.h" |
26 | 26 | ||
27 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5) | 27 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7) |
28 | static const char version[] = "2.1.5"; | 28 | static const char version[] = "2.1.7"; |
29 | 29 | ||
30 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>, " | 30 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>, " |
31 | "Serge A. Suchkov <Serge.A.S@tochka.ru>"); | 31 | "Serge A. Suchkov <Serge.A.S@tochka.ru>"); |
@@ -6214,23 +6214,27 @@ static const struct usb_action tas5130c_vf0250_NoFlikerScale[] = { | |||
6214 | {} | 6214 | {} |
6215 | }; | 6215 | }; |
6216 | 6216 | ||
6217 | static void reg_r_i(struct usb_device *dev, | 6217 | static int reg_r_i(struct gspca_dev *gspca_dev, |
6218 | __u16 index, __u8 *buffer) | 6218 | __u16 index) |
6219 | { | 6219 | { |
6220 | usb_control_msg(dev, | 6220 | usb_control_msg(gspca_dev->dev, |
6221 | usb_rcvctrlpipe(dev, 0), | 6221 | usb_rcvctrlpipe(gspca_dev->dev, 0), |
6222 | 0xa1, | 6222 | 0xa1, |
6223 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 6223 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
6224 | 0x01, /* value */ | 6224 | 0x01, /* value */ |
6225 | index, buffer, 1, | 6225 | index, gspca_dev->usb_buf, 1, |
6226 | 500); | 6226 | 500); |
6227 | return gspca_dev->usb_buf[0]; | ||
6227 | } | 6228 | } |
6228 | 6229 | ||
6229 | static void reg_r(struct usb_device *dev, | 6230 | static int reg_r(struct gspca_dev *gspca_dev, |
6230 | __u16 index, __u8 *buffer) | 6231 | __u16 index) |
6231 | { | 6232 | { |
6232 | reg_r_i(dev, index, buffer); | 6233 | int ret; |
6233 | PDEBUG(D_USBI, "reg r [%04x] -> %02x", index, *buffer); | 6234 | |
6235 | ret = reg_r_i(gspca_dev, index); | ||
6236 | PDEBUG(D_USBI, "reg r [%04x] -> %02x", index, ret); | ||
6237 | return ret; | ||
6234 | } | 6238 | } |
6235 | 6239 | ||
6236 | static void reg_w_i(struct usb_device *dev, | 6240 | static void reg_w_i(struct usb_device *dev, |
@@ -6253,55 +6257,54 @@ static void reg_w(struct usb_device *dev, | |||
6253 | reg_w_i(dev, value, index); | 6257 | reg_w_i(dev, value, index); |
6254 | } | 6258 | } |
6255 | 6259 | ||
6256 | static __u16 i2c_read(struct usb_device *dev, __u8 reg) | 6260 | static __u16 i2c_read(struct gspca_dev *gspca_dev, |
6261 | __u8 reg) | ||
6257 | { | 6262 | { |
6258 | __u8 retbyte; | 6263 | __u8 retbyte; |
6259 | __u8 retval[2]; | 6264 | __u8 retval[2]; |
6260 | 6265 | ||
6261 | reg_w_i(dev, reg, 0x92); | 6266 | reg_w_i(gspca_dev->dev, reg, 0x92); |
6262 | reg_w_i(dev, 0x02, 0x90); /* <- read command */ | 6267 | reg_w_i(gspca_dev->dev, 0x02, 0x90); /* <- read command */ |
6263 | msleep(25); | 6268 | msleep(25); |
6264 | reg_r_i(dev, 0x0091, &retbyte); /* read status */ | 6269 | retbyte = reg_r_i(gspca_dev, 0x0091); /* read status */ |
6265 | reg_r_i(dev, 0x0095, &retval[0]); /* read Lowbyte */ | 6270 | retval[0] = reg_r_i(gspca_dev, 0x0095); /* read Lowbyte */ |
6266 | reg_r_i(dev, 0x0096, &retval[1]); /* read Hightbyte */ | 6271 | retval[1] = reg_r_i(gspca_dev, 0x0096); /* read Hightbyte */ |
6267 | PDEBUG(D_USBO, "i2c r [%02x] -> (%02x) %02x%02x", | 6272 | PDEBUG(D_USBO, "i2c r [%02x] -> (%02x) %02x%02x", |
6268 | reg, retbyte, retval[1], retval[0]); | 6273 | reg, retbyte, retval[1], retval[0]); |
6269 | return (retval[1] << 8) | retval[0]; | 6274 | return (retval[1] << 8) | retval[0]; |
6270 | } | 6275 | } |
6271 | 6276 | ||
6272 | static __u8 i2c_write(struct usb_device *dev, | 6277 | static __u8 i2c_write(struct gspca_dev *gspca_dev, |
6273 | __u8 reg, | 6278 | __u8 reg, |
6274 | __u8 valL, | 6279 | __u8 valL, |
6275 | __u8 valH) | 6280 | __u8 valH) |
6276 | { | 6281 | { |
6277 | __u8 retbyte; | 6282 | __u8 retbyte; |
6278 | 6283 | ||
6279 | reg_w_i(dev, reg, 0x92); | 6284 | reg_w_i(gspca_dev->dev, reg, 0x92); |
6280 | reg_w_i(dev, valL, 0x93); | 6285 | reg_w_i(gspca_dev->dev, valL, 0x93); |
6281 | reg_w_i(dev, valH, 0x94); | 6286 | reg_w_i(gspca_dev->dev, valH, 0x94); |
6282 | reg_w_i(dev, 0x01, 0x90); /* <- write command */ | 6287 | reg_w_i(gspca_dev->dev, 0x01, 0x90); /* <- write command */ |
6283 | msleep(5); | 6288 | msleep(5); |
6284 | reg_r_i(dev, 0x0091, &retbyte); /* read status */ | 6289 | retbyte = reg_r_i(gspca_dev, 0x0091); /* read status */ |
6285 | PDEBUG(D_USBO, "i2c w [%02x] %02x%02x (%02x)", | 6290 | PDEBUG(D_USBO, "i2c w [%02x] %02x%02x (%02x)", |
6286 | reg, valH, valL, retbyte); | 6291 | reg, valH, valL, retbyte); |
6287 | return retbyte; | 6292 | return retbyte; |
6288 | } | 6293 | } |
6289 | 6294 | ||
6290 | static void usb_exchange(struct usb_device *dev, | 6295 | static void usb_exchange(struct gspca_dev *gspca_dev, |
6291 | const struct usb_action *action) | 6296 | const struct usb_action *action) |
6292 | { | 6297 | { |
6293 | __u8 buffread; | ||
6294 | |||
6295 | while (action->req) { | 6298 | while (action->req) { |
6296 | switch (action->req) { | 6299 | switch (action->req) { |
6297 | case 0xa0: /* write register */ | 6300 | case 0xa0: /* write register */ |
6298 | reg_w(dev, action->val, action->idx); | 6301 | reg_w(gspca_dev->dev, action->val, action->idx); |
6299 | break; | 6302 | break; |
6300 | case 0xa1: /* read status */ | 6303 | case 0xa1: /* read status */ |
6301 | reg_r(dev, action->idx, &buffread); | 6304 | reg_r(gspca_dev, action->idx); |
6302 | break; | 6305 | break; |
6303 | case 0xaa: | 6306 | case 0xaa: |
6304 | i2c_write(dev, | 6307 | i2c_write(gspca_dev, |
6305 | action->val, /* reg */ | 6308 | action->val, /* reg */ |
6306 | action->idx & 0xff, /* valL */ | 6309 | action->idx & 0xff, /* valL */ |
6307 | action->idx >> 8); /* valH */ | 6310 | action->idx >> 8); /* valH */ |
@@ -6376,7 +6379,6 @@ static void setsharpness(struct gspca_dev *gspca_dev) | |||
6376 | struct sd *sd = (struct sd *) gspca_dev; | 6379 | struct sd *sd = (struct sd *) gspca_dev; |
6377 | struct usb_device *dev = gspca_dev->dev; | 6380 | struct usb_device *dev = gspca_dev->dev; |
6378 | int sharpness; | 6381 | int sharpness; |
6379 | __u8 retbyte; | ||
6380 | static const __u8 sharpness_tb[][2] = { | 6382 | static const __u8 sharpness_tb[][2] = { |
6381 | {0x02, 0x03}, | 6383 | {0x02, 0x03}, |
6382 | {0x04, 0x07}, | 6384 | {0x04, 0x07}, |
@@ -6386,9 +6388,9 @@ static void setsharpness(struct gspca_dev *gspca_dev) | |||
6386 | 6388 | ||
6387 | sharpness = sd->sharpness; | 6389 | sharpness = sd->sharpness; |
6388 | reg_w(dev, sharpness_tb[sharpness][0], 0x01c6); | 6390 | reg_w(dev, sharpness_tb[sharpness][0], 0x01c6); |
6389 | reg_r(dev, 0x01c8, &retbyte); | 6391 | reg_r(gspca_dev, 0x01c8); |
6390 | reg_r(dev, 0x01c9, &retbyte); | 6392 | reg_r(gspca_dev, 0x01c9); |
6391 | reg_r(dev, 0x01ca, &retbyte); | 6393 | reg_r(gspca_dev, 0x01ca); |
6392 | reg_w(dev, sharpness_tb[sharpness][1], 0x01cb); | 6394 | reg_w(dev, sharpness_tb[sharpness][1], 0x01cb); |
6393 | } | 6395 | } |
6394 | 6396 | ||
@@ -6398,7 +6400,7 @@ static void setcontrast(struct gspca_dev *gspca_dev) | |||
6398 | struct usb_device *dev = gspca_dev->dev; | 6400 | struct usb_device *dev = gspca_dev->dev; |
6399 | const __u8 *Tgamma, *Tgradient; | 6401 | const __u8 *Tgamma, *Tgradient; |
6400 | int g, i, k; | 6402 | int g, i, k; |
6401 | static const __u8 kgamma_tb[16] = /* delta for contrast */ | 6403 | static const __u8 kgamma_tb[16] = /* delta for contrast */ |
6402 | {0x15, 0x0d, 0x0a, 0x09, 0x08, 0x08, 0x08, 0x08, | 6404 | {0x15, 0x0d, 0x0a, 0x09, 0x08, 0x08, 0x08, 0x08, |
6403 | 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}; | 6405 | 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}; |
6404 | static const __u8 kgrad_tb[16] = | 6406 | static const __u8 kgrad_tb[16] = |
@@ -6623,7 +6625,7 @@ static int setlightfreq(struct gspca_dev *gspca_dev) | |||
6623 | i++; /* 640x480 */ | 6625 | i++; /* 640x480 */ |
6624 | zc3_freq = freq_tb[(int) sd->sensor][i]; | 6626 | zc3_freq = freq_tb[(int) sd->sensor][i]; |
6625 | if (zc3_freq != NULL) { | 6627 | if (zc3_freq != NULL) { |
6626 | usb_exchange(gspca_dev->dev, zc3_freq); | 6628 | usb_exchange(gspca_dev, zc3_freq); |
6627 | switch (sd->sensor) { | 6629 | switch (sd->sensor) { |
6628 | case SENSOR_GC0305: | 6630 | case SENSOR_GC0305: |
6629 | if (mode /* if 320x240 */ | 6631 | if (mode /* if 320x240 */ |
@@ -6687,44 +6689,45 @@ static void start_2wr_probe(struct usb_device *dev, int sensor) | |||
6687 | /* msleep(2); */ | 6689 | /* msleep(2); */ |
6688 | } | 6690 | } |
6689 | 6691 | ||
6690 | static int sif_probe(struct usb_device *dev) | 6692 | static int sif_probe(struct gspca_dev *gspca_dev) |
6691 | { | 6693 | { |
6692 | __u16 checkword; | 6694 | __u16 checkword; |
6693 | 6695 | ||
6694 | start_2wr_probe(dev, 0x0f); /* PAS106 */ | 6696 | start_2wr_probe(gspca_dev->dev, 0x0f); /* PAS106 */ |
6695 | reg_w(dev, 0x08, 0x008d); | 6697 | reg_w(gspca_dev->dev, 0x08, 0x008d); |
6696 | msleep(150); | 6698 | msleep(150); |
6697 | checkword = ((i2c_read(dev, 0x00) & 0x0f) << 4) | 6699 | checkword = ((i2c_read(gspca_dev, 0x00) & 0x0f) << 4) |
6698 | | ((i2c_read(dev, 0x01) & 0xf0) >> 4); | 6700 | | ((i2c_read(gspca_dev, 0x01) & 0xf0) >> 4); |
6699 | PDEBUG(D_PROBE, "probe sif 0x%04x", checkword); | 6701 | PDEBUG(D_PROBE, "probe sif 0x%04x", checkword); |
6700 | if (checkword == 0x0007) { | 6702 | if (checkword == 0x0007) { |
6701 | send_unknown(dev, SENSOR_PAS106); | 6703 | send_unknown(gspca_dev->dev, SENSOR_PAS106); |
6702 | return 0x0f; /* PAS106 */ | 6704 | return 0x0f; /* PAS106 */ |
6703 | } | 6705 | } |
6704 | return -1; | 6706 | return -1; |
6705 | } | 6707 | } |
6706 | 6708 | ||
6707 | static int vga_2wr_probe(struct usb_device *dev) | 6709 | static int vga_2wr_probe(struct gspca_dev *gspca_dev) |
6708 | { | 6710 | { |
6711 | struct usb_device *dev = gspca_dev->dev; | ||
6709 | __u8 retbyte; | 6712 | __u8 retbyte; |
6710 | __u16 checkword; | 6713 | __u16 checkword; |
6711 | 6714 | ||
6712 | start_2wr_probe(dev, 0x00); /* HV7131B */ | 6715 | start_2wr_probe(dev, 0x00); /* HV7131B */ |
6713 | i2c_write(dev, 0x01, 0xaa, 0x00); | 6716 | i2c_write(gspca_dev, 0x01, 0xaa, 0x00); |
6714 | retbyte = i2c_read(dev, 0x01); | 6717 | retbyte = i2c_read(gspca_dev, 0x01); |
6715 | if (retbyte != 0) | 6718 | if (retbyte != 0) |
6716 | return 0x00; /* HV7131B */ | 6719 | return 0x00; /* HV7131B */ |
6717 | 6720 | ||
6718 | start_2wr_probe(dev, 0x04); /* CS2102 */ | 6721 | start_2wr_probe(dev, 0x04); /* CS2102 */ |
6719 | i2c_write(dev, 0x01, 0xaa, 0x00); | 6722 | i2c_write(gspca_dev, 0x01, 0xaa, 0x00); |
6720 | retbyte = i2c_read(dev, 0x01); | 6723 | retbyte = i2c_read(gspca_dev, 0x01); |
6721 | if (retbyte != 0) | 6724 | if (retbyte != 0) |
6722 | return 0x04; /* CS2102 */ | 6725 | return 0x04; /* CS2102 */ |
6723 | 6726 | ||
6724 | start_2wr_probe(dev, 0x06); /* OmniVision */ | 6727 | start_2wr_probe(dev, 0x06); /* OmniVision */ |
6725 | reg_w(dev, 0x08, 0x8d); | 6728 | reg_w(dev, 0x08, 0x8d); |
6726 | i2c_write(dev, 0x11, 0xaa, 0x00); | 6729 | i2c_write(gspca_dev, 0x11, 0xaa, 0x00); |
6727 | retbyte = i2c_read(dev, 0x11); | 6730 | retbyte = i2c_read(gspca_dev, 0x11); |
6728 | if (retbyte != 0) { | 6731 | if (retbyte != 0) { |
6729 | /* (should have returned 0xaa) --> Omnivision? */ | 6732 | /* (should have returned 0xaa) --> Omnivision? */ |
6730 | /* reg_r 0x10 -> 0x06 --> */ | 6733 | /* reg_r 0x10 -> 0x06 --> */ |
@@ -6732,45 +6735,45 @@ static int vga_2wr_probe(struct usb_device *dev) | |||
6732 | } | 6735 | } |
6733 | 6736 | ||
6734 | start_2wr_probe(dev, 0x08); /* HDCS2020 */ | 6737 | start_2wr_probe(dev, 0x08); /* HDCS2020 */ |
6735 | i2c_write(dev, 0x15, 0xaa, 0x00); | 6738 | i2c_write(gspca_dev, 0x15, 0xaa, 0x00); |
6736 | retbyte = i2c_read(dev, 0x15); | 6739 | retbyte = i2c_read(gspca_dev, 0x15); |
6737 | if (retbyte != 0) | 6740 | if (retbyte != 0) |
6738 | return 0x08; /* HDCS2020 */ | 6741 | return 0x08; /* HDCS2020 */ |
6739 | 6742 | ||
6740 | start_2wr_probe(dev, 0x0a); /* PB0330 */ | 6743 | start_2wr_probe(dev, 0x0a); /* PB0330 */ |
6741 | i2c_write(dev, 0x07, 0xaa, 0xaa); | 6744 | i2c_write(gspca_dev, 0x07, 0xaa, 0xaa); |
6742 | retbyte = i2c_read(dev, 0x07); | 6745 | retbyte = i2c_read(gspca_dev, 0x07); |
6743 | if (retbyte != 0) | 6746 | if (retbyte != 0) |
6744 | return 0x0a; /* PB0330 */ | 6747 | return 0x0a; /* PB0330 */ |
6745 | retbyte = i2c_read(dev, 0x03); | 6748 | retbyte = i2c_read(gspca_dev, 0x03); |
6746 | if (retbyte != 0) | 6749 | if (retbyte != 0) |
6747 | return 0x0a; /* PB0330 ?? */ | 6750 | return 0x0a; /* PB0330 ?? */ |
6748 | retbyte = i2c_read(dev, 0x04); | 6751 | retbyte = i2c_read(gspca_dev, 0x04); |
6749 | if (retbyte != 0) | 6752 | if (retbyte != 0) |
6750 | return 0x0a; /* PB0330 ?? */ | 6753 | return 0x0a; /* PB0330 ?? */ |
6751 | 6754 | ||
6752 | start_2wr_probe(dev, 0x0c); /* ICM105A */ | 6755 | start_2wr_probe(dev, 0x0c); /* ICM105A */ |
6753 | i2c_write(dev, 0x01, 0x11, 0x00); | 6756 | i2c_write(gspca_dev, 0x01, 0x11, 0x00); |
6754 | retbyte = i2c_read(dev, 0x01); | 6757 | retbyte = i2c_read(gspca_dev, 0x01); |
6755 | if (retbyte != 0) | 6758 | if (retbyte != 0) |
6756 | return 0x0c; /* ICM105A */ | 6759 | return 0x0c; /* ICM105A */ |
6757 | 6760 | ||
6758 | start_2wr_probe(dev, 0x0e); /* PAS202BCB */ | 6761 | start_2wr_probe(dev, 0x0e); /* PAS202BCB */ |
6759 | reg_w(dev, 0x08, 0x8d); | 6762 | reg_w(dev, 0x08, 0x8d); |
6760 | i2c_write(dev, 0x03, 0xaa, 0x00); | 6763 | i2c_write(gspca_dev, 0x03, 0xaa, 0x00); |
6761 | msleep(500); | 6764 | msleep(500); |
6762 | retbyte = i2c_read(dev, 0x03); | 6765 | retbyte = i2c_read(gspca_dev, 0x03); |
6763 | if (retbyte != 0) | 6766 | if (retbyte != 0) |
6764 | return 0x0e; /* PAS202BCB */ | 6767 | return 0x0e; /* PAS202BCB */ |
6765 | 6768 | ||
6766 | start_2wr_probe(dev, 0x02); /* ?? */ | 6769 | start_2wr_probe(dev, 0x02); /* ?? */ |
6767 | i2c_write(dev, 0x01, 0xaa, 0x00); | 6770 | i2c_write(gspca_dev, 0x01, 0xaa, 0x00); |
6768 | retbyte = i2c_read(dev, 0x01); | 6771 | retbyte = i2c_read(gspca_dev, 0x01); |
6769 | if (retbyte != 0) | 6772 | if (retbyte != 0) |
6770 | return 0x02; /* ?? */ | 6773 | return 0x02; /* ?? */ |
6771 | ov_check: | 6774 | ov_check: |
6772 | reg_r(dev, 0x0010, &retbyte); /* ?? */ | 6775 | reg_r(gspca_dev, 0x0010); /* ?? */ |
6773 | reg_r(dev, 0x0010, &retbyte); | 6776 | reg_r(gspca_dev, 0x0010); |
6774 | 6777 | ||
6775 | reg_w(dev, 0x01, 0x0000); | 6778 | reg_w(dev, 0x01, 0x0000); |
6776 | reg_w(dev, 0x01, 0x0001); | 6779 | reg_w(dev, 0x01, 0x0001); |
@@ -6779,10 +6782,10 @@ ov_check: | |||
6779 | reg_w(dev, 0x08, 0x008d); | 6782 | reg_w(dev, 0x08, 0x008d); |
6780 | msleep(500); | 6783 | msleep(500); |
6781 | reg_w(dev, 0x01, 0x0012); | 6784 | reg_w(dev, 0x01, 0x0012); |
6782 | i2c_write(dev, 0x12, 0x80, 0x00); /* sensor reset */ | 6785 | i2c_write(gspca_dev, 0x12, 0x80, 0x00); /* sensor reset */ |
6783 | retbyte = i2c_read(dev, 0x0a); | 6786 | retbyte = i2c_read(gspca_dev, 0x0a); |
6784 | checkword = retbyte << 8; | 6787 | checkword = retbyte << 8; |
6785 | retbyte = i2c_read(dev, 0x0b); | 6788 | retbyte = i2c_read(gspca_dev, 0x0b); |
6786 | checkword |= retbyte; | 6789 | checkword |= retbyte; |
6787 | PDEBUG(D_PROBE, "probe 2wr ov vga 0x%04x", checkword); | 6790 | PDEBUG(D_PROBE, "probe 2wr ov vga 0x%04x", checkword); |
6788 | switch (checkword) { | 6791 | switch (checkword) { |
@@ -6821,7 +6824,7 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev) | |||
6821 | 6824 | ||
6822 | /*fixme: lack of 8b=b3 (11,12)-> 10, 8b=e0 (14,15,16)-> 12 found in gspcav1*/ | 6825 | /*fixme: lack of 8b=b3 (11,12)-> 10, 8b=e0 (14,15,16)-> 12 found in gspcav1*/ |
6823 | reg_w(dev, 0x02, 0x0010); | 6826 | reg_w(dev, 0x02, 0x0010); |
6824 | reg_r(dev, 0x10, &retbyte); | 6827 | reg_r(gspca_dev, 0x10); |
6825 | reg_w(dev, 0x01, 0x0000); | 6828 | reg_w(dev, 0x01, 0x0000); |
6826 | reg_w(dev, 0x00, 0x0010); | 6829 | reg_w(dev, 0x00, 0x0010); |
6827 | reg_w(dev, 0x01, 0x0001); | 6830 | reg_w(dev, 0x01, 0x0001); |
@@ -6829,23 +6832,23 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev) | |||
6829 | reg_w(dev, 0x03, 0x0012); | 6832 | reg_w(dev, 0x03, 0x0012); |
6830 | reg_w(dev, 0x01, 0x0012); | 6833 | reg_w(dev, 0x01, 0x0012); |
6831 | reg_w(dev, 0x05, 0x0012); | 6834 | reg_w(dev, 0x05, 0x0012); |
6832 | retbyte = i2c_read(dev, 0x14); | 6835 | retbyte = i2c_read(gspca_dev, 0x14); |
6833 | if (retbyte != 0) | 6836 | if (retbyte != 0) |
6834 | return 0x11; /* HV7131R */ | 6837 | return 0x11; /* HV7131R */ |
6835 | retbyte = i2c_read(dev, 0x15); | 6838 | retbyte = i2c_read(gspca_dev, 0x15); |
6836 | if (retbyte != 0) | 6839 | if (retbyte != 0) |
6837 | return 0x11; /* HV7131R */ | 6840 | return 0x11; /* HV7131R */ |
6838 | retbyte = i2c_read(dev, 0x16); | 6841 | retbyte = i2c_read(gspca_dev, 0x16); |
6839 | if (retbyte != 0) | 6842 | if (retbyte != 0) |
6840 | return 0x11; /* HV7131R */ | 6843 | return 0x11; /* HV7131R */ |
6841 | 6844 | ||
6842 | reg_w(dev, 0x02, 0x0010); | 6845 | reg_w(dev, 0x02, 0x0010); |
6843 | reg_r(dev, 0x000b, &retbyte); | 6846 | retbyte = reg_r(gspca_dev, 0x000b); |
6844 | checkword = retbyte << 8; | 6847 | checkword = retbyte << 8; |
6845 | reg_r(dev, 0x000a, &retbyte); | 6848 | retbyte = reg_r(gspca_dev, 0x000a); |
6846 | checkword |= retbyte; | 6849 | checkword |= retbyte; |
6847 | PDEBUG(D_PROBE, "probe 3wr vga 1 0x%04x", checkword); | 6850 | PDEBUG(D_PROBE, "probe 3wr vga 1 0x%04x", checkword); |
6848 | reg_r(dev, 0x0010, &retbyte); | 6851 | reg_r(gspca_dev, 0x0010); |
6849 | /* this is tested only once anyway */ | 6852 | /* this is tested only once anyway */ |
6850 | i = 0; | 6853 | i = 0; |
6851 | while (chipset_revision_sensor[i].revision) { | 6854 | while (chipset_revision_sensor[i].revision) { |
@@ -6863,7 +6866,7 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev) | |||
6863 | reg_w(dev, 0x0a, 0x0010); | 6866 | reg_w(dev, 0x0a, 0x0010); |
6864 | reg_w(dev, 0x03, 0x0012); | 6867 | reg_w(dev, 0x03, 0x0012); |
6865 | reg_w(dev, 0x01, 0x0012); | 6868 | reg_w(dev, 0x01, 0x0012); |
6866 | retbyte = i2c_read(dev, 0x00); | 6869 | retbyte = i2c_read(gspca_dev, 0x00); |
6867 | if (retbyte != 0) { | 6870 | if (retbyte != 0) { |
6868 | PDEBUG(D_PROBE, "probe 3wr vga type 0a ?"); | 6871 | PDEBUG(D_PROBE, "probe 3wr vga type 0a ?"); |
6869 | return 0x0a; /* ?? */ | 6872 | return 0x0a; /* ?? */ |
@@ -6876,7 +6879,7 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev) | |||
6876 | reg_w(dev, 0x03, 0x0012); | 6879 | reg_w(dev, 0x03, 0x0012); |
6877 | msleep(2); | 6880 | msleep(2); |
6878 | reg_w(dev, 0x01, 0x0012); | 6881 | reg_w(dev, 0x01, 0x0012); |
6879 | retbyte = i2c_read(dev, 0x00); | 6882 | retbyte = i2c_read(gspca_dev, 0x00); |
6880 | if (retbyte != 0) { | 6883 | if (retbyte != 0) { |
6881 | PDEBUG(D_PROBE, "probe 3wr vga type %02x", retbyte); | 6884 | PDEBUG(D_PROBE, "probe 3wr vga type %02x", retbyte); |
6882 | send_unknown(dev, SENSOR_GC0305); | 6885 | send_unknown(dev, SENSOR_GC0305); |
@@ -6890,8 +6893,8 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev) | |||
6890 | reg_w(dev, 0x06, 0x0010); | 6893 | reg_w(dev, 0x06, 0x0010); |
6891 | reg_w(dev, 0x01, 0x0012); | 6894 | reg_w(dev, 0x01, 0x0012); |
6892 | reg_w(dev, 0x05, 0x0012); | 6895 | reg_w(dev, 0x05, 0x0012); |
6893 | if (i2c_read(dev, 0x1c) == 0x7f /* OV7610 - manufacturer ID */ | 6896 | if (i2c_read(gspca_dev, 0x1c) == 0x7f /* OV7610 - manufacturer ID */ |
6894 | && i2c_read(dev, 0x1d) == 0xa2) { | 6897 | && i2c_read(gspca_dev, 0x1d) == 0xa2) { |
6895 | send_unknown(dev, SENSOR_OV7620); | 6898 | send_unknown(dev, SENSOR_OV7620); |
6896 | return 0x06; /* OmniVision confirm ? */ | 6899 | return 0x06; /* OmniVision confirm ? */ |
6897 | } | 6900 | } |
@@ -6905,13 +6908,13 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev) | |||
6905 | /* msleep(150); */ | 6908 | /* msleep(150); */ |
6906 | reg_w(dev, 0x01, 0x12); | 6909 | reg_w(dev, 0x01, 0x12); |
6907 | reg_w(dev, 0x05, 0x12); | 6910 | reg_w(dev, 0x05, 0x12); |
6908 | retbyte = i2c_read(dev, 0x00); /* ID 0 */ | 6911 | retbyte = i2c_read(gspca_dev, 0x00); /* ID 0 */ |
6909 | checkword = retbyte << 8; | 6912 | checkword = retbyte << 8; |
6910 | retbyte = i2c_read(dev, 0x01); /* ID 1 */ | 6913 | retbyte = i2c_read(gspca_dev, 0x01); /* ID 1 */ |
6911 | checkword |= retbyte; | 6914 | checkword |= retbyte; |
6912 | PDEBUG(D_PROBE, "probe 3wr vga 2 0x%04x", checkword); | 6915 | PDEBUG(D_PROBE, "probe 3wr vga 2 0x%04x", checkword); |
6913 | if (checkword == 0x2030) { | 6916 | if (checkword == 0x2030) { |
6914 | retbyte = i2c_read(dev, 0x02); /* revision number */ | 6917 | retbyte = i2c_read(gspca_dev, 0x02); /* revision number */ |
6915 | PDEBUG(D_PROBE, "sensor PO2030 rev 0x%02x", retbyte); | 6918 | PDEBUG(D_PROBE, "sensor PO2030 rev 0x%02x", retbyte); |
6916 | send_unknown(dev, SENSOR_PO2030); | 6919 | send_unknown(dev, SENSOR_PO2030); |
6917 | return checkword; | 6920 | return checkword; |
@@ -6925,7 +6928,7 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev) | |||
6925 | reg_w(dev, 0x01, 0x12); | 6928 | reg_w(dev, 0x01, 0x12); |
6926 | reg_w(dev, 0x05, 0x01); | 6929 | reg_w(dev, 0x05, 0x01); |
6927 | reg_w(dev, 0xd3, 0x8b); | 6930 | reg_w(dev, 0xd3, 0x8b); |
6928 | retbyte = i2c_read(dev, 0x01); | 6931 | retbyte = i2c_read(gspca_dev, 0x01); |
6929 | if (retbyte != 0) { | 6932 | if (retbyte != 0) { |
6930 | PDEBUG(D_PROBE, "probe 3wr vga type 0a ?"); | 6933 | PDEBUG(D_PROBE, "probe 3wr vga type 0a ?"); |
6931 | return 0x0a; /* ?? */ | 6934 | return 0x0a; /* ?? */ |
@@ -6936,7 +6939,6 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev) | |||
6936 | static int zcxx_probeSensor(struct gspca_dev *gspca_dev) | 6939 | static int zcxx_probeSensor(struct gspca_dev *gspca_dev) |
6937 | { | 6940 | { |
6938 | struct sd *sd = (struct sd *) gspca_dev; | 6941 | struct sd *sd = (struct sd *) gspca_dev; |
6939 | struct usb_device *dev = gspca_dev->dev; | ||
6940 | int sensor, sensor2; | 6942 | int sensor, sensor2; |
6941 | 6943 | ||
6942 | switch (sd->sensor) { | 6944 | switch (sd->sensor) { |
@@ -6944,7 +6946,7 @@ static int zcxx_probeSensor(struct gspca_dev *gspca_dev) | |||
6944 | case SENSOR_TAS5130C_VF0250: | 6946 | case SENSOR_TAS5130C_VF0250: |
6945 | return -1; /* don't probe */ | 6947 | return -1; /* don't probe */ |
6946 | } | 6948 | } |
6947 | sensor = vga_2wr_probe(dev); | 6949 | sensor = vga_2wr_probe(gspca_dev); |
6948 | if (sensor >= 0) { | 6950 | if (sensor >= 0) { |
6949 | if (sensor < 0x7600) | 6951 | if (sensor < 0x7600) |
6950 | return sensor; | 6952 | return sensor; |
@@ -6956,7 +6958,7 @@ static int zcxx_probeSensor(struct gspca_dev *gspca_dev) | |||
6956 | return sensor; | 6958 | return sensor; |
6957 | return sensor2; | 6959 | return sensor2; |
6958 | } | 6960 | } |
6959 | return sif_probe(dev); | 6961 | return sif_probe(gspca_dev); |
6960 | } | 6962 | } |
6961 | 6963 | ||
6962 | /* this function is called at probe time */ | 6964 | /* this function is called at probe time */ |
@@ -6966,7 +6968,6 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
6966 | struct sd *sd = (struct sd *) gspca_dev; | 6968 | struct sd *sd = (struct sd *) gspca_dev; |
6967 | struct cam *cam; | 6969 | struct cam *cam; |
6968 | int sensor; | 6970 | int sensor; |
6969 | __u8 bsensor; | ||
6970 | int vga = 1; /* 1: vga, 0: sif */ | 6971 | int vga = 1; /* 1: vga, 0: sif */ |
6971 | static const __u8 gamma[SENSOR_MAX] = { | 6972 | static const __u8 gamma[SENSOR_MAX] = { |
6972 | 5, /* SENSOR_CS2102 0 */ | 6973 | 5, /* SENSOR_CS2102 0 */ |
@@ -7122,7 +7123,7 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
7122 | reg_w(gspca_dev->dev, 0x02, 0x0010); | 7123 | reg_w(gspca_dev->dev, 0x02, 0x0010); |
7123 | else | 7124 | else |
7124 | reg_w(gspca_dev->dev, sensor & 0x0f, 0x0010); | 7125 | reg_w(gspca_dev->dev, sensor & 0x0f, 0x0010); |
7125 | reg_r(gspca_dev->dev, 0x0010, &bsensor); | 7126 | reg_r(gspca_dev, 0x0010); |
7126 | } | 7127 | } |
7127 | 7128 | ||
7128 | cam = &gspca_dev->cam; | 7129 | cam = &gspca_dev->cam; |
@@ -7163,7 +7164,6 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
7163 | struct usb_device *dev = gspca_dev->dev; | 7164 | struct usb_device *dev = gspca_dev->dev; |
7164 | const struct usb_action *zc3_init; | 7165 | const struct usb_action *zc3_init; |
7165 | int mode; | 7166 | int mode; |
7166 | __u8 retbyte; | ||
7167 | static const struct usb_action *init_tb[SENSOR_MAX][2] = { | 7167 | static const struct usb_action *init_tb[SENSOR_MAX][2] = { |
7168 | {cs2102_InitialScale, cs2102_Initial}, /* 0 */ | 7168 | {cs2102_InitialScale, cs2102_Initial}, /* 0 */ |
7169 | {cs2102K_InitialScale, cs2102K_Initial}, /* 1 */ | 7169 | {cs2102K_InitialScale, cs2102K_Initial}, /* 1 */ |
@@ -7194,7 +7194,7 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
7194 | zcxx_probeSensor(gspca_dev); | 7194 | zcxx_probeSensor(gspca_dev); |
7195 | break; | 7195 | break; |
7196 | case SENSOR_PAS106: | 7196 | case SENSOR_PAS106: |
7197 | usb_exchange(dev, pas106b_Initial_com); | 7197 | usb_exchange(gspca_dev, pas106b_Initial_com); |
7198 | break; | 7198 | break; |
7199 | case SENSOR_PB0330: | 7199 | case SENSOR_PB0330: |
7200 | if (mode) { | 7200 | if (mode) { |
@@ -7210,14 +7210,14 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
7210 | } | 7210 | } |
7211 | break; | 7211 | break; |
7212 | } | 7212 | } |
7213 | usb_exchange(dev, zc3_init); | 7213 | usb_exchange(gspca_dev, zc3_init); |
7214 | 7214 | ||
7215 | switch (sd->sensor) { | 7215 | switch (sd->sensor) { |
7216 | case SENSOR_GC0305: | 7216 | case SENSOR_GC0305: |
7217 | case SENSOR_OV7620: | 7217 | case SENSOR_OV7620: |
7218 | case SENSOR_PO2030: | 7218 | case SENSOR_PO2030: |
7219 | msleep(100); /* ?? */ | 7219 | msleep(100); /* ?? */ |
7220 | reg_r(dev, 0x0002, &retbyte); /* --> 0x40 */ | 7220 | reg_r(gspca_dev, 0x0002); /* --> 0x40 */ |
7221 | reg_w(dev, 0x09, 0x01ad); /* (from win traces) */ | 7221 | reg_w(dev, 0x09, 0x01ad); /* (from win traces) */ |
7222 | reg_w(dev, 0x15, 0x01ae); | 7222 | reg_w(dev, 0x15, 0x01ae); |
7223 | reg_w(dev, 0x0d, 0x003a); | 7223 | reg_w(dev, 0x0d, 0x003a); |
@@ -7230,11 +7230,11 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
7230 | setbrightness(gspca_dev); | 7230 | setbrightness(gspca_dev); |
7231 | switch (sd->sensor) { | 7231 | switch (sd->sensor) { |
7232 | case SENSOR_OV7620: | 7232 | case SENSOR_OV7620: |
7233 | reg_r(dev, 0x0008, &retbyte); | 7233 | reg_r(gspca_dev, 0x0008); |
7234 | reg_w(dev, 0x00, 0x0008); | 7234 | reg_w(dev, 0x00, 0x0008); |
7235 | break; | 7235 | break; |
7236 | case SENSOR_GC0305: | 7236 | case SENSOR_GC0305: |
7237 | reg_r(dev, 0x0008, &retbyte); | 7237 | reg_r(gspca_dev, 0x0008); |
7238 | /* fall thru */ | 7238 | /* fall thru */ |
7239 | case SENSOR_PO2030: | 7239 | case SENSOR_PO2030: |
7240 | reg_w(dev, 0x03, 0x0008); | 7240 | reg_w(dev, 0x03, 0x0008); |
@@ -7259,7 +7259,7 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
7259 | setmatrix(gspca_dev); /* one more time? */ | 7259 | setmatrix(gspca_dev); /* one more time? */ |
7260 | switch (sd->sensor) { | 7260 | switch (sd->sensor) { |
7261 | case SENSOR_OV7620: | 7261 | case SENSOR_OV7620: |
7262 | reg_r(dev, 0x0180, &retbyte); /* from win */ | 7262 | reg_r(gspca_dev, 0x0180); /* from win */ |
7263 | reg_w(dev, 0x00, 0x0180); | 7263 | reg_w(dev, 0x00, 0x0180); |
7264 | break; | 7264 | break; |
7265 | default: | 7265 | default: |
@@ -7277,7 +7277,7 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
7277 | break; | 7277 | break; |
7278 | case SENSOR_PO2030: | 7278 | case SENSOR_PO2030: |
7279 | reg_w(dev, 0x40, 0x0117); /* (from win traces) */ | 7279 | reg_w(dev, 0x40, 0x0117); /* (from win traces) */ |
7280 | reg_r(dev, 0x0180, &retbyte); | 7280 | reg_r(gspca_dev, 0x0180); |
7281 | break; | 7281 | break; |
7282 | } | 7282 | } |
7283 | 7283 | ||
@@ -7289,22 +7289,23 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
7289 | reg_w(dev, 0x15, 0x01ae); | 7289 | reg_w(dev, 0x15, 0x01ae); |
7290 | reg_w(dev, 0x40, 0x0180); | 7290 | reg_w(dev, 0x40, 0x0180); |
7291 | reg_w(dev, 0x40, 0x0117); | 7291 | reg_w(dev, 0x40, 0x0117); |
7292 | reg_r(dev, 0x0180, &retbyte); | 7292 | reg_r(gspca_dev, 0x0180); |
7293 | sd->autogain = 1; | 7293 | sd->autogain = 1; |
7294 | setautogain(gspca_dev); | 7294 | setautogain(gspca_dev); |
7295 | break; | 7295 | break; |
7296 | case SENSOR_OV7620: | 7296 | case SENSOR_OV7620: |
7297 | i2c_read(dev, 0x13); /*fixme: returns 0xa3 */ | 7297 | i2c_read(gspca_dev, 0x13); /*fixme: returns 0xa3 */ |
7298 | i2c_write(dev, 0x13, 0xa3, 0x00); /*fixme: same to send? */ | 7298 | i2c_write(gspca_dev, 0x13, 0xa3, 0x00); |
7299 | /*fixme: returned value to send? */ | ||
7299 | reg_w(dev, 0x40, 0x0117); /* (from win traces) */ | 7300 | reg_w(dev, 0x40, 0x0117); /* (from win traces) */ |
7300 | reg_r(dev, 0x0180, &retbyte); | 7301 | reg_r(gspca_dev, 0x0180); |
7301 | setautogain(gspca_dev); | 7302 | setautogain(gspca_dev); |
7302 | msleep(500); | 7303 | msleep(500); |
7303 | break; | 7304 | break; |
7304 | case SENSOR_PO2030: | 7305 | case SENSOR_PO2030: |
7305 | msleep(500); | 7306 | msleep(500); |
7306 | reg_r(dev, 0x0008, &retbyte); | 7307 | reg_r(gspca_dev, 0x0008); |
7307 | reg_r(dev, 0x0007, &retbyte); | 7308 | reg_r(gspca_dev, 0x0007); |
7308 | reg_w(dev, 0x00, 0x0007); /* (from win traces) */ | 7309 | reg_w(dev, 0x00, 0x0007); /* (from win traces) */ |
7309 | reg_w(dev, 0x02, 0x0008); | 7310 | reg_w(dev, 0x02, 0x0008); |
7310 | break; | 7311 | break; |