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: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
diff --git a/drivers/media/video/tda9887.c b/drivers/media/video/tda9887.c
index f265c70..7686f52 100644
--- a/drivers/media/video/tda9887.c
+++ b/drivers/media/video/tda9887.c
@@ -38,6 +38,7 @@
 	struct tuner_i2c_props i2c_props;
 
 	unsigned char 	   data[4];
+	unsigned int       config;
 
 	struct tuner *t;
 };
@@ -473,31 +474,31 @@
 	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 tuner *t = priv->t;
 	char *buf = priv->data;
 
-	if (t->tda9887_config & TDA9887_PORT1_ACTIVE)
+	if (priv->config & TDA9887_PORT1_ACTIVE)
 		buf[1] &= ~cOutputPort1Inactive;
-	if (t->tda9887_config & TDA9887_PORT1_INACTIVE)
+	if (priv->config & TDA9887_PORT1_INACTIVE)
 		buf[1] |= cOutputPort1Inactive;
-	if (t->tda9887_config & TDA9887_PORT2_ACTIVE)
+	if (priv->config & TDA9887_PORT2_ACTIVE)
 		buf[1] &= ~cOutputPort2Inactive;
-	if (t->tda9887_config & TDA9887_PORT2_INACTIVE)
+	if (priv->config & TDA9887_PORT2_INACTIVE)
 		buf[1] |= cOutputPort2Inactive;
 
-	if (t->tda9887_config & TDA9887_QSS)
+	if (priv->config & TDA9887_QSS)
 		buf[1] |= cQSS;
-	if (t->tda9887_config & TDA9887_INTERCARRIER)
+	if (priv->config & TDA9887_INTERCARRIER)
 		buf[1] &= ~cQSS;
 
-	if (t->tda9887_config & TDA9887_AUTOMUTE)
+	if (priv->config & TDA9887_AUTOMUTE)
 		buf[1] |= cAutoMuteFmActive;
-	if (t->tda9887_config & TDA9887_DEEMPHASIS_MASK) {
+	if (priv->config & TDA9887_DEEMPHASIS_MASK) {
 		buf[2] &= ~0x60;
-		switch (t->tda9887_config & TDA9887_DEEMPHASIS_MASK) {
+		switch (priv->config & TDA9887_DEEMPHASIS_MASK) {
 		case TDA9887_DEEMPHASIS_NONE:
 			buf[2] |= cDeemphasisOFF;
 			break;
@@ -509,21 +510,22 @@
 			break;
 		}
 	}
-	if (t->tda9887_config & TDA9887_TOP_SET) {
+	if (priv->config & TDA9887_TOP_SET) {
 		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;
-	if (t->tda9887_config & TDA9887_GATING_18)
+	if (priv->config & TDA9887_GATING_18)
 		buf[3] &= ~cGating_36;
 
 	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] |= cRadioIF_41_30;
 		}
-		if (t->tda9887_config & TDA9887_GAIN_NORMAL)
+		if (priv->config & TDA9887_GAIN_NORMAL)
 			buf[3] &= ~cTunerGainLow;
 	}
 
@@ -570,7 +572,7 @@
 	priv->data[1] |= cOutputPort1Inactive;
 	priv->data[1] |= cOutputPort2Inactive;
 
-	tda9887_set_config(fe);
+	tda9887_do_config(fe);
 	tda9887_set_insmod(fe);
 
 	if (t->mode == T_STANDBY) {
@@ -629,6 +631,16 @@
 	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)
 {
 	kfree(fe->analog_demod_priv);
@@ -644,6 +656,7 @@
 	.tuner_status   = tda9887_tuner_status,
 	.get_afc        = tda9887_get_afc,
 	.release        = tda9887_release,
+	.set_config     = tda9887_set_config,
 };
 
 int tda9887_attach(struct tuner *t)
diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c
index 9134b99..695f39e 100644
--- a/drivers/media/video/tuner-core.c
+++ b/drivers/media/video/tuner-core.c
@@ -833,25 +833,19 @@
 #endif
 	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;
 
 		if (t->type != cfg->tuner)
 			break;
 
-		if (t->type == TUNER_TDA9887) {
-			t->tda9887_config = *(unsigned int *)cfg->priv;
-			set_freq(client, t->tv_freq);
-			break;
-		}
-
-		if (NULL == fe_tuner_ops->set_config) {
+		if ((NULL == ops) || (NULL == ops->set_config)) {
 			tuner_warn("Tuner frontend module has no way to "
 				   "set config\n");
 			break;
 		}
-		fe_tuner_ops->set_config(&t->fe, cfg->priv);
 
+		ops->set_config(&t->fe, cfg->priv);
 		break;
 	}
 	/* --- v4l ioctls --- */
diff --git a/drivers/media/video/tuner-driver.h b/drivers/media/video/tuner-driver.h
index 7f43dc6..417753b 100644
--- a/drivers/media/video/tuner-driver.h
+++ b/drivers/media/video/tuner-driver.h
@@ -69,9 +69,6 @@
 
 	struct dvb_frontend fe;
 
-	/* used by tda9887 */
-	unsigned int       tda9887_config;
-
 	unsigned int config;
 	int (*tuner_callback) (void *dev, int command,int arg);
 };