diff -r 55d60e988b89 linux/drivers/media/video/cx88/cx88-cards.c
--- a/linux/drivers/media/video/cx88/cx88-cards.c	Fri Oct 12 01:03:30 2007 +0200
+++ b/linux/drivers/media/video/cx88/cx88-cards.c	Sun Feb 24 22:07:35 2008 +0100
@@ -1549,6 +1549,36 @@ struct cx88_board cx88_boards[] = {
 			.gpio0  = 0x07fa,
 		}},
 	},
+	[CX88_BOARD_WINFAST_DTV1800H] = {
+		.name           = "LeadTek Winfast DTV1800 Hybrid",
+		.tuner_type     = TUNER_XCEIVE_XC3028,
+		.radio_type     = TUNER_XCEIVE_XC3028,
+		.tuner_addr     = 0x61,
+		.radio_addr     = 0x61,
+		.input          = {{
+			.type   = CX88_VMUX_TELEVISION,
+			.vmux   = 0,
+			.gpio0  = 0x0400,       //pin 2:mute = 0 (off)
+			.gpio1  = 0x6040,       //pin 13:audio = 0 (tuner), pin 14:FM = 1 (off?)
+			.gpio2  = 0x0000,
+		},{
+			.type   = CX88_VMUX_COMPOSITE1,
+			.vmux   = 1,
+			.gpio0  = 0x0400,       //pin 2:mute = 0 (off)
+			.gpio1  = 0x6060,       //pin 13:audio = 1 (line), pin 14:FM = 1 (off?)
+			.gpio2  = 0x0000,
+		},{
+			.type   = CX88_VMUX_SVIDEO,
+			.vmux   = 2,
+		}},
+		.radio = {
+			.type   = CX88_RADIO,
+			.gpio0  = 0x0400,       //pin 2:mute = 0 (off)
+			.gpio1  = 0x6000,       //pin 13:audio = 0? (tuner), pin 14:FM = 0? (on?)
+			.gpio2  = 0x0000,
+		},
+		.mpeg           = CX88_MPEG_DVB,
+	},
 };
 const unsigned int cx88_bcount = ARRAY_SIZE(cx88_boards);
 
@@ -1868,6 +1898,10 @@ struct cx88_subid cx88_subids[] = {
 		.subdevice = 0x6f18,
 		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
 	},{
+		.subvendor = 0x107d,
+		.subdevice = 0x6654,
+		.card      = CX88_BOARD_WINFAST_DTV1800H,
+	},{
 		.subvendor = 0x14f1,
 		.subdevice = 0x8852,
 		.card      = CX88_BOARD_GENIATECH_X8000_MT,
@@ -2087,6 +2121,14 @@ void cx88_card_setup_pre_i2c(struct cx88
 		cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */
 		udelay(1000);
 		break;
+	case CX88_BOARD_WINFAST_DTV1800H:
+		cx_write(MO_GP1_IO, 0x101010);  //gpio 12 = 1: powerup XC3028
+		mdelay(250);
+		cx_write(MO_GP1_IO, 0x101000);  //gpio 12 = 0: powerdown XC3028
+		mdelay(250);
+		cx_write(MO_GP1_IO, 0x101010);  //gpio 12 = 1: powerup XC3028
+		mdelay(250);
+		break;
 	}
 }
 
diff -r 55d60e988b89 linux/drivers/media/video/cx88/cx88-dvb.c
--- a/linux/drivers/media/video/cx88/cx88-dvb.c	Fri Oct 12 01:03:30 2007 +0200
+++ b/linux/drivers/media/video/cx88/cx88-dvb.c	Sun Feb 24 22:07:35 2008 +0100
@@ -314,6 +314,12 @@ static struct zl10353_config cx88_geniat
 	.r5c_clk_mpegts_output = 0x75,
 };
 
+static struct zl10353_config cx88_winfast_dtv1800h = {
+	.demod_address = (0x1e >> 1),
+	.no_tuner = 1,
+	.input_frequency = 0xe609,
+};
+
 static int nxt200x_set_ts_param(struct dvb_frontend* fe, int is_punctured)
 {
 	struct cx8802_dev *dev= fe->dvb->priv;
@@ -386,7 +392,9 @@ static struct xc3028_config geniatech_x8
 
 static int v4l_dvb_tuner_ioctl(struct v4l_dvb_tuner_ops *ops, int cmd, int arg)
 {
-	return ((struct cx88_core*)(ops->dev))->callback(ops->dev, cmd, arg);
+	struct cx88_core *core = ops->dev;
+
+	return core->callback(core->i2c_adap.algo_data, cmd, arg);
 }
 
 
@@ -421,6 +429,19 @@ static int dvb_register(struct cx8802_de
 			dvb_attach(dvb_pll_attach, &dev->dvb.frontend->ops.tuner_ops, 0x60,
 				   &dev->core->i2c_adap,
 				   &dvb_pll_thomson_dtt7579);
+		}
+		break;
+	case CX88_BOARD_WINFAST_DTV1800H:
+		dev->dvb.frontend = dvb_attach(zl10353_attach, &cx88_winfast_dtv1800h, &dev->core->i2c_adap);
+		if (dev->dvb.frontend != NULL) {
+			dev->dvb.frontend->ops.tuner_ops.fe = dev->dvb.frontend;
+
+			dev->dvb.frontend->ops.tuner_ops.ioctl = v4l_dvb_tuner_ioctl;
+			dev->dvb.frontend->ops.tuner_ops.dev = dev->core;
+			dev->dvb.frontend->ops.i2c_gate_ctrl = NULL;
+			dev->dvb.frontend->ops.sleep = NULL;
+
+			dvb_attach(xc3028_attach, &dev->dvb.frontend->ops.tuner_ops, &dev->core->i2c_adap, &dev->core->xc3028conf);
 		}
 		break;
 	case CX88_BOARD_WINFAST_DTV2000H:
diff -r 55d60e988b89 linux/drivers/media/video/cx88/cx88-i2c.c
--- a/linux/drivers/media/video/cx88/cx88-i2c.c	Fri Oct 12 01:03:30 2007 +0200
+++ b/linux/drivers/media/video/cx88/cx88-i2c.c	Sun Feb 24 22:07:35 2008 +0100
@@ -199,7 +199,7 @@ static int cx88_xc3028_control(void *pri
 	switch (command) {
 	case TUNER_RESET1:
 	case TUNER_RESET2:
-	case TUNER_RESET3:
+//	case TUNER_RESET3:
 		switch (mode) {
 		case V4L2_INT_TUNER_RADIO:
 			printk("Switching to radio!\n");
@@ -291,6 +291,7 @@ static int attach_inform(struct i2c_clie
 
 			case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
 			case CX88_BOARD_PINNACLE_HYBRID_PCTV:
+			case CX88_BOARD_WINFAST_DTV1800H:
 				/* tun_setup.tuner_mode = TODO */
 				tun_setup.tuner_mode     = &core->mode;
 				tun_setup.tuner_callback = core->callback = cx88_xc3028_control;
@@ -311,9 +312,10 @@ static int attach_inform(struct i2c_clie
 			case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
 			case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
 			case CX88_BOARD_PINNACLE_HYBRID_PCTV:
+			case CX88_BOARD_WINFAST_DTV1800H:
 				/* tun_setup.tuner_mode = TODO */
 				tun_setup.tuner_mode     = &core->mode;
-				tun_setup.tuner_callback = cx88_xc3028_control;
+				tun_setup.tuner_callback = core->callback = cx88_xc3028_control;
 				break;
 			}
 
diff -r 55d60e988b89 linux/drivers/media/video/cx88/cx88.h
--- a/linux/drivers/media/video/cx88/cx88.h	Fri Oct 12 01:03:30 2007 +0200
+++ b/linux/drivers/media/video/cx88/cx88.h	Sun Feb 24 22:07:35 2008 +0100
@@ -219,6 +219,7 @@ extern struct sram_channel cx88_sram_cha
 #define CX88_BOARD_POWERCOLOR_REAL_ANGEL   60
 #define CX88_BOARD_GENIATECH_X8000_MT	   61
 #define CX88_BOARD_PIXELVIEW_PLAYTV_MPEG   62
+#define CX88_BOARD_WINFAST_DTV1800H        63
 
 enum cx88_itype {
 	CX88_VMUX_COMPOSITE1 = 1,
