diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-06-16 22:55:44 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-06-23 02:10:05 -0400 |
commit | 14422f9dd8515bfbe6fdbde37eadf59e2980f104 (patch) | |
tree | 1590b5ac41fd4aab91317632d6cb41cd7402e7d8 /drivers/media/video/cx88 | |
parent | d888a4c76c51092993643f8992bf55b3c28da483 (diff) |
V4L/DVB (12010): cx88: Properly support Leadtek TV2000 XP Global
Fix Leadtek TV2000 XP Global entries and add missing PCI ID's.
Thanks to Terry Wu <terrywu2009@gmail.com> for pointing us for the proper settings.
Cc: Terry Wu <terrywu2009@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/cx88')
-rw-r--r-- | drivers/media/video/cx88/cx88-cards.c | 94 |
1 files changed, 75 insertions, 19 deletions
diff --git a/drivers/media/video/cx88/cx88-cards.c b/drivers/media/video/cx88/cx88-cards.c index 94b7a52629d0..a5cc1c1fc2d6 100644 --- a/drivers/media/video/cx88/cx88-cards.c +++ b/drivers/media/video/cx88/cx88-cards.c | |||
@@ -1524,33 +1524,45 @@ static const struct cx88_board cx88_boards[] = { | |||
1524 | }, | 1524 | }, |
1525 | .mpeg = CX88_MPEG_DVB, | 1525 | .mpeg = CX88_MPEG_DVB, |
1526 | }, | 1526 | }, |
1527 | /* Terry Wu <terrywu2009@gmail.com> */ | ||
1528 | /* TV Audio : set GPIO 2, 18, 19 value to 0, 1, 0 */ | ||
1529 | /* FM Audio : set GPIO 2, 18, 19 value to 0, 0, 0 */ | ||
1530 | /* Line-in Audio : set GPIO 2, 18, 19 value to 0, 1, 1 */ | ||
1531 | /* Mute Audio : set GPIO 2 value to 1 */ | ||
1527 | [CX88_BOARD_WINFAST_TV2000_XP_GLOBAL] = { | 1532 | [CX88_BOARD_WINFAST_TV2000_XP_GLOBAL] = { |
1528 | .name = "Winfast TV2000 XP Global", | 1533 | .name = "Leadtek TV2000 XP Global", |
1529 | .tuner_type = TUNER_XC2028, | 1534 | .tuner_type = TUNER_XC2028, |
1530 | .tuner_addr = 0x61, | 1535 | .tuner_addr = 0x61, |
1536 | .radio_type = TUNER_XC2028, | ||
1537 | .radio_addr = 0x61, | ||
1531 | .input = { { | 1538 | .input = { { |
1532 | .type = CX88_VMUX_TELEVISION, | 1539 | .type = CX88_VMUX_TELEVISION, |
1533 | .vmux = 0, | 1540 | .vmux = 0, |
1534 | .gpio0 = 0x0400, /* pin 2:mute = 0 (off?) */ | 1541 | .gpio0 = 0x0400, /* pin 2 = 0 */ |
1535 | .gpio1 = 0x0000, | 1542 | .gpio1 = 0x0000, |
1536 | .gpio2 = 0x0800, /* pin 19:audio = 0 (tv) */ | 1543 | .gpio2 = 0x0C04, /* pin 18 = 1, pin 19 = 0 */ |
1537 | 1544 | .gpio3 = 0x0000, | |
1538 | }, { | 1545 | }, { |
1539 | .type = CX88_VMUX_COMPOSITE1, | 1546 | .type = CX88_VMUX_COMPOSITE1, |
1540 | .vmux = 1, | 1547 | .vmux = 1, |
1541 | .gpio0 = 0x0400, /* probably? or 0x0404 to turn mute on */ | 1548 | .gpio0 = 0x0400, /* pin 2 = 0 */ |
1542 | .gpio1 = 0x0000, | 1549 | .gpio1 = 0x0000, |
1543 | .gpio2 = 0x0808, /* pin 19:audio = 1 (line) */ | 1550 | .gpio2 = 0x0C0C, /* pin 18 = 1, pin 19 = 1 */ |
1544 | 1551 | .gpio3 = 0x0000, | |
1545 | }, { | 1552 | }, { |
1546 | .type = CX88_VMUX_SVIDEO, | 1553 | .type = CX88_VMUX_SVIDEO, |
1547 | .vmux = 2, | 1554 | .vmux = 2, |
1555 | .gpio0 = 0x0400, /* pin 2 = 0 */ | ||
1556 | .gpio1 = 0x0000, | ||
1557 | .gpio2 = 0x0C0C, /* pin 18 = 1, pin 19 = 1 */ | ||
1558 | .gpio3 = 0x0000, | ||
1548 | } }, | 1559 | } }, |
1549 | .radio = { | 1560 | .radio = { |
1550 | .type = CX88_RADIO, | 1561 | .type = CX88_RADIO, |
1551 | .gpio0 = 0x004ff, | 1562 | .gpio0 = 0x0400, /* pin 2 = 0 */ |
1552 | .gpio1 = 0x010ff, | 1563 | .gpio1 = 0x0000, |
1553 | .gpio2 = 0x0ff, | 1564 | .gpio2 = 0x0C00, /* pin 18 = 0, pin 19 = 0 */ |
1565 | .gpio3 = 0x0000, | ||
1554 | }, | 1566 | }, |
1555 | }, | 1567 | }, |
1556 | [CX88_BOARD_POWERCOLOR_REAL_ANGEL] = { | 1568 | [CX88_BOARD_POWERCOLOR_REAL_ANGEL] = { |
@@ -2438,6 +2450,41 @@ static const struct cx88_subid cx88_subids[] = { | |||
2438 | .subvendor = 0x107d, | 2450 | .subvendor = 0x107d, |
2439 | .subdevice = 0x6654, | 2451 | .subdevice = 0x6654, |
2440 | .card = CX88_BOARD_WINFAST_DTV1800H, | 2452 | .card = CX88_BOARD_WINFAST_DTV1800H, |
2453 | }, { | ||
2454 | /* PVR2000 PAL Model [107d:6630] */ | ||
2455 | .subvendor = 0x107d, | ||
2456 | .subdevice = 0x6630, | ||
2457 | .card = CX88_BOARD_LEADTEK_PVR2000, | ||
2458 | }, { | ||
2459 | /* PVR2000 PAL Model [107d:6638] */ | ||
2460 | .subvendor = 0x107d, | ||
2461 | .subdevice = 0x6638, | ||
2462 | .card = CX88_BOARD_LEADTEK_PVR2000, | ||
2463 | }, { | ||
2464 | /* PVR2000 NTSC Model [107d:6631] */ | ||
2465 | .subvendor = 0x107d, | ||
2466 | .subdevice = 0x6631, | ||
2467 | .card = CX88_BOARD_LEADTEK_PVR2000, | ||
2468 | }, { | ||
2469 | /* PVR2000 NTSC Model [107d:6637] */ | ||
2470 | .subvendor = 0x107d, | ||
2471 | .subdevice = 0x6637, | ||
2472 | .card = CX88_BOARD_LEADTEK_PVR2000, | ||
2473 | }, { | ||
2474 | /* PVR2000 NTSC Model [107d:663d] */ | ||
2475 | .subvendor = 0x107d, | ||
2476 | .subdevice = 0x663d, | ||
2477 | .card = CX88_BOARD_LEADTEK_PVR2000, | ||
2478 | }, { | ||
2479 | /* DV2000 NTSC Model [107d:6621] */ | ||
2480 | .subvendor = 0x107d, | ||
2481 | .subdevice = 0x6621, | ||
2482 | .card = CX88_BOARD_WINFAST_DV2000, | ||
2483 | }, { | ||
2484 | /* TV2000 XP Global [107d:6618] */ | ||
2485 | .subvendor = 0x107d, | ||
2486 | .subdevice = 0x6618, | ||
2487 | .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL, | ||
2441 | }, | 2488 | }, |
2442 | }; | 2489 | }; |
2443 | 2490 | ||
@@ -2446,12 +2493,6 @@ static const struct cx88_subid cx88_subids[] = { | |||
2446 | 2493 | ||
2447 | static void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data) | 2494 | static void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data) |
2448 | { | 2495 | { |
2449 | /* This is just for the "Winfast 2000XP Expert" board ATM; I don't have data on | ||
2450 | * any others. | ||
2451 | * | ||
2452 | * Byte 0 is 1 on the NTSC board. | ||
2453 | */ | ||
2454 | |||
2455 | if (eeprom_data[4] != 0x7d || | 2496 | if (eeprom_data[4] != 0x7d || |
2456 | eeprom_data[5] != 0x10 || | 2497 | eeprom_data[5] != 0x10 || |
2457 | eeprom_data[7] != 0x66) { | 2498 | eeprom_data[7] != 0x66) { |
@@ -2459,8 +2500,19 @@ static void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data) | |||
2459 | return; | 2500 | return; |
2460 | } | 2501 | } |
2461 | 2502 | ||
2462 | core->board.tuner_type = (eeprom_data[6] == 0x13) ? | 2503 | /* Terry Wu <terrywu2009@gmail.com> */ |
2463 | TUNER_PHILIPS_FM1236_MK3 : TUNER_PHILIPS_FM1216ME_MK3; | 2504 | switch (eeprom_data[6]) { |
2505 | case 0x13: /* SSID 6613 for TV2000 XP Expert NTSC Model */ | ||
2506 | case 0x21: /* SSID 6621 for DV2000 NTSC Model */ | ||
2507 | case 0x31: /* SSID 6631 for PVR2000 NTSC Model */ | ||
2508 | case 0x37: /* SSID 6637 for PVR2000 NTSC Model */ | ||
2509 | case 0x3d: /* SSID 6637 for PVR2000 NTSC Model */ | ||
2510 | core->board.tuner_type = TUNER_PHILIPS_FM1236_MK3; | ||
2511 | break; | ||
2512 | default: | ||
2513 | core->board.tuner_type = TUNER_PHILIPS_FM1216ME_MK3; | ||
2514 | break; | ||
2515 | } | ||
2464 | 2516 | ||
2465 | info_printk(core, "Leadtek Winfast 2000XP Expert config: " | 2517 | info_printk(core, "Leadtek Winfast 2000XP Expert config: " |
2466 | "tuner=%d, eeprom[0]=0x%02x\n", | 2518 | "tuner=%d, eeprom[0]=0x%02x\n", |
@@ -2713,7 +2765,6 @@ static int cx88_xc2028_tuner_callback(struct cx88_core *core, | |||
2713 | { | 2765 | { |
2714 | /* Board-specific callbacks */ | 2766 | /* Board-specific callbacks */ |
2715 | switch (core->boardnr) { | 2767 | switch (core->boardnr) { |
2716 | case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL: | ||
2717 | case CX88_BOARD_POWERCOLOR_REAL_ANGEL: | 2768 | case CX88_BOARD_POWERCOLOR_REAL_ANGEL: |
2718 | case CX88_BOARD_GENIATECH_X8000_MT: | 2769 | case CX88_BOARD_GENIATECH_X8000_MT: |
2719 | case CX88_BOARD_KWORLD_ATSC_120: | 2770 | case CX88_BOARD_KWORLD_ATSC_120: |
@@ -2725,6 +2776,7 @@ static int cx88_xc2028_tuner_callback(struct cx88_core *core, | |||
2725 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: | 2776 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: |
2726 | case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: | 2777 | case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: |
2727 | return cx88_dvico_xc2028_callback(core, command, arg); | 2778 | return cx88_dvico_xc2028_callback(core, command, arg); |
2779 | case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL: | ||
2728 | case CX88_BOARD_WINFAST_DTV1800H: | 2780 | case CX88_BOARD_WINFAST_DTV1800H: |
2729 | return cx88_xc3028_winfast1800h_callback(core, command, arg); | 2781 | return cx88_xc3028_winfast1800h_callback(core, command, arg); |
2730 | } | 2782 | } |
@@ -2914,6 +2966,7 @@ static void cx88_card_setup_pre_i2c(struct cx88_core *core) | |||
2914 | udelay(1000); | 2966 | udelay(1000); |
2915 | break; | 2967 | break; |
2916 | 2968 | ||
2969 | case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL: | ||
2917 | case CX88_BOARD_WINFAST_DTV1800H: | 2970 | case CX88_BOARD_WINFAST_DTV1800H: |
2918 | /* GPIO 12 (xc3028 tuner reset) */ | 2971 | /* GPIO 12 (xc3028 tuner reset) */ |
2919 | cx_set(MO_GP1_IO, 0x1010); | 2972 | cx_set(MO_GP1_IO, 0x1010); |
@@ -2950,6 +3003,7 @@ void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl) | |||
2950 | case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: | 3003 | case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: |
2951 | ctl->demod = XC3028_FE_OREN538; | 3004 | ctl->demod = XC3028_FE_OREN538; |
2952 | break; | 3005 | break; |
3006 | case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL: | ||
2953 | case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME: | 3007 | case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME: |
2954 | case CX88_BOARD_PROLINK_PV_8000GT: | 3008 | case CX88_BOARD_PROLINK_PV_8000GT: |
2955 | /* | 3009 | /* |
@@ -2993,6 +3047,8 @@ static void cx88_card_setup(struct cx88_core *core) | |||
2993 | if (0 == core->i2c_rc) | 3047 | if (0 == core->i2c_rc) |
2994 | gdi_eeprom(core, eeprom); | 3048 | gdi_eeprom(core, eeprom); |
2995 | break; | 3049 | break; |
3050 | case CX88_BOARD_LEADTEK_PVR2000: | ||
3051 | case CX88_BOARD_WINFAST_DV2000: | ||
2996 | case CX88_BOARD_WINFAST2000XP_EXPERT: | 3052 | case CX88_BOARD_WINFAST2000XP_EXPERT: |
2997 | if (0 == core->i2c_rc) | 3053 | if (0 == core->i2c_rc) |
2998 | leadtek_eeprom(core, eeprom); | 3054 | leadtek_eeprom(core, eeprom); |