V4L/DVB (8951): xc5000: dont pass devptr in xc5000_attach()
authorMichael Krufky <mkrufky@linuxtv.org>
Sat, 6 Sep 2008 17:56:58 +0000 (14:56 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sun, 12 Oct 2008 11:37:01 +0000 (09:37 -0200)
Dont pass devptr in xc5000_attach, dont store it in xc5000_priv.
This pointer is passed into the tuner_callback function, which always
expects a pointer to fe->dvb->priv or i2c_adapter->algo_data.

This prevents future possible bugs in new drivers, such as using a "devptr"
other that the standard fe->dvb->priv in a DVB driver.

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/common/tuners/xc5000.h
drivers/media/video/au0828/au0828-dvb.c
drivers/media/video/cx23885/cx23885-dvb.c
drivers/media/video/cx88/cx88-dvb.c
drivers/media/video/tuner-core.c

index 72efc65..ccc4dae 100644 (file)
@@ -59,7 +59,6 @@ struct xc5000_priv {
        u8  video_standard;
        u8  rf_mode;
 
-       void *devptr;
        int  (*tuner_callback) (void *priv, int command, int arg);
 };
 
@@ -234,7 +233,10 @@ static void xc5000_TunerReset(struct dvb_frontend *fe)
        dprintk(1, "%s()\n", __func__);
 
        if (priv->tuner_callback) {
-               ret = priv->tuner_callback(priv->devptr, XC5000_TUNER_RESET, 0);
+               ret = priv->tuner_callback(((fe->dvb) && (fe->dvb->priv)) ?
+                                          fe->dvb->priv :
+                                          priv->i2c_props.adap->algo_data,
+                                          XC5000_TUNER_RESET, 0);
                if (ret)
                        printk(KERN_ERR "xc5000: reset failed\n");
        } else
@@ -950,7 +952,7 @@ static const struct dvb_tuner_ops xc5000_tuner_ops = {
 
 struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
                                   struct i2c_adapter *i2c,
-                                  struct xc5000_config *cfg, void *devptr)
+                                  struct xc5000_config *cfg)
 {
        struct xc5000_priv *priv = NULL;
        int instance;
@@ -972,7 +974,6 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
        case 1:
                /* new tuner instance */
                priv->bandwidth = BANDWIDTH_6_MHZ;
-               priv->devptr = devptr;
                priv->if_khz = cfg->if_khz;
                priv->tuner_callback = cfg->tuner_callback;
 
index 5389f74..fa0321c 100644 (file)
@@ -49,13 +49,11 @@ struct xc5000_config {
     (defined(CONFIG_MEDIA_TUNER_XC5000_MODULE) && defined(MODULE))
 extern struct dvb_frontend* xc5000_attach(struct dvb_frontend *fe,
                                          struct i2c_adapter *i2c,
-                                         struct xc5000_config *cfg,
-                                         void *devptr);
+                                         struct xc5000_config *cfg);
 #else
 static inline struct dvb_frontend* xc5000_attach(struct dvb_frontend *fe,
                                                 struct i2c_adapter *i2c,
-                                                struct xc5000_config *cfg,
-                                                void *devptr)
+                                                struct xc5000_config *cfg)
 {
        printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
        return NULL;
index ba94be7..9624695 100644 (file)
@@ -358,9 +358,8 @@ int au0828_dvb_register(struct au0828_dev *dev)
                                &hauppauge_hvr950q_config,
                                &dev->i2c_adap);
                if (dvb->frontend != NULL)
-                       dvb_attach(xc5000_attach, dvb->frontend,
-                               &dev->i2c_adap,
-                               &hauppauge_hvr950q_tunerconfig, dev);
+                       dvb_attach(xc5000_attach, dvb->frontend, &dev->i2c_adap,
+                                  &hauppauge_hvr950q_tunerconfig);
                break;
        case AU0828_BOARD_HAUPPAUGE_HVR950Q_MXL:
                dvb->frontend = dvb_attach(au8522_attach,
index b85cb39..f462efd 100644 (file)
@@ -390,8 +390,8 @@ static int dvb_register(struct cx23885_tsport *port)
                                                &dev->i2c_bus[0].i2c_adap);
                if (port->dvb.frontend != NULL)
                        dvb_attach(xc5000_attach, port->dvb.frontend,
-                               &i2c_bus->i2c_adap,
-                               &hauppauge_hvr1500q_tunerconfig, port);
+                                  &i2c_bus->i2c_adap,
+                                  &hauppauge_hvr1500q_tunerconfig);
                break;
        case CX23885_BOARD_HAUPPAUGE_HVR1500:
                i2c_bus = &dev->i2c_bus[1];
@@ -471,8 +471,8 @@ static int dvb_register(struct cx23885_tsport *port)
                                                        &i2c_bus->i2c_adap);
                if (port->dvb.frontend != NULL)
                        dvb_attach(xc5000_attach, port->dvb.frontend,
-                               &i2c_bus->i2c_adap,
-                               &dvico_xc5000_tunerconfig, port);
+                                  &i2c_bus->i2c_adap,
+                                  &dvico_xc5000_tunerconfig);
                break;
        case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP: {
                i2c_bus = &dev->i2c_bus[port->nr - 1];
index d96173f..07270b7 100644 (file)
@@ -813,13 +813,9 @@ static int dvb_register(struct cx8802_dev *dev)
                                               &pinnacle_pctv_hd_800i_config,
                                               &core->i2c_adap);
                if (dev->dvb.frontend != NULL) {
-                       /* tuner_config.video_dev must point to
-                        * i2c_adap.algo_data
-                        */
                        if (!dvb_attach(xc5000_attach, dev->dvb.frontend,
                                        &core->i2c_adap,
-                                       &pinnacle_pctv_hd_800i_tuner_config,
-                                       core->i2c_adap.algo_data))
+                                       &pinnacle_pctv_hd_800i_tuner_config))
                                goto frontend_detach;
                }
                break;
@@ -874,13 +870,9 @@ static int dvb_register(struct cx8802_dev *dev)
                                               &dvico_fusionhdtv7_config,
                                               &core->i2c_adap);
                if (dev->dvb.frontend != NULL) {
-                       /* tuner_config.video_dev must point to
-                        * i2c_adap.algo_data
-                        */
                        if (!dvb_attach(xc5000_attach, dev->dvb.frontend,
                                        &core->i2c_adap,
-                                       &dvico_fusionhdtv7_tuner_config,
-                                       core->i2c_adap.algo_data))
+                                       &dvico_fusionhdtv7_tuner_config))
                                goto frontend_detach;
                }
                break;
index d806a35..39c7b9b 100644 (file)
@@ -452,8 +452,7 @@ static void set_type(struct i2c_client *c, unsigned int type,
                xc5000_cfg.if_khz         = 5380;
                xc5000_cfg.tuner_callback = t->tuner_callback;
                if (!dvb_attach(xc5000_attach,
-                               &t->fe, t->i2c->adapter, &xc5000_cfg,
-                               c->adapter->algo_data))
+                               &t->fe, t->i2c->adapter, &xc5000_cfg))
                        goto attach_failed;
 
                xc_tuner_ops = &t->fe.ops.tuner_ops;