diff options
Diffstat (limited to 'linux/drivers')
-rw-r--r-- | linux/drivers/media/dvb/dvb-core/dvb_frontend.c | 6 | ||||
-rw-r--r-- | linux/drivers/media/dvb/dvb-core/dvb_frontend.h | 26 | ||||
-rw-r--r-- | linux/drivers/media/dvb/frontends/tda18271-fe.c | 6 | ||||
-rw-r--r-- | linux/drivers/media/video/tda8290.c | 24 | ||||
-rw-r--r-- | linux/drivers/media/video/tda9887.c | 6 | ||||
-rw-r--r-- | linux/drivers/media/video/tuner-core.c | 100 | ||||
-rw-r--r-- | linux/drivers/media/video/tuner-driver.h | 51 |
7 files changed, 93 insertions, 126 deletions
diff --git a/linux/drivers/media/dvb/dvb-core/dvb_frontend.c b/linux/drivers/media/dvb/dvb-core/dvb_frontend.c index ce24996d8..54cc2637b 100644 --- a/linux/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/linux/drivers/media/dvb/dvb-core/dvb_frontend.c @@ -1213,6 +1213,10 @@ void dvb_frontend_detach(struct dvb_frontend* fe) fe->ops.tuner_ops.release(fe); symbol_put_addr(fe->ops.tuner_ops.release); } + if (fe->ops.analog_ops.release) { + fe->ops.analog_ops.release(fe); + symbol_put_addr(fe->ops.analog_ops.release); + } ptr = (void*)fe->ops.release; if (ptr) { fe->ops.release(fe); @@ -1226,6 +1230,8 @@ void dvb_frontend_detach(struct dvb_frontend* fe) fe->ops.release_sec(fe); if (fe->ops.tuner_ops.release) fe->ops.tuner_ops.release(fe); + if (fe->ops.analog_ops.release) + fe->ops.analog_ops.release(fe); if (fe->ops.release) fe->ops.release(fe); } diff --git a/linux/drivers/media/dvb/dvb-core/dvb_frontend.h b/linux/drivers/media/dvb/dvb-core/dvb_frontend.h index d99fe67ae..fc3213fec 100644 --- a/linux/drivers/media/dvb/dvb-core/dvb_frontend.h +++ b/linux/drivers/media/dvb/dvb-core/dvb_frontend.h @@ -64,8 +64,6 @@ struct dvb_tuner_info { u32 bandwidth_step; }; -struct analog_tuner_ops; - struct analog_parameters { unsigned int frequency; unsigned int mode; @@ -105,6 +103,28 @@ struct dvb_tuner_ops { int (*set_bandwidth)(struct dvb_frontend *fe, u32 bandwidth); }; +struct analog_demod_info { + char *name; +}; + +struct analog_demod_ops { + + struct analog_demod_info info; + + void (*set_params)(struct dvb_frontend *fe, + struct analog_parameters *params); + int (*has_signal)(struct dvb_frontend *fe); + int (*is_stereo)(struct dvb_frontend *fe); + int (*get_afc)(struct dvb_frontend *fe); + void (*tuner_status)(struct dvb_frontend *fe); + void (*standby)(struct dvb_frontend *fe); + void (*release)(struct dvb_frontend *fe); + int (*i2c_gate_ctrl)(struct dvb_frontend *fe, int enable); + + /** This is to allow setting tuner-specific configuration */ + int (*set_config)(struct dvb_frontend *fe, void *priv_cfg); +}; + struct dvb_frontend_ops { struct dvb_frontend_info info; @@ -150,7 +170,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 diff --git a/linux/drivers/media/dvb/frontends/tda18271-fe.c b/linux/drivers/media/dvb/frontends/tda18271-fe.c index 915fb92fb..73d1023ee 100644 --- a/linux/drivers/media/dvb/frontends/tda18271-fe.c +++ b/linux/drivers/media/dvb/frontends/tda18271-fe.c @@ -21,7 +21,6 @@ #include <linux/delay.h> #include "compat.h" #include <linux/videodev2.h> -#include "tuner-driver.h" #include "tda18271.h" #include "tda18271-priv.h" @@ -52,7 +51,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; @@ -76,8 +74,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) diff --git a/linux/drivers/media/video/tda8290.c b/linux/drivers/media/video/tda8290.c index 65a87926e..972fdab96 100644 --- a/linux/drivers/media/video/tda8290.c +++ b/linux/drivers/media/video/tda8290.c @@ -24,7 +24,6 @@ #include <linux/delay.h> #include "compat.h" #include <linux/videodev.h> -#include "tuner-driver.h" #include "tuner-i2c.h" #include "tda8290.h" #include "tda827x.h" @@ -539,16 +538,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; @@ -566,7 +565,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++) { @@ -589,7 +588,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) { @@ -617,7 +616,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; } @@ -662,7 +661,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", }, @@ -673,7 +672,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", }, @@ -705,12 +704,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) @@ -753,7 +754,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); diff --git a/linux/drivers/media/video/tda9887.c b/linux/drivers/media/video/tda9887.c index 8377facca..5962e39c3 100644 --- a/linux/drivers/media/video/tda9887.c +++ b/linux/drivers/media/video/tda9887.c @@ -13,7 +13,6 @@ #endif #include <media/v4l2-common.h> #include <media/tuner.h> -#include "tuner-driver.h" #include "tuner-i2c.h" #include "tda9887.h" @@ -660,7 +659,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", }, @@ -689,7 +688,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; } diff --git a/linux/drivers/media/video/tuner-core.c b/linux/drivers/media/video/tuner-core.c index 73976746b..c81e7e581 100644 --- a/linux/drivers/media/video/tuner-core.c +++ b/linux/drivers/media/video/tuner-core.c @@ -21,7 +21,6 @@ #include <media/tuner-types.h> #include <media/v4l2-common.h> #include <media/v4l2-i2c-drv-legacy.h> -#include "tuner-driver.h" #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) #include "i2c-compat.h" #endif @@ -173,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 @@ -219,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, @@ -232,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, @@ -244,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; } @@ -261,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, @@ -279,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; } @@ -296,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) @@ -367,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) { @@ -394,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: @@ -465,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)); } @@ -663,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) { @@ -693,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"); } /* ---------------------------------------------------------------------- */ @@ -714,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; @@ -723,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; @@ -753,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); @@ -780,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: @@ -849,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 @@ -858,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 */ @@ -889,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; @@ -898,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 --- */ @@ -974,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) { @@ -996,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; @@ -1029,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; } @@ -1263,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); diff --git a/linux/drivers/media/video/tuner-driver.h b/linux/drivers/media/video/tuner-driver.h deleted file mode 100644 index 5eaa30ccb..000000000 --- a/linux/drivers/media/video/tuner-driver.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - tuner-driver.h - interface for different tuners - - Copyright (C) 1997 Markus Schroeder (schroedm@uni-duesseldorf.de) - minor modifications by Ralph Metzler (rjkm@thp.uni-koeln.de) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#ifndef __TUNER_DRIVER_H__ -#define __TUNER_DRIVER_H__ - -#include "dvb_frontend.h" - -extern unsigned const int tuner_count; - -struct analog_demod_info { - char *name; -}; - -struct analog_tuner_ops { - - struct analog_demod_info info; - - void (*set_params)(struct dvb_frontend *fe, - struct analog_parameters *params); - int (*has_signal)(struct dvb_frontend *fe); - int (*is_stereo)(struct dvb_frontend *fe); - int (*get_afc)(struct dvb_frontend *fe); - void (*tuner_status)(struct dvb_frontend *fe); - void (*standby)(struct dvb_frontend *fe); - void (*release)(struct dvb_frontend *fe); - int (*i2c_gate_ctrl)(struct dvb_frontend *fe, int enable); - - /** This is to allow setting tuner-specific configuration */ - int (*set_config)(struct dvb_frontend *fe, void *priv_cfg); -}; - -#endif /* __TUNER_DRIVER_H__ */ |