Skip to contentSkip to conversation

Leadtek WinFast DTV-1800H support

linux-dvb sustmi 2 participants 4 messages Oct 19, 2008 – Oct 22, 2008 8 messages not in the archive Media (V4L/DVB)

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

A message that is not in the archive (sent off-list or not yet received): [email protected]

A message that is not in the archive (sent off-list or not yet received): [email protected]

A message that is not in the archive (sent off-list or not yet received): [email protected]

A message that is not in the archive (sent off-list or not yet received): [email protected]

A message that is not in the archive (sent off-list or not yet received): [email protected]

A message that is not in the archive (sent off-list or not yet received): [email protected]

A message that is not in the archive (sent off-list or not yet received): [email protected]

sustmi

author
#8 lore raw

Hi,

I was working on support for Leadtek WinFast DTV-1800H. First I made it work with Markus Rechberger's v4l repository (there was better XC3028-tunner code).

Few weeks ago Markus Rechberger announced that he is no going to support non-ex28xx cards anymore and that I have to focus on the linuxtv linux-dvb repository.

So I (cooperating with Paul Chubb) made a patch against linuxtv linux-dvb. (attached file: leadtek_winfast_dtv1800h.patch)

It enables support for DVB-T, analogue TV, radio and IR remote control.

I have tried to use existing parts of code as much as possible. The creation of 'cx88_xc3028_winfast1800h_callback' function was necessary. Function 'cx88_xc3028_geniatech_tuner_callback' is similar, but the extra GPIO code makes IR remote control not work.

It will be great if patch is merged into the repository.

There is one question I want to ask you in terms of this message:
http://www.linuxtv.org/pipermail/linux-dvb/2008-August/028117.html
Why is using of cx_write() risky?

Thank you for your reply.

- Miroslav Šustek

linux/drivers/media/video/cx88/cx88-cards.c +74 -0
diff -r e2a8b9b9c294 linux/drivers/media/video/cx88/cx88-cards.c
@@ -1904,6 +1904,47 @@
 		} },
 		.mpeg           = CX88_MPEG_DVB,
 	},
+	[CX88_BOARD_WINFAST_DTV1800H] = {
+		.name           = "Leadtek WinFast DTV1800 Hybrid",
+		.tuner_type     = TUNER_XC2028,
+		.radio_type     = TUNER_XC2028,
+		.tuner_addr     = 0x61,
+		.radio_addr     = 0x61,
+		/*
+		 * GPIO setting
+		 *
+		 *  2: mute (0=off,1=on)
+		 * 12: tuner reset pin
+		 * 13: audio source (0=tuner audio,1=line in)
+		 * 14: FM (0=on,1=off ???)
+		 */
+		.input          = {{
+			.type   = CX88_VMUX_TELEVISION,
+			.vmux   = 0,
+			.gpio0  = 0x0400,       //pin 2 = 0
+			.gpio1  = 0x6040,       //pin 13 = 0, pin 14 = 1
+			.gpio2  = 0x0000,
+		},{
+			.type   = CX88_VMUX_COMPOSITE1,
+			.vmux   = 1,
+			.gpio0  = 0x0400,       //pin 2 = 0
+			.gpio1  = 0x6060,       //pin 13 = 1, pin 14 = 1
+			.gpio2  = 0x0000,
+		},{
+			.type   = CX88_VMUX_SVIDEO,
+			.vmux   = 2,
+			.gpio0  = 0x0400,       //pin 2 = 0
+			.gpio1  = 0x6060,       //pin 13 = 1, pin 14 = 1
+			.gpio2  = 0x0000,
+		}},
+		.radio = {
+			.type   = CX88_RADIO,
+			.gpio0  = 0x0400,       //pin 2 = 0
+			.gpio1  = 0x6000,       //pin 13 = 0, pin 14 = 0
+			.gpio2  = 0x0000,
+		},
+		.mpeg           = CX88_MPEG_DVB,
+	},
 };
 
 /* ------------------------------------------------------------------ */
@@ -2297,6 +2338,10 @@
 		.subvendor = 0xB033,
 		.subdevice = 0x3033,
 		.card      = CX88_BOARD_PROF_7300,
+	}, {
+		.subvendor = 0x107d,
+		.subdevice = 0x6654,
+		.card      = CX88_BOARD_WINFAST_DTV1800H,
 	},
 };
 
@@ -2494,6 +2539,23 @@
 	return -EINVAL;
 }
 
+static int cx88_xc3028_winfast1800h_callback(struct cx88_core *core,
+					     int command, int arg)
+{
+	switch (command) {
+	case XC2028_TUNER_RESET:
+		// GPIO 12 = xc3028 tuner reset
+		cx_set(MO_GP1_IO, 0x1010);  //gpio 12 = 1: powerup XC3028
+		mdelay(50);
+		cx_clear(MO_GP1_IO, 0x10);  //gpio 12 = 0: powerdown XC3028
+		mdelay(50);
+		cx_set(MO_GP1_IO, 0x10);  //gpio 12 = 1: powerup XC3028
+		mdelay(50);
+		return 0;
+	}
+	return -EINVAL;
+}
+
 /* ------------------------------------------------------------------- */
 /* some Divco specific stuff                                           */
 static int cx88_pv_8000gt_callback(struct cx88_core *core,
@@ -2566,6 +2628,8 @@
 	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_DTV1800H:
+		return cx88_xc3028_winfast1800h_callback(core, command, arg);
 	}
 
 	switch (command) {
@@ -2740,6 +2804,15 @@
 		cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */
 		udelay(1000);
 		break;
+
+	case CX88_BOARD_WINFAST_DTV1800H:
+		cx_set(MO_GP1_IO, 0x1010);  //gpio 12 = 1: powerup XC3028
+		mdelay(50);
+		cx_clear(MO_GP1_IO, 0x10);  //gpio 12 = 0: powerdown XC3028
+		mdelay(50);
+		cx_set(MO_GP1_IO, 0x10);  //gpio 12 = 1: powerup XC3028
+		mdelay(50);
+		break;
 	}
 }
 
@@ -2760,6 +2833,7 @@
 			core->i2c_algo.udelay = 16;
 		break;
 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
+	case CX88_BOARD_WINFAST_DTV1800H:
 		ctl->demod = XC3028_FE_ZARLINK456;
 		break;
 	case CX88_BOARD_KWORLD_ATSC_120:
linux/drivers/media/video/cx88/cx88-dvb.c +1 -0
diff -r e2a8b9b9c294 linux/drivers/media/video/cx88/cx88-dvb.c
@@ -963,6 +963,7 @@
 		}
 		break;
 	 case CX88_BOARD_PINNACLE_HYBRID_PCTV:
+	case CX88_BOARD_WINFAST_DTV1800H:
 		fe0->dvb.frontend = dvb_attach(zl10353_attach,
 					       &cx88_pinnacle_hybrid_pctv,
 					       &core->i2c_adap);
linux/drivers/media/video/cx88/cx88-input.c +2 -0
diff -r e2a8b9b9c294 linux/drivers/media/video/cx88/cx88-input.c
@@ -93,6 +93,7 @@
 		gpio=(gpio & 0x7fd) + (auxgpio & 0xef);
 		break;
 	case CX88_BOARD_WINFAST_DTV1000:
+	case CX88_BOARD_WINFAST_DTV1800H:
 		gpio = (gpio & 0x6ff) | ((cx_read(MO_GP1_IO) << 8) & 0x900);
 		auxgpio = gpio;
 		break;
@@ -244,6 +245,7 @@
 		ir->sampling = 1;
 		break;
 	case CX88_BOARD_WINFAST_DTV2000H:
+	case CX88_BOARD_WINFAST_DTV1800H:
 		ir_codes = ir_codes_winfast;
 		ir->gpio_addr = MO_GP0_IO;
 		ir->mask_keycode = 0x8f8;
linux/drivers/media/video/cx88/cx88.h +1 -0
diff -r e2a8b9b9c294 linux/drivers/media/video/cx88/cx88.h
@@ -230,6 +230,7 @@
 #define CX88_BOARD_TEVII_S420              73
 #define CX88_BOARD_PROLINK_PV_GLOBAL_XTREME 74
 #define CX88_BOARD_PROF_7300               75
+#define CX88_BOARD_WINFAST_DTV1800H        76
 
 enum cx88_itype {
 	CX88_VMUX_COMPOSITE1 = 1,

_______________________________________________
linux-dvb mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

#9 lore raw
Quoted 20 lines · sustmi

Hi,

I was working on support for Leadtek WinFast DTV-1800H. First I made it work with Markus Rechberger's v4l repository (there was better XC3028-tunner code).

Few weeks ago Markus Rechberger announced that he is no going to support non-ex28xx cards anymore and that I have to focus on the linuxtv linux-dvb repository.

So I (cooperating with Paul Chubb) made a patch against linuxtv linux-dvb. (attached file: leadtek_winfast_dtv1800h.patch)

It enables support for DVB-T, analogue TV, radio and IR remote control.

I have tried to use existing parts of code as much as possible. The creation of 'cx88_xc3028_winfast1800h_callback' function was necessary. Function 'cx88_xc3028_geniatech_tuner_callback' is similar, but the extra GPIO code makes IR remote control not work.

Quoted 5 lines

It will be great if patch is merged into the repository.

There is one question I want to ask you in terms of this message:
http://www.linuxtv.org/pipermail/linux-dvb/2008-August/028117.html
Why is using of cx_write() risky?

From my orig email: "Don't call cx_write() inside the gpio card setup,
you're potentially destroying the other bits, it's risky."

cx_write destroys the content of the GPIO direction-enablement and values bits. That's a bad thing, and can lead to unexpected behaviors if used generally in drivers.

It's better to have a driver read the previous register value, and/or in the appropriate bit and write the value back to the gpio registers. This is what cx_set/clear do. That way parts of the driver can toggle GPIO's for important pieces, without having to understand GPIO usage in other disconnected/unrelated parts of the driver.

Your patch uses set/clear, which is good.

Incidently, you patch cannot be merged as-is, it has C99 style comments '//' are not allowed, change to /* */ etc.

- Steve

_______________________________________________
linux-dvb mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

#10 lore raw
Quoted 2 lines
Quoted 1 line · sustmi

Hi,

...

Quoted 5 lines
Quoted 2 lines

http://www.linuxtv.org/pipermail/linux-dvb/2008-August/028117.html
Why is using of cx_write() risky?

From my orig email: "Don't call cx_write() inside the gpio card setup, you're potentially destroying the other bits, it's risky."

Quoted 8 lines

cx_write destroys the content of the GPIO direction-enablement and values bits. That's a bad thing, and can lead to unexpected behaviors if used generally in drivers.

It's better to have a driver read the previous register value, and/or in the appropriate bit and write the value back to the gpio registers. This is what cx_set/clear do. That way parts of the driver can toggle GPIO's for important pieces, without having to understand GPIO usage in other disconnected/unrelated parts of the driver.

Your patch uses set/clear, which is good.

From datasheet (www.domenech.org/datasheets/cx23880-cx23881-cx23882-cx23883-datasheet-08-2002.pdf),

Chapter 2.3.3:
GP{x}_IO register:
bits [23:16] = GP{x}_BWE

"If this field is equal to 8’h00, then the whole GPIO byte register operates in normal RW mode. If any bit is set, then the corresponding GP_OE and GP_IO bit locations are enabled for writing. If the bit write enable is not set, the corresponding GPIO bits will be unaffected."

So I think this is just like (this is) mask. I don't see any possibility of unexpected behavior. You only have to know which bits you want change (=how to set the mask)...
Ok, persuaded me, using cx_set and cx_clear is prettier :) .

Quoted 4 lines

Incidently, you patch cannot be merged as-is, it has C99 style comments '//' are not allowed, change to /* */ etc.

- Steve

Of course, new patch is attached.

linux/drivers/media/video/cx88/cx88-cards.c +75 -0
diff -r e2a8b9b9c294 linux/drivers/media/video/cx88/cx88-cards.c
@@ -1904,6 +1904,47 @@
 		} },
 		.mpeg           = CX88_MPEG_DVB,
 	},
+	[CX88_BOARD_WINFAST_DTV1800H] = {
+		.name           = "Leadtek WinFast DTV1800 Hybrid",
+		.tuner_type     = TUNER_XC2028,
+		.radio_type     = TUNER_XC2028,
+		.tuner_addr     = 0x61,
+		.radio_addr     = 0x61,
+		/*
+		 * GPIO setting
+		 *
+		 *  2: mute (0=off,1=on)
+		 * 12: tuner reset pin
+		 * 13: audio source (0=tuner audio,1=line in)
+		 * 14: FM (0=on,1=off ???)
+		 */
+		.input          = {{
+			.type   = CX88_VMUX_TELEVISION,
+			.vmux   = 0,
+			.gpio0  = 0x0400,       /* pin 2 = 0 */
+			.gpio1  = 0x6040,       /* pin 13 = 0, pin 14 = 1 */
+			.gpio2  = 0x0000,
+		},{
+			.type   = CX88_VMUX_COMPOSITE1,
+			.vmux   = 1,
+			.gpio0  = 0x0400,       /* pin 2 = 0 */
+			.gpio1  = 0x6060,       /* pin 13 = 1, pin 14 = 1 */
+			.gpio2  = 0x0000,
+		},{
+			.type   = CX88_VMUX_SVIDEO,
+			.vmux   = 2,
+			.gpio0  = 0x0400,       /* pin 2 = 0 */
+			.gpio1  = 0x6060,       /* pin 13 = 1, pin 14 = 1 */
+			.gpio2  = 0x0000,
+		}},
+		.radio = {
+			.type   = CX88_RADIO,
+			.gpio0  = 0x0400,       /* pin 2 = 0 */
+			.gpio1  = 0x6000,       /* pin 13 = 0, pin 14 = 0 */
+			.gpio2  = 0x0000,
+		},
+		.mpeg           = CX88_MPEG_DVB,
+	},
 };
 
 /* ------------------------------------------------------------------ */
@@ -2297,6 +2338,10 @@
 		.subvendor = 0xB033,
 		.subdevice = 0x3033,
 		.card      = CX88_BOARD_PROF_7300,
+	}, {
+		.subvendor = 0x107d,
+		.subdevice = 0x6654,
+		.card      = CX88_BOARD_WINFAST_DTV1800H,
 	},
 };
 
@@ -2494,6 +2539,23 @@
 	return -EINVAL;
 }
 
+static int cx88_xc3028_winfast1800h_callback(struct cx88_core *core,
+					     int command, int arg)
+{
+	switch (command) {
+	case XC2028_TUNER_RESET:
+		/* GPIO 12 (xc3028 tuner reset) */
+		cx_set(MO_GP1_IO, 0x1010);
+		mdelay(50);
+		cx_clear(MO_GP1_IO, 0x10);
+		mdelay(50);
+		cx_set(MO_GP1_IO, 0x10);
+		mdelay(50);
+		return 0;
+	}
+	return -EINVAL;
+}
+
 /* ------------------------------------------------------------------- */
 /* some Divco specific stuff                                           */
 static int cx88_pv_8000gt_callback(struct cx88_core *core,
@@ -2566,6 +2628,8 @@
 	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_DTV1800H:
+		return cx88_xc3028_winfast1800h_callback(core, command, arg);
 	}
 
 	switch (command) {
@@ -2740,6 +2804,16 @@
 		cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */
 		udelay(1000);
 		break;
+
+	case CX88_BOARD_WINFAST_DTV1800H:
+		/* GPIO 12 (xc3028 tuner reset) */
+		cx_set(MO_GP1_IO, 0x1010);
+		mdelay(50);
+		cx_clear(MO_GP1_IO, 0x10);
+		mdelay(50);
+		cx_set(MO_GP1_IO, 0x10);
+		mdelay(50);
+		break;
 	}
 }
 
@@ -2760,6 +2834,7 @@
 			core->i2c_algo.udelay = 16;
 		break;
 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
+	case CX88_BOARD_WINFAST_DTV1800H:
 		ctl->demod = XC3028_FE_ZARLINK456;
 		break;
 	case CX88_BOARD_KWORLD_ATSC_120:
linux/drivers/media/video/cx88/cx88-dvb.c +1 -0
diff -r e2a8b9b9c294 linux/drivers/media/video/cx88/cx88-dvb.c
@@ -963,6 +963,7 @@
 		}
 		break;
 	 case CX88_BOARD_PINNACLE_HYBRID_PCTV:
+	case CX88_BOARD_WINFAST_DTV1800H:
 		fe0->dvb.frontend = dvb_attach(zl10353_attach,
 					       &cx88_pinnacle_hybrid_pctv,
 					       &core->i2c_adap);
linux/drivers/media/video/cx88/cx88-input.c +2 -0
diff -r e2a8b9b9c294 linux/drivers/media/video/cx88/cx88-input.c
@@ -93,6 +93,7 @@
 		gpio=(gpio & 0x7fd) + (auxgpio & 0xef);
 		break;
 	case CX88_BOARD_WINFAST_DTV1000:
+	case CX88_BOARD_WINFAST_DTV1800H:
 		gpio = (gpio & 0x6ff) | ((cx_read(MO_GP1_IO) << 8) & 0x900);
 		auxgpio = gpio;
 		break;
@@ -244,6 +245,7 @@
 		ir->sampling = 1;
 		break;
 	case CX88_BOARD_WINFAST_DTV2000H:
+	case CX88_BOARD_WINFAST_DTV1800H:
 		ir_codes = ir_codes_winfast;
 		ir->gpio_addr = MO_GP0_IO;
 		ir->mask_keycode = 0x8f8;
linux/drivers/media/video/cx88/cx88.h +1 -0
diff -r e2a8b9b9c294 linux/drivers/media/video/cx88/cx88.h
@@ -230,6 +230,7 @@
 #define CX88_BOARD_TEVII_S420              73
 #define CX88_BOARD_PROLINK_PV_GLOBAL_XTREME 74
 #define CX88_BOARD_PROF_7300               75
+#define CX88_BOARD_WINFAST_DTV1800H        76
 
 enum cx88_itype {
 	CX88_VMUX_COMPOSITE1 = 1,

_______________________________________________
linux-dvb mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

#11 lore raw
In reply to Steven Toth

*Sorry for double-post, but first one was cut off.*

Quoted 10 lines · Steven Toth

From my orig email: "Don't call cx_write() inside the gpio card setup, you're potentially destroying the other bits, it's risky."

cx_write destroys the content of the GPIO direction-enablement and values bits. That's a bad thing, and can lead to unexpected behaviors if used generally in drivers.

It's better to have a driver read the previous register value, and/or in the appropriate bit and write the value back to the gpio registers. This is what cx_set/clear do. That way parts of the driver can toggle GPIO's for important pieces, without having to understand GPIO usage in other disconnected/unrelated parts of the driver.

Your patch uses set/clear, which is good.

From datasheet (http://www.domenech.org/datasheets/cx23880-cx23881-cx23882-cx23883-datasheet-08-2002.pdf),

Chapter 2.3.3:
GP{x}_IO register:
bits [23:16] = GP{x}_BWE

"If this field is equal to 8’h00, then the whole GPIO byte register operates in normal RW mode. If any bit is set, then the corresponding GP_OE and GP_IO bit locations are enabled for writing. If the bit write enable is not set, the corresponding GPIO bits will be unaffected."

So I think this is just like (this is) mask. I don't see any possibility of unexpected behavior. You only have to know which bits you want change (=how to set the mask)...
Ok, persuaded me, using cx_set and cx_clear is prettier :) .

Quoted 1 line

Incidently, you patch cannot be merged as-is, it has C99 style comments '//' are not allowed, change to /* */ etc.

Of course, new patch is attached.

linux/drivers/media/video/cx88/cx88-cards.c +75 -0
diff -r e2a8b9b9c294 linux/drivers/media/video/cx88/cx88-cards.c
@@ -1904,6 +1904,47 @@
 		} },
 		.mpeg           = CX88_MPEG_DVB,
 	},
+	[CX88_BOARD_WINFAST_DTV1800H] = {
+		.name           = "Leadtek WinFast DTV1800 Hybrid",
+		.tuner_type     = TUNER_XC2028,
+		.radio_type     = TUNER_XC2028,
+		.tuner_addr     = 0x61,
+		.radio_addr     = 0x61,
+		/*
+		 * GPIO setting
+		 *
+		 *  2: mute (0=off,1=on)
+		 * 12: tuner reset pin
+		 * 13: audio source (0=tuner audio,1=line in)
+		 * 14: FM (0=on,1=off ???)
+		 */
+		.input          = {{
+			.type   = CX88_VMUX_TELEVISION,
+			.vmux   = 0,
+			.gpio0  = 0x0400,       /* pin 2 = 0 */
+			.gpio1  = 0x6040,       /* pin 13 = 0, pin 14 = 1 */
+			.gpio2  = 0x0000,
+		},{
+			.type   = CX88_VMUX_COMPOSITE1,
+			.vmux   = 1,
+			.gpio0  = 0x0400,       /* pin 2 = 0 */
+			.gpio1  = 0x6060,       /* pin 13 = 1, pin 14 = 1 */
+			.gpio2  = 0x0000,
+		},{
+			.type   = CX88_VMUX_SVIDEO,
+			.vmux   = 2,
+			.gpio0  = 0x0400,       /* pin 2 = 0 */
+			.gpio1  = 0x6060,       /* pin 13 = 1, pin 14 = 1 */
+			.gpio2  = 0x0000,
+		}},
+		.radio = {
+			.type   = CX88_RADIO,
+			.gpio0  = 0x0400,       /* pin 2 = 0 */
+			.gpio1  = 0x6000,       /* pin 13 = 0, pin 14 = 0 */
+			.gpio2  = 0x0000,
+		},
+		.mpeg           = CX88_MPEG_DVB,
+	},
 };
 
 /* ------------------------------------------------------------------ */
@@ -2297,6 +2338,10 @@
 		.subvendor = 0xB033,
 		.subdevice = 0x3033,
 		.card      = CX88_BOARD_PROF_7300,
+	}, {
+		.subvendor = 0x107d,
+		.subdevice = 0x6654,
+		.card      = CX88_BOARD_WINFAST_DTV1800H,
 	},
 };
 
@@ -2494,6 +2539,23 @@
 	return -EINVAL;
 }
 
+static int cx88_xc3028_winfast1800h_callback(struct cx88_core *core,
+					     int command, int arg)
+{
+	switch (command) {
+	case XC2028_TUNER_RESET:
+		/* GPIO 12 (xc3028 tuner reset) */
+		cx_set(MO_GP1_IO, 0x1010);
+		mdelay(50);
+		cx_clear(MO_GP1_IO, 0x10);
+		mdelay(50);
+		cx_set(MO_GP1_IO, 0x10);
+		mdelay(50);
+		return 0;
+	}
+	return -EINVAL;
+}
+
 /* ------------------------------------------------------------------- */
 /* some Divco specific stuff                                           */
 static int cx88_pv_8000gt_callback(struct cx88_core *core,
@@ -2566,6 +2628,8 @@
 	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_DTV1800H:
+		return cx88_xc3028_winfast1800h_callback(core, command, arg);
 	}
 
 	switch (command) {
@@ -2740,6 +2804,16 @@
 		cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */
 		udelay(1000);
 		break;
+
+	case CX88_BOARD_WINFAST_DTV1800H:
+		/* GPIO 12 (xc3028 tuner reset) */
+		cx_set(MO_GP1_IO, 0x1010);
+		mdelay(50);
+		cx_clear(MO_GP1_IO, 0x10);
+		mdelay(50);
+		cx_set(MO_GP1_IO, 0x10);
+		mdelay(50);
+		break;
 	}
 }
 
@@ -2760,6 +2834,7 @@
 			core->i2c_algo.udelay = 16;
 		break;
 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
+	case CX88_BOARD_WINFAST_DTV1800H:
 		ctl->demod = XC3028_FE_ZARLINK456;
 		break;
 	case CX88_BOARD_KWORLD_ATSC_120:
linux/drivers/media/video/cx88/cx88-dvb.c +1 -0
diff -r e2a8b9b9c294 linux/drivers/media/video/cx88/cx88-dvb.c
@@ -963,6 +963,7 @@
 		}
 		break;
 	 case CX88_BOARD_PINNACLE_HYBRID_PCTV:
+	case CX88_BOARD_WINFAST_DTV1800H:
 		fe0->dvb.frontend = dvb_attach(zl10353_attach,
 					       &cx88_pinnacle_hybrid_pctv,
 					       &core->i2c_adap);
linux/drivers/media/video/cx88/cx88-input.c +2 -0
diff -r e2a8b9b9c294 linux/drivers/media/video/cx88/cx88-input.c
@@ -93,6 +93,7 @@
 		gpio=(gpio & 0x7fd) + (auxgpio & 0xef);
 		break;
 	case CX88_BOARD_WINFAST_DTV1000:
+	case CX88_BOARD_WINFAST_DTV1800H:
 		gpio = (gpio & 0x6ff) | ((cx_read(MO_GP1_IO) << 8) & 0x900);
 		auxgpio = gpio;
 		break;
@@ -244,6 +245,7 @@
 		ir->sampling = 1;
 		break;
 	case CX88_BOARD_WINFAST_DTV2000H:
+	case CX88_BOARD_WINFAST_DTV1800H:
 		ir_codes = ir_codes_winfast;
 		ir->gpio_addr = MO_GP0_IO;
 		ir->mask_keycode = 0x8f8;
linux/drivers/media/video/cx88/cx88.h +1 -0
diff -r e2a8b9b9c294 linux/drivers/media/video/cx88/cx88.h
@@ -230,6 +230,7 @@
 #define CX88_BOARD_TEVII_S420              73
 #define CX88_BOARD_PROLINK_PV_GLOBAL_XTREME 74
 #define CX88_BOARD_PROF_7300               75
+#define CX88_BOARD_WINFAST_DTV1800H        76
 
 enum cx88_itype {
 	CX88_VMUX_COMPOSITE1 = 1,

_______________________________________________
linux-dvb mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb