struct tuner_i2c_props i2c_props;
 
        unsigned char      data[4];
+       unsigned int       config;
 
        struct tuner *t;
 };
        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;
                        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;
        }
 
        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) {
        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);
        .tuner_status   = tda9887_tuner_status,
        .get_afc        = tda9887_get_afc,
        .release        = tda9887_release,
+       .set_config     = tda9887_set_config,
 };
 
 int tda9887_attach(struct tuner *t)
 
 #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 --- */