Commit 710401b8 authored by Michael Krufky's avatar Michael Krufky Committed by Mauro Carvalho Chehab

V4L/DVB (6840): tuner: convert tda9887 to use TUNER_SET_CONFIG

Use TUNER_SET_CONFIG to set configuration in tda9887's private state
structure, rather than storing tda9887-specific configuration within
struct tuner.

Update handling of TUNER_SET_CONFIG by tuner-core, to call
&t->fe.ops.analog_demod_ops rather than &t->fe.ops.tuner_ops

analog_demod_ops.set_config passes the request to tuner_ops.set_config,
so this does not break other drivers.
Signed-off-by: default avatarMichael Krufky <mkrufky@linuxtv.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent f1c9a281
...@@ -38,6 +38,7 @@ struct tda9887_priv { ...@@ -38,6 +38,7 @@ struct tda9887_priv {
struct tuner_i2c_props i2c_props; struct tuner_i2c_props i2c_props;
unsigned char data[4]; unsigned char data[4];
unsigned int config;
struct tuner *t; struct tuner *t;
}; };
...@@ -473,31 +474,31 @@ static int tda9887_set_insmod(struct dvb_frontend *fe) ...@@ -473,31 +474,31 @@ static int tda9887_set_insmod(struct dvb_frontend *fe)
return 0; return 0;
} }
static int tda9887_set_config(struct dvb_frontend *fe) static int tda9887_do_config(struct dvb_frontend *fe)
{ {
struct tda9887_priv *priv = fe->analog_demod_priv; struct tda9887_priv *priv = fe->analog_demod_priv;
struct tuner *t = priv->t; struct tuner *t = priv->t;
char *buf = priv->data; char *buf = priv->data;
if (t->tda9887_config & TDA9887_PORT1_ACTIVE) if (priv->config & TDA9887_PORT1_ACTIVE)
buf[1] &= ~cOutputPort1Inactive; buf[1] &= ~cOutputPort1Inactive;
if (t->tda9887_config & TDA9887_PORT1_INACTIVE) if (priv->config & TDA9887_PORT1_INACTIVE)
buf[1] |= cOutputPort1Inactive; buf[1] |= cOutputPort1Inactive;
if (t->tda9887_config & TDA9887_PORT2_ACTIVE) if (priv->config & TDA9887_PORT2_ACTIVE)
buf[1] &= ~cOutputPort2Inactive; buf[1] &= ~cOutputPort2Inactive;
if (t->tda9887_config & TDA9887_PORT2_INACTIVE) if (priv->config & TDA9887_PORT2_INACTIVE)
buf[1] |= cOutputPort2Inactive; buf[1] |= cOutputPort2Inactive;
if (t->tda9887_config & TDA9887_QSS) if (priv->config & TDA9887_QSS)
buf[1] |= cQSS; buf[1] |= cQSS;
if (t->tda9887_config & TDA9887_INTERCARRIER) if (priv->config & TDA9887_INTERCARRIER)
buf[1] &= ~cQSS; buf[1] &= ~cQSS;
if (t->tda9887_config & TDA9887_AUTOMUTE) if (priv->config & TDA9887_AUTOMUTE)
buf[1] |= cAutoMuteFmActive; buf[1] |= cAutoMuteFmActive;
if (t->tda9887_config & TDA9887_DEEMPHASIS_MASK) { if (priv->config & TDA9887_DEEMPHASIS_MASK) {
buf[2] &= ~0x60; buf[2] &= ~0x60;
switch (t->tda9887_config & TDA9887_DEEMPHASIS_MASK) { switch (priv->config & TDA9887_DEEMPHASIS_MASK) {
case TDA9887_DEEMPHASIS_NONE: case TDA9887_DEEMPHASIS_NONE:
buf[2] |= cDeemphasisOFF; buf[2] |= cDeemphasisOFF;
break; break;
...@@ -509,21 +510,22 @@ static int tda9887_set_config(struct dvb_frontend *fe) ...@@ -509,21 +510,22 @@ static int tda9887_set_config(struct dvb_frontend *fe)
break; break;
} }
} }
if (t->tda9887_config & TDA9887_TOP_SET) { if (priv->config & TDA9887_TOP_SET) {
buf[2] &= ~cTopMask; buf[2] &= ~cTopMask;
buf[2] |= (t->tda9887_config >> 8) & cTopMask; buf[2] |= (priv->config >> 8) & cTopMask;
} }
if ((t->tda9887_config & TDA9887_INTERCARRIER_NTSC) && (t->std & V4L2_STD_NTSC)) if ((priv->config & TDA9887_INTERCARRIER_NTSC) &&
(t->std & V4L2_STD_NTSC))
buf[1] &= ~cQSS; buf[1] &= ~cQSS;
if (t->tda9887_config & TDA9887_GATING_18) if (priv->config & TDA9887_GATING_18)
buf[3] &= ~cGating_36; buf[3] &= ~cGating_36;
if (t->mode == V4L2_TUNER_RADIO) { if (t->mode == V4L2_TUNER_RADIO) {
if (t->tda9887_config & TDA9887_RIF_41_3) { if (priv->config & TDA9887_RIF_41_3) {
buf[3] &= ~cVideoIFMask; buf[3] &= ~cVideoIFMask;
buf[3] |= cRadioIF_41_30; buf[3] |= cRadioIF_41_30;
} }
if (t->tda9887_config & TDA9887_GAIN_NORMAL) if (priv->config & TDA9887_GAIN_NORMAL)
buf[3] &= ~cTunerGainLow; buf[3] &= ~cTunerGainLow;
} }
...@@ -570,7 +572,7 @@ static void tda9887_configure(struct dvb_frontend *fe) ...@@ -570,7 +572,7 @@ static void tda9887_configure(struct dvb_frontend *fe)
priv->data[1] |= cOutputPort1Inactive; priv->data[1] |= cOutputPort1Inactive;
priv->data[1] |= cOutputPort2Inactive; priv->data[1] |= cOutputPort2Inactive;
tda9887_set_config(fe); tda9887_do_config(fe);
tda9887_set_insmod(fe); tda9887_set_insmod(fe);
if (t->mode == T_STANDBY) { if (t->mode == T_STANDBY) {
...@@ -629,6 +631,16 @@ static void tda9887_set_params(struct dvb_frontend *fe, ...@@ -629,6 +631,16 @@ static void tda9887_set_params(struct dvb_frontend *fe,
tda9887_configure(fe); tda9887_configure(fe);
} }
static int tda9887_set_config(struct dvb_frontend *fe, void *priv_cfg)
{
struct tda9887_priv *priv = fe->analog_demod_priv;
priv->config = *(unsigned int *)priv_cfg;
tda9887_configure(fe);
return 0;
}
static void tda9887_release(struct dvb_frontend *fe) static void tda9887_release(struct dvb_frontend *fe)
{ {
kfree(fe->analog_demod_priv); kfree(fe->analog_demod_priv);
...@@ -644,6 +656,7 @@ static struct analog_tuner_ops tda9887_tuner_ops = { ...@@ -644,6 +656,7 @@ static struct analog_tuner_ops tda9887_tuner_ops = {
.tuner_status = tda9887_tuner_status, .tuner_status = tda9887_tuner_status,
.get_afc = tda9887_get_afc, .get_afc = tda9887_get_afc,
.release = tda9887_release, .release = tda9887_release,
.set_config = tda9887_set_config,
}; };
int tda9887_attach(struct tuner *t) int tda9887_attach(struct tuner *t)
......
...@@ -833,25 +833,19 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) ...@@ -833,25 +833,19 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
#endif #endif
case TUNER_SET_CONFIG: case TUNER_SET_CONFIG:
{ {
struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops; struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
struct v4l2_priv_tun_config *cfg = arg; struct v4l2_priv_tun_config *cfg = arg;
if (t->type != cfg->tuner) if (t->type != cfg->tuner)
break; break;
if (t->type == TUNER_TDA9887) { if ((NULL == ops) || (NULL == ops->set_config)) {
t->tda9887_config = *(unsigned int *)cfg->priv;
set_freq(client, t->tv_freq);
break;
}
if (NULL == fe_tuner_ops->set_config) {
tuner_warn("Tuner frontend module has no way to " tuner_warn("Tuner frontend module has no way to "
"set config\n"); "set config\n");
break; break;
} }
fe_tuner_ops->set_config(&t->fe, cfg->priv);
ops->set_config(&t->fe, cfg->priv);
break; break;
} }
/* --- v4l ioctls --- */ /* --- v4l ioctls --- */
......
...@@ -69,9 +69,6 @@ struct tuner { ...@@ -69,9 +69,6 @@ struct tuner {
struct dvb_frontend fe; struct dvb_frontend fe;
/* used by tda9887 */
unsigned int tda9887_config;
unsigned int config; unsigned int config;
int (*tuner_callback) (void *dev, int command,int arg); int (*tuner_callback) (void *dev, int command,int arg);
}; };
......
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