Merge branch 'rmobile/urgent' into rmobile-fixes-for-linus
[linux-2.6-block.git] / drivers / media / common / tuners / tda18271-fe.c
index 63cc4004e211e9654044b612400460bb93832bf9..2e67f44599045e175ba6f0881bbb56bb6c11c578 100644 (file)
@@ -928,59 +928,49 @@ fail:
 
 /* ------------------------------------------------------------------ */
 
-static int tda18271_set_params(struct dvb_frontend *fe,
-                              struct dvb_frontend_parameters *params)
+static int tda18271_set_params(struct dvb_frontend *fe)
 {
+       struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+       u32 delsys = c->delivery_system;
+       u32 bw = c->bandwidth_hz;
+       u32 freq = c->frequency;
        struct tda18271_priv *priv = fe->tuner_priv;
        struct tda18271_std_map *std_map = &priv->std;
        struct tda18271_std_map_item *map;
        int ret;
-       u32 bw, freq = params->frequency;
 
        priv->mode = TDA18271_DIGITAL;
 
-       if (fe->ops.info.type == FE_ATSC) {
-               switch (params->u.vsb.modulation) {
-               case VSB_8:
-               case VSB_16:
-                       map = &std_map->atsc_6;
-                       break;
-               case QAM_64:
-               case QAM_256:
-                       map = &std_map->qam_6;
-                       break;
-               default:
-                       tda_warn("modulation not set!\n");
-                       return -EINVAL;
-               }
-#if 0
-               /* userspace request is already center adjusted */
-               freq += 1750000; /* Adjust to center (+1.75MHZ) */
-#endif
+       switch (delsys) {
+       case SYS_ATSC:
+               map = &std_map->atsc_6;
                bw = 6000000;
-       } else if (fe->ops.info.type == FE_OFDM) {
-               switch (params->u.ofdm.bandwidth) {
-               case BANDWIDTH_6_MHZ:
-                       bw = 6000000;
+               break;
+       case SYS_ISDBT:
+       case SYS_DVBT:
+       case SYS_DVBT2:
+               if (bw <= 6000000) {
                        map = &std_map->dvbt_6;
-                       break;
-               case BANDWIDTH_7_MHZ:
-                       bw = 7000000;
+               } else if (bw <= 7000000) {
                        map = &std_map->dvbt_7;
-                       break;
-               case BANDWIDTH_8_MHZ:
-                       bw = 8000000;
+               } else {
                        map = &std_map->dvbt_8;
-                       break;
-               default:
-                       tda_warn("bandwidth not set!\n");
-                       return -EINVAL;
                }
-       } else if (fe->ops.info.type == FE_QAM) {
-               /* DVB-C */
-               map = &std_map->qam_8;
-               bw = 8000000;
-       } else {
+               break;
+       case SYS_DVBC_ANNEX_B:
+               bw = 6000000;
+               /* falltrough */
+       case SYS_DVBC_ANNEX_A:
+       case SYS_DVBC_ANNEX_C:
+               if (bw <= 6000000) {
+                       map = &std_map->qam_6;
+               } else if (bw <= 7000000) {
+                       map = &std_map->qam_7;
+               } else {
+                       map = &std_map->qam_8;
+               }
+               break;
+       default:
                tda_warn("modulation type not supported!\n");
                return -EINVAL;
        }
@@ -994,9 +984,9 @@ static int tda18271_set_params(struct dvb_frontend *fe,
        if (tda_fail(ret))
                goto fail;
 
+       priv->if_freq   = map->if_freq;
        priv->frequency = freq;
-       priv->bandwidth = (fe->ops.info.type == FE_OFDM) ?
-               params->u.ofdm.bandwidth : 0;
+       priv->bandwidth = bw;
 fail:
        return ret;
 }
@@ -1050,6 +1040,7 @@ static int tda18271_set_analog_params(struct dvb_frontend *fe,
        if (tda_fail(ret))
                goto fail;
 
+       priv->if_freq   = map->if_freq;
        priv->frequency = freq;
        priv->bandwidth = 0;
 fail:
@@ -1086,6 +1077,13 @@ static int tda18271_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
        return 0;
 }
 
+static int tda18271_get_if_frequency(struct dvb_frontend *fe, u32 *frequency)
+{
+       struct tda18271_priv *priv = fe->tuner_priv;
+       *frequency = (u32)priv->if_freq * 1000;
+       return 0;
+}
+
 /* ------------------------------------------------------------------ */
 
 #define tda18271_update_std(std_cfg, name) do {                                \
@@ -1245,6 +1243,7 @@ static const struct dvb_tuner_ops tda18271_tuner_ops = {
        .set_config        = tda18271_set_config,
        .get_frequency     = tda18271_get_frequency,
        .get_bandwidth     = tda18271_get_bandwidth,
+       .get_if_frequency  = tda18271_get_if_frequency,
 };
 
 struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,