Commit 14422f9d authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

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: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent d888a4c7
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
5 -> Leadtek Winfast 2000XP Expert [107d:6611,107d:6613] 5 -> Leadtek Winfast 2000XP Expert [107d:6611,107d:6613]
6 -> AverTV Studio 303 (M126) [1461:000b] 6 -> AverTV Studio 303 (M126) [1461:000b]
7 -> MSI TV-@nywhere Master [1462:8606] 7 -> MSI TV-@nywhere Master [1462:8606]
8 -> Leadtek Winfast DV2000 [107d:6620] 8 -> Leadtek Winfast DV2000 [107d:6620,107d:6621]
9 -> Leadtek PVR 2000 [107d:663b,107d:663c,107d:6632] 9 -> Leadtek PVR 2000 [107d:663b,107d:663c,107d:6632,107d:6630,107d:6638,107d:6631,107d:6637,107d:663d]
10 -> IODATA GV-VCP3/PCI [10fc:d003] 10 -> IODATA GV-VCP3/PCI [10fc:d003]
11 -> Prolink PlayTV PVR 11 -> Prolink PlayTV PVR
12 -> ASUS PVR-416 [1043:4823,1461:c111] 12 -> ASUS PVR-416 [1043:4823,1461:c111]
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
58 -> Pinnacle PCTV HD 800i [11bd:0051] 58 -> Pinnacle PCTV HD 800i [11bd:0051]
59 -> DViCO FusionHDTV 5 PCI nano [18ac:d530] 59 -> DViCO FusionHDTV 5 PCI nano [18ac:d530]
60 -> Pinnacle Hybrid PCTV [12ab:1788] 60 -> Pinnacle Hybrid PCTV [12ab:1788]
61 -> Winfast TV2000 XP Global [107d:6f18] 61 -> Leadtek TV2000 XP Global [107d:6f18,107d:6618]
62 -> PowerColor RA330 [14f1:ea3d] 62 -> PowerColor RA330 [14f1:ea3d]
63 -> Geniatech X8000-MT DVBT [14f1:8852] 63 -> Geniatech X8000-MT DVBT [14f1:8852]
64 -> DViCO FusionHDTV DVB-T PRO [18ac:db30] 64 -> DViCO FusionHDTV DVB-T PRO [18ac:db30]
......
...@@ -1524,33 +1524,45 @@ static const struct cx88_board cx88_boards[] = { ...@@ -1524,33 +1524,45 @@ static const struct cx88_board cx88_boards[] = {
}, },
.mpeg = CX88_MPEG_DVB, .mpeg = CX88_MPEG_DVB,
}, },
/* Terry Wu <terrywu2009@gmail.com> */
/* TV Audio : set GPIO 2, 18, 19 value to 0, 1, 0 */
/* FM Audio : set GPIO 2, 18, 19 value to 0, 0, 0 */
/* Line-in Audio : set GPIO 2, 18, 19 value to 0, 1, 1 */
/* Mute Audio : set GPIO 2 value to 1 */
[CX88_BOARD_WINFAST_TV2000_XP_GLOBAL] = { [CX88_BOARD_WINFAST_TV2000_XP_GLOBAL] = {
.name = "Winfast TV2000 XP Global", .name = "Leadtek TV2000 XP Global",
.tuner_type = TUNER_XC2028, .tuner_type = TUNER_XC2028,
.tuner_addr = 0x61, .tuner_addr = 0x61,
.radio_type = TUNER_XC2028,
.radio_addr = 0x61,
.input = { { .input = { {
.type = CX88_VMUX_TELEVISION, .type = CX88_VMUX_TELEVISION,
.vmux = 0, .vmux = 0,
.gpio0 = 0x0400, /* pin 2:mute = 0 (off?) */ .gpio0 = 0x0400, /* pin 2 = 0 */
.gpio1 = 0x0000, .gpio1 = 0x0000,
.gpio2 = 0x0800, /* pin 19:audio = 0 (tv) */ .gpio2 = 0x0C04, /* pin 18 = 1, pin 19 = 0 */
.gpio3 = 0x0000,
}, { }, {
.type = CX88_VMUX_COMPOSITE1, .type = CX88_VMUX_COMPOSITE1,
.vmux = 1, .vmux = 1,
.gpio0 = 0x0400, /* probably? or 0x0404 to turn mute on */ .gpio0 = 0x0400, /* pin 2 = 0 */
.gpio1 = 0x0000, .gpio1 = 0x0000,
.gpio2 = 0x0808, /* pin 19:audio = 1 (line) */ .gpio2 = 0x0C0C, /* pin 18 = 1, pin 19 = 1 */
.gpio3 = 0x0000,
}, { }, {
.type = CX88_VMUX_SVIDEO, .type = CX88_VMUX_SVIDEO,
.vmux = 2, .vmux = 2,
.gpio0 = 0x0400, /* pin 2 = 0 */
.gpio1 = 0x0000,
.gpio2 = 0x0C0C, /* pin 18 = 1, pin 19 = 1 */
.gpio3 = 0x0000,
} }, } },
.radio = { .radio = {
.type = CX88_RADIO, .type = CX88_RADIO,
.gpio0 = 0x004ff, .gpio0 = 0x0400, /* pin 2 = 0 */
.gpio1 = 0x010ff, .gpio1 = 0x0000,
.gpio2 = 0x0ff, .gpio2 = 0x0C00, /* pin 18 = 0, pin 19 = 0 */
.gpio3 = 0x0000,
}, },
}, },
[CX88_BOARD_POWERCOLOR_REAL_ANGEL] = { [CX88_BOARD_POWERCOLOR_REAL_ANGEL] = {
...@@ -2438,6 +2450,41 @@ static const struct cx88_subid cx88_subids[] = { ...@@ -2438,6 +2450,41 @@ static const struct cx88_subid cx88_subids[] = {
.subvendor = 0x107d, .subvendor = 0x107d,
.subdevice = 0x6654, .subdevice = 0x6654,
.card = CX88_BOARD_WINFAST_DTV1800H, .card = CX88_BOARD_WINFAST_DTV1800H,
}, {
/* PVR2000 PAL Model [107d:6630] */
.subvendor = 0x107d,
.subdevice = 0x6630,
.card = CX88_BOARD_LEADTEK_PVR2000,
}, {
/* PVR2000 PAL Model [107d:6638] */
.subvendor = 0x107d,
.subdevice = 0x6638,
.card = CX88_BOARD_LEADTEK_PVR2000,
}, {
/* PVR2000 NTSC Model [107d:6631] */
.subvendor = 0x107d,
.subdevice = 0x6631,
.card = CX88_BOARD_LEADTEK_PVR2000,
}, {
/* PVR2000 NTSC Model [107d:6637] */
.subvendor = 0x107d,
.subdevice = 0x6637,
.card = CX88_BOARD_LEADTEK_PVR2000,
}, {
/* PVR2000 NTSC Model [107d:663d] */
.subvendor = 0x107d,
.subdevice = 0x663d,
.card = CX88_BOARD_LEADTEK_PVR2000,
}, {
/* DV2000 NTSC Model [107d:6621] */
.subvendor = 0x107d,
.subdevice = 0x6621,
.card = CX88_BOARD_WINFAST_DV2000,
}, {
/* TV2000 XP Global [107d:6618] */
.subvendor = 0x107d,
.subdevice = 0x6618,
.card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
}, },
}; };
...@@ -2446,12 +2493,6 @@ static const struct cx88_subid cx88_subids[] = { ...@@ -2446,12 +2493,6 @@ static const struct cx88_subid cx88_subids[] = {
static void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data) static void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data)
{ {
/* This is just for the "Winfast 2000XP Expert" board ATM; I don't have data on
* any others.
*
* Byte 0 is 1 on the NTSC board.
*/
if (eeprom_data[4] != 0x7d || if (eeprom_data[4] != 0x7d ||
eeprom_data[5] != 0x10 || eeprom_data[5] != 0x10 ||
eeprom_data[7] != 0x66) { eeprom_data[7] != 0x66) {
...@@ -2459,8 +2500,19 @@ static void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data) ...@@ -2459,8 +2500,19 @@ static void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data)
return; return;
} }
core->board.tuner_type = (eeprom_data[6] == 0x13) ? /* Terry Wu <terrywu2009@gmail.com> */
TUNER_PHILIPS_FM1236_MK3 : TUNER_PHILIPS_FM1216ME_MK3; switch (eeprom_data[6]) {
case 0x13: /* SSID 6613 for TV2000 XP Expert NTSC Model */
case 0x21: /* SSID 6621 for DV2000 NTSC Model */
case 0x31: /* SSID 6631 for PVR2000 NTSC Model */
case 0x37: /* SSID 6637 for PVR2000 NTSC Model */
case 0x3d: /* SSID 6637 for PVR2000 NTSC Model */
core->board.tuner_type = TUNER_PHILIPS_FM1236_MK3;
break;
default:
core->board.tuner_type = TUNER_PHILIPS_FM1216ME_MK3;
break;
}
info_printk(core, "Leadtek Winfast 2000XP Expert config: " info_printk(core, "Leadtek Winfast 2000XP Expert config: "
"tuner=%d, eeprom[0]=0x%02x\n", "tuner=%d, eeprom[0]=0x%02x\n",
...@@ -2713,7 +2765,6 @@ static int cx88_xc2028_tuner_callback(struct cx88_core *core, ...@@ -2713,7 +2765,6 @@ static int cx88_xc2028_tuner_callback(struct cx88_core *core,
{ {
/* Board-specific callbacks */ /* Board-specific callbacks */
switch (core->boardnr) { switch (core->boardnr) {
case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
case CX88_BOARD_POWERCOLOR_REAL_ANGEL: case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
case CX88_BOARD_GENIATECH_X8000_MT: case CX88_BOARD_GENIATECH_X8000_MT:
case CX88_BOARD_KWORLD_ATSC_120: case CX88_BOARD_KWORLD_ATSC_120:
...@@ -2725,6 +2776,7 @@ static int cx88_xc2028_tuner_callback(struct cx88_core *core, ...@@ -2725,6 +2776,7 @@ static int cx88_xc2028_tuner_callback(struct cx88_core *core,
case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
return cx88_dvico_xc2028_callback(core, command, arg); return cx88_dvico_xc2028_callback(core, command, arg);
case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
case CX88_BOARD_WINFAST_DTV1800H: case CX88_BOARD_WINFAST_DTV1800H:
return cx88_xc3028_winfast1800h_callback(core, command, arg); return cx88_xc3028_winfast1800h_callback(core, command, arg);
} }
...@@ -2914,6 +2966,7 @@ static void cx88_card_setup_pre_i2c(struct cx88_core *core) ...@@ -2914,6 +2966,7 @@ static void cx88_card_setup_pre_i2c(struct cx88_core *core)
udelay(1000); udelay(1000);
break; break;
case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
case CX88_BOARD_WINFAST_DTV1800H: case CX88_BOARD_WINFAST_DTV1800H:
/* GPIO 12 (xc3028 tuner reset) */ /* GPIO 12 (xc3028 tuner reset) */
cx_set(MO_GP1_IO, 0x1010); cx_set(MO_GP1_IO, 0x1010);
...@@ -2950,6 +3003,7 @@ void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl) ...@@ -2950,6 +3003,7 @@ void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl)
case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
ctl->demod = XC3028_FE_OREN538; ctl->demod = XC3028_FE_OREN538;
break; break;
case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME: case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
case CX88_BOARD_PROLINK_PV_8000GT: case CX88_BOARD_PROLINK_PV_8000GT:
/* /*
...@@ -2993,6 +3047,8 @@ static void cx88_card_setup(struct cx88_core *core) ...@@ -2993,6 +3047,8 @@ static void cx88_card_setup(struct cx88_core *core)
if (0 == core->i2c_rc) if (0 == core->i2c_rc)
gdi_eeprom(core, eeprom); gdi_eeprom(core, eeprom);
break; break;
case CX88_BOARD_LEADTEK_PVR2000:
case CX88_BOARD_WINFAST_DV2000:
case CX88_BOARD_WINFAST2000XP_EXPERT: case CX88_BOARD_WINFAST2000XP_EXPERT:
if (0 == core->i2c_rc) if (0 == core->i2c_rc)
leadtek_eeprom(core, eeprom); leadtek_eeprom(core, eeprom);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment