23 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
25 #include <linux/input.h>
41 #define SCALE_MASK 0x0f
42 #define SCALE_160x120 0
43 #define SCALE_320x240 1
44 #define SCALE_640x480 2
45 #define SCALE_1280x1024 3
47 #define MODE_JPEG 0x20
48 #define MODE_SXGA 0x80
50 #define SENSOR_OV9650 0
51 #define SENSOR_OV9655 1
52 #define SENSOR_SOI968 2
53 #define SENSOR_OV7660 3
54 #define SENSOR_OV7670 4
55 #define SENSOR_MT9V011 5
56 #define SENSOR_MT9V111 6
57 #define SENSOR_MT9V112 7
58 #define SENSOR_MT9M001 8
59 #define SENSOR_MT9M111 9
60 #define SENSOR_MT9M112 10
61 #define SENSOR_HV7131R 11
62 #define SENSOR_MT9VPRB 12
65 #define HAS_NO_BUTTON 0x1
66 #define LED_REVERSE 0x2
67 #define FLIP_DETECT 0x4
103 #define MIN_AVG_LUM 80
104 #define MAX_AVG_LUM 130
135 .ident =
"MSI MS-1034",
143 .ident =
"MSI MS-1632",
150 .ident =
"MSI MS-1633X",
157 .ident =
"MSI MS-1635X",
164 .ident =
"ASUSTeK W7J",
176 .sizeimage = 160 * 120 * 4 / 8 + 590,
181 .sizeimage = 160 * 120,
186 .sizeimage = 240 * 120,
191 .sizeimage = 320 * 240 * 4 / 8 + 590,
196 .sizeimage = 320 * 240 ,
201 .sizeimage = 480 * 240 ,
206 .sizeimage = 640 * 480 * 4 / 8 + 590,
211 .sizeimage = 640 * 480,
216 .sizeimage = 960 * 480,
224 .sizeimage = 160 * 120 * 4 / 8 + 590,
229 .sizeimage = 160 * 120,
234 .sizeimage = 240 * 120,
239 .sizeimage = 320 * 240 * 4 / 8 + 590,
244 .sizeimage = 320 * 240 ,
249 .sizeimage = 480 * 240 ,
254 .sizeimage = 640 * 480 * 4 / 8 + 590,
259 .sizeimage = 640 * 480,
264 .sizeimage = 960 * 480,
268 .bytesperline = 1280,
269 .sizeimage = 1280 * 1024,
277 .sizeimage = 160 * 120,
282 .sizeimage = 320 * 240 ,
287 .sizeimage = 640 * 480,
291 .bytesperline = 1280,
292 .sizeimage = 1280 * 1024,
297 static const s16 hsv_red_x[] = {
298 41, 44, 46, 48, 50, 52, 54, 56,
299 58, 60, 62, 64, 66, 68, 70, 72,
300 74, 76, 78, 80, 81, 83, 85, 87,
301 88, 90, 92, 93, 95, 97, 98, 100,
302 101, 102, 104, 105, 107, 108, 109, 110,
303 112, 113, 114, 115, 116, 117, 118, 119,
304 120, 121, 122, 123, 123, 124, 125, 125,
305 126, 127, 127, 128, 128, 129, 129, 129,
306 130, 130, 130, 130, 131, 131, 131, 131,
307 131, 131, 131, 131, 130, 130, 130, 130,
308 129, 129, 129, 128, 128, 127, 127, 126,
309 125, 125, 124, 123, 122, 122, 121, 120,
310 119, 118, 117, 116, 115, 114, 112, 111,
311 110, 109, 107, 106, 105, 103, 102, 101,
312 99, 98, 96, 94, 93, 91, 90, 88,
313 86, 84, 83, 81, 79, 77, 75, 74,
314 72, 70, 68, 66, 64, 62, 60, 58,
315 56, 54, 52, 49, 47, 45, 43, 41,
316 39, 36, 34, 32, 30, 28, 25, 23,
317 21, 19, 16, 14, 12, 9, 7, 5,
318 3, 0, -1, -3, -6, -8, -10, -12,
319 -15, -17, -19, -22, -24, -26, -28, -30,
320 -33, -35, -37, -39, -41, -44, -46, -48,
321 -50, -52, -54, -56, -58, -60, -62, -64,
322 -66, -68, -70, -72, -74, -76, -78, -80,
323 -81, -83, -85, -87, -88, -90, -92, -93,
324 -95, -97, -98, -100, -101, -102, -104, -105,
325 -107, -108, -109, -110, -112, -113, -114, -115,
326 -116, -117, -118, -119, -120, -121, -122, -123,
327 -123, -124, -125, -125, -126, -127, -127, -128,
328 -128, -128, -128, -128, -128, -128, -128, -128,
329 -128, -128, -128, -128, -128, -128, -128, -128,
330 -128, -128, -128, -128, -128, -128, -128, -128,
331 -128, -127, -127, -126, -125, -125, -124, -123,
332 -122, -122, -121, -120, -119, -118, -117, -116,
333 -115, -114, -112, -111, -110, -109, -107, -106,
334 -105, -103, -102, -101, -99, -98, -96, -94,
335 -93, -91, -90, -88, -86, -84, -83, -81,
336 -79, -77, -75, -74, -72, -70, -68, -66,
337 -64, -62, -60, -58, -56, -54, -52, -49,
338 -47, -45, -43, -41, -39, -36, -34, -32,
339 -30, -28, -25, -23, -21, -19, -16, -14,
340 -12, -9, -7, -5, -3, 0, 1, 3,
341 6, 8, 10, 12, 15, 17, 19, 22,
342 24, 26, 28, 30, 33, 35, 37, 39, 41
345 static const s16 hsv_red_y[] = {
346 82, 80, 78, 76, 74, 73, 71, 69,
347 67, 65, 63, 61, 58, 56, 54, 52,
348 50, 48, 46, 44, 41, 39, 37, 35,
349 32, 30, 28, 26, 23, 21, 19, 16,
350 14, 12, 10, 7, 5, 3, 0, -1,
351 -3, -6, -8, -10, -13, -15, -17, -19,
352 -22, -24, -26, -29, -31, -33, -35, -38,
353 -40, -42, -44, -46, -48, -51, -53, -55,
354 -57, -59, -61, -63, -65, -67, -69, -71,
355 -73, -75, -77, -79, -81, -82, -84, -86,
356 -88, -89, -91, -93, -94, -96, -98, -99,
357 -101, -102, -104, -105, -106, -108, -109, -110,
358 -112, -113, -114, -115, -116, -117, -119, -120,
359 -120, -121, -122, -123, -124, -125, -126, -126,
360 -127, -128, -128, -128, -128, -128, -128, -128,
361 -128, -128, -128, -128, -128, -128, -128, -128,
362 -128, -128, -128, -128, -128, -128, -128, -128,
363 -128, -128, -128, -128, -128, -128, -128, -128,
364 -127, -127, -126, -125, -125, -124, -123, -122,
365 -121, -120, -119, -118, -117, -116, -115, -114,
366 -113, -111, -110, -109, -107, -106, -105, -103,
367 -102, -100, -99, -97, -96, -94, -92, -91,
368 -89, -87, -85, -84, -82, -80, -78, -76,
369 -74, -73, -71, -69, -67, -65, -63, -61,
370 -58, -56, -54, -52, -50, -48, -46, -44,
371 -41, -39, -37, -35, -32, -30, -28, -26,
372 -23, -21, -19, -16, -14, -12, -10, -7,
373 -5, -3, 0, 1, 3, 6, 8, 10,
374 13, 15, 17, 19, 22, 24, 26, 29,
375 31, 33, 35, 38, 40, 42, 44, 46,
376 48, 51, 53, 55, 57, 59, 61, 63,
377 65, 67, 69, 71, 73, 75, 77, 79,
378 81, 82, 84, 86, 88, 89, 91, 93,
379 94, 96, 98, 99, 101, 102, 104, 105,
380 106, 108, 109, 110, 112, 113, 114, 115,
381 116, 117, 119, 120, 120, 121, 122, 123,
382 124, 125, 126, 126, 127, 128, 128, 129,
383 129, 130, 130, 131, 131, 131, 131, 132,
384 132, 132, 132, 132, 132, 132, 132, 132,
385 132, 132, 132, 131, 131, 131, 130, 130,
386 130, 129, 129, 128, 127, 127, 126, 125,
387 125, 124, 123, 122, 121, 120, 119, 118,
388 117, 116, 115, 114, 113, 111, 110, 109,
389 107, 106, 105, 103, 102, 100, 99, 97,
390 96, 94, 92, 91, 89, 87, 85, 84, 82
393 static const s16 hsv_green_x[] = {
394 -124, -124, -125, -125, -125, -125, -125, -125,
395 -125, -126, -126, -125, -125, -125, -125, -125,
396 -125, -124, -124, -124, -123, -123, -122, -122,
397 -121, -121, -120, -120, -119, -118, -117, -117,
398 -116, -115, -114, -113, -112, -111, -110, -109,
399 -108, -107, -105, -104, -103, -102, -100, -99,
400 -98, -96, -95, -93, -92, -91, -89, -87,
401 -86, -84, -83, -81, -79, -77, -76, -74,
402 -72, -70, -69, -67, -65, -63, -61, -59,
403 -57, -55, -53, -51, -49, -47, -45, -43,
404 -41, -39, -37, -35, -33, -30, -28, -26,
405 -24, -22, -20, -18, -15, -13, -11, -9,
406 -7, -4, -2, 0, 1, 3, 6, 8,
407 10, 12, 14, 17, 19, 21, 23, 25,
408 27, 29, 32, 34, 36, 38, 40, 42,
409 44, 46, 48, 50, 52, 54, 56, 58,
410 60, 62, 64, 66, 68, 70, 71, 73,
411 75, 77, 78, 80, 82, 83, 85, 87,
412 88, 90, 91, 93, 94, 96, 97, 98,
413 100, 101, 102, 104, 105, 106, 107, 108,
414 109, 111, 112, 113, 113, 114, 115, 116,
415 117, 118, 118, 119, 120, 120, 121, 122,
416 122, 123, 123, 124, 124, 124, 125, 125,
417 125, 125, 125, 125, 125, 126, 126, 125,
418 125, 125, 125, 125, 125, 124, 124, 124,
419 123, 123, 122, 122, 121, 121, 120, 120,
420 119, 118, 117, 117, 116, 115, 114, 113,
421 112, 111, 110, 109, 108, 107, 105, 104,
422 103, 102, 100, 99, 98, 96, 95, 93,
423 92, 91, 89, 87, 86, 84, 83, 81,
424 79, 77, 76, 74, 72, 70, 69, 67,
425 65, 63, 61, 59, 57, 55, 53, 51,
426 49, 47, 45, 43, 41, 39, 37, 35,
427 33, 30, 28, 26, 24, 22, 20, 18,
428 15, 13, 11, 9, 7, 4, 2, 0,
429 -1, -3, -6, -8, -10, -12, -14, -17,
430 -19, -21, -23, -25, -27, -29, -32, -34,
431 -36, -38, -40, -42, -44, -46, -48, -50,
432 -52, -54, -56, -58, -60, -62, -64, -66,
433 -68, -70, -71, -73, -75, -77, -78, -80,
434 -82, -83, -85, -87, -88, -90, -91, -93,
435 -94, -96, -97, -98, -100, -101, -102, -104,
436 -105, -106, -107, -108, -109, -111, -112, -113,
437 -113, -114, -115, -116, -117, -118, -118, -119,
438 -120, -120, -121, -122, -122, -123, -123, -124, -124
441 static const s16 hsv_green_y[] = {
442 -100, -99, -98, -97, -95, -94, -93, -91,
443 -90, -89, -87, -86, -84, -83, -81, -80,
444 -78, -76, -75, -73, -71, -70, -68, -66,
445 -64, -63, -61, -59, -57, -55, -53, -51,
446 -49, -48, -46, -44, -42, -40, -38, -36,
447 -34, -32, -30, -27, -25, -23, -21, -19,
448 -17, -15, -13, -11, -9, -7, -4, -2,
449 0, 1, 3, 5, 7, 9, 11, 14,
450 16, 18, 20, 22, 24, 26, 28, 30,
451 32, 34, 36, 38, 40, 42, 44, 46,
452 48, 50, 52, 54, 56, 58, 59, 61,
453 63, 65, 67, 68, 70, 72, 74, 75,
454 77, 78, 80, 82, 83, 85, 86, 88,
455 89, 90, 92, 93, 95, 96, 97, 98,
456 100, 101, 102, 103, 104, 105, 106, 107,
457 108, 109, 110, 111, 112, 112, 113, 114,
458 115, 115, 116, 116, 117, 117, 118, 118,
459 119, 119, 119, 120, 120, 120, 120, 120,
460 121, 121, 121, 121, 121, 121, 120, 120,
461 120, 120, 120, 119, 119, 119, 118, 118,
462 117, 117, 116, 116, 115, 114, 114, 113,
463 112, 111, 111, 110, 109, 108, 107, 106,
464 105, 104, 103, 102, 100, 99, 98, 97,
465 95, 94, 93, 91, 90, 89, 87, 86,
466 84, 83, 81, 80, 78, 76, 75, 73,
467 71, 70, 68, 66, 64, 63, 61, 59,
468 57, 55, 53, 51, 49, 48, 46, 44,
469 42, 40, 38, 36, 34, 32, 30, 27,
470 25, 23, 21, 19, 17, 15, 13, 11,
471 9, 7, 4, 2, 0, -1, -3, -5,
472 -7, -9, -11, -14, -16, -18, -20, -22,
473 -24, -26, -28, -30, -32, -34, -36, -38,
474 -40, -42, -44, -46, -48, -50, -52, -54,
475 -56, -58, -59, -61, -63, -65, -67, -68,
476 -70, -72, -74, -75, -77, -78, -80, -82,
477 -83, -85, -86, -88, -89, -90, -92, -93,
478 -95, -96, -97, -98, -100, -101, -102, -103,
479 -104, -105, -106, -107, -108, -109, -110, -111,
480 -112, -112, -113, -114, -115, -115, -116, -116,
481 -117, -117, -118, -118, -119, -119, -119, -120,
482 -120, -120, -120, -120, -121, -121, -121, -121,
483 -121, -121, -120, -120, -120, -120, -120, -119,
484 -119, -119, -118, -118, -117, -117, -116, -116,
485 -115, -114, -114, -113, -112, -111, -111, -110,
486 -109, -108, -107, -106, -105, -104, -103, -102, -100
489 static const s16 hsv_blue_x[] = {
490 112, 113, 114, 114, 115, 116, 117, 117,
491 118, 118, 119, 119, 120, 120, 120, 121,
492 121, 121, 122, 122, 122, 122, 122, 122,
493 122, 122, 122, 122, 122, 122, 121, 121,
494 121, 120, 120, 120, 119, 119, 118, 118,
495 117, 116, 116, 115, 114, 113, 113, 112,
496 111, 110, 109, 108, 107, 106, 105, 104,
497 103, 102, 100, 99, 98, 97, 95, 94,
498 93, 91, 90, 88, 87, 85, 84, 82,
499 80, 79, 77, 76, 74, 72, 70, 69,
500 67, 65, 63, 61, 60, 58, 56, 54,
501 52, 50, 48, 46, 44, 42, 40, 38,
502 36, 34, 32, 30, 28, 26, 24, 22,
503 19, 17, 15, 13, 11, 9, 7, 5,
504 2, 0, -1, -3, -5, -7, -9, -12,
505 -14, -16, -18, -20, -22, -24, -26, -28,
506 -31, -33, -35, -37, -39, -41, -43, -45,
507 -47, -49, -51, -53, -54, -56, -58, -60,
508 -62, -64, -66, -67, -69, -71, -73, -74,
509 -76, -78, -79, -81, -83, -84, -86, -87,
510 -89, -90, -92, -93, -94, -96, -97, -98,
511 -99, -101, -102, -103, -104, -105, -106, -107,
512 -108, -109, -110, -111, -112, -113, -114, -114,
513 -115, -116, -117, -117, -118, -118, -119, -119,
514 -120, -120, -120, -121, -121, -121, -122, -122,
515 -122, -122, -122, -122, -122, -122, -122, -122,
516 -122, -122, -121, -121, -121, -120, -120, -120,
517 -119, -119, -118, -118, -117, -116, -116, -115,
518 -114, -113, -113, -112, -111, -110, -109, -108,
519 -107, -106, -105, -104, -103, -102, -100, -99,
520 -98, -97, -95, -94, -93, -91, -90, -88,
521 -87, -85, -84, -82, -80, -79, -77, -76,
522 -74, -72, -70, -69, -67, -65, -63, -61,
523 -60, -58, -56, -54, -52, -50, -48, -46,
524 -44, -42, -40, -38, -36, -34, -32, -30,
525 -28, -26, -24, -22, -19, -17, -15, -13,
526 -11, -9, -7, -5, -2, 0, 1, 3,
527 5, 7, 9, 12, 14, 16, 18, 20,
528 22, 24, 26, 28, 31, 33, 35, 37,
529 39, 41, 43, 45, 47, 49, 51, 53,
530 54, 56, 58, 60, 62, 64, 66, 67,
531 69, 71, 73, 74, 76, 78, 79, 81,
532 83, 84, 86, 87, 89, 90, 92, 93,
533 94, 96, 97, 98, 99, 101, 102, 103,
534 104, 105, 106, 107, 108, 109, 110, 111, 112
537 static const s16 hsv_blue_y[] = {
538 -11, -13, -15, -17, -19, -21, -23, -25,
539 -27, -29, -31, -33, -35, -37, -39, -41,
540 -43, -45, -46, -48, -50, -52, -54, -55,
541 -57, -59, -61, -62, -64, -66, -67, -69,
542 -71, -72, -74, -75, -77, -78, -80, -81,
543 -83, -84, -86, -87, -88, -90, -91, -92,
544 -93, -95, -96, -97, -98, -99, -100, -101,
545 -102, -103, -104, -105, -106, -106, -107, -108,
546 -109, -109, -110, -111, -111, -112, -112, -113,
547 -113, -114, -114, -114, -115, -115, -115, -115,
548 -116, -116, -116, -116, -116, -116, -116, -116,
549 -116, -115, -115, -115, -115, -114, -114, -114,
550 -113, -113, -112, -112, -111, -111, -110, -110,
551 -109, -108, -108, -107, -106, -105, -104, -103,
552 -102, -101, -100, -99, -98, -97, -96, -95,
553 -94, -93, -91, -90, -89, -88, -86, -85,
554 -84, -82, -81, -79, -78, -76, -75, -73,
555 -71, -70, -68, -67, -65, -63, -62, -60,
556 -58, -56, -55, -53, -51, -49, -47, -45,
557 -44, -42, -40, -38, -36, -34, -32, -30,
558 -28, -26, -24, -22, -20, -18, -16, -14,
559 -12, -10, -8, -6, -4, -2, 0, 1,
560 3, 5, 7, 9, 11, 13, 15, 17,
561 19, 21, 23, 25, 27, 29, 31, 33,
562 35, 37, 39, 41, 43, 45, 46, 48,
563 50, 52, 54, 55, 57, 59, 61, 62,
564 64, 66, 67, 69, 71, 72, 74, 75,
565 77, 78, 80, 81, 83, 84, 86, 87,
566 88, 90, 91, 92, 93, 95, 96, 97,
567 98, 99, 100, 101, 102, 103, 104, 105,
568 106, 106, 107, 108, 109, 109, 110, 111,
569 111, 112, 112, 113, 113, 114, 114, 114,
570 115, 115, 115, 115, 116, 116, 116, 116,
571 116, 116, 116, 116, 116, 115, 115, 115,
572 115, 114, 114, 114, 113, 113, 112, 112,
573 111, 111, 110, 110, 109, 108, 108, 107,
574 106, 105, 104, 103, 102, 101, 100, 99,
575 98, 97, 96, 95, 94, 93, 91, 90,
576 89, 88, 86, 85, 84, 82, 81, 79,
577 78, 76, 75, 73, 71, 70, 68, 67,
578 65, 63, 62, 60, 58, 56, 55, 53,
579 51, 49, 47, 45, 44, 42, 40, 38,
580 36, 34, 32, 30, 28, 26, 24, 22,
581 20, 18, 16, 14, 12, 10, 8, 6,
582 4, 2, 0, -1, -3, -5, -7, -9, -11
585 static const u16 i2c_ident[] = {
601 static const u16 bridge_init[][2] = {
602 {0x1000, 0x78}, {0x1001, 0x40}, {0x1002, 0x1c},
603 {0x1020, 0x80}, {0x1061, 0x01}, {0x1067, 0x40},
604 {0x1068, 0x30}, {0x1069, 0x20}, {0x106a, 0x10},
605 {0x106b, 0x08}, {0x1188, 0x87}, {0x11a1, 0x00},
606 {0x11a2, 0x00}, {0x11a3, 0x6a}, {0x11a4, 0x50},
607 {0x11ab, 0x00}, {0x11ac, 0x00}, {0x11ad, 0x50},
608 {0x11ae, 0x3c}, {0x118a, 0x04}, {0x0395, 0x04},
609 {0x11b8, 0x3a}, {0x118b, 0x0e}, {0x10f7, 0x05},
610 {0x10f8, 0x14}, {0x10fa, 0xff}, {0x10f9, 0x00},
611 {0x11ba, 0x0a}, {0x11a5, 0x2d}, {0x11a6, 0x2d},
612 {0x11a7, 0x3a}, {0x11a8, 0x05}, {0x11a9, 0x04},
613 {0x11aa, 0x3f}, {0x11af, 0x28}, {0x11b0, 0xd8},
614 {0x11b1, 0x14}, {0x11b2, 0xec}, {0x11b3, 0x32},
615 {0x11b4, 0xdd}, {0x11b5, 0x32}, {0x11b6, 0xdd},
616 {0x10e0, 0x2c}, {0x11bc, 0x40}, {0x11bd, 0x01},
617 {0x11be, 0xf0}, {0x11bf, 0x00}, {0x118c, 0x1f},
618 {0x118d, 0x1f}, {0x118e, 0x1f}, {0x118f, 0x1f},
619 {0x1180, 0x01}, {0x1181, 0x00}, {0x1182, 0x01},
620 {0x1183, 0x00}, {0x1184, 0x50}, {0x1185, 0x80},
625 static const u8 ov_gain[] = {
626 0x00 , 0x04 , 0x08 , 0x0c ,
627 0x10 , 0x12 , 0x14 , 0x16 ,
628 0x18 , 0x1a , 0x1c , 0x1e ,
629 0x30 , 0x31 , 0x32 , 0x33 ,
630 0x34 , 0x35 , 0x36 , 0x37 ,
631 0x38 , 0x39 , 0x3a , 0x3b ,
632 0x3c , 0x3d , 0x3e , 0x3f ,
637 static const u16 micron1_gain[] = {
639 0x0020, 0x0028, 0x0030, 0x0038,
641 0x00a0, 0x00a4, 0x00a8, 0x00ac,
643 0x00b0, 0x00b4, 0x00b8, 0x00bc,
645 0x00c0, 0x00c4, 0x00c8, 0x00cc,
647 0x00d0, 0x00d4, 0x00d8, 0x00dc,
649 0x00e0, 0x00e4, 0x00e8, 0x00ec,
651 0x00f0, 0x00f4, 0x00f8, 0x00fc,
658 static const u16 micron2_gain[] = {
660 0x0008, 0x000a, 0x000c, 0x000e,
662 0x0010, 0x0012, 0x0014, 0x0016,
664 0x0018, 0x001a, 0x001c, 0x001e,
666 0x0020, 0x0051, 0x0052, 0x0053,
668 0x0054, 0x0055, 0x0056, 0x0057,
670 0x0058, 0x0059, 0x005a, 0x005b,
672 0x005c, 0x005d, 0x005e, 0x005f,
678 static const u8 hv7131r_gain[] = {
679 0x08 , 0x0c , 0x10 , 0x14 ,
680 0x18 , 0x1c , 0x20 , 0x24 ,
681 0x28 , 0x2c , 0x30 , 0x34 ,
682 0x38 , 0x3c , 0x40 , 0x44 ,
683 0x48 , 0x4c , 0x50 , 0x54 ,
684 0x58 , 0x5c , 0x60 , 0x64 ,
685 0x68 , 0x6c , 0x70 , 0x74 ,
689 static const struct i2c_reg_u8 soi968_init[] = {
690 {0x0c, 0x00}, {0x0f, 0x1f},
691 {0x11, 0x80}, {0x38, 0x52}, {0x1e, 0x00},
692 {0x33, 0x08}, {0x35, 0x8c}, {0x36, 0x0c},
693 {0x37, 0x04}, {0x45, 0x04}, {0x47, 0xff},
694 {0x3e, 0x00}, {0x3f, 0x00}, {0x3b, 0x20},
695 {0x3a, 0x96}, {0x3d, 0x0a}, {0x14, 0x8e},
696 {0x13, 0x8b}, {0x12, 0x40}, {0x17, 0x13},
697 {0x18, 0x63}, {0x19, 0x01}, {0x1a, 0x79},
698 {0x32, 0x24}, {0x03, 0x00}, {0x11, 0x40},
699 {0x2a, 0x10}, {0x2b, 0xe0}, {0x10, 0x32},
700 {0x00, 0x00}, {0x01, 0x80}, {0x02, 0x80},
703 static const struct i2c_reg_u8 ov7660_init[] = {
704 {0x0e, 0x80}, {0x0d, 0x08}, {0x0f, 0xc3},
705 {0x04, 0xc3}, {0x10, 0x40}, {0x11, 0x40},
706 {0x12, 0x05}, {0x13, 0xba}, {0x14, 0x2a},
709 {0x17, 0x10}, {0x18, 0x61},
710 {0x37, 0x0f}, {0x38, 0x02}, {0x39, 0x43},
711 {0x3a, 0x00}, {0x69, 0x90}, {0x2d, 0x00},
712 {0x2e, 0x00}, {0x01, 0x78}, {0x02, 0x50},
715 static const struct i2c_reg_u8 ov7670_init[] = {
716 {0x11, 0x80}, {0x3a, 0x04}, {0x12, 0x01},
717 {0x32, 0xb6}, {0x03, 0x0a}, {0x0c, 0x00}, {0x3e, 0x00},
718 {0x70, 0x3a}, {0x71, 0x35}, {0x72, 0x11}, {0x73, 0xf0},
719 {0xa2, 0x02}, {0x13, 0xe0}, {0x00, 0x00}, {0x10, 0x00},
720 {0x0d, 0x40}, {0x14, 0x28}, {0xa5, 0x05}, {0xab, 0x07},
721 {0x24, 0x95}, {0x25, 0x33}, {0x26, 0xe3}, {0x9f, 0x75},
722 {0xa0, 0x65}, {0xa1, 0x0b}, {0xa6, 0xd8}, {0xa7, 0xd8},
723 {0xa8, 0xf0}, {0xa9, 0x90}, {0xaa, 0x94}, {0x13, 0xe5},
724 {0x0e, 0x61}, {0x0f, 0x4b}, {0x16, 0x02}, {0x1e, 0x27},
725 {0x21, 0x02}, {0x22, 0x91}, {0x29, 0x07}, {0x33, 0x0b},
726 {0x35, 0x0b}, {0x37, 0x1d}, {0x38, 0x71}, {0x39, 0x2a},
727 {0x3c, 0x78}, {0x4d, 0x40}, {0x4e, 0x20}, {0x69, 0x00},
728 {0x74, 0x19}, {0x8d, 0x4f}, {0x8e, 0x00}, {0x8f, 0x00},
729 {0x90, 0x00}, {0x91, 0x00}, {0x96, 0x00}, {0x9a, 0x80},
730 {0xb0, 0x84}, {0xb1, 0x0c}, {0xb2, 0x0e}, {0xb3, 0x82},
731 {0xb8, 0x0a}, {0x43, 0x0a}, {0x44, 0xf0}, {0x45, 0x20},
732 {0x46, 0x7d}, {0x47, 0x29}, {0x48, 0x4a}, {0x59, 0x8c},
733 {0x5a, 0xa5}, {0x5b, 0xde}, {0x5c, 0x96}, {0x5d, 0x66},
734 {0x5e, 0x10}, {0x6c, 0x0a}, {0x6d, 0x55}, {0x6e, 0x11},
735 {0x6f, 0x9e}, {0x6a, 0x40}, {0x01, 0x40}, {0x02, 0x40},
736 {0x13, 0xe7}, {0x4f, 0x6e}, {0x50, 0x70}, {0x51, 0x02},
737 {0x52, 0x1d}, {0x53, 0x56}, {0x54, 0x73}, {0x55, 0x0a},
738 {0x56, 0x55}, {0x57, 0x80}, {0x58, 0x9e}, {0x41, 0x08},
739 {0x3f, 0x02}, {0x75, 0x03}, {0x76, 0x63}, {0x4c, 0x04},
740 {0x77, 0x06}, {0x3d, 0x02}, {0x4b, 0x09}, {0xc9, 0x30},
741 {0x41, 0x08}, {0x56, 0x48}, {0x34, 0x11}, {0xa4, 0x88},
742 {0x96, 0x00}, {0x97, 0x30}, {0x98, 0x20}, {0x99, 0x30},
743 {0x9a, 0x84}, {0x9b, 0x29}, {0x9c, 0x03}, {0x9d, 0x99},
744 {0x9e, 0x7f}, {0x78, 0x04}, {0x79, 0x01}, {0xc8, 0xf0},
745 {0x79, 0x0f}, {0xc8, 0x00}, {0x79, 0x10}, {0xc8, 0x7e},
746 {0x79, 0x0a}, {0xc8, 0x80}, {0x79, 0x0b}, {0xc8, 0x01},
747 {0x79, 0x0c}, {0xc8, 0x0f}, {0x79, 0x0d}, {0xc8, 0x20},
748 {0x79, 0x09}, {0xc8, 0x80}, {0x79, 0x02}, {0xc8, 0xc0},
749 {0x79, 0x03}, {0xc8, 0x40}, {0x79, 0x05}, {0xc8, 0x30},
750 {0x79, 0x26}, {0x62, 0x20}, {0x63, 0x00}, {0x64, 0x06},
751 {0x65, 0x00}, {0x66, 0x05}, {0x94, 0x05}, {0x95, 0x0a},
752 {0x17, 0x13}, {0x18, 0x01}, {0x19, 0x02}, {0x1a, 0x7a},
753 {0x46, 0x59}, {0x47, 0x30}, {0x58, 0x9a}, {0x59, 0x84},
754 {0x5a, 0x91}, {0x5b, 0x57}, {0x5c, 0x75}, {0x5d, 0x6d},
755 {0x5e, 0x13}, {0x64, 0x07}, {0x94, 0x07}, {0x95, 0x0d},
756 {0xa6, 0xdf}, {0xa7, 0xdf}, {0x48, 0x4d}, {0x51, 0x00},
757 {0x6b, 0x0a}, {0x11, 0x80}, {0x2a, 0x00}, {0x2b, 0x00},
758 {0x92, 0x00}, {0x93, 0x00}, {0x55, 0x0a}, {0x56, 0x60},
759 {0x4f, 0x6e}, {0x50, 0x70}, {0x51, 0x00}, {0x52, 0x1d},
760 {0x53, 0x56}, {0x54, 0x73}, {0x58, 0x9a}, {0x4f, 0x6e},
761 {0x50, 0x70}, {0x51, 0x00}, {0x52, 0x1d}, {0x53, 0x56},
762 {0x54, 0x73}, {0x58, 0x9a}, {0x3f, 0x01}, {0x7b, 0x03},
763 {0x7c, 0x09}, {0x7d, 0x16}, {0x7e, 0x38}, {0x7f, 0x47},
764 {0x80, 0x53}, {0x81, 0x5e}, {0x82, 0x6a}, {0x83, 0x74},
765 {0x84, 0x80}, {0x85, 0x8c}, {0x86, 0x9b}, {0x87, 0xb2},
766 {0x88, 0xcc}, {0x89, 0xe5}, {0x7a, 0x24}, {0x3b, 0x00},
767 {0x9f, 0x76}, {0xa0, 0x65}, {0x13, 0xe2}, {0x6b, 0x0a},
768 {0x11, 0x80}, {0x2a, 0x00}, {0x2b, 0x00}, {0x92, 0x00},
772 static const struct i2c_reg_u8 ov9650_init[] = {
773 {0x00, 0x00}, {0x01, 0x78},
774 {0x02, 0x78}, {0x03, 0x36}, {0x04, 0x03},
775 {0x05, 0x00}, {0x06, 0x00}, {0x08, 0x00},
776 {0x09, 0x01}, {0x0c, 0x00}, {0x0d, 0x00},
777 {0x0e, 0xa0}, {0x0f, 0x52}, {0x10, 0x7c},
778 {0x11, 0x80}, {0x12, 0x45}, {0x13, 0xc2},
779 {0x14, 0x2e}, {0x15, 0x00}, {0x16, 0x07},
780 {0x17, 0x24}, {0x18, 0xc5}, {0x19, 0x00},
781 {0x1a, 0x3c}, {0x1b, 0x00}, {0x1e, 0x04},
782 {0x1f, 0x00}, {0x24, 0x78}, {0x25, 0x68},
783 {0x26, 0xd4}, {0x27, 0x80}, {0x28, 0x80},
784 {0x29, 0x30}, {0x2a, 0x00}, {0x2b, 0x00},
785 {0x2c, 0x80}, {0x2d, 0x00}, {0x2e, 0x00},
786 {0x2f, 0x00}, {0x30, 0x08}, {0x31, 0x30},
787 {0x32, 0x84}, {0x33, 0xe2}, {0x34, 0xbf},
788 {0x35, 0x81}, {0x36, 0xf9}, {0x37, 0x00},
789 {0x38, 0x93}, {0x39, 0x50}, {0x3a, 0x01},
790 {0x3b, 0x01}, {0x3c, 0x73}, {0x3d, 0x19},
791 {0x3e, 0x0b}, {0x3f, 0x80}, {0x40, 0xc1},
792 {0x41, 0x00}, {0x42, 0x08}, {0x67, 0x80},
793 {0x68, 0x80}, {0x69, 0x40}, {0x6a, 0x00},
794 {0x6b, 0x0a}, {0x8b, 0x06}, {0x8c, 0x20},
795 {0x8d, 0x00}, {0x8e, 0x00}, {0x8f, 0xdf},
796 {0x92, 0x00}, {0x93, 0x00}, {0x94, 0x88},
797 {0x95, 0x88}, {0x96, 0x04}, {0xa1, 0x00},
798 {0xa5, 0x80}, {0xa8, 0x80}, {0xa9, 0xb8},
799 {0xaa, 0x92}, {0xab, 0x0a},
802 static const struct i2c_reg_u8 ov9655_init[] = {
803 {0x0e, 0x61}, {0x11, 0x80}, {0x13, 0xba},
804 {0x14, 0x2e}, {0x16, 0x24}, {0x1e, 0x04}, {0x27, 0x08},
805 {0x28, 0x08}, {0x29, 0x15}, {0x2c, 0x08}, {0x34, 0x3d},
806 {0x35, 0x00}, {0x38, 0x12}, {0x0f, 0x42}, {0x39, 0x57},
807 {0x3a, 0x00}, {0x3b, 0xcc}, {0x3c, 0x0c}, {0x3d, 0x19},
808 {0x3e, 0x0c}, {0x3f, 0x01}, {0x41, 0x40}, {0x42, 0x80},
809 {0x45, 0x46}, {0x46, 0x62}, {0x47, 0x2a}, {0x48, 0x3c},
810 {0x4a, 0xf0}, {0x4b, 0xdc}, {0x4c, 0xdc}, {0x4d, 0xdc},
811 {0x4e, 0xdc}, {0x6c, 0x04}, {0x6f, 0x9e}, {0x70, 0x05},
812 {0x71, 0x78}, {0x77, 0x02}, {0x8a, 0x23}, {0x90, 0x7e},
813 {0x91, 0x7c}, {0x9f, 0x6e}, {0xa0, 0x6e}, {0xa5, 0x68},
814 {0xa6, 0x60}, {0xa8, 0xc1}, {0xa9, 0xfa}, {0xaa, 0x92},
815 {0xab, 0x04}, {0xac, 0x80}, {0xad, 0x80}, {0xae, 0x80},
816 {0xaf, 0x80}, {0xb2, 0xf2}, {0xb3, 0x20}, {0xb5, 0x00},
817 {0xb6, 0xaf}, {0xbb, 0xae}, {0xbc, 0x44}, {0xbd, 0x44},
818 {0xbe, 0x3b}, {0xbf, 0x3a}, {0xc1, 0xc8}, {0xc2, 0x01},
819 {0xc4, 0x00}, {0xc6, 0x85}, {0xc7, 0x81}, {0xc9, 0xe0},
820 {0xca, 0xe8}, {0xcc, 0xd8}, {0xcd, 0x93}, {0x2d, 0x00},
821 {0x2e, 0x00}, {0x01, 0x80}, {0x02, 0x80}, {0x12, 0x61},
822 {0x36, 0xfa}, {0x8c, 0x8d}, {0xc0, 0xaa}, {0x69, 0x0a},
823 {0x03, 0x09}, {0x17, 0x16}, {0x18, 0x6e}, {0x19, 0x01},
824 {0x1a, 0x3e}, {0x32, 0x09}, {0x2a, 0x10}, {0x2b, 0x0a},
825 {0x92, 0x00}, {0x93, 0x00}, {0xa1, 0x00}, {0x10, 0x7c},
826 {0x04, 0x03}, {0x00, 0x13},
830 {0xf0, 0x0000}, {0x0d, 0x0021}, {0x0d, 0x0020},
831 {0x34, 0xc019}, {0x0a, 0x0011}, {0x0b, 0x000b},
832 {0x20, 0x0703}, {0x35, 0x2022}, {0xf0, 0x0001},
833 {0x05, 0x0000}, {0x06, 0x340c}, {0x3b, 0x042a},
834 {0x3c, 0x0400}, {0xf0, 0x0002}, {0x2e, 0x0c58},
835 {0x5b, 0x0001}, {0xc8, 0x9f0b}, {0xf0, 0x0001},
836 {0x9b, 0x5300}, {0xf0, 0x0000}, {0x2b, 0x0020},
837 {0x2c, 0x002a}, {0x2d, 0x0032}, {0x2e, 0x0020},
838 {0x09, 0x01dc}, {0x01, 0x000c}, {0x02, 0x0020},
839 {0x03, 0x01e0}, {0x04, 0x0280}, {0x06, 0x000c},
840 {0x05, 0x0098}, {0x20, 0x0703}, {0x09, 0x01f2},
841 {0x2b, 0x00a0}, {0x2c, 0x00a0}, {0x2d, 0x00a0},
842 {0x2e, 0x00a0}, {0x01, 0x000c}, {0x02, 0x0020},
843 {0x03, 0x01e0}, {0x04, 0x0280}, {0x06, 0x000c},
844 {0x05, 0x0098}, {0x09, 0x01c1}, {0x2b, 0x00ae},
845 {0x2c, 0x00ae}, {0x2d, 0x00ae}, {0x2e, 0x00ae},
849 {0x01, 0x0004}, {0x0d, 0x0001}, {0x0d, 0x0000},
850 {0x01, 0x0001}, {0x05, 0x0004}, {0x2d, 0xe0a0},
851 {0x2e, 0x0c64}, {0x2f, 0x0064}, {0x06, 0x600e},
852 {0x08, 0x0480}, {0x01, 0x0004}, {0x02, 0x0016},
853 {0x03, 0x01e7}, {0x04, 0x0287}, {0x05, 0x0004},
854 {0x06, 0x002d}, {0x07, 0x3002}, {0x08, 0x0008},
855 {0x0e, 0x0008}, {0x20, 0x0000}
859 {0x07, 0x0002}, {0x0d, 0x0001}, {0x0d, 0x0000},
860 {0x01, 0x0008}, {0x02, 0x0016}, {0x03, 0x01e1},
861 {0x04, 0x0281}, {0x05, 0x0083}, {0x06, 0x0006},
862 {0x0d, 0x0002}, {0x0a, 0x0000}, {0x0b, 0x0000},
863 {0x0c, 0x0000}, {0x0d, 0x0000}, {0x0e, 0x0000},
864 {0x0f, 0x0000}, {0x10, 0x0000}, {0x11, 0x0000},
865 {0x12, 0x0000}, {0x13, 0x0000}, {0x14, 0x0000},
866 {0x15, 0x0000}, {0x16, 0x0000}, {0x17, 0x0000},
867 {0x18, 0x0000}, {0x19, 0x0000}, {0x1a, 0x0000},
868 {0x1b, 0x0000}, {0x1c, 0x0000}, {0x1d, 0x0000},
869 {0x32, 0x0000}, {0x20, 0x1101}, {0x21, 0x0000},
870 {0x22, 0x0000}, {0x23, 0x0000}, {0x24, 0x0000},
871 {0x25, 0x0000}, {0x26, 0x0000}, {0x27, 0x0024},
872 {0x2f, 0xf7b0}, {0x30, 0x0005}, {0x31, 0x0000},
873 {0x32, 0x0000}, {0x33, 0x0000}, {0x34, 0x0100},
874 {0x3d, 0x068f}, {0x40, 0x01e0}, {0x41, 0x00d1},
875 {0x44, 0x0082}, {0x5a, 0x0000}, {0x5b, 0x0000},
876 {0x5c, 0x0000}, {0x5d, 0x0000}, {0x5e, 0x0000},
877 {0x5f, 0xa31d}, {0x62, 0x0611}, {0x0a, 0x0000},
878 {0x06, 0x0029}, {0x05, 0x0009}, {0x20, 0x1101},
879 {0x20, 0x1101}, {0x09, 0x0064}, {0x07, 0x0003},
880 {0x2b, 0x0033}, {0x2c, 0x00a0}, {0x2d, 0x00a0},
881 {0x2e, 0x0033}, {0x07, 0x0002}, {0x06, 0x0000},
882 {0x06, 0x0029}, {0x05, 0x0009},
902 {0xf0, 0x0000}, {0x0d, 0x0021}, {0x0d, 0x0008},
903 {0xf0, 0x0001}, {0x3a, 0x4300}, {0x9b, 0x4300},
904 {0x06, 0x708e}, {0xf0, 0x0002}, {0x2e, 0x0a1e},
909 {0xf0, 0x0000}, {0x0d, 0x0021}, {0x0d, 0x0008},
910 {0xf0, 0x0001}, {0x3a, 0x4300}, {0x9b, 0x4300},
911 {0x06, 0x708e}, {0xf0, 0x0002}, {0x2e, 0x0a1e},
915 static const struct i2c_reg_u8 hv7131r_init[] = {
916 {0x02, 0x08}, {0x02, 0x00}, {0x01, 0x08},
917 {0x02, 0x00}, {0x20, 0x00}, {0x21, 0xd0},
918 {0x22, 0x00}, {0x23, 0x09}, {0x01, 0x08},
919 {0x01, 0x08}, {0x01, 0x08}, {0x25, 0x07},
920 {0x26, 0xc3}, {0x27, 0x50}, {0x30, 0x62},
921 {0x31, 0x10}, {0x32, 0x06}, {0x33, 0x10},
922 {0x20, 0x00}, {0x21, 0xd0}, {0x22, 0x00},
923 {0x23, 0x09}, {0x01, 0x08},
928 struct usb_device *
dev = gspca_dev->
dev;
941 if (
unlikely(result < 0 || result != length)) {
942 pr_err(
"Read register %02x failed %d\n", reg, result);
947 static void reg_w(
struct gspca_dev *gspca_dev,
u16 reg,
950 struct usb_device *dev = gspca_dev->
dev;
964 if (
unlikely(result < 0 || result != length)) {
965 pr_err(
"Write register %02x failed %d\n", reg, result);
970 static void reg_w1(
struct gspca_dev *gspca_dev,
u16 reg,
const u8 value)
972 reg_w(gspca_dev, reg, &value, 1);
975 static void i2c_w(
struct gspca_dev *gspca_dev,
const u8 *buffer)
979 reg_w(gspca_dev, 0x10c0, buffer, 8);
980 for (i = 0; i < 5; i++) {
981 reg_r(gspca_dev, 0x10c0, 1);
984 if (gspca_dev->
usb_buf[0] & 0x04) {
985 if (gspca_dev->
usb_buf[0] & 0x08) {
993 pr_err(
"i2c_w reg %02x no response\n", buffer[2]);
997 static void i2c_w1(
struct gspca_dev *gspca_dev,
u8 reg,
u8 val)
999 struct sd *
sd = (
struct sd *) gspca_dev;
1015 i2c_w(gspca_dev, row);
1018 static void i2c_w1_buf(
struct gspca_dev *gspca_dev,
1022 i2c_w1(gspca_dev, buf->
reg, buf->
val);
1027 static void i2c_w2(
struct gspca_dev *gspca_dev,
u8 reg,
u16 val)
1029 struct sd *
sd = (
struct sd *) gspca_dev;
1045 i2c_w(gspca_dev, row);
1048 static void i2c_w2_buf(
struct gspca_dev *gspca_dev,
1052 i2c_w2(gspca_dev, buf->
reg, buf->
val);
1057 static void i2c_r1(
struct gspca_dev *gspca_dev,
u8 reg,
u8 *
val)
1059 struct sd *
sd = (
struct sd *) gspca_dev;
1070 i2c_w(gspca_dev, row);
1071 row[0] = sd->
i2c_intf | (1 << 4) | 0x02;
1073 i2c_w(gspca_dev, row);
1074 reg_r(gspca_dev, 0x10c2, 5);
1078 static void i2c_r2(
struct gspca_dev *gspca_dev,
u8 reg,
u16 *
val)
1080 struct sd *
sd = (
struct sd *) gspca_dev;
1091 i2c_w(gspca_dev, row);
1092 row[0] = sd->
i2c_intf | (2 << 4) | 0x02;
1094 i2c_w(gspca_dev, row);
1095 reg_r(gspca_dev, 0x10c2, 5);
1099 static void ov9650_init_sensor(
struct gspca_dev *gspca_dev)
1102 struct sd *
sd = (
struct sd *) gspca_dev;
1104 i2c_r2(gspca_dev, 0x1c, &
id);
1109 pr_err(
"sensor id for ov9650 doesn't match (0x%04x)\n",
id);
1114 i2c_w1(gspca_dev, 0x12, 0x80);
1116 i2c_w1_buf(gspca_dev, ov9650_init,
ARRAY_SIZE(ov9650_init));
1118 pr_err(
"OV9650 sensor initialization failed\n");
1123 static void ov9655_init_sensor(
struct gspca_dev *gspca_dev)
1125 struct sd *sd = (
struct sd *) gspca_dev;
1127 i2c_w1(gspca_dev, 0x12, 0x80);
1129 i2c_w1_buf(gspca_dev, ov9655_init,
ARRAY_SIZE(ov9655_init));
1131 pr_err(
"OV9655 sensor initialization failed\n");
1137 static void soi968_init_sensor(
struct gspca_dev *gspca_dev)
1139 struct sd *sd = (
struct sd *) gspca_dev;
1141 i2c_w1(gspca_dev, 0x12, 0x80);
1143 i2c_w1_buf(gspca_dev, soi968_init,
ARRAY_SIZE(soi968_init));
1145 pr_err(
"SOI968 sensor initialization failed\n");
1151 static void ov7660_init_sensor(
struct gspca_dev *gspca_dev)
1153 struct sd *sd = (
struct sd *) gspca_dev;
1155 i2c_w1(gspca_dev, 0x12, 0x80);
1157 i2c_w1_buf(gspca_dev, ov7660_init,
ARRAY_SIZE(ov7660_init));
1159 pr_err(
"OV7660 sensor initialization failed\n");
1164 static void ov7670_init_sensor(
struct gspca_dev *gspca_dev)
1166 struct sd *sd = (
struct sd *) gspca_dev;
1168 i2c_w1(gspca_dev, 0x12, 0x80);
1170 i2c_w1_buf(gspca_dev, ov7670_init,
ARRAY_SIZE(ov7670_init));
1172 pr_err(
"OV7670 sensor initialization failed\n");
1178 static void mt9v_init_sensor(
struct gspca_dev *gspca_dev)
1180 struct sd *sd = (
struct sd *) gspca_dev;
1184 i2c_r2(gspca_dev, 0xff, &value);
1186 && value == 0x8243) {
1187 i2c_w2_buf(gspca_dev, mt9v011_init,
ARRAY_SIZE(mt9v011_init));
1189 pr_err(
"MT9V011 sensor initialization failed\n");
1195 pr_info(
"MT9V011 sensor detected\n");
1201 i2c_w2(gspca_dev, 0x01, 0x0004);
1202 i2c_r2(gspca_dev, 0xff, &value);
1204 && value == 0x823a) {
1205 i2c_w2_buf(gspca_dev, mt9v111_init,
ARRAY_SIZE(mt9v111_init));
1207 pr_err(
"MT9V111 sensor initialization failed\n");
1213 pr_info(
"MT9V111 sensor detected\n");
1219 i2c_w2(gspca_dev, 0xf0, 0x0000);
1223 i2c_w2(gspca_dev, 0xf0, 0x0000);
1225 i2c_r2(gspca_dev, 0x00, &value);
1227 && value == 0x1229) {
1228 i2c_w2_buf(gspca_dev, mt9v112_init,
ARRAY_SIZE(mt9v112_init));
1230 pr_err(
"MT9V112 sensor initialization failed\n");
1236 pr_info(
"MT9V112 sensor detected\n");
1243 static void mt9m112_init_sensor(
struct gspca_dev *gspca_dev)
1245 struct sd *sd = (
struct sd *) gspca_dev;
1247 i2c_w2_buf(gspca_dev, mt9m112_init,
ARRAY_SIZE(mt9m112_init));
1249 pr_err(
"MT9M112 sensor initialization failed\n");
1255 static void mt9m111_init_sensor(
struct gspca_dev *gspca_dev)
1257 struct sd *sd = (
struct sd *) gspca_dev;
1259 i2c_w2_buf(gspca_dev, mt9m111_init,
ARRAY_SIZE(mt9m111_init));
1261 pr_err(
"MT9M111 sensor initialization failed\n");
1267 static void mt9m001_init_sensor(
struct gspca_dev *gspca_dev)
1269 struct sd *sd = (
struct sd *) gspca_dev;
1272 i2c_r2(gspca_dev, 0x00, &
id);
1280 pr_info(
"MT9M001 color sensor detected\n");
1283 pr_info(
"MT9M001 mono sensor detected\n");
1286 pr_err(
"No MT9M001 chip detected, ID = %x\n\n",
id);
1291 i2c_w2_buf(gspca_dev, mt9m001_init,
ARRAY_SIZE(mt9m001_init));
1293 pr_err(
"MT9M001 sensor initialization failed\n");
1299 static void hv7131r_init_sensor(
struct gspca_dev *gspca_dev)
1301 struct sd *sd = (
struct sd *) gspca_dev;
1303 i2c_w1_buf(gspca_dev, hv7131r_init,
ARRAY_SIZE(hv7131r_init));
1305 pr_err(
"HV7131R Sensor initialization failed\n");
1311 static void set_cmatrix(
struct gspca_dev *gspca_dev,
1314 s32 hue_coord, hue_index = 180 +
hue;
1317 memset(cmatrix, 0,
sizeof cmatrix);
1318 cmatrix[2] = (contrast * 0x25 / 0x100) + 0x26;
1319 cmatrix[0] = 0x13 + (cmatrix[2] - 0x26) * 0x13 / 0x25;
1320 cmatrix[4] = 0x07 + (cmatrix[2] - 0x26) * 0x07 / 0x25;
1321 cmatrix[18] = brightness - 0x80;
1323 hue_coord = (hsv_red_x[hue_index] * satur) >> 8;
1324 cmatrix[6] = hue_coord;
1325 cmatrix[7] = (hue_coord >> 8) & 0x0f;
1327 hue_coord = (hsv_red_y[hue_index] * satur) >> 8;
1328 cmatrix[8] = hue_coord;
1329 cmatrix[9] = (hue_coord >> 8) & 0x0f;
1331 hue_coord = (hsv_green_x[hue_index] * satur) >> 8;
1332 cmatrix[10] = hue_coord;
1333 cmatrix[11] = (hue_coord >> 8) & 0x0f;
1335 hue_coord = (hsv_green_y[hue_index] * satur) >> 8;
1336 cmatrix[12] = hue_coord;
1337 cmatrix[13] = (hue_coord >> 8) & 0x0f;
1339 hue_coord = (hsv_blue_x[hue_index] * satur) >> 8;
1340 cmatrix[14] = hue_coord;
1341 cmatrix[15] = (hue_coord >> 8) & 0x0f;
1343 hue_coord = (hsv_blue_y[hue_index] * satur) >> 8;
1344 cmatrix[16] = hue_coord;
1345 cmatrix[17] = (hue_coord >> 8) & 0x0f;
1347 reg_w(gspca_dev, 0x10e1, cmatrix, 21);
1350 static void set_gamma(
struct gspca_dev *gspca_dev,
s32 val)
1353 u8 gval = val * 0xb8 / 0x100;
1356 gamma[1] = 0x13 + (gval * (0xcb - 0x13) / 0xb8);
1357 gamma[2] = 0x25 + (gval * (0xee - 0x25) / 0xb8);
1358 gamma[3] = 0x37 + (gval * (0xfa - 0x37) / 0xb8);
1359 gamma[4] = 0x45 + (gval * (0xfc - 0x45) / 0xb8);
1360 gamma[5] = 0x55 + (gval * (0xfb - 0x55) / 0xb8);
1361 gamma[6] = 0x65 + (gval * (0xfc - 0x65) / 0xb8);
1362 gamma[7] = 0x74 + (gval * (0xfd - 0x74) / 0xb8);
1363 gamma[8] = 0x83 + (gval * (0xfe - 0x83) / 0xb8);
1364 gamma[9] = 0x92 + (gval * (0xfc - 0x92) / 0xb8);
1365 gamma[10] = 0xa1 + (gval * (0xfc - 0xa1) / 0xb8);
1366 gamma[11] = 0xb0 + (gval * (0xfc - 0xb0) / 0xb8);
1367 gamma[12] = 0xbf + (gval * (0xfb - 0xbf) / 0xb8);
1368 gamma[13] = 0xce + (gval * (0xfb - 0xce) / 0xb8);
1369 gamma[14] = 0xdf + (gval * (0xfd - 0xdf) / 0xb8);
1370 gamma[15] = 0xea + (gval * (0xf9 - 0xea) / 0xb8);
1373 reg_w(gspca_dev, 0x1190, gamma, 17);
1376 static void set_redblue(
struct gspca_dev *gspca_dev,
s32 blue,
s32 red)
1378 reg_w1(gspca_dev, 0x118c, red);
1379 reg_w1(gspca_dev, 0x118f, blue);
1386 struct sd *sd = (
struct sd *) gspca_dev;
1404 reg_w1(gspca_dev, 0x1182, sd->
vstart);
1405 i2c_w1(gspca_dev, 0x1e, value);
1408 i2c_r1(gspca_dev, 0x1e, &value);
1417 i2c_w1(gspca_dev, 0x1e, value);
1418 i2c_w1(gspca_dev, 0x3a, tslb);
1422 i2c_r2(gspca_dev, 0x20, &value2);
1428 i2c_w2(gspca_dev, 0x20, value2);
1433 i2c_r2(gspca_dev, 0x20, &value2);
1439 i2c_w2(gspca_dev, 0x20, value2);
1442 i2c_r1(gspca_dev, 0x01, &value);
1448 i2c_w1(gspca_dev, 0x01, value);
1453 static void set_exposure(
struct gspca_dev *gspca_dev,
s32 expo)
1455 struct sd *sd = (
struct sd *) gspca_dev;
1457 0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
1474 exp[3] = expo2 >> 2;
1476 i2c_w(gspca_dev, exp);
1478 exp[3] = expo2 & 0x0003;
1480 i2c_w(gspca_dev, exp);
1506 i2c_w(gspca_dev, exp);
1509 static void set_gain(
struct gspca_dev *gspca_dev,
s32 g)
1511 struct sd *sd = (
struct sd *) gspca_dev;
1513 0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
1524 gain[0] |= (2 << 4);
1525 gain[3] = ov_gain[g];
1528 gain[0] |= (3 << 4);
1530 gain[3] = micron1_gain[g] >> 8;
1531 gain[4] = micron1_gain[g];
1534 gain[0] |= (3 << 4);
1536 gain[3] = micron1_gain[g] >> 8;
1537 gain[4] = micron1_gain[g];
1540 gain[0] |= (3 << 4);
1542 gain[3] = micron2_gain[g] >> 8;
1543 gain[4] = micron2_gain[g];
1546 gain[0] |= (2 << 4);
1548 gain[3] = hv7131r_gain[g];
1553 i2c_w(gspca_dev, gain);
1556 static void set_quality(
struct gspca_dev *gspca_dev,
s32 val)
1558 struct sd *sd = (
struct sd *) gspca_dev;
1561 reg_w1(gspca_dev, 0x1061, 0x01);
1562 reg_w1(gspca_dev, 0x10e0, sd->
fmt | 0x20);
1563 reg_w(gspca_dev, 0x1100, &sd->
jpeg_hdr[JPEG_QT0_OFFSET], 64);
1564 reg_w(gspca_dev, 0x1140, &sd->
jpeg_hdr[JPEG_QT1_OFFSET], 64);
1565 reg_w1(gspca_dev, 0x1061, 0x03);
1566 reg_w1(gspca_dev, 0x10e0, sd->
fmt);
1568 reg_w1(gspca_dev, 0x10e0, sd->
fmt);
1571 #ifdef CONFIG_VIDEO_ADV_DEBUG
1572 static int sd_dbg_g_register(
struct gspca_dev *gspca_dev,
1575 struct sd *sd = (
struct sd *) gspca_dev;
1577 switch (reg->
match.type) {
1579 if (reg->
match.addr != 0)
1581 if (reg->
reg < 0x1000 || reg->
reg > 0x11ff)
1583 reg_r(gspca_dev, reg->
reg, 1);
1591 i2c_r2(gspca_dev, reg->
reg, (
u16 *) ®->
val);
1593 i2c_r1(gspca_dev, reg->
reg, (
u8 *) ®->
val);
1600 static int sd_dbg_s_register(
struct gspca_dev *gspca_dev,
1603 struct sd *sd = (
struct sd *) gspca_dev;
1605 switch (reg->
match.type) {
1607 if (reg->
match.addr != 0)
1609 if (reg->
reg < 0x1000 || reg->
reg > 0x11ff)
1611 reg_w1(gspca_dev, reg->
reg, reg->
val);
1618 i2c_w2(gspca_dev, reg->
reg, reg->
val);
1620 i2c_w1(gspca_dev, reg->
reg, reg->
val);
1628 static int sd_chip_ident(
struct gspca_dev *gspca_dev,
1631 struct sd *sd = (
struct sd *) gspca_dev;
1633 switch (chip->
match.type) {
1635 if (chip->
match.addr != 0)
1650 static int sd_config(
struct gspca_dev *gspca_dev,
1653 struct sd *sd = (
struct sd *) gspca_dev;
1656 cam = &gspca_dev->
cam;
1659 sd->
sensor =
id->driver_info >> 8;
1661 sd->
flags =
id->driver_info >> 16;
1696 struct gspca_dev *gspca_dev =
1698 struct sd *sd = (
struct sd *)gspca_dev;
1712 set_gamma(gspca_dev, ctrl->
val);
1716 set_redblue(gspca_dev, sd->
blue->val, sd->
red->val);
1720 set_hvflip(gspca_dev, sd->
hflip->val, sd->
vflip->val);
1724 set_exposure(gspca_dev, ctrl->
val);
1728 set_gain(gspca_dev, ctrl->
val);
1733 set_gain(gspca_dev, sd->
gain->val);
1735 set_exposure(gspca_dev, sd->
exposure->val);
1738 set_quality(gspca_dev, ctrl->
val);
1745 .s_ctrl = sd_s_ctrl,
1748 static int sd_init_controls(
struct gspca_dev *gspca_dev)
1750 struct sd *sd = (
struct sd *) gspca_dev;
1753 gspca_dev->
vdev.ctrl_handler = hdl;
1799 pr_err(
"Could not initialize controls\n");
1820 static int sd_init(
struct gspca_dev *gspca_dev)
1822 struct sd *sd = (
struct sd *) gspca_dev;
1826 {0x80, sd->
i2c_addr, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03};
1828 for (i = 0; i <
ARRAY_SIZE(bridge_init); i++) {
1829 value = bridge_init[
i][1];
1830 reg_w(gspca_dev, bridge_init[i][0], &value, 1);
1832 pr_err(
"Device initialization failed\n");
1838 reg_w1(gspca_dev, 0x1006, 0x00);
1840 reg_w1(gspca_dev, 0x1006, 0x20);
1842 reg_w(gspca_dev, 0x10c0, i2c_init, 9);
1844 pr_err(
"Device initialization failed\n");
1850 ov9650_init_sensor(gspca_dev);
1853 pr_info(
"OV9650 sensor detected\n");
1856 ov9655_init_sensor(gspca_dev);
1859 pr_info(
"OV9655 sensor detected\n");
1862 soi968_init_sensor(gspca_dev);
1865 pr_info(
"SOI968 sensor detected\n");
1868 ov7660_init_sensor(gspca_dev);
1871 pr_info(
"OV7660 sensor detected\n");
1874 ov7670_init_sensor(gspca_dev);
1877 pr_info(
"OV7670 sensor detected\n");
1880 mt9v_init_sensor(gspca_dev);
1883 pr_info(
"MT9VPRB sensor detected\n");
1886 mt9m111_init_sensor(gspca_dev);
1889 pr_info(
"MT9M111 sensor detected\n");
1892 mt9m112_init_sensor(gspca_dev);
1895 pr_info(
"MT9M112 sensor detected\n");
1898 mt9m001_init_sensor(gspca_dev);
1903 hv7131r_init_sensor(gspca_dev);
1906 pr_info(
"HV7131R sensor detected\n");
1909 pr_err(
"Unsupported sensor\n");
1915 static void configure_sensor_output(
struct gspca_dev *gspca_dev,
int mode)
1917 struct sd *sd = (
struct sd *) gspca_dev;
1923 i2c_w1(gspca_dev, 0x17, 0x1d);
1924 i2c_w1(gspca_dev, 0x18, 0xbd);
1925 i2c_w1(gspca_dev, 0x19, 0x01);
1926 i2c_w1(gspca_dev, 0x1a, 0x81);
1927 i2c_w1(gspca_dev, 0x12, 0x00);
1931 i2c_w1(gspca_dev, 0x17, 0x13);
1932 i2c_w1(gspca_dev, 0x18, 0x63);
1933 i2c_w1(gspca_dev, 0x19, 0x01);
1934 i2c_w1(gspca_dev, 0x1a, 0x79);
1935 i2c_w1(gspca_dev, 0x12, 0x40);
1941 if (mode & MODE_SXGA) {
1942 i2c_w1(gspca_dev, 0x17, 0x1b);
1943 i2c_w1(gspca_dev, 0x18, 0xbc);
1944 i2c_w1(gspca_dev, 0x19, 0x01);
1945 i2c_w1(gspca_dev, 0x1a, 0x82);
1946 i2c_r1(gspca_dev, 0x12, &value);
1947 i2c_w1(gspca_dev, 0x12, value & 0x07);
1949 i2c_w1(gspca_dev, 0x17, 0x24);
1950 i2c_w1(gspca_dev, 0x18, 0xc5);
1951 i2c_w1(gspca_dev, 0x19, 0x00);
1952 i2c_w1(gspca_dev, 0x1a, 0x3c);
1953 i2c_r1(gspca_dev, 0x12, &value);
1954 i2c_w1(gspca_dev, 0x12, (value & 0x7) | 0x40);
1959 if (mode & MODE_SXGA) {
1960 i2c_w2(gspca_dev, 0xf0, 0x0002);
1961 i2c_w2(gspca_dev, 0xc8, 0x970b);
1962 i2c_w2(gspca_dev, 0xf0, 0x0000);
1964 i2c_w2(gspca_dev, 0xf0, 0x0002);
1965 i2c_w2(gspca_dev, 0xc8, 0x8000);
1966 i2c_w2(gspca_dev, 0xf0, 0x0000);
1972 static int sd_isoc_init(
struct gspca_dev *gspca_dev)
1985 if (intf->num_altsetting != 9) {
1986 pr_warn(
"sn9c20x camera with unknown number of alt "
1987 "settings (%d), please report!\n",
1988 intf->num_altsetting);
1989 gspca_dev->
alt = intf->num_altsetting;
1993 switch (gspca_dev->
width) {
2009 #define HW_WIN(mode, hstart, vstart) \
2010 ((const u8 []){hstart, 0, vstart, 0, \
2011 (mode & MODE_SXGA ? 1280 >> 4 : 640 >> 4), \
2012 (mode & MODE_SXGA ? 1024 >> 3 : 480 >> 3)})
2014 #define CLR_WIN(width, height) \
2016 {0, width >> 2, 0, height >> 1,\
2017 ((width >> 10) & 0x01) | ((height >> 8) & 0x6)})
2019 static int sd_start(
struct gspca_dev *gspca_dev)
2021 struct sd *sd = (
struct sd *) gspca_dev;
2058 configure_sensor_output(gspca_dev, mode);
2063 reg_w1(gspca_dev, 0x1189, scale);
2064 reg_w1(gspca_dev, 0x10e0, fmt);
2081 reg_w1(gspca_dev, 0x1007, 0x20);
2082 reg_w1(gspca_dev, 0x1061, 0x03);
2085 if (mode & MODE_JPEG) {
2095 static void sd_stopN(
struct gspca_dev *gspca_dev)
2097 reg_w1(gspca_dev, 0x1007, 0x00);
2098 reg_w1(gspca_dev, 0x1061, 0x01);
2103 static void sd_stop0(
struct gspca_dev *gspca_dev)
2105 struct sd *sd = (
struct sd *) gspca_dev;
2115 static void do_autoexposure(
struct gspca_dev *gspca_dev,
u16 avg_lum)
2117 struct sd *sd = (
struct sd *) gspca_dev;
2166 static void do_autogain(
struct gspca_dev *gspca_dev,
u16 avg_lum)
2168 struct sd *sd = (
struct sd *) gspca_dev;
2171 if (avg_lum <
MIN_AVG_LUM && cur_gain < sd->gain->maximum)
2177 static void sd_dqcallback(
struct gspca_dev *gspca_dev)
2179 struct sd *sd = (
struct sd *) gspca_dev;
2187 do_autogain(gspca_dev, avg_lum);
2189 do_autoexposure(gspca_dev, avg_lum);
2197 struct gspca_dev *gspca_dev = &sd->
gspca_dev;
2202 PDEBUG(D_STREAM,
"qual_upd %d%%", qual);
2204 set_quality(gspca_dev, qual);
2208 #if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
2209 static int sd_int_pkt_scan(
struct gspca_dev *gspca_dev,
2213 struct sd *sd = (
struct sd *) gspca_dev;
2216 input_report_key(gspca_dev->input_dev,
KEY_CAMERA, 1);
2217 input_sync(gspca_dev->input_dev);
2218 input_report_key(gspca_dev->input_dev,
KEY_CAMERA, 0);
2219 input_sync(gspca_dev->input_dev);
2227 static void transfer_check(
struct gspca_dev *gspca_dev,
2230 struct sd *sd = (
struct sd *) gspca_dev;
2236 if (data[6] & 0x08) {
2242 r = (sd->
pktsz * 100) /
2244 gspca_dev->
urb[0]->iso_frame_desc[0].length);
2250 if (new_qual != 0) {
2251 sd->
nchg += new_qual;
2252 if (sd->
nchg < -6 || sd->
nchg >= 12) {
2258 new_qual += curqual;
2259 if (new_qual < sd->
jpegqual->minimum)
2261 else if (new_qual > sd->
jpegqual->maximum)
2263 if (new_qual != curqual) {
2274 static void sd_pkt_scan(
struct gspca_dev *gspca_dev,
2278 struct sd *sd = (
struct sd *) gspca_dev;
2280 static const u8 frame_header[] =
2281 {0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96};
2283 is_jpeg = (sd->
fmt & 0x03) == 0;
2284 if (len >= 64 &&
memcmp(data, frame_header, 6) == 0) {
2285 avg_lum = ((data[35] >> 2) & 3) |
2288 avg_lum += ((data[35] >> 4) & 3) |
2291 avg_lum += ((data[35] >> 6) & 3) |
2294 avg_lum += (data[36] & 3) |
2297 avg_lum += ((data[36] >> 2) & 3) |
2300 avg_lum += ((data[36] >> 4) & 3) |
2303 avg_lum += ((data[36] >> 6) & 3) |
2306 avg_lum += ((data[44] >> 4) & 3) |
2313 transfer_check(gspca_dev, data);
2343 .
name = KBUILD_MODNAME,
2344 .config = sd_config,
2346 .init_controls = sd_init_controls,
2347 .isoc_init = sd_isoc_init,
2351 .pkt_scan = sd_pkt_scan,
2352 #if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
2353 .int_pkt_scan = sd_int_pkt_scan,
2355 .dq_callback = sd_dqcallback,
2356 #ifdef CONFIG_VIDEO_ADV_DEBUG
2357 .set_register = sd_dbg_s_register,
2358 .get_register = sd_dbg_g_register,
2360 .get_chip_ident = sd_chip_ident,
2363 #define SN9C20X(sensor, i2c_addr, flags) \
2364 .driver_info = ((flags & 0xff) << 16) \
2365 | (SENSOR_ ## sensor << 8) \
2369 {USB_DEVICE(0x0c45, 0x6240),
SN9C20X(MT9M001, 0x5d, 0)},
2370 {USB_DEVICE(0x0c45, 0x6242),
SN9C20X(MT9M111, 0x5d, 0)},
2371 {USB_DEVICE(0x0c45, 0x6248),
SN9C20X(OV9655, 0x30, 0)},
2372 {USB_DEVICE(0x0c45, 0x624c),
SN9C20X(MT9M112, 0x5d, 0)},
2374 {USB_DEVICE(0x0c45, 0x624f),
SN9C20X(OV9650, 0x30,
2376 {USB_DEVICE(0x0c45, 0x6251),
SN9C20X(OV9650, 0x30, 0)},
2377 {USB_DEVICE(0x0c45, 0x6253),
SN9C20X(OV9650, 0x30, 0)},
2378 {USB_DEVICE(0x0c45, 0x6260),
SN9C20X(OV7670, 0x21, 0)},
2379 {USB_DEVICE(0x0c45, 0x6270),
SN9C20X(MT9VPRB, 0x00, 0)},
2381 {USB_DEVICE(0x0c45, 0x627c),
SN9C20X(HV7131R, 0x11, 0)},
2382 {USB_DEVICE(0x0c45, 0x627f),
SN9C20X(OV9650, 0x30, 0)},
2383 {USB_DEVICE(0x0c45, 0x6280),
SN9C20X(MT9M001, 0x5d, 0)},
2384 {USB_DEVICE(0x0c45, 0x6282),
SN9C20X(MT9M111, 0x5d, 0)},
2385 {USB_DEVICE(0x0c45, 0x6288),
SN9C20X(OV9655, 0x30, 0)},
2386 {USB_DEVICE(0x0c45, 0x628c),
SN9C20X(MT9M112, 0x5d, 0)},
2387 {USB_DEVICE(0x0c45, 0x628e),
SN9C20X(SOI968, 0x30, 0)},
2388 {USB_DEVICE(0x0c45, 0x628f),
SN9C20X(OV9650, 0x30, 0)},
2389 {USB_DEVICE(0x0c45, 0x62a0),
SN9C20X(OV7670, 0x21, 0)},
2390 {USB_DEVICE(0x0c45, 0x62b0),
SN9C20X(MT9VPRB, 0x00, 0)},
2393 {USB_DEVICE(0x0c45, 0x62bc),
SN9C20X(HV7131R, 0x11, 0)},
2394 {USB_DEVICE(0x045e, 0x00f4),
SN9C20X(OV9650, 0x30, 0)},
2395 {USB_DEVICE(0x145f, 0x013d),
SN9C20X(OV7660, 0x21, 0)},
2396 {USB_DEVICE(0x0458, 0x7029),
SN9C20X(HV7131R, 0x11, 0)},
2397 {USB_DEVICE(0x0458, 0x704a),
SN9C20X(MT9M112, 0x5d, 0)},
2398 {USB_DEVICE(0x0458, 0x704c),
SN9C20X(MT9M112, 0x5d, 0)},
2399 {USB_DEVICE(0xa168, 0x0610),
SN9C20X(HV7131R, 0x11, 0)},
2400 {USB_DEVICE(0xa168, 0x0611),
SN9C20X(HV7131R, 0x11, 0)},
2401 {USB_DEVICE(0xa168, 0x0613),
SN9C20X(HV7131R, 0x11, 0)},
2402 {USB_DEVICE(0xa168, 0x0618),
SN9C20X(HV7131R, 0x11, 0)},
2403 {USB_DEVICE(0xa168, 0x0614),
SN9C20X(MT9M111, 0x5d, 0)},
2404 {USB_DEVICE(0xa168, 0x0615),
SN9C20X(MT9M111, 0x5d, 0)},
2405 {USB_DEVICE(0xa168, 0x0617),
SN9C20X(MT9M111, 0x5d, 0)},
2418 static struct usb_driver sd_driver = {
2419 .name = KBUILD_MODNAME,
2420 .id_table = device_table,
2424 .suspend = gspca_suspend,
2425 .resume = gspca_resume,
2426 .reset_resume = gspca_resume,