All tuners used with cxd2820r offers IF frequency so switch that.
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
 static struct cxd2820r_config anysee_cxd2820r_config = {
        .i2c_address = 0x6d, /* (0xda >> 1) */
        .ts_mode = 0x38,
-       .if_dvbt_6 = 3550,
-       .if_dvbt_7 = 3700,
-       .if_dvbt_8 = 4150,
-       .if_dvbt2_6 = 3250,
-       .if_dvbt2_7 = 4000,
-       .if_dvbt2_8 = 4000,
-       .if_dvbc = 5000,
 };
 
 /*
 
         */
        bool spec_inv;
 
-       /* IFs for all used modes.
-        * Default: none, must set
-        * Values: <kHz>
-        */
-       u16 if_dvbt_6;
-       u16 if_dvbt_7;
-       u16 if_dvbt_8;
-       u16 if_dvbt2_5;
-       u16 if_dvbt2_6;
-       u16 if_dvbt2_7;
-       u16 if_dvbt2_8;
-       u16 if_dvbc;
-
        /* GPIOs for all used modes.
         * Default: none, disabled
         * Values: <see above>
 
        struct dtv_frontend_properties *c = &fe->dtv_property_cache;
        int ret, i;
        u8 buf[2];
+       u32 if_freq;
        u16 if_ctl;
        u64 num;
        struct reg_val_mask tab[] = {
        priv->delivery_system = SYS_DVBC_ANNEX_AC;
        priv->ber_running = 0; /* tune stops BER counter */
 
-       num = priv->cfg.if_dvbc;
+       /* program IF frequency */
+       if (fe->ops.tuner_ops.get_if_frequency) {
+               ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_freq);
+               if (ret)
+                       goto error;
+       } else
+               if_freq = 0;
+
+       dbg("%s: if_freq=%d", __func__, if_freq);
+
+       num = if_freq / 1000; /* Hz => kHz */
        num *= 0x4000;
        if_ctl = cxd2820r_div_u64_round_closest(num, 41000);
        buf[0] = (if_ctl >> 8) & 0x3f;
 
        struct cxd2820r_priv *priv = fe->demodulator_priv;
        struct dtv_frontend_properties *c = &fe->dtv_property_cache;
        int ret, i;
-       u32 if_khz, if_ctl;
+       u32 if_freq, if_ctl;
        u64 num;
        u8 buf[3], bw_param;
        u8 bw_params1[][5] = {
 
        switch (c->bandwidth_hz) {
        case 6000000:
-               if_khz = priv->cfg.if_dvbt_6;
                i = 0;
                bw_param = 2;
                break;
        case 7000000:
-               if_khz = priv->cfg.if_dvbt_7;
                i = 1;
                bw_param = 1;
                break;
        case 8000000:
-               if_khz = priv->cfg.if_dvbt_8;
                i = 2;
                bw_param = 0;
                break;
                return -EINVAL;
        }
 
-       num = if_khz;
+       /* program IF frequency */
+       if (fe->ops.tuner_ops.get_if_frequency) {
+               ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_freq);
+               if (ret)
+                       goto error;
+       } else
+               if_freq = 0;
+
+       dbg("%s: if_freq=%d", __func__, if_freq);
+
+       num = if_freq / 1000; /* Hz => kHz */
        num *= 0x1000000;
        if_ctl = cxd2820r_div_u64_round_closest(num, 41000);
        buf[0] = ((if_ctl >> 16) & 0xff);
 
        struct cxd2820r_priv *priv = fe->demodulator_priv;
        struct dtv_frontend_properties *c = &fe->dtv_property_cache;
        int ret, i;
-       u32 if_khz, if_ctl;
+       u32 if_freq, if_ctl;
        u64 num;
        u8 buf[3], bw_param;
        u8 bw_params1[][5] = {
 
        switch (c->bandwidth_hz) {
        case 5000000:
-               if_khz = priv->cfg.if_dvbt2_5;
                i = 0;
                bw_param = 3;
                break;
        case 6000000:
-               if_khz = priv->cfg.if_dvbt2_6;
                i = 1;
                bw_param = 2;
                break;
        case 7000000:
-               if_khz = priv->cfg.if_dvbt2_7;
                i = 2;
                bw_param = 1;
                break;
        case 8000000:
-               if_khz = priv->cfg.if_dvbt2_8;
                i = 3;
                bw_param = 0;
                break;
                return -EINVAL;
        }
 
-       num = if_khz;
+       /* program IF frequency */
+       if (fe->ops.tuner_ops.get_if_frequency) {
+               ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_freq);
+               if (ret)
+                       goto error;
+       } else
+               if_freq = 0;
+
+       dbg("%s: if_freq=%d", __func__, if_freq);
+
+       num = if_freq / 1000; /* Hz => kHz */
        num *= 0x1000000;
        if_ctl = cxd2820r_div_u64_round_closest(num, 41000);
        buf[0] = ((if_ctl >> 16) & 0xff);
 
 static struct cxd2820r_config em28xx_cxd2820r_config = {
        .i2c_address = (0xd8 >> 1),
        .ts_mode = CXD2820R_TS_SERIAL,
-       .if_dvbt_6  = 3300,
-       .if_dvbt_7  = 3500,
-       .if_dvbt_8  = 4000,
-       .if_dvbt2_6 = 3300,
-       .if_dvbt2_7 = 3500,
-       .if_dvbt2_8 = 4000,
-       .if_dvbc    = 5000,
 
        /* enable LNA for DVB-T2 and DVB-C */
        .gpio_dvbt2[0] = CXD2820R_GPIO_E | CXD2820R_GPIO_O | CXD2820R_GPIO_L,