aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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}