V4L/DVB (12578): tda18271: allow drivers to request RF tracking filter calibration...
authorMichael Krufky <mkrufky@kernellabs.com>
Thu, 27 Aug 2009 19:58:06 +0000 (16:58 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 12 Sep 2009 15:19:37 +0000 (12:19 -0300)
On certain master / slave dual tuner configurations, tuning performance
improves when the RF tracking filter calibration is performed sequentially.

This patch allows for the bridge driver to specify this behavior in the
configuration structure at attach-time.

The "cal" module option will continue to override this attach-time
configuration: set cal=0 to prevent RF tracking filter calibration
on startup, and set cal=1 to force it.

Signed-off-by: Michael Krufky <mkrufky@kernellabs.com>
Reviewed-by: Steven Toth <stoth@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/common/tuners/tda18271-fe.c
drivers/media/common/tuners/tda18271.h

index b10935630154f94b4845c15f4abf314cdf9eb4ee..bc4b004ba7dbed45f3a07ff0ef4d4411fa159737 100644 (file)
@@ -27,7 +27,7 @@ module_param_named(debug, tda18271_debug, int, 0644);
 MODULE_PARM_DESC(debug, "set debug level "
                 "(info=1, map=2, reg=4, adv=8, cal=16 (or-able))");
 
-static int tda18271_cal_on_startup;
+static int tda18271_cal_on_startup = -1;
 module_param_named(cal, tda18271_cal_on_startup, int, 0644);
 MODULE_PARM_DESC(cal, "perform RF tracking filter calibration on startup");
 
@@ -1192,10 +1192,25 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
        case 0:
                goto fail;
        case 1:
+       {
                /* new tuner instance */
+               int rf_cal_on_startup;
+
                priv->gate = (cfg) ? cfg->gate : TDA18271_GATE_AUTO;
                priv->role = (cfg) ? cfg->role : TDA18271_MASTER;
                priv->config = (cfg) ? cfg->config : 0;
+
+               /* tda18271_cal_on_startup == -1 when cal
+                * module option is unset */
+               if (tda18271_cal_on_startup == -1) {
+                       /* honor attach-time configuration */
+                       rf_cal_on_startup =
+                               ((cfg) && (cfg->rf_cal_on_startup)) ? 1 : 0;
+               } else {
+                       /* module option overrides attach configuration */
+                       rf_cal_on_startup = tda18271_cal_on_startup;
+               }
+
                priv->cal_initialized = false;
                mutex_init(&priv->lock);
 
@@ -1213,11 +1228,12 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
                mutex_lock(&priv->lock);
                tda18271_init_regs(fe);
 
-               if ((tda18271_cal_on_startup) && (priv->id == TDA18271HDC2))
+               if ((rf_cal_on_startup) && (priv->id == TDA18271HDC2))
                        tda18271c2_rf_cal_init(fe);
 
                mutex_unlock(&priv->lock);
                break;
+       }
        default:
                /* existing tuner instance */
                fe->tuner_priv = priv;
index 53a9892a18d0fd6ca7c19bf0b1979a7a26155d4e..71bac9593f1ea9246b64a3eb178fca0342fe3d83 100644 (file)
@@ -77,6 +77,9 @@ struct tda18271_config {
        /* use i2c gate provided by analog or digital demod */
        enum tda18271_i2c_gate gate;
 
+       /* force rf tracking filter calibration on startup */
+       unsigned int rf_cal_on_startup:1;
+
        /* some i2c providers cant write all 39 registers at once */
        unsigned int small_i2c:1;