V4L/DVB (11059): xc5000: fix bug for hybrid xc5000 devices with IF other than 5380
authorDevin Heitmueller <dheitmueller@linuxtv.org>
Wed, 11 Mar 2009 05:58:53 +0000 (02:58 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 30 Mar 2009 15:43:24 +0000 (12:43 -0300)
The xc5000 driver has a bug where the IF is always set to whatever the first
caller to dvb_attach() provides.  This fails when the device requires an IF
other than 5380 and the analog driver is loaded first through tuner-core
(which always supplies the hard-coded value of 5380).

Thanks to Michael Krufky <mkrufky@linuxtv.org> and Steven Toth
<stoth@linuxtv.org> for providing sample hardware, engineering level support,
and testing.

Signed-off-by: Devin Heitmueller <dheitmueller@linuxtv.org>
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/common/tuners/xc5000.c
drivers/media/video/tuner-core.c

index ef4bdf2315f14de8ba53e6497912d4acf7c89e67..b54598550dc43da789cc7b6fdbc6acf3792aa5c8 100644 (file)
@@ -973,8 +973,6 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
        case 1:
                /* new tuner instance */
                priv->bandwidth = BANDWIDTH_6_MHZ;
-               priv->if_khz = cfg->if_khz;
-
                fe->tuner_priv = priv;
                break;
        default:
@@ -983,6 +981,13 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
                break;
        }
 
+       if (priv->if_khz == 0) {
+               /* If the IF hasn't been set yet, use the value provided by
+                  the caller (occurs in hybrid devices where the analog
+                  call to xc5000_attach occurs before the digital side) */
+               priv->if_khz = cfg->if_khz;
+       }
+
        /* Check if firmware has been loaded. It is possible that another
           instance of the driver has loaded the firmware.
         */
index 30640fbfd0f921ad0734eb939a533bfea1e7fc0e..2a957e2beabf9b585823a6d5f33b494d5a1646cb 100644 (file)
@@ -452,7 +452,8 @@ static void set_type(struct i2c_client *c, unsigned int type,
                struct dvb_tuner_ops *xc_tuner_ops;
 
                xc5000_cfg.i2c_address    = t->i2c->addr;
-               xc5000_cfg.if_khz         = 5380;
+               /* if_khz will be set when the digital dvb_attach() occurs */
+               xc5000_cfg.if_khz         = 0;
                if (!dvb_attach(xc5000_attach,
                                &t->fe, t->i2c->adapter, &xc5000_cfg))
                        goto attach_failed;