Commit 4e9154b8 authored by Michael Krufky's avatar Michael Krufky Committed by Mauro Carvalho Chehab

V4L/DVB (6440): tuner: convert analog tuner demod sub-modules to dvb_frontend interface

Convert tda9887 and tda8290/5 to dvb_frontend interface
Signed-off-by: default avatarMichael Krufky <mkrufky@linuxtv.org>
Reviewed-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 482b498d
This diff is collapsed.
......@@ -21,17 +21,19 @@
*/
#define tda9887_info(fmt, arg...) do {\
printk(KERN_INFO "%s %d-%04x: " fmt, t->i2c.name, \
i2c_adapter_id(t->i2c.adapter), t->i2c.addr , ##arg); } while (0)
printk(KERN_INFO "%s %d-%04x: " fmt, priv->t->i2c.name, \
i2c_adapter_id(priv->t->i2c.adapter), priv->t->i2c.addr , ##arg); } while (0)
#define tda9887_dbg(fmt, arg...) do {\
if (tuner_debug) \
printk(KERN_INFO "%s %d-%04x: " fmt, t->i2c.name, \
i2c_adapter_id(t->i2c.adapter), t->i2c.addr , ##arg); } while (0)
printk(KERN_INFO "%s %d-%04x: " fmt, priv->t->i2c.name, \
i2c_adapter_id(priv->t->i2c.adapter), priv->t->i2c.addr , ##arg); } while (0)
struct tda9887_priv {
struct tuner_i2c_props i2c_props;
unsigned char data[4];
struct tuner *t;
};
/* ---------------------------------------------------------------------- */
......@@ -262,8 +264,10 @@ static struct tvnorm radio_mono = {
/* ---------------------------------------------------------------------- */
static void dump_read_message(struct tuner *t, unsigned char *buf)
static void dump_read_message(struct dvb_frontend *fe, unsigned char *buf)
{
struct tda9887_priv *priv = fe->analog_demod_priv;
static char *afc[16] = {
"- 12.5 kHz",
"- 37.5 kHz",
......@@ -290,8 +294,10 @@ static void dump_read_message(struct tuner *t, unsigned char *buf)
tda9887_info(" vfi level : %s\n", (buf[0] & 0x80) ? "high" : "low");
}
static void dump_write_message(struct tuner *t, unsigned char *buf)
static void dump_write_message(struct dvb_frontend *fe, unsigned char *buf)
{
struct tda9887_priv *priv = fe->analog_demod_priv;
static char *sound[4] = {
"AM/TV",
"FM/radio",
......@@ -386,9 +392,12 @@ static void dump_write_message(struct tuner *t, unsigned char *buf)
/* ---------------------------------------------------------------------- */
static int tda9887_set_tvnorm(struct tuner *t, char *buf)
static int tda9887_set_tvnorm(struct dvb_frontend *fe)
{
struct tda9887_priv *priv = fe->analog_demod_priv;
struct tuner *t = priv->t;
struct tvnorm *norm = NULL;
char *buf = priv->data;
int i;
if (t->mode == V4L2_TUNER_RADIO) {
......@@ -426,8 +435,11 @@ module_param(port2, int, 0644);
module_param(qss, int, 0644);
module_param(adjust, int, 0644);
static int tda9887_set_insmod(struct tuner *t, char *buf)
static int tda9887_set_insmod(struct dvb_frontend *fe)
{
struct tda9887_priv *priv = fe->analog_demod_priv;
char *buf = priv->data;
if (UNSET != port1) {
if (port1)
buf[1] |= cOutputPort1Inactive;
......@@ -455,8 +467,12 @@ static int tda9887_set_insmod(struct tuner *t, char *buf)
return 0;
}
static int tda9887_set_config(struct tuner *t, char *buf)
static int tda9887_set_config(struct dvb_frontend *fe)
{
struct tda9887_priv *priv = fe->analog_demod_priv;
struct tuner *t = priv->t;
char *buf = priv->data;
if (t->tda9887_config & TDA9887_PORT1_ACTIVE)
buf[1] &= ~cOutputPort1Inactive;
if (t->tda9887_config & TDA9887_PORT1_INACTIVE)
......@@ -510,26 +526,27 @@ static int tda9887_set_config(struct tuner *t, char *buf)
/* ---------------------------------------------------------------------- */
static int tda9887_status(struct tuner *t)
static int tda9887_status(struct dvb_frontend *fe)
{
struct tda9887_priv *priv = t->fe.analog_demod_priv;
struct tda9887_priv *priv = fe->analog_demod_priv;
unsigned char buf[1];
int rc;
memset(buf,0,sizeof(buf));
if (1 != (rc = tuner_i2c_xfer_recv(&priv->i2c_props,buf,1)))
tda9887_info("i2c i/o error: rc == %d (should be 1)\n",rc);
dump_read_message(t, buf);
dump_read_message(fe, buf);
return 0;
}
static void tda9887_configure(struct tuner *t)
static void tda9887_configure(struct dvb_frontend *fe)
{
struct tda9887_priv *priv = t->fe.analog_demod_priv;
struct tda9887_priv *priv = fe->analog_demod_priv;
struct tuner *t = priv->t;
int rc;
memset(priv->data,0,sizeof(priv->data));
tda9887_set_tvnorm(t,priv->data);
tda9887_set_tvnorm(fe);
/* A note on the port settings:
These settings tend to depend on the specifics of the board.
......@@ -547,8 +564,8 @@ static void tda9887_configure(struct tuner *t)
priv->data[1] |= cOutputPort1Inactive;
priv->data[1] |= cOutputPort2Inactive;
tda9887_set_config(t,priv->data);
tda9887_set_insmod(t,priv->data);
tda9887_set_config(fe);
tda9887_set_insmod(fe);
if (t->mode == T_STANDBY) {
priv->data[1] |= cForcedMuteAudioON;
......@@ -557,28 +574,28 @@ static void tda9887_configure(struct tuner *t)
tda9887_dbg("writing: b=0x%02x c=0x%02x e=0x%02x\n",
priv->data[1],priv->data[2],priv->data[3]);
if (tuner_debug > 1)
dump_write_message(t, priv->data);
dump_write_message(fe, priv->data);
if (4 != (rc = tuner_i2c_xfer_send(&priv->i2c_props,priv->data,4)))
tda9887_info("i2c i/o error: rc == %d (should be 4)\n",rc);
if (tuner_debug > 2) {
msleep_interruptible(1000);
tda9887_status(t);
tda9887_status(fe);
}
}
/* ---------------------------------------------------------------------- */
static void tda9887_tuner_status(struct tuner *t)
static void tda9887_tuner_status(struct dvb_frontend *fe)
{
struct tda9887_priv *priv = t->fe.analog_demod_priv;
struct tda9887_priv *priv = fe->analog_demod_priv;
tda9887_info("Data bytes: b=0x%02x c=0x%02x e=0x%02x\n", priv->data[1], priv->data[2], priv->data[3]);
}
static int tda9887_get_afc(struct tuner *t)
static int tda9887_get_afc(struct dvb_frontend *fe)
{
struct tda9887_priv *priv = t->fe.analog_demod_priv;
struct tda9887_priv *priv = fe->analog_demod_priv;
static int AFC_BITS_2_kHz[] = {
-12500, -37500, -62500, -97500,
-112500, -137500, -162500, -187500,
......@@ -594,20 +611,20 @@ static int tda9887_get_afc(struct tuner *t)
return afc;
}
static void tda9887_standby(struct tuner *t)
static void tda9887_standby(struct dvb_frontend *fe)
{
tda9887_configure(t);
tda9887_configure(fe);
}
static void tda9887_set_freq(struct tuner *t, unsigned int freq)
static void tda9887_set_freq(struct dvb_frontend *fe, unsigned int freq)
{
tda9887_configure(t);
tda9887_configure(fe);
}
static void tda9887_release(struct tuner *t)
static void tda9887_release(struct dvb_frontend *fe)
{
kfree(t->fe.analog_demod_priv);
t->fe.analog_demod_priv = NULL;
kfree(fe->analog_demod_priv);
fe->analog_demod_priv = NULL;
}
static struct analog_tuner_ops tda9887_tuner_ops = {
......@@ -630,6 +647,7 @@ int tda9887_tuner_init(struct tuner *t)
priv->i2c_props.addr = t->i2c.addr;
priv->i2c_props.adap = t->i2c.adapter;
priv->t = t;
strlcpy(t->i2c.name, "tda9887", sizeof(t->i2c.name));
......
......@@ -77,9 +77,10 @@ static struct i2c_client client_template;
/* ---------------------------------------------------------------------- */
static void fe_set_freq(struct tuner *t, unsigned int freq)
static void fe_set_freq(struct dvb_frontend *fe, unsigned int freq)
{
struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
struct tuner *t = fe->analog_demod_priv;
struct analog_parameters params = {
.frequency = freq,
......@@ -92,39 +93,38 @@ static void fe_set_freq(struct tuner *t, unsigned int freq)
tuner_warn("Tuner frontend module has no way to set freq\n");
return;
}
fe_tuner_ops->set_analog_params(&t->fe, &params);
fe_tuner_ops->set_analog_params(fe, &params);
}
static void fe_release(struct tuner *t)
static void fe_release(struct dvb_frontend *fe)
{
struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
if (fe_tuner_ops->release)
fe_tuner_ops->release(&t->fe);
if (fe->ops.tuner_ops.release)
fe->ops.tuner_ops.release(fe);
t->fe.ops.analog_demod_ops = NULL;
fe->ops.analog_demod_ops = NULL;
/* DO NOT kfree(t->fe.analog_demod_priv) */
fe->analog_demod_priv = NULL;
}
static void fe_standby(struct tuner *t)
static void fe_standby(struct dvb_frontend *fe)
{
struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
if (fe_tuner_ops->sleep)
fe_tuner_ops->sleep(&t->fe);
fe_tuner_ops->sleep(fe);
}
static int fe_has_signal(struct tuner *t)
static int fe_has_signal(struct dvb_frontend *fe)
{
struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
u16 strength = 0;
if (fe_tuner_ops->get_rf_strength)
fe_tuner_ops->get_rf_strength(&t->fe, &strength);
if (fe->ops.tuner_ops.get_rf_strength)
fe->ops.tuner_ops.get_rf_strength(fe, &strength);
return strength;
}
static void tuner_status(struct tuner *t);
static void tuner_status(struct dvb_frontend *fe);
static struct analog_tuner_ops tuner_core_ops = {
.set_tv_freq = fe_set_freq,
......@@ -160,7 +160,7 @@ static void set_tv_freq(struct i2c_client *c, unsigned int freq)
else
freq = tv_range[1] * 16;
}
ops->set_tv_freq(t, freq);
ops->set_tv_freq(&t->fe, freq);
}
static void set_radio_freq(struct i2c_client *c, unsigned int freq)
......@@ -188,7 +188,7 @@ static void set_radio_freq(struct i2c_client *c, unsigned int freq)
freq = radio_range[1] * 16000;
}
ops->set_radio_freq(t, freq);
ops->set_radio_freq(&t->fe, freq);
}
static void set_freq(struct i2c_client *c, unsigned long freq)
......@@ -279,7 +279,7 @@ 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);
ops->release(&t->fe);
switch (t->type) {
case TUNER_MT2032:
......@@ -359,6 +359,7 @@ static void set_type(struct i2c_client *c, unsigned int type,
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;
}
tuner_info("type set to %s\n", t->i2c.name);
......@@ -531,8 +532,9 @@ static int tuner_fixup_std(struct tuner *t)
return 0;
}
static void tuner_status(struct tuner *t)
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;
......@@ -566,10 +568,11 @@ static void tuner_status(struct tuner *t)
tuner_info("Stereo: yes\n");
}
if ((ops) && (ops->has_signal)) {
tuner_info("Signal strength: %d\n", ops->has_signal(t));
tuner_info("Signal strength: %d\n", ops->has_signal(fe));
}
if ((ops) && (ops->is_stereo)) {
tuner_info("Stereo: %s\n", ops->is_stereo(t) ? "yes" : "no");
tuner_info("Stereo: %s\n", ops->is_stereo(fe) ?
"yes" : "no");
}
}
......@@ -723,7 +726,7 @@ static int tuner_detach(struct i2c_client *client)
}
if ((ops) && (ops->release))
ops->release(t);
ops->release(&t->fe);
kfree(t);
return 0;
......@@ -748,7 +751,7 @@ 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);
ops->standby(&t->fe);
return EINVAL;
}
return 0;
......@@ -799,7 +802,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
return 0;
t->mode = T_STANDBY;
if ((ops) && (ops->standby))
ops->standby(t);
ops->standby(&t->fe);
break;
#ifdef CONFIG_VIDEO_V4L1
case VIDIOCSAUDIO:
......@@ -868,7 +871,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
vt->flags &= ~VIDEO_TUNER_STEREO_ON;
} else {
if ((ops) && (ops->is_stereo)) {
if (ops->is_stereo(t))
if (ops->is_stereo(&t->fe))
vt->flags |=
VIDEO_TUNER_STEREO_ON;
else
......@@ -877,7 +880,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
}
}
if ((ops) && (ops->has_signal))
vt->signal = ops->has_signal(t);
vt->signal = ops->has_signal(&t->fe);
vt->flags |= VIDEO_TUNER_LOW; /* Allow freqs at 62.5 Hz */
......@@ -908,7 +911,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
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)
va->mode = ops->is_stereo(&t->fe)
? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO;
}
return 0;
......@@ -999,7 +1002,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
tuner->type = t->mode;
if ((ops) && (ops->get_afc))
tuner->afc = ops->get_afc(t);
tuner->afc = ops->get_afc(&t->fe);
if (t->mode == V4L2_TUNER_ANALOG_TV)
tuner->capability |= V4L2_TUNER_CAP_NORM;
if (t->mode != V4L2_TUNER_RADIO) {
......@@ -1015,16 +1018,20 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
u32 tuner_status;
fe_tuner_ops->get_status(&t->fe, &tuner_status);
tuner->rxsubchans = (tuner_status & TUNER_STATUS_STEREO) ?
V4L2_TUNER_SUB_STEREO : V4L2_TUNER_SUB_MONO;
tuner->rxsubchans =
(tuner_status & TUNER_STATUS_STEREO) ?
V4L2_TUNER_SUB_STEREO :
V4L2_TUNER_SUB_MONO;
} else {
if ((ops) && (ops->is_stereo)) {
tuner->rxsubchans = ops->is_stereo(t) ?
V4L2_TUNER_SUB_STEREO : V4L2_TUNER_SUB_MONO;
tuner->rxsubchans =
ops->is_stereo(&t->fe) ?
V4L2_TUNER_SUB_STEREO :
V4L2_TUNER_SUB_MONO;
}
}
if ((ops) && (ops->has_signal))
tuner->signal = ops->has_signal(t);
tuner->signal = ops->has_signal(&t->fe);
tuner->capability |=
V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_STEREO;
tuner->audmode = t->audmode;
......@@ -1050,7 +1057,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
}
case VIDIOC_LOG_STATUS:
if ((ops) && (ops->tuner_status))
ops->tuner_status(t);
ops->tuner_status(&t->fe);
break;
}
......
......@@ -32,14 +32,14 @@ extern unsigned const int tuner_count;
struct tuner;
struct analog_tuner_ops {
void (*set_tv_freq)(struct tuner *t, unsigned int freq);
void (*set_radio_freq)(struct tuner *t, unsigned int freq);
int (*has_signal)(struct tuner *t);
int (*is_stereo)(struct tuner *t);
int (*get_afc)(struct tuner *t);
void (*tuner_status)(struct tuner *t);
void (*standby)(struct tuner *t);
void (*release)(struct tuner *t);
void (*set_tv_freq)(struct dvb_frontend *fe, unsigned int freq);
void (*set_radio_freq)(struct dvb_frontend *fe, unsigned int freq);
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);
};
struct tuner {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment