aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/cx88
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2009-06-16 22:55:44 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-06-23 02:10:05 -0400
commit14422f9dd8515bfbe6fdbde37eadf59e2980f104 (patch)
tree1590b5ac41fd4aab91317632d6cb41cd7402e7d8 /drivers/media/video/cx88
parentd888a4c76c51092993643f8992bf55b3c28da483 (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.c94
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 94b7a52629d..a5cc1c1fc2d 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
2447static void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data) 2494static 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);