diff mbox

dib0700 i2c problem / mt2266 patch

Message ID 4AB0ED11.3090205@stud.uni-hannover.de (mailing list archive)
State RFC
Headers show

Commit Message

Soeren.Moch@stud.uni-hannover.de Sept. 16, 2009, 1:50 p.m. UTC
Patrick,

when you are discussing dib0700 issues with dibcom, there is an
additional one for the list:
When using dib0700 in dual mode (on my nova-td stick), from
time to time a tuner hangs up. I never observed this behavior in
single mode. It seems to me that there is no proper locking within
the dib0700 firmware when accessing both tuner i2c buses
"simultaneously".

Since I only need UHF channels, I use the attached patch to decrease
the number of i2c transactions and tuner registers, which are involved
in the channel switch. This solved the tuning problems.

Besides the i2c problem, maybe it might be a good idea to integrate
this patch into the mt2266 driver anyway, because it considerably
speeds up the channel switch.

Regards,
S:oren
diff mbox

Patch

--- drivers/media/common/tuners/mt2266.c.orig	2009-06-29 22:11:08.000000000 +0200
+++ drivers/media/common/tuners/mt2266.c	2009-06-29 22:21:01.000000000 +0200
@@ -137,7 +137,6 @@  static int mt2266_set_params(struct dvb_
 	freq = params->frequency / 1000; // Hz -> kHz
 	if (freq < 470000 && freq > 230000)
 		return -EINVAL; /* Gap between VHF and UHF bands */
-	priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->u.ofdm.bandwidth : 0;
 	priv->frequency = freq * 1000;
 
 	tune = 2 * freq * (8192/16) / (FREF/16);
@@ -145,21 +144,24 @@  static int mt2266_set_params(struct dvb_
 	if (band == MT2266_VHF)
 		tune *= 2;
 
-	switch (params->u.ofdm.bandwidth) {
-	case BANDWIDTH_6_MHZ:
-		mt2266_writeregs(priv, mt2266_init_6mhz,
-				 sizeof(mt2266_init_6mhz));
-		break;
-	case BANDWIDTH_7_MHZ:
-		mt2266_writeregs(priv, mt2266_init_7mhz,
-				 sizeof(mt2266_init_7mhz));
-		break;
-	case BANDWIDTH_8_MHZ:
-	default:
-		mt2266_writeregs(priv, mt2266_init_8mhz,
-				 sizeof(mt2266_init_8mhz));
-		break;
-	}
+        if (priv->bandwidth != params->u.ofdm.bandwidth) {
+          priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->u.ofdm.bandwidth : 0;
+          switch (params->u.ofdm.bandwidth) {
+          case BANDWIDTH_6_MHZ:
+            mt2266_writeregs(priv, mt2266_init_6mhz,
+                             sizeof(mt2266_init_6mhz));
+            break;
+          case BANDWIDTH_7_MHZ:
+            mt2266_writeregs(priv, mt2266_init_7mhz,
+                             sizeof(mt2266_init_7mhz));
+            break;
+          case BANDWIDTH_8_MHZ:
+          default:
+            mt2266_writeregs(priv, mt2266_init_8mhz,
+                             sizeof(mt2266_init_8mhz));
+            break;
+          }
+        }
 
 	if (band == MT2266_VHF && priv->band == MT2266_UHF) {
 		dprintk("Switch from UHF to VHF");
@@ -327,6 +329,7 @@  struct dvb_frontend * mt2266_attach(stru
 
 	priv->cfg      = cfg;
 	priv->i2c      = i2c;
+	priv->bandwidth= BANDWIDTH_8_MHZ;
 	priv->band     = MT2266_UHF;
 
 	if (mt2266_readreg(priv, 0, &id)) {