Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -6,8 +6,8 @@
  5 -> Leadtek Winfast 2000XP Expert                       [107d:6611,107d:6613]
  6 -> AverTV Studio 303 (M126)                            [1461:000b]
  7 -> MSI TV-@nywhere Master                              [1462:8606]
  8 -> Leadtek Winfast DV2000                              [107d:6620]
  9 -> Leadtek PVR 2000                                    [107d:663b,107d:663c,107d:6632]
  8 -> Leadtek Winfast DV2000                              [107d:6620,107d:6621]
  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]
 11 -> Prolink PlayTV PVR
 12 -> ASUS PVR-416                                        [1043:4823,1461:c111]
@@ -59,7 +59,7 @@
 58 -> Pinnacle PCTV HD 800i                               [11bd:0051]
 59 -> DViCO FusionHDTV 5 PCI nano                         [18ac:d530]
 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]
 63 -> Geniatech X8000-MT DVBT                             [14f1:8852]
 64 -> DViCO FusionHDTV DVB-T PRO                          [18ac:db30]
+75 −19
Original line number Diff line number Diff line
@@ -1524,33 +1524,45 @@ static const struct cx88_board cx88_boards[] = {
		},
		.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] = {
		.name           = "Winfast TV2000 XP Global",
		.name           = "Leadtek TV2000 XP Global",
		.tuner_type     = TUNER_XC2028,
		.tuner_addr     = 0x61,
		.radio_type     = TUNER_XC2028,
		.radio_addr     = 0x61,
		.input          = { {
			.type   = CX88_VMUX_TELEVISION,
			.vmux   = 0,
			.gpio0  = 0x0400, /* pin 2:mute = 0 (off?) */
			.gpio0  = 0x0400,       /* pin 2 = 0 */
			.gpio1  = 0x0000,
			.gpio2  = 0x0800, /* pin 19:audio = 0 (tv) */

			.gpio2  = 0x0C04,       /* pin 18 = 1, pin 19 = 0 */
			.gpio3  = 0x0000,
		}, {
			.type   = CX88_VMUX_COMPOSITE1,
			.vmux   = 1,
			.gpio0  = 0x0400, /* probably?  or 0x0404 to turn mute on */
			.gpio0  = 0x0400,       /* pin 2 = 0 */
			.gpio1  = 0x0000,
			.gpio2  = 0x0808, /* pin 19:audio = 1 (line) */

			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
			.gpio3  = 0x0000,
		}, {
			.type   = CX88_VMUX_SVIDEO,
			.vmux   = 2,
			.gpio0  = 0x0400,       /* pin 2 = 0 */
			.gpio1  = 0x0000,
			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
			.gpio3  = 0x0000,
		} },
		.radio = {
			.type   = CX88_RADIO,
			.gpio0  = 0x004ff,
			.gpio1  = 0x010ff,
			.gpio2  = 0x0ff,
			.gpio0  = 0x0400,        /* pin 2 = 0 */
			.gpio1  = 0x0000,
			.gpio2  = 0x0C00,       /* pin 18 = 0, pin 19 = 0 */
			.gpio3  = 0x0000,
		},
	},
	[CX88_BOARD_POWERCOLOR_REAL_ANGEL] = {
@@ -2438,6 +2450,41 @@ static const struct cx88_subid cx88_subids[] = {
		.subvendor = 0x107d,
		.subdevice = 0x6654,
		.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[] = {

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 ||
	    eeprom_data[5] != 0x10 ||
	    eeprom_data[7] != 0x66) {
@@ -2459,8 +2500,19 @@ static void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data)
		return;
	}

	core->board.tuner_type = (eeprom_data[6] == 0x13) ?
		TUNER_PHILIPS_FM1236_MK3 : TUNER_PHILIPS_FM1216ME_MK3;
	/* Terry Wu <terrywu2009@gmail.com> */
	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: "
		    "tuner=%d, eeprom[0]=0x%02x\n",
@@ -2713,7 +2765,6 @@ static int cx88_xc2028_tuner_callback(struct cx88_core *core,
{
	/* Board-specific callbacks */
	switch (core->boardnr) {
	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
	case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
	case CX88_BOARD_GENIATECH_X8000_MT:
	case CX88_BOARD_KWORLD_ATSC_120:
@@ -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_5_PCI_NANO:
		return cx88_dvico_xc2028_callback(core, command, arg);
	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
	case CX88_BOARD_WINFAST_DTV1800H:
		return cx88_xc3028_winfast1800h_callback(core, command, arg);
	}
@@ -2914,6 +2966,7 @@ static void cx88_card_setup_pre_i2c(struct cx88_core *core)
		udelay(1000);
		break;

	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
	case CX88_BOARD_WINFAST_DTV1800H:
		/* GPIO 12 (xc3028 tuner reset) */
		cx_set(MO_GP1_IO, 0x1010);
@@ -2950,6 +3003,7 @@ void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl)
	case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
		ctl->demod = XC3028_FE_OREN538;
		break;
	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
	case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
	case CX88_BOARD_PROLINK_PV_8000GT:
		/*
@@ -2993,6 +3047,8 @@ static void cx88_card_setup(struct cx88_core *core)
		if (0 == core->i2c_rc)
			gdi_eeprom(core, eeprom);
		break;
	case CX88_BOARD_LEADTEK_PVR2000:
	case CX88_BOARD_WINFAST_DV2000:
	case CX88_BOARD_WINFAST2000XP_EXPERT:
		if (0 == core->i2c_rc)
			leadtek_eeprom(core, eeprom);