[PATCH] dvb: usb: digitv: support for nxt6000 demod

Add support for the NXT6000-based digitv-box.  Add .get_tune_settings callback
for the NXT6000 to have a min_tune_delay of 500ms.

Signed-off-by: Svante Olofsson <svante@agentum.com>
Signed-off-by: Patrick Boettcher <pb@linuxtv.org>
Signed-off-by: Johannes Stezenbach <js@linuxtv.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
diff --git a/drivers/media/dvb/dvb-usb/digitv.c b/drivers/media/dvb/dvb-usb/digitv.c
index 24d2bc6..74545f8 100644
--- a/drivers/media/dvb/dvb-usb/digitv.c
+++ b/drivers/media/dvb/dvb-usb/digitv.c
@@ -111,31 +111,28 @@
 }
 
 static struct mt352_config digitv_mt352_config = {
-	.demod_address = 0x0, /* ignored by the digitv anyway */
 	.demod_init = digitv_mt352_demod_init,
 	.pll_set = dvb_usb_pll_set,
 };
 
-static struct nxt6000_config digitv_nxt6000_config = {
-	.demod_address = 0x0, /* ignored by the digitv anyway */
-	.clock_inversion = 0x0,
+static int digitv_nxt6000_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
+{
+	struct dvb_usb_device *d = fe->dvb->priv;
+	u8 b[5];
+	dvb_usb_pll_set(fe,fep,b);
+	return digitv_ctrl_msg(d,USB_WRITE_TUNER,0,&b[1],4,NULL,0);
+}
 
-	.pll_init = NULL,
-	.pll_set = NULL,
+static struct nxt6000_config digitv_nxt6000_config = {
+	.clock_inversion = 1,
+	.pll_set = digitv_nxt6000_pll_set,
 };
 
 static int digitv_frontend_attach(struct dvb_usb_device *d)
 {
-	if ((d->fe = mt352_attach(&digitv_mt352_config, &d->i2c_adap)) != NULL)
+	if ((d->fe = mt352_attach(&digitv_mt352_config, &d->i2c_adap)) != NULL ||
+		(d->fe = nxt6000_attach(&digitv_nxt6000_config, &d->i2c_adap)) != NULL)
 		return 0;
-	if ((d->fe = nxt6000_attach(&digitv_nxt6000_config, &d->i2c_adap)) != NULL) {
-
-		warn("nxt6000 support is not done yet, in fact you are one of the first "
-				"person who wants to use this device in Linux. Please report to "
-				"linux-dvb@linuxtv.org");
-
-		return 0;
-	}
 	return -EIO;
 }
 
@@ -173,7 +170,18 @@
 static int digitv_probe(struct usb_interface *intf,
 		const struct usb_device_id *id)
 {
-	return dvb_usb_device_init(intf,&digitv_properties,THIS_MODULE,NULL);
+	struct dvb_usb_device *d;
+	int ret;
+	if ((ret = dvb_usb_device_init(intf,&digitv_properties,THIS_MODULE,&d)) == 0) {
+		u8 b[4] = { 0 };
+
+		b[0] = 1;
+		digitv_ctrl_msg(d,USB_WRITE_REMOTE_TYPE,0,b,4,NULL,0);
+
+		b[0] = 0;
+		digitv_ctrl_msg(d,USB_WRITE_REMOTE,0,b,4,NULL,0);
+	}
+	return ret;
 }
 
 static struct usb_device_id digitv_table [] = {