]> git.ipfire.org Git - people/arne_f/kernel.git/commitdiff
[PATCH] DVB: fix dvb_pll_attach for mt352/zl10353 in cx88-dvb, and nxt200x
authorMichael Krufky <mkrufky@linuxtv.org>
Sat, 28 Oct 2006 18:53:49 +0000 (14:53 -0400)
committerChris Wright <chrisw@sous-sol.org>
Sat, 4 Nov 2006 01:33:46 +0000 (17:33 -0800)
DVB: fix dvb_pll_attach for mt352/zl10353 in cx88-dvb, and nxt200x

Typical wiring of MT352, ZL10353, NXT2002 and NXT2004 based tuners
differ from dvb-pll's expectation that the PLL is directly accessible.
On these boards, the PLL is actually hidden behind the demodulator, and
as such can only be accessed via the demodulator's interface.  It was
failing to communicate with the PLL during an attach test and
subsequently not connecting the tuner ops.

By passing a NULL I2C bus handle to dvb_pll_attach, this accessibility
check can be bypassed.  Do this for the affected boards.  Also fix a
possible NULL dereference at sleep time, which would otherwise be
exposed by this change.

This patch has been backported to the 2.6.18.y stable kernel series
from the original changesets from Chris Pascoe and Michael Krufky,
already present in the upstream 2.6.19 kernel tree.

Signed-off-by: Chris Pascoe <c.pascoe@itee.uq.edu.au>
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Chris Wright <chrisw@sous-sol.org>
drivers/media/dvb/b2c2/flexcop-fe-tuner.c
drivers/media/dvb/frontends/dvb-pll.c
drivers/media/video/cx88/cx88-dvb.c
drivers/media/video/saa7134/saa7134-dvb.c

index 3be87c72e37b7f6bf13053f3db75a0fd9a4229af..68bb56e4638a090edc93b6bc8d92f59b13b8e961 100644 (file)
@@ -527,7 +527,7 @@ int flexcop_frontend_init(struct flexcop_device *fc)
        /* try the air atsc 2nd generation (nxt2002) */
        if ((fc->fe = nxt200x_attach(&samsung_tbmv_config, &fc->i2c_adap)) != NULL) {
                fc->dev_type          = FC_AIR_ATSC2;
-               dvb_pll_attach(fc->fe, 0x61, &fc->i2c_adap, &dvb_pll_samsung_tbmv);
+               dvb_pll_attach(fc->fe, 0x61, NULL, &dvb_pll_samsung_tbmv);
                info("found the nxt2002 at i2c address: 0x%02x",samsung_tbmv_config.demod_address);
        } else
        /* try the air atsc 3nd generation (lgdt3303) */
index 2be33f27c69fbfb7944140220eb34df815f15034..887d6f420a255d82a120d0916173a04f4d8cbeca 100644 (file)
@@ -493,6 +493,9 @@ static int dvb_pll_sleep(struct dvb_frontend *fe)
        int i;
        int result;
 
+       if (priv->i2c == NULL)
+               return -EINVAL;
+
        for (i = 0; i < priv->pll_desc->count; i++) {
                if (priv->pll_desc->entries[i].limit == 0)
                        break;
index afde3789d702e2f295cc66a4d953b2c028c9ddce..fd3ef4ca61caa844d0efeeb8cc6a498852a0a5dd 100644 (file)
@@ -576,7 +576,7 @@ static int dvb_register(struct cx8802_dev *dev)
                                                 &dev->core->i2c_adap);
                if (dev->dvb.frontend != NULL) {
                        dvb_pll_attach(dev->dvb.frontend, 0x60,
-                                      &dev->core->i2c_adap,
+                                      NULL,
                                       &dvb_pll_thomson_dtt7579);
                        break;
                }
@@ -587,7 +587,7 @@ static int dvb_register(struct cx8802_dev *dev)
                                                   &dev->core->i2c_adap);
                if (dev->dvb.frontend != NULL) {
                        dvb_pll_attach(dev->dvb.frontend, 0x60,
-                                      &dev->core->i2c_adap,
+                                      NULL,
                                       &dvb_pll_thomson_dtt7579);
                }
 #endif
@@ -600,7 +600,7 @@ static int dvb_register(struct cx8802_dev *dev)
                                                 &dev->core->i2c_adap);
                if (dev->dvb.frontend != NULL) {
                        dvb_pll_attach(dev->dvb.frontend, 0x61,
-                                      &dev->core->i2c_adap,
+                                      NULL,
                                       &dvb_pll_thomson_dtt7579);
                        break;
                }
@@ -611,7 +611,7 @@ static int dvb_register(struct cx8802_dev *dev)
                                                   &dev->core->i2c_adap);
                if (dev->dvb.frontend != NULL) {
                        dvb_pll_attach(dev->dvb.frontend, 0x61,
-                                      &dev->core->i2c_adap,
+                                      NULL,
                                       &dvb_pll_thomson_dtt7579);
                }
 #endif
@@ -623,7 +623,7 @@ static int dvb_register(struct cx8802_dev *dev)
                                                 &dev->core->i2c_adap);
                if (dev->dvb.frontend != NULL) {
                        dvb_pll_attach(dev->dvb.frontend, 0x61,
-                                      &dev->core->i2c_adap,
+                                      NULL,
                                       &dvb_pll_lg_z201);
                }
                break;
@@ -634,7 +634,7 @@ static int dvb_register(struct cx8802_dev *dev)
                                                 &dev->core->i2c_adap);
                if (dev->dvb.frontend != NULL) {
                        dvb_pll_attach(dev->dvb.frontend, 0x61,
-                                      &dev->core->i2c_adap,
+                                      NULL,
                                       &dvb_pll_unknown_1);
                }
                break;
@@ -757,7 +757,7 @@ static int dvb_register(struct cx8802_dev *dev)
                                                 &dev->core->i2c_adap);
                if (dev->dvb.frontend != NULL) {
                        dvb_pll_attach(dev->dvb.frontend, 0x61,
-                                      &dev->core->i2c_adap,
+                                      NULL,
                                       &dvb_pll_tuv1236d);
                }
                break;
index 279828b8f299bf45598b92af8d6e4b3f2b9d775d..449fe2301fe2c80181879682489bd98198b60916 100644 (file)
@@ -1158,13 +1158,13 @@ static int dvb_init(struct saa7134_dev *dev)
        case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180:
                dev->dvb.frontend = nxt200x_attach(&avertvhda180, &dev->i2c_adap);
                if (dev->dvb.frontend) {
-                       dvb_pll_attach(dev->dvb.frontend, 0x61, &dev->i2c_adap, &dvb_pll_tdhu2);
+                       dvb_pll_attach(dev->dvb.frontend, 0x61, NULL, &dvb_pll_tdhu2);
                }
                break;
        case SAA7134_BOARD_KWORLD_ATSC110:
                dev->dvb.frontend = nxt200x_attach(&kworldatsc110, &dev->i2c_adap);
                if (dev->dvb.frontend) {
-                       dvb_pll_attach(dev->dvb.frontend, 0x61, &dev->i2c_adap, &dvb_pll_tuv1236d);
+                       dvb_pll_attach(dev->dvb.frontend, 0x61, NULL, &dvb_pll_tuv1236d);
                }
                break;
 #endif