Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[linux-dvb] frontend experimental patch v5



* Rewrite autotune function so it initially reuses the previously determined 
inversion on FE_SET_FRONTEND as suggested by Oliver Endriss.

BTW: Should I start checking this stuff? The 1.1.1 release is done, and I 
don't really like spamming the list so much...
? dvb-kernel-frontend-exp4.patch
? build-2.4/dvb-ttpci-info.txt
? build-2.4/redo
? build-2.4/include/linux
? linux/drivers/media/dvb/dvb-core/dvb_ca.adq.c
? linux/drivers/media/dvb/dvb-core/dvb_ca.adq.h
? linux/include/linux/dvb/ca.further.h
Index: linux/drivers/media/dvb/dvb-core/dvb_frontend.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/dvb-core/dvb_frontend.c,v
retrieving revision 1.70
diff -a -u -r1.70 dvb_frontend.c
--- linux/drivers/media/dvb/dvb-core/dvb_frontend.c	1 Mar 2004 19:11:18 -0000	1.70
+++ linux/drivers/media/dvb/dvb-core/dvb_frontend.c	10 Mar 2004 00:14:53 -0000
@@ -46,8 +46,8 @@
 #define FESTATE_TUNED 16
 #define FESTATE_ZIGZAG_FAST 32
 #define FESTATE_ZIGZAG_SLOW 64
-#define FESTATE_CLEAN_SETUP 128
-#define FESTATE_SEARCHING (FESTATE_TUNING_FAST | FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW)
+#define FESTATE_DISEQC 128
+#define FESTATE_WAITFORLOCK (FESTATE_TUNING_FAST | FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW | FESTATE_DISEQC)
 #define FESTATE_SEARCHING_FAST (FESTATE_TUNING_FAST | FESTATE_ZIGZAG_FAST)
 #define FESTATE_SEARCHING_SLOW (FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_SLOW)
 #define FESTATE_LOSTLOCK (FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW)
@@ -59,8 +59,8 @@
  * FESTATE_TUNED. The frontend has successfully locked on.
  * FESTATE_ZIGZAG_FAST. The lock has been lost, and a fast zigzag has been initiated to try and regain it.
  * FESTATE_ZIGZAG_SLOW. The lock has been lost. Fast zigzag has been failed, so we're trying again, but slower.
- * FESTATE_CLEAN_SETUP. Used for certain dodgy tuners which need special massaging to lock.
- * FESTATE_SEARCHING. When we're searching for a signal using a zigzag scan of any sort.
+ * FESTATE_DISEQC. A DISEQC command has just been issued.
+ * FESTATE_WAITFORLOCK. When we're waiting for a lock.
  * FESTATE_SEARCHING_FAST. When we're searching for a signal using a fast zigzag scan.
  * FESTATE_SEARCHING_SLOW. When we're searching for a signal using a slow zigzag scan.
  * FESTATE_LOSTLOCK. When the lock has been lost, and we're searching it again.
@@ -69,7 +69,10 @@
 
 static int dvb_frontend_debug = 0;
 static int dvb_shutdown_timeout = 5;
-static int dvb_frequency_bending = 1;
+static int dvb_override_frequency_bending = 0;
+static int dvb_force_auto_inversion = 0;
+
+static int do_frequency_bending = 0;
 
 #define dprintk if (dvb_frontend_debug) printk
 
@@ -100,9 +103,12 @@
 	int bending;
 	int lnb_drift;
         int inversion;
-        int auto_count;
-        int started_auto_count;
+        int auto_step;
+        int auto_sub_step;
+        int started_auto_step;
         int min_delay;
+        int max_drift;
+        int step_size;
 	int exit;
         fe_status_t status;
 };
@@ -353,78 +359,50 @@
  * Performs automatic twiddling of frontend parameters.
  * 
  * @param fe The frontend concerned.
+ * @param check_wrapped Checks if an iteration has completed. DO NOT SET ON THE FIRST ATTEMPT
  * @returns Number of complete iterations that have been performed.
  */
-static int dvb_frontend_autotune(struct dvb_frontend_data *fe)
+static int dvb_frontend_autotune(struct dvb_frontend_data *fe, int check_wrapped)
 {
-        int stepsize;
-        int maxdrift;
         int autoinversion;
         int ready = 0;
-        int wrapped = 0;
         int original_inversion = fe->parameters.inversion;
         u32 original_frequency = fe->parameters.frequency;
 
 	dprintk ("%s\n", __FUNCTION__);
 
-        // choose step size for zigzag scan
-	switch(fe->info->type) {
-	case FE_QPSK:
-	        if (fe->parameters.u.qpsk.symbol_rate < 10000000) {
-	                stepsize = fe->parameters.u.qpsk.symbol_rate / 32000;
-	                maxdrift = 5000;
-	        } else {
-		        stepsize = fe->parameters.u.qpsk.symbol_rate / 16000;
-		        maxdrift = fe->parameters.u.qpsk.symbol_rate / 2000;
-		}
-	        break;
-	    
-	case FE_QAM:
-		stepsize = 1;
-	        maxdrift = 0; // don't want any zigzagging under DVB-C frontends
-	        break;
-	    
-	case FE_OFDM:
-	        stepsize = fe->info->frequency_stepsize * 2;
-	        maxdrift = (fe->info->frequency_stepsize * 2) + 1;
-	        break;
-	    
-	default:
-	        printk("Unknown frontend type %i\n", fe->info->type);
-	        return 0;
-	}
-
         // are we using autoinversion?
         autoinversion = ((!(fe->info->caps & FE_CAN_INVERSION_AUTO)) && (fe->parameters.inversion == INVERSION_AUTO));
 
         // setup parameters correctly
         while(!ready) {
-	        // wrap the count if we've reached the maximum drift
-	        fe->lnb_drift = (fe->auto_count / 4) * stepsize;
-	        if (fe->lnb_drift >= maxdrift) {
-		        fe->auto_count = 0;
+	        // calculate the lnb_drift
+	        fe->lnb_drift = fe->auto_step * fe->step_size;
+
+	        // wrap the auto_step if we've exceeded the maximum drift
+	        if (fe->lnb_drift > fe->max_drift) {
+		        fe->auto_step = 0;
+		        fe->auto_sub_step = 0;
 		        fe->lnb_drift = 0;
-		        wrapped = 1;
 		}
-    
+
 	        // perform inversion and +/- zigzag
-	        switch(fe->auto_count % 4) {
+	        switch(fe->auto_sub_step) {
 		case 0:
-		        fe->inversion = INVERSION_OFF;
+		        // try with the current inversion and current drift setting
 		        ready = 1;
 		        break;
 	    
 		case 1:
 		        if (!autoinversion) break;
 
-		        fe->inversion = INVERSION_ON;
+		        fe->inversion = (fe->inversion == INVERSION_OFF) ? INVERSION_ON : INVERSION_OFF;
 		        ready = 1;
 		        break;
 	    
 		case 2:
 		        if (fe->lnb_drift == 0) break;
 		    
-		        fe->inversion = INVERSION_OFF;
 		        fe->lnb_drift = -fe->lnb_drift;
 		        ready = 1;
 		        break;
@@ -433,32 +411,38 @@
 		        if (fe->lnb_drift == 0) break;
 		        if (!autoinversion) break;
 		    
-		        fe->inversion = INVERSION_ON;
+		        fe->inversion = (fe->inversion == INVERSION_OFF) ? INVERSION_ON : INVERSION_OFF;
 		        fe->lnb_drift = -fe->lnb_drift;
 		        ready = 1;
 		        break;
+		    
+		default:
+		        fe->auto_step++;
+		        fe->auto_sub_step = -1; // it'll be incremented to 0 in a moment
+		        break;
 		}
 	    
-	        if (!ready) fe->auto_count++;
+	        if (!ready) fe->auto_sub_step++;
+	}
+
+        // if this attempt would hit where we started, indicate a complete iteration has occurred
+        if ((fe->auto_step == fe->started_auto_step) && (fe->auto_sub_step == 0) && check_wrapped) {
+	        return 1;
 	}
-   
-        // perform frequency bending if enabled
-        if (dvb_frequency_bending)
+
+        // perform frequency bending if necessary
+        if ((dvb_override_frequency_bending != 1) && do_frequency_bending)
                 dvb_bend_frequency(fe, 0);
-   
+
         // set the frontend itself
 	fe->parameters.frequency += fe->lnb_drift + fe->bending;
         if (autoinversion) fe->parameters.inversion = fe->inversion;
 	dvb_frontend_internal_ioctl (&fe->frontend, FE_SET_FRONTEND, &fe->parameters);
 	fe->parameters.frequency = original_frequency;
         fe->parameters.inversion = original_inversion;
-    
-        // reset frontend IRQ bits to clean error stats
-    	dvb_frontend_internal_ioctl (&fe->frontend, FE_RESET, NULL);
 
-        // if we've hit where we started from, indicate a complete iteration has occurred
-	fe->auto_count++;
-        if ((fe->auto_count == fe->started_auto_count) || (fe->started_auto_count==0 && wrapped)) return 1;
+	// normal return
+        fe->auto_sub_step++;
         return 0;
 }
 
@@ -483,8 +467,8 @@
 	unsigned long timeout;
 	char name [15];
 	int quality = 0, delay = 3*HZ;
-        int clean_setup_count = 0;
 	fe_status_t s;
+        int check_wrapped = 0;
 
 	dprintk ("%s\n", __FUNCTION__);
 
@@ -521,17 +505,17 @@
 			dvb_frontend_add_event (fe, s);
 
 	        // if we're not tuned, and we have a lock, move to the TUNED state
-		if ((fe->state & FESTATE_SEARCHING) && (s & FE_HAS_LOCK)) {
+		if ((fe->state & FESTATE_WAITFORLOCK) && (s & FE_HAS_LOCK)) {
 		        update_delay(&quality, &delay, fe->min_delay, s & FE_HAS_LOCK);
 		        fe->state = FESTATE_TUNED;
-		    
+
 		        // if we're tuned, then we have determined the correct inversion
 		        if ((!(fe->info->caps & FE_CAN_INVERSION_AUTO)) && (fe->parameters.inversion == INVERSION_AUTO)) {
 			        fe->parameters.inversion = fe->inversion;
 			}
 		        continue;
 		}
-	    
+
 	        // if we are tuned already, check we're still locked
 	        if (fe->state & FESTATE_TUNED) {
 		        update_delay(&quality, &delay, fe->min_delay, s & FE_HAS_LOCK);
@@ -542,46 +526,56 @@
 			} else {
 			        // if we _WERE_ tuned, but now don't have a lock, need to zigzag
 			        fe->state = FESTATE_ZIGZAG_FAST;
-			        fe->started_auto_count = fe->auto_count;
+			        fe->started_auto_step = fe->auto_step;
+			        check_wrapped = 0;
 			        // fallthrough
 			}
 		}
 
-	        // don't actually do anything if we're in the LOSTLOCK state
-		// and the frontend can recover automatically
-		if ((fe->state & FESTATE_LOSTLOCK) && (fe->info->caps & FE_CAN_RECOVER)) {
+	        // don't actually do anything if we're in the LOSTLOCK state, the frontend is set to
+		// FE_CAN_RECOVER, and the max_drift is 0
+	        if ((fe->state & FESTATE_LOSTLOCK) && 
+		    (fe->info->caps & FE_CAN_RECOVER) && (fe->max_drift == 0)) {
 		        update_delay(&quality, &delay, fe->min_delay, s & FE_HAS_LOCK);
 		        continue;
 		}
-	   
-	        // if we're in the RETUNE state, set everything up for a brand new scan
+	    
+	        // don't do anything if we're in the DISEQC state, since this might be someone
+		// with a motorized dish controlled by DISEQC. If its actually a re-tune, there will
+		// be a SET_FRONTEND soon enough.
+	        if (fe->state & FESTATE_DISEQC) {
+		        update_delay(&quality, &delay, fe->min_delay, s & FE_HAS_LOCK);
+		        continue;
+		}
+
+	        // if we're in the RETUNE state, set everything up for a brand new scan,
+		// keeping the current inversion setting, as the next tune is _very_ likely
+		// to require the same
 	        if (fe->state & FESTATE_RETUNE) {
 		        fe->lnb_drift = 0;
-		        fe->inversion = INVERSION_OFF;
-		        fe->auto_count = 0;
-		        fe->started_auto_count = 0;
-		        clean_setup_count = 0;
+		        fe->auto_step = 0;
+		        fe->auto_sub_step = 0;
+		        fe->started_auto_step = 0;
+		        check_wrapped = 0;
 		}
-	    
+
 	        // fast zigzag.
 		if ((fe->state & FESTATE_SEARCHING_FAST) || (fe->state & FESTATE_RETUNE)) {
 		        delay = fe->min_delay;
-		   
-		        // OK, if we've run out of trials at the fast speed. Drop back to
-			// slow for the _next_ attempt
-		        if (dvb_frontend_autotune(fe)) {
+
+		        // peform a tune
+		        if (dvb_frontend_autotune(fe, check_wrapped)) {
+			        // OK, if we've run out of trials at the fast speed. Drop back to
+			        // slow for the _next_ attempt
 			        fe->state = FESTATE_SEARCHING_SLOW;
-			        fe->started_auto_count = fe->auto_count;
+			        fe->started_auto_step = fe->auto_step;
 			        continue;
 			}
+		        check_wrapped = 1;
 
-		        // enter clean setup state after the first tune if necessary. yeuch
-		        if ((!(fe->info->caps & FE_CAN_CLEAN_SETUP)) && (clean_setup_count == 0)) {
-			        fe->state = FESTATE_CLEAN_SETUP;
-			}
-		    
 		        // if we've just retuned, enter the ZIGZAG_FAST state. This ensures
-			// we cannot return from an FE_SET_FRONTEND before the retune occurs.
+			// we cannot return from an FE_SET_FRONTEND ioctl before the first frontend
+			// tune occurs
 			if (fe->state & FESTATE_RETUNE) {
 			        fe->state = FESTATE_TUNING_FAST;
 			}
@@ -590,18 +584,10 @@
 	        // slow zigzag
 		if (fe->state & FESTATE_SEARCHING_SLOW) {
 		        update_delay(&quality, &delay, fe->min_delay, s & FE_HAS_LOCK);
-		        dvb_frontend_autotune(fe);
-		}
-
-	        // clean setup
-		if (fe->state & FESTATE_CLEAN_SETUP) {
-		        if ((clean_setup_count < 10) && (!(s & FE_HAS_LOCK))) {
-			        dvb_frontend_internal_ioctl(&fe->frontend, FE_RESET, NULL);
-			} else {
-			        // return to tuning state
-			        fe->state = FESTATE_TUNING_FAST;
-			}
-		        clean_setup_count++;
+		    
+		        // Note: don't bother checking for wrapping; we stay in this state 
+		        // until we get a lock
+		        dvb_frontend_autotune(fe, 0);
 		}
 	};
 
@@ -713,8 +699,8 @@
 {
 	struct dvb_device *dvbdev = file->private_data;
 	struct dvb_frontend_data *fe = dvbdev->priv;
+        struct dvb_frontend_tune_settings fetunesettings;
 	int err = 0;
-        int delay_ms;
 
 	dprintk ("%s\n", __FUNCTION__);
 
@@ -731,7 +717,7 @@
 		if (fe->status)
 			dvb_call_frontend_notifiers (fe, 0);
 		dvb_frontend_internal_ioctl (&fe->frontend, cmd, parg);
-	        fe->state = FESTATE_IDLE;
+	        fe->state = FESTATE_DISEQC;
 		break;
 
 	case FE_SET_FRONTEND:
@@ -740,20 +726,40 @@
 		memcpy (&fe->parameters, parg,
 			sizeof (struct dvb_frontend_parameters));
 
-	        delay_ms = dvb_frontend_internal_ioctl(&fe->frontend, FE_GETMINDELAY, &fe->parameters);
-	        if (delay_ms >= 0) fe->min_delay = (delay_ms * HZ) / 1000;
-	        else {
+	        memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings));
+	        memcpy(&fetunesettings.parameters, parg,
+		       sizeof (struct dvb_frontend_parameters));
+	    	    
+	        // force auto frequency inversion if requested
+	        if (dvb_force_auto_inversion) {
+		        fe->parameters.inversion = INVERSION_AUTO;
+		        fetunesettings.parameters.inversion = INVERSION_AUTO;
+		}
+
+	        // get frontend-specific tuning settings
+	        if (dvb_frontend_internal_ioctl(&fe->frontend, FE_GET_TUNE_SETTINGS, &fetunesettings) == 0) {
+		        fe->min_delay = (fetunesettings.min_delay_ms * HZ) / 1000;
+		        fe->max_drift = fetunesettings.max_drift;
+		        fe->step_size = fetunesettings.step_size;
+		} else {
+		        // default values
 		        switch(fe->info->type) {
 			case FE_QPSK:
 			        fe->min_delay = HZ/20; // default mindelay of 50ms
+			        fe->step_size = fe->parameters.u.qpsk.symbol_rate / 16000;
+			        fe->max_drift = fe->parameters.u.qpsk.symbol_rate / 2000;
 			        break;
 			    
 			case FE_QAM:
 			        fe->min_delay = HZ/20; // default mindelay of 50ms
+			        fe->step_size = 0;
+			        fe->max_drift = 0; // don't want any zigzagging under DVB-C frontends
 			        break;
 			    
 			case FE_OFDM:
-			        fe->min_delay = HZ/10; // default mindelay of 100ms
+			        fe->min_delay = HZ/20; // default mindelay of 50ms
+			        fe->step_size = fe->info->frequency_stepsize * 2;
+			        fe->max_drift = (fe->info->frequency_stepsize * 2) + 1;
 			        break;
 			}
 		}
@@ -764,7 +770,7 @@
 	case FE_GET_EVENT:
 		err = dvb_frontend_get_event (fe, parg, file->f_flags);
 		break;
-
+	    
 	case FE_GET_FRONTEND:
 		memcpy (parg, &fe->parameters,
 			sizeof (struct dvb_frontend_parameters));
@@ -1089,6 +1095,7 @@
 	fe->frontend.i2c = i2c;
 	fe->frontend.data = data;
 	fe->info = info;
+        fe->inversion = INVERSION_OFF;
 
 	list_for_each (entry, &frontend_ioctl_list) {
 		struct dvb_frontend_ioctl_data *ioctl;
@@ -1128,6 +1135,9 @@
 	dvb_register_device (i2c->adapter, &fe->dvbdev, &dvbdev_template,
 			     fe, DVB_DEVICE_FRONTEND);
 
+        if ((info->caps & FE_NEEDS_BENDING) || (dvb_override_frequency_bending == 2))
+                do_frequency_bending = 1;
+    
 	up (&frontend_mutex);
 
 	return 0;
@@ -1165,7 +1175,10 @@
 
 MODULE_PARM(dvb_frontend_debug,"i");
 MODULE_PARM(dvb_shutdown_timeout,"i");
-MODULE_PARM(dvb_frequency_bending,"i");
+MODULE_PARM(dvb_override_frequency_bending,"i");
+MODULE_PARM(dvb_force_auto_inversion,"i");
+
 MODULE_PARM_DESC(dvb_frontend_debug, "enable verbose debug messages");
 MODULE_PARM_DESC(dvb_shutdown_timeout, "wait <shutdown_timeout> seconds after close() before suspending hardware");
-MODULE_PARM_DESC(dvb_frequency_bending, "0: disable frequency bending, 1: enable (default)");
+MODULE_PARM_DESC(dvb_override_frequency_bending, "0: normal (default), 1: never use frequency bending, 2: always use frequency bending");
+MODULE_PARM_DESC(dvb_force_auto_inversion, "0: normal (default), 1: INVERSION_AUTO forced always");
Index: linux/drivers/media/dvb/dvb-core/dvb_frontend.h
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/dvb-core/dvb_frontend.h,v
retrieving revision 1.9
diff -a -u -r1.9 dvb_frontend.h
--- linux/drivers/media/dvb/dvb-core/dvb_frontend.h	27 Feb 2004 03:32:53 -0000	1.9
+++ linux/drivers/media/dvb/dvb-core/dvb_frontend.h	10 Mar 2004 00:14:53 -0000
@@ -56,15 +56,25 @@
 	void *data;                /*  can be used by hardware module... */
 };
 
+struct dvb_frontend_tune_settings {
+        int min_delay_ms;
+        int step_size;
+        int max_drift;
+        struct dvb_frontend_parameters parameters;
+};
+
 
 /**
  *   private frontend command ioctl's.
  *   keep them in sync with the public ones defined in linux/dvb/frontend.h
+ * 
+ *   FE_SLEEP. Ioctl used to put frontend into a low power mode.
+ *   FE_INIT. Ioctl used to initialise the frontend.
+ *   FE_GET_TUNE_SETTINGS. Get the frontend-specific tuning loop settings for the supplied set of parameters.
  */
 #define FE_SLEEP              _IO('v', 80)
 #define FE_INIT               _IO('v', 81)
-#define FE_RESET              _IO('v', 82)
-#define FE_GETMINDELAY        _IOW('v', 83, struct dvb_frontend_parameters)
+#define FE_GET_TUNE_SETTINGS  _IOWR('v', 83, struct dvb_frontend_tune_settings)
 
 
 extern int
Index: linux/drivers/media/dvb/frontends/alps_tdlb7.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/alps_tdlb7.c,v
retrieving revision 1.16
diff -a -u -r1.16 alps_tdlb7.c
--- linux/drivers/media/dvb/frontends/alps_tdlb7.c	29 Jan 2004 20:42:31 -0000	1.16
+++ linux/drivers/media/dvb/frontends/alps_tdlb7.c	10 Mar 2004 00:14:56 -0000
@@ -636,9 +636,6 @@
         case FE_SET_FRONTEND:
 		return sp8870_set_frontend(i2c, (struct dvb_frontend_parameters*) arg);
 
-	case FE_RESET:
-		return -EOPNOTSUPP;
-
 	case FE_GET_FRONTEND:			 // FIXME: read known values back from Hardware...
 		return -EOPNOTSUPP;
 
@@ -653,6 +650,15 @@
 		}
 		break;
 
+	case FE_GET_TUNE_SETTINGS:
+	{
+	        struct dvb_frontend_tune_settings* fesettings = (struct dvb_frontend_tune_settings*) arg;
+	        fesettings->min_delay_ms = 50;
+	        fesettings->step_size = 0;
+	        fesettings->max_drift = 0;
+	        return 0;
+	}	    
+	    
 	default:
 		return -EOPNOTSUPP;
         };
Index: linux/drivers/media/dvb/frontends/alps_tdmb7.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/alps_tdmb7.c,v
retrieving revision 1.23
diff -a -u -r1.23 alps_tdmb7.c
--- linux/drivers/media/dvb/frontends/alps_tdmb7.c	29 Jan 2004 20:42:31 -0000	1.23
+++ linux/drivers/media/dvb/frontends/alps_tdmb7.c	10 Mar 2004 00:14:56 -0000
@@ -50,7 +50,7 @@
 	.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
 	      FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
 	      FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
-	      FE_CAN_CLEAN_SETUP | FE_CAN_RECOVER
+              FE_CAN_RECOVER
 };
 
 
@@ -390,8 +390,14 @@
         case FE_INIT:
 		return cx22700_init (i2c);
 
-        case FE_RESET:
-                break;
+	case FE_GET_TUNE_SETTINGS:
+	{
+	        struct dvb_frontend_tune_settings* fesettings = (struct dvb_frontend_tune_settings*) arg;
+	        fesettings->min_delay_ms = 50;
+	        fesettings->step_size = 0;
+	        fesettings->max_drift = 0;
+	        return 0;
+	}	    
 
 	default:
 		return -EOPNOTSUPP;
Index: linux/drivers/media/dvb/frontends/at76c651.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/at76c651.c,v
retrieving revision 1.14
diff -a -u -r1.14 at76c651.c
--- linux/drivers/media/dvb/frontends/at76c651.c	20 Dec 2003 22:22:19 -0000	1.14
+++ linux/drivers/media/dvb/frontends/at76c651.c	10 Mar 2004 00:14:56 -0000
@@ -71,9 +71,7 @@
 	    FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
 	    FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
 	    FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 | FE_CAN_QAM_128 |
-	    FE_CAN_QAM_256 /* | FE_CAN_QAM_512 | FE_CAN_QAM_1024 */ |
-	    FE_CAN_RECOVER | FE_CAN_CLEAN_SETUP | FE_CAN_MUTE_TS
-
+	    FE_CAN_MUTE_TS | FE_CAN_QAM_256 | FE_CAN_RECOVER
 };
 
 #if ! defined(__powerpc__)
@@ -360,7 +358,8 @@
 	at76c651_set_symbolrate(i2c, p->u.qam.symbol_rate);
 	at76c651_set_inversion(i2c, p->inversion);
 	at76c651_set_auto_config(i2c);
-
+        at76c651_reset(i2c);
+    
 	return 0;
 
 }
@@ -460,8 +459,14 @@
 	case FE_INIT:
 		return at76c651_set_defaults(fe->i2c);
 
-	case FE_RESET:
-		return at76c651_reset(fe->i2c);
+	case FE_GET_TUNE_SETTINGS:
+	{
+	        struct dvb_frontend_tune_settings* fesettings = (struct dvb_frontend_tune_settings*) arg;
+	        fesettings->min_delay_ms = 50;
+	        fesettings->step_size = 0;
+	        fesettings->max_drift = 0;
+	        return 0;
+	}	    
 
 	default:
 		return -ENOIOCTLCMD;
Index: linux/drivers/media/dvb/frontends/cx24110.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/cx24110.c,v
retrieving revision 1.12
diff -a -u -r1.12 cx24110.c
--- linux/drivers/media/dvb/frontends/cx24110.c	9 Dec 2003 06:08:29 -0000	1.12
+++ linux/drivers/media/dvb/frontends/cx24110.c	10 Mar 2004 00:14:57 -0000
@@ -59,8 +59,7 @@
 	.caps = FE_CAN_INVERSION_AUTO |
 		FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
 		FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
-		FE_CAN_QPSK |
-		FE_CAN_CLEAN_SETUP
+		FE_CAN_QPSK
 };
 /* fixme: are these values correct? especially ..._tolerance and caps */
 
@@ -621,11 +620,6 @@
         case FE_INIT:
 		return cx24110_init (i2c);
 
-	case FE_RESET:
-/* no idea what to do for this call */
-/* fixme (medium): fill me in */
-		break;
-
 	case FE_SET_TONE:
 		return cx24110_writereg(i2c,0x76,(cx24110_readreg(i2c,0x76)&~0x10)|((((fe_sec_tone_mode_t) arg)==SEC_TONE_ON)?0x10:0));
 	case FE_SET_VOLTAGE:
Index: linux/drivers/media/dvb/frontends/dst.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/dst.c,v
retrieving revision 1.12
diff -a -u -r1.12 dst.c
--- linux/drivers/media/dvb/frontends/dst.c	3 Feb 2004 23:10:10 -0000	1.12
+++ linux/drivers/media/dvb/frontends/dst.c	10 Mar 2004 00:14:58 -0000
@@ -963,7 +963,6 @@
 	{FE_GET_FRONTEND,            "FE_GET_FRONTEND:" },
 	{FE_SLEEP,                   "FE_SLEEP:" },
 	{FE_INIT,                    "FE_INIT:" },
-	{FE_RESET,                   "FE_RESET:" },
 	{FE_SET_TONE,                "FE_SET_TONE:" },
 	{FE_SET_VOLTAGE,             "FE_SET_VOLTAGE:" },
 	};
@@ -1091,9 +1090,6 @@
 		dst_init(dst);
 		break;
 
-	case FE_RESET:
-		break;
-
 	case FE_DISEQC_SEND_MASTER_CMD:
 	{
 		struct dvb_diseqc_master_cmd *cmd = (struct dvb_diseqc_master_cmd *)arg;
Index: linux/drivers/media/dvb/frontends/dvb_dummy_fe.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/dvb_dummy_fe.c,v
retrieving revision 1.5
diff -a -u -r1.5 dvb_dummy_fe.c
--- linux/drivers/media/dvb/frontends/dvb_dummy_fe.c	8 Oct 2003 23:12:46 -0000	1.5
+++ linux/drivers/media/dvb/frontends/dvb_dummy_fe.c	10 Mar 2004 00:14:58 -0000
@@ -62,8 +62,7 @@
 #endif
 	.caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
 		FE_CAN_QAM_128 | FE_CAN_QAM_256 | 
-		FE_CAN_FEC_AUTO | FE_CAN_INVERSION_AUTO |
-		FE_CAN_CLEAN_SETUP
+		FE_CAN_FEC_AUTO | FE_CAN_INVERSION_AUTO
 };
 
 static struct dvb_frontend_info dvb_t_dummyfe_info = {
@@ -157,9 +156,6 @@
         case FE_INIT:
 		return 0;
 
-	case FE_RESET:
-		return 0;
-
 	case FE_SET_TONE:
 		return -EOPNOTSUPP;
 
Index: linux/drivers/media/dvb/frontends/grundig_29504-401.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/grundig_29504-401.c,v
retrieving revision 1.21
diff -a -u -r1.21 grundig_29504-401.c
--- linux/drivers/media/dvb/frontends/grundig_29504-401.c	3 Mar 2004 14:34:58 -0000	1.21
+++ linux/drivers/media/dvb/frontends/grundig_29504-401.c	10 Mar 2004 00:14:59 -0000
@@ -48,7 +48,7 @@
 	.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
 	      FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
 	      FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
-	      FE_CAN_MUTE_TS /*| FE_CAN_CLEAN_SETUP*/
+              FE_CAN_MUTE_TS
 };
 
 
Index: linux/drivers/media/dvb/frontends/grundig_29504-491.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/grundig_29504-491.c,v
retrieving revision 1.15
diff -a -u -r1.15 grundig_29504-491.c
--- linux/drivers/media/dvb/frontends/grundig_29504-491.c	8 Oct 2003 23:12:46 -0000	1.15
+++ linux/drivers/media/dvb/frontends/grundig_29504-491.c	10 Mar 2004 00:15:00 -0000
@@ -52,8 +52,7 @@
 		FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
 		FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
 		FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
-		FE_CAN_QPSK |
-		FE_CAN_MUTE_TS | FE_CAN_CLEAN_SETUP
+		FE_CAN_QPSK | FE_CAN_MUTE_TS
 };
 
 
@@ -398,11 +397,6 @@
 		tda8083_writereg (i2c, 0x00, 0x04);
 		break;
 
-	case FE_RESET:
-		tda8083_writereg (i2c, 0x00, 0x3c);
-		tda8083_writereg (i2c, 0x00, 0x04);
-		break;
-
 	case FE_DISEQC_SEND_MASTER_CMD:
 		return tda8083_send_diseqc_msg (i2c, arg);
 
Index: linux/drivers/media/dvb/frontends/mt312.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/mt312.c,v
retrieving revision 1.13
diff -a -u -r1.13 mt312.c
--- linux/drivers/media/dvb/frontends/mt312.c	20 Dec 2003 22:22:19 -0000	1.13
+++ linux/drivers/media/dvb/frontends/mt312.c	10 Mar 2004 00:15:01 -0000
@@ -66,8 +66,8 @@
 	.caps =
 	    FE_CAN_INVERSION_AUTO | FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
 	    FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
-	    FE_CAN_FEC_AUTO | FE_CAN_QPSK | FE_CAN_RECOVER |
-	    FE_CAN_CLEAN_SETUP | FE_CAN_MUTE_TS
+	    FE_CAN_FEC_AUTO | FE_CAN_QPSK | FE_CAN_MUTE_TS | 
+            FE_CAN_RECOVER
 };
 
 static int mt312_read(struct dvb_i2c_bus *i2c,
@@ -570,6 +570,8 @@
 	if ((ret = mt312_write(i2c, SYM_RATE_H, buf, sizeof(buf))) < 0)
 		return ret;
 
+        mt312_reset(i2c, 0);
+
 	return 0;
 }
 
@@ -755,9 +757,15 @@
 			return mt312_init(i2c, (long) fe->data, (u8) 90);
 		else
 			return mt312_init(i2c, (long) fe->data, (u8) 60);
-			
-	case FE_RESET:
-		return mt312_reset(i2c, 0);
+
+	case FE_GET_TUNE_SETTINGS:
+	{
+	        struct dvb_frontend_tune_settings* fesettings = (struct dvb_frontend_tune_settings*) arg;
+	        fesettings->min_delay_ms = 50;
+	        fesettings->step_size = 0;
+	        fesettings->max_drift = 0;
+	        return 0;
+	}	    
 
 	default:
 		return -ENOIOCTLCMD;
Index: linux/drivers/media/dvb/frontends/mt352.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/mt352.c,v
retrieving revision 1.1
diff -a -u -r1.1 mt352.c
--- linux/drivers/media/dvb/frontends/mt352.c	5 Mar 2004 16:43:49 -0000	1.1
+++ linux/drivers/media/dvb/frontends/mt352.c	10 Mar 2004 00:15:01 -0000
@@ -60,7 +60,7 @@
                 FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
 	        FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
 		FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
-	        FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER | FE_CAN_CLEAN_SETUP | 
+	        FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER | 
 		FE_CAN_MUTE_TS
 };
 
Index: linux/drivers/media/dvb/frontends/nxt6000.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/nxt6000.c,v
retrieving revision 1.17
diff -a -u -r1.17 nxt6000.c
--- linux/drivers/media/dvb/frontends/nxt6000.c	29 Jan 2004 18:09:51 -0000	1.17
+++ linux/drivers/media/dvb/frontends/nxt6000.c	10 Mar 2004 00:15:01 -0000
@@ -52,7 +52,12 @@
 	.symbol_rate_max = 9360000,	/* FIXME */
 	.symbol_rate_tolerance = 4000,
 	.notifier_delay = 0,
-	.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 | FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO | FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO,
+	.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | 
+                FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 | 
+                FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO | 
+                FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO | 
+                FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | 
+                FE_CAN_HIERARCHY_AUTO,
 };
 
 struct nxt6000_config {
@@ -657,9 +662,6 @@
 		nxt6000_setup(fe);
 		break;
 
-	case FE_RESET:
-		break;
-
 	case FE_SET_FRONTEND:
 		{
 			struct nxt6000_config *nxt = FE2NXT(fe);
Index: linux/drivers/media/dvb/frontends/sp887x.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/sp887x.c,v
retrieving revision 1.10
diff -a -u -r1.10 sp887x.c
--- linux/drivers/media/dvb/frontends/sp887x.c	2 Mar 2004 10:11:34 -0000	1.10
+++ linux/drivers/media/dvb/frontends/sp887x.c	10 Mar 2004 00:15:02 -0000
@@ -64,7 +64,8 @@
 	.frequency_stepsize = 166666,
 	.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
 		FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
-		FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_RECOVER
+		FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
+                FE_CAN_RECOVER
 };
 
 static int errno;
@@ -632,6 +633,15 @@
 		sp887x_writereg(fe, 0xc18, 0x00d);
 		break;
 
+	case FE_GET_TUNE_SETTINGS:
+	{
+	        struct dvb_frontend_tune_settings* fesettings = (struct dvb_frontend_tune_settings*) arg;
+	        fesettings->min_delay_ms = 50;
+	        fesettings->step_size = 0;
+	        fesettings->max_drift = 0;
+	        return 0;
+	}	    
+
 	default:
 		return -EOPNOTSUPP;
         };
Index: linux/drivers/media/dvb/frontends/stv0299.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/stv0299.c,v
retrieving revision 1.37
diff -a -u -r1.37 stv0299.c
--- linux/drivers/media/dvb/frontends/stv0299.c	27 Feb 2004 09:54:49 -0000	1.37
+++ linux/drivers/media/dvb/frontends/stv0299.c	10 Mar 2004 00:15:05 -0000
@@ -96,8 +96,7 @@
 	.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
 	      FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
 	      FE_CAN_QPSK |
-	      FE_CAN_FEC_AUTO | 
-	      FE_CAN_CLEAN_SETUP
+	      FE_CAN_FEC_AUTO
 };
 
 
@@ -368,9 +367,14 @@
 
 	if ((freq < 950000) || (freq > 2150000)) return -EINVAL;
 
-        divisor = 500;
-        regcode = 2;
-   
+        if (ftype == PHILIPS_SU1278_TSA_TT) {
+	        divisor = 500;
+	        regcode = 2;
+	} else {
+	        divisor = 125;
+	        regcode = 4;
+	}
+
 	// setup frequency divisor
 	div = (freq + (divisor - 1)) / divisor; // round correctly
 	buf[0] = (div >> 8) & 0x7f;
@@ -395,7 +399,8 @@
 
 	case ALPS_BSRU6:
 		addr = 0x61;
-		buf[3] |= 0xC0;
+		buf[3] = 0xC4;
+	        if (freq > 1530000) buf[3] = 0xc0;
 	 	break;
 
 	default:
@@ -923,20 +928,18 @@
 
 	case ALPS_BSRU6:
 	default:
-		if (srate <= 1500000) { aclk = 0xb7; bclk = 0x87; }
-		else if (srate <= 3000000) { aclk = 0xb7; bclk = 0x8b; }
-		else if (srate <= 7000000) { aclk = 0xb7; bclk = 0x8f; }
-		else if (srate <= 14000000) { aclk = 0xb7; bclk = 0x93; }
-		else if (srate <= 30000000) { aclk = 0xb6; bclk = 0x93; }
-		else if (srate <= 45000000) { aclk = 0xb4; bclk = 0x91; }
-		m1 = 0x12;
+		if (srate < 1500000) { aclk = 0xb7; bclk = 0x47; }
+		else if (srate < 3000000) { aclk = 0xb7; bclk = 0x4b; }
+		else if (srate < 7000000) { aclk = 0xb7; bclk = 0x4f; }
+		else if (srate < 14000000) { aclk = 0xb7; bclk = 0x53; }
+		else if (srate < 30000000) { aclk = 0xb6; bclk = 0x53; }
+		else if (srate < 45000000) { aclk = 0xb4; bclk = 0x51; }
 
 	        stv0299_writereg (i2c, 0x13, aclk);
 	        stv0299_writereg (i2c, 0x14, bclk);
 	        stv0299_writereg (i2c, 0x1f, (ratio >> 16) & 0xff);
 	        stv0299_writereg (i2c, 0x20, (ratio >>  8) & 0xff);
 	        stv0299_writereg (i2c, 0x21, (ratio      ) & 0xf0);
-	        stv0299_writereg (i2c, 0x0f, (stv0299_readreg(i2c, 0x0f) & 0xc0) | m1);
 		break;
 	}
     
@@ -979,21 +982,6 @@
 	return srate;
 }
 
-static int stv0299_check_inversion (struct dvb_i2c_bus *i2c)
-{
-            dprintk ("%s\n", __FUNCTION__);
-    
-            if ((stv0299_readreg (i2c, 0x1b) & 0x98) != 0x98) {
-		                dvb_delay(30);
-		                if ((stv0299_readreg (i2c, 0x1b) & 0x98) != 0x98) {
-				                            u8 val = stv0299_readreg (i2c, 0x0c);
-				                            return stv0299_writereg (i2c, 0x0c, val ^ 0x01);
-				}
-	    }
-    
-            return 0;
-}
-
 static int uni0299_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
 {
 	struct dvb_i2c_bus *i2c = fe->i2c;
@@ -1093,14 +1081,13 @@
 		} else if (p->inversion == INVERSION_ON) {
 		        stv0299_writereg(i2c, 0x0c, stv0299_readreg(i2c, 0x0c) | 1);
 		} else {
-		        // temporary hack until the new dvb_frontend.c becomes mainline
-		        stv0299_check_inversion(i2c);
-		    
-//		        printk("stv0299 does not support auto-inversion\n");
-//		        return -EINVAL;
+		        printk("stv0299 does not support auto-inversion\n");
+		        return -EINVAL;
 		}
 
-	        if (state->tuner_type == PHILIPS_SU1278_TSA_TT) {
+	        switch(state->tuner_type) {
+		case PHILIPS_SU1278_TSA_TT: 
+		{
 		        /* check if we should do a finetune */
 	                int frequency_delta = p->frequency - state->tuner_frequency;
 		        int minmax = p->u.qpsk.symbol_rate / 2000;
@@ -1118,23 +1105,30 @@
 			        // now set them as we want
 			        stv0299_writereg (i2c, 0x22, Drot_freq >> 8);
 			        stv0299_writereg (i2c, 0x23, Drot_freq);
-			        break;
+			} else {
+			        /* A "normal" tune is requested */
+			        pll_set_tv_freq (i2c, p->frequency, state->tuner_type, p->u.qpsk.symbol_rate);
+			        stv0299_writereg (i2c, 0x32, 0x80);
+			        stv0299_writereg (i2c, 0x22, 0x00);
+			        stv0299_writereg (i2c, 0x23, 0x00);
+			        stv0299_writereg (i2c, 0x32, 0x19);
+			        stv0299_set_symbolrate (i2c, p->u.qpsk.symbol_rate, state->tuner_type);
+			        stv0299_set_FEC (i2c, p->u.qpsk.fec_inner);
 			}
+		        break;
+		}
+		    
+		default:
+		        pll_set_tv_freq (i2c, p->frequency, state->tuner_type, p->u.qpsk.symbol_rate);
+		        stv0299_set_FEC (i2c, p->u.qpsk.fec_inner);
+		        stv0299_set_symbolrate (i2c, p->u.qpsk.symbol_rate, state->tuner_type);
+		        stv0299_writereg (i2c, 0x22, 0x00);
+		        stv0299_writereg (i2c, 0x23, 0x00);
+		        stv0299_readreg (i2c, 0x23);
+		        stv0299_writereg (i2c, 0x12, 0xb9);
+		        break;
 		}
 
-	        /* A "normal" tune is requested */
-	        stv0299_writereg (i2c, 0x32, 0x80);
-	        stv0299_writereg (i2c, 0x22, 0x00);
-	        stv0299_writereg (i2c, 0x23, 0x00);
-	        stv0299_writereg (i2c, 0x32, 0x19);
-	        stv0299_set_symbolrate (i2c, p->u.qpsk.symbol_rate, state->tuner_type);
-	        stv0299_set_FEC (i2c, p->u.qpsk.fec_inner);
-	        pll_set_tv_freq (i2c, p->frequency, state->tuner_type, p->u.qpsk.symbol_rate);
-	        dvb_delay(50);
-	        stv0299_writereg (i2c, 0x22, 0x00);
-	        stv0299_writereg (i2c, 0x23, 0x00);
-	        pll_set_tv_freq (i2c, p->frequency, state->tuner_type, p->u.qpsk.symbol_rate);
- 
 	        state->tuner_frequency = p->frequency;
 	        state->fec_inner = p->u.qpsk.fec_inner;
 	        state->symbol_rate = p->u.qpsk.symbol_rate;
@@ -1172,10 +1166,17 @@
 		break;
 
         case FE_INIT:
-	        state->tuner_frequency = 0;
-	        if (!state->initialised) {
-		        state->initialised = 1;
-	                return stv0299_init (i2c, state->tuner_type);
+	        switch(state->tuner_type) {
+		case PHILIPS_SU1278_TSA_TT:
+		        state->tuner_frequency = 0;
+		        if (!state->initialised) {
+			        state->initialised = 1;
+			        return stv0299_init (i2c, state->tuner_type);
+			}
+		        break;
+
+		default:
+		        return stv0299_init (i2c, state->tuner_type);
 		}
 	        break;
 
@@ -1191,7 +1192,21 @@
 	case FE_SET_VOLTAGE:
 		return stv0299_set_voltage (i2c, (fe_sec_voltage_t) arg);
 
-	 default:
+	case FE_GET_TUNE_SETTINGS:
+	{
+	        struct dvb_frontend_tune_settings* fesettings = (struct dvb_frontend_tune_settings*) arg;
+	        fesettings->min_delay_ms = 50;
+	        if (fesettings->parameters.u.qpsk.symbol_rate < 10000000) {
+		        fesettings->step_size = fesettings->parameters.u.qpsk.symbol_rate / 32000;
+		        fesettings->max_drift = 5000;
+		} else {
+		        fesettings->step_size = fesettings->parameters.u.qpsk.symbol_rate / 16000;
+		        fesettings->max_drift = fesettings->parameters.u.qpsk.symbol_rate / 2000;
+		}
+	        return 0;
+	}
+	    
+	default:
 		return -EOPNOTSUPP;
 	};
 
Index: linux/drivers/media/dvb/frontends/ves1820.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/ves1820.c,v
retrieving revision 1.41
diff -a -u -r1.41 ves1820.c
--- linux/drivers/media/dvb/frontends/ves1820.c	1 Mar 2004 22:54:14 -0000	1.41
+++ linux/drivers/media/dvb/frontends/ves1820.c	10 Mar 2004 00:15:05 -0000
@@ -111,8 +111,7 @@
 #endif
 	.caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
 		FE_CAN_QAM_128 | FE_CAN_QAM_256 |
-		FE_CAN_FEC_AUTO | FE_CAN_INVERSION_AUTO |
-		FE_CAN_CLEAN_SETUP
+		FE_CAN_FEC_AUTO | FE_CAN_INVERSION_AUTO,
 };
 
 
Index: linux/drivers/media/dvb/frontends/ves1x93.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/ves1x93.c,v
retrieving revision 1.4
diff -a -u -r1.4 ves1x93.c
--- linux/drivers/media/dvb/frontends/ves1x93.c	16 Jan 2004 14:34:05 -0000	1.4
+++ linux/drivers/media/dvb/frontends/ves1x93.c	10 Mar 2004 00:15:05 -0000
@@ -30,7 +30,8 @@
 #include <linux/slab.h>
 
 #include "dvb_frontend.h"
-
+#include "dvb_functions.h"
+  
 static int debug = 0;
 #define dprintk	if (debug) printk
 
@@ -67,10 +68,10 @@
  */
 
 static u8 init_1893_tab [] = {
-	0x01, 0xa4, 0x35, 0x81, 0x2a, 0x0d, 0x55, 0xc4,
+	0x01, 0xa4, 0x35, 0x80, 0x2a, 0x0b, 0x55, 0xc4,
 	0x09, 0x69, 0x00, 0x86, 0x4c, 0x28, 0x7f, 0x00,
 	0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x80, 0x00, 0x31, 0xb0, 0x14, 0x00, 0xdc, 0x00,
+	0x80, 0x00, 0x21, 0xb0, 0x14, 0x00, 0xdc, 0x00,
 	0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 	0x00, 0x55, 0x00, 0x00, 0x7f, 0x00
@@ -247,8 +248,16 @@
 {
         ves1x93_writereg (i2c, 0, init_1x93_tab[0] & 0xfe);
         ves1x93_writereg (i2c, 0, init_1x93_tab[0]);
+        dvb_delay(5);
+        return 0;
+}
+
+static int ves1x93_init_aquire (struct dvb_i2c_bus *i2c)
+{
         ves1x93_writereg (i2c, 3, 0x00);
-        return ves1x93_writereg (i2c, 3, init_1x93_tab[3]);
+        ves1x93_writereg (i2c, 3, init_1x93_tab[3]);
+        dvb_delay(5);
+        return 0;
 }
 
 
@@ -308,6 +317,12 @@
 	u32 tmp;
 	u32 XIN, FIN;
 
+	u8 sync = ves1x93_readreg (i2c, 0x0e);
+		if (!(sync & 1)){
+			dprintk("No signal");
+			return -1;
+		}	
+
 	dprintk("%s: srate == %d\n", __FUNCTION__, (unsigned int) srate);
 
 	switch (board_type) {
@@ -403,6 +418,35 @@
 }
 
 
+static int ves1x93_afc (struct dvb_i2c_bus *i2c, u32 freq, u32 srate)
+{
+	int afc;
+
+	u8 sync = ves1x93_readreg (i2c, 0x0e);
+
+	if (!(sync & 8)){
+		dprintk("No sync");
+		return -1;
+	}
+
+        afc = ((int)((ves1x93_readreg (i2c, 0x0a) << 1) & 0xff))/2;
+        afc = (afc * (int)(srate/1000/8))/16;
+    
+	if (afc |= 0){
+	
+		freq -= afc;
+
+		tuner_set_tv_freq (i2c, freq, 0);
+
+        	ves1x93_init_aquire (i2c);
+
+        	afc = ((int)((ves1x93_readreg (i2c, 0x0a) << 1) & 0xff))/2;
+		afc = (afc * (int)(srate/1000/8))/16;
+	}
+       
+        return 0;
+}
+
 static int ves1x93_set_voltage (struct dvb_i2c_bus *i2c, fe_sec_voltage_t voltage)
 {
 	switch (voltage) {
@@ -497,6 +541,7 @@
 		ves1x93_set_inversion (i2c, p->inversion);
 		ves1x93_set_fec (i2c, p->u.qpsk.fec_inner);
 		ves1x93_set_symbolrate (i2c, p->u.qpsk.symbol_rate);
+		ves1x93_afc (i2c, p->frequency, p->u.qpsk.symbol_rate);	    
                 break;
         }
 
@@ -530,9 +575,6 @@
         case FE_INIT:
 		return ves1x93_init (i2c);
 
-	case FE_RESET:
-		return ves1x93_clr_bit (i2c);
-
 	case FE_SET_TONE:
 		return -EOPNOTSUPP;  /* the ves1893 can generate the 22k */
 		                     /* let's implement this when we have */
Index: linux/drivers/media/dvb/ttusb-dec/ttusb_dec.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/ttusb-dec/ttusb_dec.c,v
retrieving revision 1.43
diff -a -u -r1.43 ttusb_dec.c
--- linux/drivers/media/dvb/ttusb-dec/ttusb_dec.c	29 Feb 2004 12:25:30 -0000	1.43
+++ linux/drivers/media/dvb/ttusb-dec/ttusb_dec.c	10 Mar 2004 00:15:07 -0000
@@ -1586,10 +1586,6 @@
 		dprintk("%s: FE_INIT\n", __FUNCTION__);
 		break;
 
-	case FE_RESET:
-		dprintk("%s: FE_RESET\n", __FUNCTION__);
-		break;
-
 	default:
 		dprintk("%s: unknown IOCTL (0x%X)\n", __FUNCTION__, cmd);
 		return -EINVAL;
@@ -1701,10 +1697,6 @@
 		dprintk("%s: FE_INIT\n", __FUNCTION__);
 		break;
 
-	case FE_RESET:
-		dprintk("%s: FE_RESET\n", __FUNCTION__);
-		break;
-
 	case FE_DISEQC_SEND_MASTER_CMD:
 		dprintk("%s: FE_DISEQC_SEND_MASTER_CMD\n", __FUNCTION__);
 		break;
Index: linux/include/linux/dvb/frontend.h
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/include/linux/dvb/frontend.h,v
retrieving revision 1.10
diff -a -u -r1.10 frontend.h
--- linux/include/linux/dvb/frontend.h	8 May 2003 13:50:13 -0000	1.10
+++ linux/include/linux/dvb/frontend.h	10 Mar 2004 00:15:07 -0000
@@ -59,9 +59,9 @@
 	FE_CAN_BANDWIDTH_AUTO         = 0x40000,
 	FE_CAN_GUARD_INTERVAL_AUTO    = 0x80000,
 	FE_CAN_HIERARCHY_AUTO         = 0x100000,
-	FE_CAN_RECOVER                = 0x20000000,
-	FE_CAN_CLEAN_SETUP            = 0x40000000,
-	FE_CAN_MUTE_TS                = 0x80000000
+	FE_NEEDS_BENDING              = 0x20000000, // frontend requires frequency bending
+	FE_CAN_RECOVER                = 0x40000000, // frontend can recover from a cable unplug automatically
+	FE_CAN_MUTE_TS                = 0x80000000  // frontend can stop spurious TS data output
 } fe_caps_t;
 
 

Home | Main Index | Thread Index