diff options
author | Michael Krufky <mkrufky@linuxtv.org> | 2007-12-21 09:18:32 -0500 |
---|---|---|
committer | Michael Krufky <mkrufky@linuxtv.org> | 2007-12-21 09:18:32 -0500 |
commit | f01ebb1a2e7941c78d70b25337f17029e4a1078a (patch) | |
tree | c9ee94a5ce7d16cec6ca6fbc8990e55dfda67ea5 /linux/drivers/media/video/tuner-core.c | |
parent | 519f4cd6a982745152ab63f44945d12df2748659 (diff) | |
download | mediapointer-dvb-s2-f01ebb1a2e7941c78d70b25337f17029e4a1078a.tar.gz mediapointer-dvb-s2-f01ebb1a2e7941c78d70b25337f17029e4a1078a.tar.bz2 |
include struct analog_demod_ops directly inside struct dvb_frontend
From: Michael Krufky <mkrufky@linuxtv.org>
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>
Diffstat (limited to 'linux/drivers/media/video/tuner-core.c')
-rw-r--r-- | linux/drivers/media/video/tuner-core.c | 99 |
1 files changed, 47 insertions, 52 deletions
diff --git a/linux/drivers/media/video/tuner-core.c b/linux/drivers/media/video/tuner-core.c index deee9b08f..c81e7e581 100644 --- a/linux/drivers/media/video/tuner-core.c +++ b/linux/drivers/media/video/tuner-core.c @@ -172,8 +172,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 @@ -218,7 +216,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, @@ -231,7 +229,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, @@ -243,7 +241,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; } @@ -260,13 +258,13 @@ static void set_tv_freq(struct i2c_client *c, unsigned int freq) } params.frequency = freq; - ops->set_params(&t->fe, ¶ms); + analog_ops->set_params(&t->fe, ¶ms); } 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, @@ -278,7 +276,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; } @@ -295,7 +293,7 @@ static void set_radio_freq(struct i2c_client *c, unsigned int freq) } params.frequency = freq; - ops->set_params(&t->fe, ¶ms); + analog_ops->set_params(&t->fe, ¶ms); } static void set_freq(struct i2c_client *c, unsigned long freq) @@ -366,7 +364,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) { @@ -393,8 +391,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: @@ -464,17 +462,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)); } @@ -662,7 +659,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) { @@ -692,14 +689,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"); } /* ---------------------------------------------------------------------- */ @@ -713,7 +708,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; @@ -722,8 +717,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; @@ -752,7 +747,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); @@ -779,8 +774,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: @@ -848,8 +843,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 @@ -857,8 +852,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 */ @@ -888,8 +884,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; @@ -897,19 +893,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 --- */ @@ -973,8 +968,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) { @@ -995,15 +990,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; @@ -1028,8 +1023,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; } @@ -1262,10 +1257,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); |