aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Francois Moine <moinejf@free.fr>2010-12-14 14:17:40 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-12-17 15:49:11 -0500
commit0e4d413af1a9ddd12f82617734eb535007e186a8 (patch)
treecf28c6181a492882841f20adba7238e6f52684e6
parent4fd350ee2bf129acb933ad5104bc4754b2c7c9ef (diff)
[media] gspca - sonixj: Better handling of the bridge registers 0x01 and 0x17
The initial values of the registers 0x01 and 0x17 are taken from the sensor table at capture start and updated according to the flag PDN_INV. Their values are updated at each step of the capture initialization and memorized for reuse in capture stop. This patch also fixed automatically some bad hardcoded values of these registers. Signed-off-by: Jean-François Moine <moinejf@free.fr> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/video/gspca/sonixj.c263
1 files changed, 100 insertions, 163 deletions
diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c
index 8ff4c89c3d82..e23de57e2c73 100644
--- a/drivers/media/video/gspca/sonixj.c
+++ b/drivers/media/video/gspca/sonixj.c
@@ -63,6 +63,8 @@ struct sd {
63#define QUALITY_DEF 80 63#define QUALITY_DEF 80
64 u8 jpegqual; /* webcam quality */ 64 u8 jpegqual; /* webcam quality */
65 65
66 u8 reg01;
67 u8 reg17;
66 u8 reg18; 68 u8 reg18;
67 u8 flags; 69 u8 flags;
68 70
@@ -2306,8 +2308,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
2306{ 2308{
2307 struct sd *sd = (struct sd *) gspca_dev; 2309 struct sd *sd = (struct sd *) gspca_dev;
2308 int i; 2310 int i;
2311 u8 reg01, reg17;
2309 u8 reg0102[2]; 2312 u8 reg0102[2];
2310 u8 reg1, reg17;
2311 const u8 *sn9c1xx; 2313 const u8 *sn9c1xx;
2312 const u8 (*init)[8]; 2314 const u8 (*init)[8];
2313 const u8 *reg9a; 2315 const u8 *reg9a;
@@ -2341,10 +2343,13 @@ static int sd_start(struct gspca_dev *gspca_dev)
2341 2343
2342 /* sensor clock already enabled in sd_init */ 2344 /* sensor clock already enabled in sd_init */
2343 /* reg_w1(gspca_dev, 0xf1, 0x00); */ 2345 /* reg_w1(gspca_dev, 0xf1, 0x00); */
2344 reg_w1(gspca_dev, 0x01, sn9c1xx[1]); 2346 reg01 = sn9c1xx[1];
2347 if (sd->flags & PDN_INV)
2348 reg01 ^= S_PDN_INV; /* power down inverted */
2349 reg_w1(gspca_dev, 0x01, reg01);
2345 2350
2346 /* configure gpio */ 2351 /* configure gpio */
2347 reg0102[0] = sn9c1xx[1]; 2352 reg0102[0] = reg01;
2348 reg0102[1] = sn9c1xx[2]; 2353 reg0102[1] = sn9c1xx[2];
2349 if (gspca_dev->audio) 2354 if (gspca_dev->audio)
2350 reg0102[1] |= 0x04; /* keep the audio connection */ 2355 reg0102[1] |= 0x04; /* keep the audio connection */
@@ -2370,95 +2375,49 @@ static int sd_start(struct gspca_dev *gspca_dev)
2370 2375
2371 reg_w(gspca_dev, 0x03, &sn9c1xx[3], 0x0f); 2376 reg_w(gspca_dev, 0x03, &sn9c1xx[3], 0x0f);
2372 2377
2378 reg17 = sn9c1xx[0x17];
2373 switch (sd->sensor) { 2379 switch (sd->sensor) {
2374 case SENSOR_ADCM1700:
2375 reg_w1(gspca_dev, 0x01, 0x43);
2376 reg_w1(gspca_dev, 0x17, 0x62);
2377 reg_w1(gspca_dev, 0x01, 0x42);
2378 reg_w1(gspca_dev, 0x01, 0x42);
2379 break;
2380 case SENSOR_GC0307: 2380 case SENSOR_GC0307:
2381 msleep(50); 2381 msleep(50); /*fixme: is it useful? */
2382 reg_w1(gspca_dev, 0x01, 0x61);
2383 reg_w1(gspca_dev, 0x17, 0x22);
2384 reg_w1(gspca_dev, 0x01, 0x60);
2385 reg_w1(gspca_dev, 0x01, 0x40);
2386 msleep(50);
2387 break;
2388 case SENSOR_MI0360B:
2389 reg_w1(gspca_dev, 0x01, 0x61);
2390 reg_w1(gspca_dev, 0x17, 0x60);
2391 reg_w1(gspca_dev, 0x01, 0x60);
2392 reg_w1(gspca_dev, 0x01, 0x40);
2393 break;
2394 case SENSOR_MT9V111:
2395 reg_w1(gspca_dev, 0x01, 0x61);
2396 reg_w1(gspca_dev, 0x17, 0x61);
2397 reg_w1(gspca_dev, 0x01, 0x60);
2398 reg_w1(gspca_dev, 0x01, 0x40);
2399 break; 2382 break;
2400 case SENSOR_OM6802: 2383 case SENSOR_OM6802:
2401 msleep(10); 2384 msleep(10);
2402 reg_w1(gspca_dev, 0x02, 0x73); 2385 reg_w1(gspca_dev, 0x02, 0x73);
2403 reg_w1(gspca_dev, 0x17, 0x60); 2386 reg17 |= SEN_CLK_EN;
2387 reg_w1(gspca_dev, 0x17, reg17);
2404 reg_w1(gspca_dev, 0x01, 0x22); 2388 reg_w1(gspca_dev, 0x01, 0x22);
2405 msleep(100); 2389 msleep(100);
2406 reg_w1(gspca_dev, 0x01, 0x62); 2390 reg01 = SCL_SEL_OD | S_PDN_INV;
2407 reg_w1(gspca_dev, 0x17, 0x64); 2391 reg17 &= MCK_SIZE_MASK;
2408 reg_w1(gspca_dev, 0x17, 0x64); 2392 reg17 |= 0x04; /* clock / 4 */
2409 reg_w1(gspca_dev, 0x01, 0x42); 2393 break;
2394 }
2395 reg01 |= SYS_SEL_48M;
2396 reg_w1(gspca_dev, 0x01, reg01);
2397 reg17 |= SEN_CLK_EN;
2398 reg_w1(gspca_dev, 0x17, reg17);
2399 reg01 &= ~S_PWR_DN; /* sensor power on */
2400 reg_w1(gspca_dev, 0x01, reg01);
2401 reg01 &= ~SYS_SEL_48M;
2402 reg_w1(gspca_dev, 0x01, reg01);
2403
2404 switch (sd->sensor) {
2405 case SENSOR_HV7131R:
2406 hv7131r_probe(gspca_dev); /*fixme: is it useful? */
2407 break;
2408 case SENSOR_OM6802:
2410 msleep(10); 2409 msleep(10);
2411 reg_w1(gspca_dev, 0x01, 0x42); 2410 reg_w1(gspca_dev, 0x01, reg01);
2412 i2c_w8(gspca_dev, om6802_init0[0]); 2411 i2c_w8(gspca_dev, om6802_init0[0]);
2413 i2c_w8(gspca_dev, om6802_init0[1]); 2412 i2c_w8(gspca_dev, om6802_init0[1]);
2414 msleep(15); 2413 msleep(15);
2415 reg_w1(gspca_dev, 0x02, 0x71); 2414 reg_w1(gspca_dev, 0x02, 0x71);
2416 msleep(150); 2415 msleep(150);
2417 break; 2416 break;
2418 case SENSOR_OV7630:
2419 reg_w1(gspca_dev, 0x01, 0x61);
2420 reg_w1(gspca_dev, 0x17, 0xe2);
2421 reg_w1(gspca_dev, 0x01, 0x60);
2422 reg_w1(gspca_dev, 0x01, 0x40);
2423 break;
2424 case SENSOR_OV7648:
2425 reg_w1(gspca_dev, 0x01, 0x63);
2426 reg_w1(gspca_dev, 0x17, 0x20);
2427 reg_w1(gspca_dev, 0x01, 0x62);
2428 reg_w1(gspca_dev, 0x01, 0x42);
2429 break;
2430 case SENSOR_PO1030:
2431 case SENSOR_SOI768:
2432 reg_w1(gspca_dev, 0x01, 0x61);
2433 reg_w1(gspca_dev, 0x17, 0x20);
2434 reg_w1(gspca_dev, 0x01, 0x60);
2435 reg_w1(gspca_dev, 0x01, 0x40);
2436 break;
2437 case SENSOR_PO2030N:
2438 case SENSOR_OV7660:
2439 reg_w1(gspca_dev, 0x01, 0x63);
2440 reg_w1(gspca_dev, 0x17, 0x20);
2441 reg_w1(gspca_dev, 0x01, 0x62);
2442 reg_w1(gspca_dev, 0x01, 0x42);
2443 break;
2444 case SENSOR_SP80708: 2417 case SENSOR_SP80708:
2445 reg_w1(gspca_dev, 0x01, 0x63);
2446 reg_w1(gspca_dev, 0x17, 0x20);
2447 reg_w1(gspca_dev, 0x01, 0x62);
2448 reg_w1(gspca_dev, 0x01, 0x42);
2449 msleep(100); 2418 msleep(100);
2450 reg_w1(gspca_dev, 0x02, 0x62); 2419 reg_w1(gspca_dev, 0x02, 0x62);
2451 break; 2420 break;
2452 default:
2453/* case SENSOR_HV7131R: */
2454/* case SENSOR_MI0360: */
2455/* case SENSOR_MO4000: */
2456 reg_w1(gspca_dev, 0x01, 0x43);
2457 reg_w1(gspca_dev, 0x17, 0x61);
2458 reg_w1(gspca_dev, 0x01, 0x42);
2459 if (sd->sensor == SENSOR_HV7131R)
2460 hv7131r_probe(gspca_dev);
2461 break;
2462 } 2421 }
2463 2422
2464 /* initialize the sensor */ 2423 /* initialize the sensor */
@@ -2487,30 +2446,11 @@ static int sd_start(struct gspca_dev *gspca_dev)
2487 } 2446 }
2488 reg_w1(gspca_dev, 0x18, sn9c1xx[0x18]); 2447 reg_w1(gspca_dev, 0x18, sn9c1xx[0x18]);
2489 switch (sd->sensor) { 2448 switch (sd->sensor) {
2490 case SENSOR_GC0307: 2449 case SENSOR_OM6802:
2491 reg17 = 0xa2; 2450/* case SENSOR_OV7648: * fixme: sometimes */
2492 break;
2493 case SENSOR_MT9V111:
2494 case SENSOR_MI0360B:
2495 reg17 = 0xe0;
2496 break;
2497 case SENSOR_ADCM1700:
2498 case SENSOR_OV7630:
2499 reg17 = 0xe2;
2500 break;
2501 case SENSOR_OV7648:
2502 reg17 = 0x20;
2503 break;
2504 case SENSOR_OV7660:
2505 case SENSOR_SOI768:
2506 reg17 = 0xa0;
2507 break;
2508 case SENSOR_PO1030:
2509 case SENSOR_PO2030N:
2510 reg17 = 0xa0;
2511 break; 2451 break;
2512 default: 2452 default:
2513 reg17 = 0x60; 2453 reg17 |= DEF_EN;
2514 break; 2454 break;
2515 } 2455 }
2516 reg_w1(gspca_dev, 0x17, reg17); 2456 reg_w1(gspca_dev, 0x17, reg17);
@@ -2557,95 +2497,67 @@ static int sd_start(struct gspca_dev *gspca_dev)
2557 2497
2558 init = NULL; 2498 init = NULL;
2559 mode = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv; 2499 mode = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv;
2560 if (mode) 2500 reg01 |= SYS_SEL_48M | V_TX_EN;
2561 reg1 = 0x46; /* 320x240: clk 48Mhz, video trf enable */ 2501 reg17 &= ~MCK_SIZE_MASK;
2562 else 2502 reg17 |= 0x02; /* clock / 2 */
2563 reg1 = 0x06; /* 640x480: clk 24Mhz, video trf enable */
2564 reg17 = 0x61; /* 0x:20: enable sensor clock */
2565 switch (sd->sensor) { 2503 switch (sd->sensor) {
2566 case SENSOR_ADCM1700: 2504 case SENSOR_ADCM1700:
2567 init = adcm1700_sensor_param1; 2505 init = adcm1700_sensor_param1;
2568 reg1 = 0x46;
2569 reg17 = 0xe2;
2570 break; 2506 break;
2571 case SENSOR_GC0307: 2507 case SENSOR_GC0307:
2572 init = gc0307_sensor_param1; 2508 init = gc0307_sensor_param1;
2573 reg17 = 0xa2; 2509 break;
2574 reg1 = 0x44; 2510 case SENSOR_HV7131R:
2511 case SENSOR_MI0360:
2512 if (mode)
2513 reg01 |= SYS_SEL_48M; /* 320x240: clk 48Mhz */
2514 else
2515 reg01 &= ~SYS_SEL_48M; /* 640x480: clk 24Mhz */
2516 reg17 &= ~MCK_SIZE_MASK;
2517 reg17 |= 0x01; /* clock / 1 */
2575 break; 2518 break;
2576 case SENSOR_MI0360B: 2519 case SENSOR_MI0360B:
2577 init = mi0360b_sensor_param1; 2520 init = mi0360b_sensor_param1;
2578 reg1 &= ~0x02; /* don't inverse pin S_PWR_DN */
2579 reg17 = 0xe2;
2580 break; 2521 break;
2581 case SENSOR_MO4000: 2522 case SENSOR_MO4000:
2582 if (mode) { 2523 if (mode) { /* if 320x240 */
2583/* reg1 = 0x46; * 320 clk 48Mhz 60fp/s */ 2524 reg01 &= ~SYS_SEL_48M; /* clk 24Mz */
2584 reg1 = 0x06; /* clk 24Mz */ 2525 reg17 &= ~MCK_SIZE_MASK;
2585 } else { 2526 reg17 |= 0x01; /* clock / 1 */
2586 reg17 = 0x22; /* 640 MCKSIZE */
2587/* reg1 = 0x06; * 640 clk 24Mz (done) */
2588 } 2527 }
2589 break; 2528 break;
2590 case SENSOR_MT9V111: 2529 case SENSOR_MT9V111:
2591 init = mt9v111_sensor_param1; 2530 init = mt9v111_sensor_param1;
2592 if (mode) {
2593 reg1 = 0x04; /* 320 clk 48Mhz */
2594 } else {
2595/* reg1 = 0x06; * 640 clk 24Mz (done) */
2596 reg17 = 0xc2;
2597 }
2598 break; 2531 break;
2599 case SENSOR_OM6802: 2532 case SENSOR_OM6802:
2600 init = om6802_sensor_param1; 2533 init = om6802_sensor_param1;
2601 reg17 = 0x64; /* 640 MCKSIZE */ 2534 if (!mode) { /* if 640x480 */
2535 reg17 &= ~MCK_SIZE_MASK;
2536 reg17 |= 0x01; /* clock / 4 */
2537 }
2602 break; 2538 break;
2603 case SENSOR_OV7630: 2539 case SENSOR_OV7630:
2604 init = ov7630_sensor_param1; 2540 init = ov7630_sensor_param1;
2605 reg17 = 0xe2;
2606 reg1 = 0x44;
2607 break; 2541 break;
2608 case SENSOR_OV7648: 2542 case SENSOR_OV7648:
2609 init = ov7648_sensor_param1; 2543 init = ov7648_sensor_param1;
2610 reg17 = 0x21; 2544 reg17 &= ~MCK_SIZE_MASK;
2611/* reg1 = 0x42; * 42 - 46? */ 2545 reg17 |= 0x01; /* clock / 1 */
2612 break; 2546 break;
2613 case SENSOR_OV7660: 2547 case SENSOR_OV7660:
2614 init = ov7660_sensor_param1; 2548 init = ov7660_sensor_param1;
2615 if (sd->bridge == BRIDGE_SN9C120) {
2616 if (mode) { /* 320x240 - 160x120 */
2617 reg17 = 0xa2;
2618 reg1 = 0x44; /* 48 Mhz, video trf eneble */
2619 }
2620 } else {
2621 reg17 = 0x22;
2622 reg1 = 0x06; /* 24 Mhz, video trf eneble
2623 * inverse power down */
2624 }
2625 break; 2549 break;
2626 case SENSOR_PO1030: 2550 case SENSOR_PO1030:
2627 init = po1030_sensor_param1; 2551 init = po1030_sensor_param1;
2628 reg17 = 0xa2;
2629 reg1 = 0x44;
2630 break; 2552 break;
2631 case SENSOR_PO2030N: 2553 case SENSOR_PO2030N:
2632 init = po2030n_sensor_param1; 2554 init = po2030n_sensor_param1;
2633 reg1 = 0x46;
2634 reg17 = 0xa2;
2635 break; 2555 break;
2636 case SENSOR_SOI768: 2556 case SENSOR_SOI768:
2637 init = soi768_sensor_param1; 2557 init = soi768_sensor_param1;
2638 reg1 = 0x44;
2639 reg17 = 0xa2;
2640 break; 2558 break;
2641 case SENSOR_SP80708: 2559 case SENSOR_SP80708:
2642 init = sp80708_sensor_param1; 2560 init = sp80708_sensor_param1;
2643 if (mode) {
2644/*?? reg1 = 0x04; * 320 clk 48Mhz */
2645 } else {
2646 reg1 = 0x46; /* 640 clk 48Mz */
2647 reg17 = 0xa2;
2648 }
2649 break; 2561 break;
2650 } 2562 }
2651 2563
@@ -2695,7 +2607,9 @@ static int sd_start(struct gspca_dev *gspca_dev)
2695 setjpegqual(gspca_dev); 2607 setjpegqual(gspca_dev);
2696 2608
2697 reg_w1(gspca_dev, 0x17, reg17); 2609 reg_w1(gspca_dev, 0x17, reg17);
2698 reg_w1(gspca_dev, 0x01, reg1); 2610 reg_w1(gspca_dev, 0x01, reg01);
2611 sd->reg01 = reg01;
2612 sd->reg17 = reg17;
2699 2613
2700 sethvflip(gspca_dev); 2614 sethvflip(gspca_dev);
2701 setbrightness(gspca_dev); 2615 setbrightness(gspca_dev);
@@ -2717,41 +2631,64 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
2717 { 0xa1, 0x21, 0x76, 0x20, 0x00, 0x00, 0x00, 0x10 }; 2631 { 0xa1, 0x21, 0x76, 0x20, 0x00, 0x00, 0x00, 0x10 };
2718 static const u8 stopsoi768[] = 2632 static const u8 stopsoi768[] =
2719 { 0xa1, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10 }; 2633 { 0xa1, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10 };
2720 u8 data; 2634 u8 reg01;
2721 const u8 *sn9c1xx; 2635 u8 reg17;
2722 2636
2723 data = 0x0b; 2637 reg01 = sd->reg01;
2638 reg17 = sd->reg17 & ~SEN_CLK_EN;
2724 switch (sd->sensor) { 2639 switch (sd->sensor) {
2640 case SENSOR_ADCM1700:
2725 case SENSOR_GC0307: 2641 case SENSOR_GC0307:
2726 data = 0x29; 2642 case SENSOR_PO2030N:
2643 case SENSOR_SP80708:
2644 reg01 |= LED;
2645 reg_w1(gspca_dev, 0x01, reg01);
2646 reg01 &= ~(LED | V_TX_EN);
2647 reg_w1(gspca_dev, 0x01, reg01);
2648/* reg_w1(gspca_dev, 0x02, 0x??); * LED off ? */
2727 break; 2649 break;
2728 case SENSOR_HV7131R: 2650 case SENSOR_HV7131R:
2651 reg01 &= ~V_TX_EN;
2652 reg_w1(gspca_dev, 0x01, reg01);
2729 i2c_w8(gspca_dev, stophv7131); 2653 i2c_w8(gspca_dev, stophv7131);
2730 data = 0x2b;
2731 break; 2654 break;
2732 case SENSOR_MI0360: 2655 case SENSOR_MI0360:
2733 case SENSOR_MI0360B: 2656 case SENSOR_MI0360B:
2657 reg01 &= ~V_TX_EN;
2658 reg_w1(gspca_dev, 0x01, reg01);
2659/* reg_w1(gspca_dev, 0x02, 0x40); * LED off ? */
2734 i2c_w8(gspca_dev, stopmi0360); 2660 i2c_w8(gspca_dev, stopmi0360);
2735 data = 0x29;
2736 break; 2661 break;
2737 case SENSOR_OV7648:
2738 i2c_w8(gspca_dev, stopov7648);
2739 /* fall thru */
2740 case SENSOR_MT9V111: 2662 case SENSOR_MT9V111:
2741 case SENSOR_OV7630: 2663 case SENSOR_OM6802:
2742 case SENSOR_PO1030: 2664 case SENSOR_PO1030:
2743 data = 0x29; 2665 reg01 &= ~V_TX_EN;
2666 reg_w1(gspca_dev, 0x01, reg01);
2667 break;
2668 case SENSOR_OV7630:
2669 case SENSOR_OV7648:
2670 reg01 &= ~V_TX_EN;
2671 reg_w1(gspca_dev, 0x01, reg01);
2672 i2c_w8(gspca_dev, stopov7648);
2673 break;
2674 case SENSOR_OV7660:
2675 reg01 &= ~V_TX_EN;
2676 reg_w1(gspca_dev, 0x01, reg01);
2744 break; 2677 break;
2745 case SENSOR_SOI768: 2678 case SENSOR_SOI768:
2746 i2c_w8(gspca_dev, stopsoi768); 2679 i2c_w8(gspca_dev, stopsoi768);
2747 data = 0x29;
2748 break; 2680 break;
2749 } 2681 }
2750 sn9c1xx = sn_tb[sd->sensor]; 2682
2751 reg_w1(gspca_dev, 0x01, sn9c1xx[1]); 2683 reg01 |= SCL_SEL_OD;
2752 reg_w1(gspca_dev, 0x17, sn9c1xx[0x17]); 2684 reg_w1(gspca_dev, 0x01, reg01);
2753 reg_w1(gspca_dev, 0x01, sn9c1xx[1]); 2685 reg01 |= S_PWR_DN; /* sensor power down */
2754 reg_w1(gspca_dev, 0x01, data); 2686 reg_w1(gspca_dev, 0x01, reg01);
2687 reg_w1(gspca_dev, 0x17, reg17);
2688 reg01 &= ~SYS_SEL_48M; /* clock 24MHz */
2689 reg_w1(gspca_dev, 0x01, reg01);
2690 reg01 |= LED;
2691 reg_w1(gspca_dev, 0x01, reg01);
2755 /* Don't disable sensor clock as that disables the button on the cam */ 2692 /* Don't disable sensor clock as that disables the button on the cam */
2756 /* reg_w1(gspca_dev, 0xf1, 0x01); */ 2693 /* reg_w1(gspca_dev, 0xf1, 0x01); */
2757} 2694}