diff options
-rw-r--r-- | drivers/media/video/gspca/sonixj.c | 263 |
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 | } |