V4L/DVB (6881): include struct analog_demod_ops directly inside struct dvb_frontend
authorMichael Krufky <mkrufky@linuxtv.org>
Fri, 21 Dec 2007 14:18:32 +0000 (11:18 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Fri, 25 Jan 2008 21:04:11 +0000 (19:04 -0200)
Rather than using a pointer, include struct analog_demod_ops directly
inside struct dvb_frontend.  This will allow us to use dvb_attach in
the future, along with removing the need to check the ops structure
before having to check the pointer to the method being called.

Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/dvb/dvb-core/dvb_frontend.h
drivers/media/dvb/frontends/tda18271-fe.c
drivers/media/video/tda8290.c
drivers/media/video/tda9887.c
drivers/media/video/tuner-core.c

index 417802f83f7e12f23c099e4fd4b714677778c282..aa4133f0bd1911d093b4e386aba4ab0c965f6ba8 100644 (file)
@@ -105,7 +105,7 @@ struct analog_demod_info {
        char *name;
 };
 
-struct analog_tuner_ops {
+struct analog_demod_ops {
 
        struct analog_demod_info info;
 
@@ -168,7 +168,7 @@ struct dvb_frontend_ops {
        int (*ts_bus_ctrl)(struct dvb_frontend* fe, int acquire);
 
        struct dvb_tuner_ops tuner_ops;
-       struct analog_tuner_ops *analog_demod_ops;
+       struct analog_demod_ops analog_ops;
 };
 
 #define MAX_EVENT 8
index 406520f6310c1854c1167fa6af7c6f9375bb0263..3c0f06e1f47dc61524687a7a6a13f840e7a2caec 100644 (file)
@@ -50,7 +50,6 @@ struct tda18271_priv {
 static int tda18271_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
 {
        struct tda18271_priv *priv = fe->tuner_priv;
-       struct analog_tuner_ops *ops = fe->ops.analog_demod_ops;
        enum tda18271_i2c_gate gate;
        int ret = 0;
 
@@ -74,8 +73,8 @@ static int tda18271_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
 
        switch (gate) {
        case TDA18271_GATE_ANALOG:
-               if (ops && ops->i2c_gate_ctrl)
-                       ret = ops->i2c_gate_ctrl(fe, enable);
+               if (fe->ops.analog_ops.i2c_gate_ctrl)
+                       ret = fe->ops.analog_ops.i2c_gate_ctrl(fe, enable);
                break;
        case TDA18271_GATE_DIGITAL:
                if (fe->ops.i2c_gate_ctrl)
index 71d38ba37f2e92c5deb3b21fc4a9d07e8637df32..2e1d9b663a91caad3db0f08a86d39dda3503a2c7 100644 (file)
@@ -512,16 +512,16 @@ static void tda829x_release(struct dvb_frontend *fe)
 static int tda829x_find_tuner(struct dvb_frontend *fe)
 {
        struct tda8290_priv *priv = fe->analog_demod_priv;
-       struct analog_tuner_ops *ops = fe->ops.analog_demod_ops;
+       struct analog_demod_ops *analog_ops = &fe->ops.analog_ops;
        int i, ret, tuners_found;
        u32 tuner_addrs;
        u8 data;
        struct i2c_msg msg = { .flags = I2C_M_RD, .buf = &data, .len = 1 };
 
-       if (NULL == ops)
+       if (NULL == analog_ops->i2c_gate_ctrl)
                return -EINVAL;
 
-       ops->i2c_gate_ctrl(fe, 1);
+       analog_ops->i2c_gate_ctrl(fe, 1);
 
        /* probe for tuner chip */
        tuners_found = 0;
@@ -539,7 +539,7 @@ static int tda829x_find_tuner(struct dvb_frontend *fe)
           give a response now
         */
 
-       ops->i2c_gate_ctrl(fe, 0);
+       analog_ops->i2c_gate_ctrl(fe, 0);
 
        if (tuners_found > 1)
                for (i = 0; i < tuners_found; i++) {
@@ -562,7 +562,7 @@ static int tda829x_find_tuner(struct dvb_frontend *fe)
        priv->tda827x_addr = tuner_addrs;
        msg.addr = tuner_addrs;
 
-       ops->i2c_gate_ctrl(fe, 1);
+       analog_ops->i2c_gate_ctrl(fe, 1);
        ret = i2c_transfer(priv->i2c_props.adap, &msg, 1);
 
        if (ret != 1) {
@@ -590,7 +590,7 @@ static int tda829x_find_tuner(struct dvb_frontend *fe)
        if (fe->ops.tuner_ops.sleep)
                fe->ops.tuner_ops.sleep(fe);
 
-       ops->i2c_gate_ctrl(fe, 0);
+       analog_ops->i2c_gate_ctrl(fe, 0);
 
        return 0;
 }
@@ -635,7 +635,7 @@ static int tda8295_probe(struct tuner_i2c_props *i2c_props)
        return -ENODEV;
 }
 
-static struct analog_tuner_ops tda8290_tuner_ops = {
+static struct analog_demod_ops tda8290_ops = {
        .info           = {
                .name   = "TDA8290",
        },
@@ -646,7 +646,7 @@ static struct analog_tuner_ops tda8290_tuner_ops = {
        .i2c_gate_ctrl  = tda8290_i2c_bridge,
 };
 
-static struct analog_tuner_ops tda8295_tuner_ops = {
+static struct analog_demod_ops tda8295_ops = {
        .info           = {
                .name   = "TDA8295",
        },
@@ -678,12 +678,14 @@ struct dvb_frontend *tda829x_attach(struct dvb_frontend *fe,
 
        if (tda8290_probe(&priv->i2c_props) == 0) {
                priv->ver = TDA8290;
-               fe->ops.analog_demod_ops = &tda8290_tuner_ops;
+               memcpy(&fe->ops.analog_ops, &tda8290_ops,
+                      sizeof(struct analog_demod_ops));
        }
 
        if (tda8295_probe(&priv->i2c_props) == 0) {
                priv->ver = TDA8295;
-               fe->ops.analog_demod_ops = &tda8295_tuner_ops;
+               memcpy(&fe->ops.analog_ops, &tda8295_ops,
+                      sizeof(struct analog_demod_ops));
        }
 
        if (tda829x_find_tuner(fe) < 0)
@@ -723,7 +725,6 @@ struct dvb_frontend *tda829x_attach(struct dvb_frontend *fe,
 
 fail:
        tda829x_release(fe);
-       fe->ops.analog_demod_ops = NULL;
        return NULL;
 }
 EXPORT_SYMBOL_GPL(tda829x_attach);
index 1b017d52bfb5f19d0642d3e4200a7106f8a89329..d3aabe2d146b3124c05c54bec0325b4c97c8d605 100644 (file)
@@ -648,7 +648,7 @@ static void tda9887_release(struct dvb_frontend *fe)
        fe->analog_demod_priv = NULL;
 }
 
-static struct analog_tuner_ops tda9887_tuner_ops = {
+static struct analog_demod_ops tda9887_ops = {
        .info           = {
                .name   = "TDA9887",
        },
@@ -677,7 +677,8 @@ struct dvb_frontend *tda9887_attach(struct dvb_frontend *fe,
 
        tuner_info("tda988[5/6/7] found\n");
 
-       fe->ops.analog_demod_ops = &tda9887_tuner_ops;
+       memcpy(&fe->ops.analog_ops, &tda9887_ops,
+              sizeof(struct analog_demod_ops));
 
        return fe;
 }
index ad20af84809dfd1463306f3157a1cbd0f6b6a101..f792871582ff16566666234f3ece760e2a9059ce 100644 (file)
@@ -143,8 +143,6 @@ static void fe_release(struct dvb_frontend *fe)
        if (fe->ops.tuner_ops.release)
                fe->ops.tuner_ops.release(fe);
 
-       fe->ops.analog_demod_ops = NULL;
-
        /* DO NOT kfree(fe->analog_demod_priv)
         *
         * If we are in this function, analog_demod_priv contains a pointer
@@ -189,7 +187,7 @@ static int fe_set_config(struct dvb_frontend *fe, void *priv_cfg)
 
 static void tuner_status(struct dvb_frontend *fe);
 
-static struct analog_tuner_ops tuner_core_ops = {
+static struct analog_demod_ops tuner_core_ops = {
        .set_params     = fe_set_params,
        .standby        = fe_standby,
        .release        = fe_release,
@@ -202,7 +200,7 @@ static struct analog_tuner_ops tuner_core_ops = {
 static void set_tv_freq(struct i2c_client *c, unsigned int freq)
 {
        struct tuner *t = i2c_get_clientdata(c);
-       struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
+       struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
 
        struct analog_parameters params = {
                .mode      = t->mode,
@@ -214,7 +212,7 @@ static void set_tv_freq(struct i2c_client *c, unsigned int freq)
                tuner_warn ("tuner type not set\n");
                return;
        }
-       if ((NULL == ops) || (NULL == ops->set_params)) {
+       if (NULL == analog_ops->set_params) {
                tuner_warn ("Tuner has no way to set tv freq\n");
                return;
        }
@@ -231,13 +229,13 @@ static void set_tv_freq(struct i2c_client *c, unsigned int freq)
        }
        params.frequency = freq;
 
-       ops->set_params(&t->fe, &params);
+       analog_ops->set_params(&t->fe, &params);
 }
 
 static void set_radio_freq(struct i2c_client *c, unsigned int freq)
 {
        struct tuner *t = i2c_get_clientdata(c);
-       struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
+       struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
 
        struct analog_parameters params = {
                .mode      = t->mode,
@@ -249,7 +247,7 @@ static void set_radio_freq(struct i2c_client *c, unsigned int freq)
                tuner_warn ("tuner type not set\n");
                return;
        }
-       if ((NULL == ops) || (NULL == ops->set_params)) {
+       if (analog_ops->set_params) {
                tuner_warn ("tuner has no way to set radio frequency\n");
                return;
        }
@@ -266,7 +264,7 @@ static void set_radio_freq(struct i2c_client *c, unsigned int freq)
        }
        params.frequency = freq;
 
-       ops->set_params(&t->fe, &params);
+       analog_ops->set_params(&t->fe, &params);
 }
 
 static void set_freq(struct i2c_client *c, unsigned long freq)
@@ -337,7 +335,7 @@ static void set_type(struct i2c_client *c, unsigned int type,
 {
        struct tuner *t = i2c_get_clientdata(c);
        struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
-       struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
+       struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
        unsigned char buffer[4];
 
        if (type == UNSET || type == TUNER_ABSENT) {
@@ -364,8 +362,8 @@ static void set_type(struct i2c_client *c, unsigned int type,
        }
 
        /* discard private data, in case set_type() was previously called */
-       if (ops && ops->release)
-               ops->release(&t->fe);
+       if (analog_ops->release)
+               analog_ops->release(&t->fe);
 
        switch (t->type) {
        case TUNER_MT2032:
@@ -435,17 +433,16 @@ static void set_type(struct i2c_client *c, unsigned int type,
                break;
        }
 
-       ops = t->fe.ops.analog_demod_ops;
-
-       if (((NULL == ops) || (NULL == ops->set_params)) &&
+       if ((NULL == analog_ops->set_params) &&
            (fe_tuner_ops->set_analog_params)) {
                strlcpy(t->i2c->name, fe_tuner_ops->info.name,
                        sizeof(t->i2c->name));
 
-               t->fe.ops.analog_demod_ops = &tuner_core_ops;
                t->fe.analog_demod_priv = t;
+               memcpy(analog_ops, &tuner_core_ops,
+                      sizeof(struct analog_demod_ops));
        } else {
-               strlcpy(t->i2c->name, ops->info.name,
+               strlcpy(t->i2c->name, analog_ops->info.name,
                        sizeof(t->i2c->name));
        }
 
@@ -624,7 +621,7 @@ static void tuner_status(struct dvb_frontend *fe)
        struct tuner *t = fe->analog_demod_priv;
        unsigned long freq, freq_fraction;
        struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
-       struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
+       struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
        const char *p;
 
        switch (t->mode) {
@@ -654,14 +651,12 @@ static void tuner_status(struct dvb_frontend *fe)
                if (tuner_status & TUNER_STATUS_STEREO)
                        tuner_info("Stereo:          yes\n");
        }
-       if (ops) {
-               if (ops->has_signal)
-                       tuner_info("Signal strength: %d\n",
-                                  ops->has_signal(fe));
-               if (ops->is_stereo)
-                       tuner_info("Stereo:          %s\n",
-                                  ops->is_stereo(fe) ? "yes" : "no");
-       }
+       if (analog_ops->has_signal)
+               tuner_info("Signal strength: %d\n",
+                          analog_ops->has_signal(fe));
+       if (analog_ops->is_stereo)
+               tuner_info("Stereo:          %s\n",
+                          analog_ops->is_stereo(fe) ? "yes" : "no");
 }
 
 /* ---------------------------------------------------------------------- */
@@ -675,7 +670,7 @@ static void tuner_status(struct dvb_frontend *fe)
 
 static inline int set_mode(struct i2c_client *client, struct tuner *t, int mode, char *cmd)
 {
-       struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
+       struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
 
        if (mode == t->mode)
                return 0;
@@ -684,8 +679,8 @@ static inline int set_mode(struct i2c_client *client, struct tuner *t, int mode,
 
        if (check_mode(t, cmd) == EINVAL) {
                t->mode = T_STANDBY;
-               if (ops && ops->standby)
-                       ops->standby(&t->fe);
+               if (analog_ops->standby)
+                       analog_ops->standby(&t->fe);
                return EINVAL;
        }
        return 0;
@@ -708,7 +703,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
 {
        struct tuner *t = i2c_get_clientdata(client);
        struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
-       struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
+       struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
 
        if (tuner_debug>1)
                v4l_i2c_print_ioctl(client,cmd);
@@ -735,8 +730,8 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
                if (check_mode(t, "TUNER_SET_STANDBY") == EINVAL)
                        return 0;
                t->mode = T_STANDBY;
-               if (ops && ops->standby)
-                       ops->standby(&t->fe);
+               if (analog_ops->standby)
+                       analog_ops->standby(&t->fe);
                break;
 #ifdef CONFIG_VIDEO_V4L1
        case VIDIOCSAUDIO:
@@ -804,8 +799,8 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
                                        else
                                                vt->flags &= ~VIDEO_TUNER_STEREO_ON;
                                } else {
-                                       if (ops && ops->is_stereo) {
-                                               if (ops->is_stereo(&t->fe))
+                                       if (analog_ops->is_stereo) {
+                                               if (analog_ops->is_stereo(&t->fe))
                                                        vt->flags |=
                                                                VIDEO_TUNER_STEREO_ON;
                                                else
@@ -813,8 +808,9 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
                                                                ~VIDEO_TUNER_STEREO_ON;
                                        }
                                }
-                               if (ops && ops->has_signal)
-                                       vt->signal = ops->has_signal(&t->fe);
+                               if (analog_ops->has_signal)
+                                       vt->signal =
+                                               analog_ops->has_signal(&t->fe);
 
                                vt->flags |= VIDEO_TUNER_LOW;   /* Allow freqs at 62.5 Hz */
 
@@ -844,8 +840,8 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
                                        fe_tuner_ops->get_status(&t->fe, &tuner_status);
                                        va->mode = (tuner_status & TUNER_STATUS_STEREO)
                                            ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO;
-                               } else if (ops && ops->is_stereo)
-                                       va->mode = ops->is_stereo(&t->fe)
+                               } else if (analog_ops->is_stereo)
+                                       va->mode = analog_ops->is_stereo(&t->fe)
                                            ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO;
                        }
                        return 0;
@@ -853,19 +849,18 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
 #endif
        case TUNER_SET_CONFIG:
        {
-               struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
                struct v4l2_priv_tun_config *cfg = arg;
 
                if (t->type != cfg->tuner)
                        break;
 
-               if ((NULL == ops) || (NULL == ops->set_config)) {
+               if (analog_ops->set_config) {
                        tuner_warn("Tuner frontend module has no way to "
                                   "set config\n");
                        break;
                }
 
-               ops->set_config(&t->fe, cfg->priv);
+               analog_ops->set_config(&t->fe, cfg->priv);
                break;
        }
        /* --- v4l ioctls --- */
@@ -929,8 +924,8 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
                        switch_v4l2();
 
                        tuner->type = t->mode;
-                       if (ops && ops->get_afc)
-                               tuner->afc = ops->get_afc(&t->fe);
+                       if (analog_ops->get_afc)
+                               tuner->afc = analog_ops->get_afc(&t->fe);
                        if (t->mode == V4L2_TUNER_ANALOG_TV)
                                tuner->capability |= V4L2_TUNER_CAP_NORM;
                        if (t->mode != V4L2_TUNER_RADIO) {
@@ -951,15 +946,15 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
                                        V4L2_TUNER_SUB_STEREO :
                                        V4L2_TUNER_SUB_MONO;
                        } else {
-                               if (ops && ops->is_stereo) {
+                               if (analog_ops->is_stereo) {
                                        tuner->rxsubchans =
-                                               ops->is_stereo(&t->fe) ?
+                                               analog_ops->is_stereo(&t->fe) ?
                                                V4L2_TUNER_SUB_STEREO :
                                                V4L2_TUNER_SUB_MONO;
                                }
                        }
-                       if (ops && ops->has_signal)
-                               tuner->signal = ops->has_signal(&t->fe);
+                       if (analog_ops->has_signal)
+                               tuner->signal = analog_ops->has_signal(&t->fe);
                        tuner->capability |=
                            V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_STEREO;
                        tuner->audmode = t->audmode;
@@ -984,8 +979,8 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
                        break;
                }
        case VIDIOC_LOG_STATUS:
-               if (ops && ops->tuner_status)
-                       ops->tuner_status(&t->fe);
+               if (analog_ops->tuner_status)
+                       analog_ops->tuner_status(&t->fe);
                break;
        }
 
@@ -1214,10 +1209,10 @@ static int tuner_legacy_probe(struct i2c_adapter *adap)
 static int tuner_remove(struct i2c_client *client)
 {
        struct tuner *t = i2c_get_clientdata(client);
-       struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
+       struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
 
-       if (ops && ops->release)
-               ops->release(&t->fe);
+       if (analog_ops->release)
+               analog_ops->release(&t->fe);
 
        list_del(&t->list);
        kfree(t);