upstream: [media] xc5000: Fix get_frequency() 98/25798/1
authorMauro Carvalho Chehab <m.chehab@samsung.com>
Mon, 21 Jul 2014 17:21:18 +0000 (14:21 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Sun, 10 Aug 2014 02:32:48 +0000 (23:32 -0300)
The programmed frequency on xc5000 is not the middle
frequency, but the initial frequency on the bandwidth range.
However, the DVB API works with the middle frequency.

Cc: stable@vger.kernel.org
Backports http://git.linuxtv.org/cgit.cgi/media_tree.git/commit/?id=a3eec916cbc1
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Change-Id: Ifadbdd319edb4f9189da2203547ba77456544908

drivers/media/tuners/xc5000.c

index 513dda7..233fe7a 100644 (file)
@@ -56,7 +56,7 @@ struct xc5000_priv {
 
        u32 if_khz;
        u16 xtal_khz;
-       u32 freq_hz;
+       u32 freq_hz, freq_offset;
        u32 bandwidth;
        u8  video_standard;
        u8  rf_mode;
@@ -731,13 +731,13 @@ static int xc5000_set_params(struct dvb_frontend *fe)
        case SYS_ATSC:
                dprintk(1, "%s() VSB modulation\n", __func__);
                priv->rf_mode = XC_RF_MODE_AIR;
-               priv->freq_hz = freq - 1750000;
+               priv->freq_offset = 1750000;
                priv->video_standard = DTV6;
                break;
        case SYS_DVBC_ANNEX_B:
                dprintk(1, "%s() QAM modulation\n", __func__);
                priv->rf_mode = XC_RF_MODE_CABLE;
-               priv->freq_hz = freq - 1750000;
+               priv->freq_offset = 1750000;
                priv->video_standard = DTV6;
                break;
        case SYS_ISDBT:
@@ -752,15 +752,15 @@ static int xc5000_set_params(struct dvb_frontend *fe)
                switch (bw) {
                case 6000000:
                        priv->video_standard = DTV6;
-                       priv->freq_hz = freq - 1750000;
+                       priv->freq_offset = 1750000;
                        break;
                case 7000000:
                        priv->video_standard = DTV7;
-                       priv->freq_hz = freq - 2250000;
+                       priv->freq_offset = 2250000;
                        break;
                case 8000000:
                        priv->video_standard = DTV8;
-                       priv->freq_hz = freq - 2750000;
+                       priv->freq_offset = 2750000;
                        break;
                default:
                        printk(KERN_ERR "xc5000 bandwidth not set!\n");
@@ -774,15 +774,15 @@ static int xc5000_set_params(struct dvb_frontend *fe)
                priv->rf_mode = XC_RF_MODE_CABLE;
                if (bw <= 6000000) {
                        priv->video_standard = DTV6;
-                       priv->freq_hz = freq - 1750000;
+                       priv->freq_offset = 1750000;
                        b = 6;
                } else if (bw <= 7000000) {
                        priv->video_standard = DTV7;
-                       priv->freq_hz = freq - 2250000;
+                       priv->freq_offset = 2250000;
                        b = 7;
                } else {
                        priv->video_standard = DTV7_8;
-                       priv->freq_hz = freq - 2750000;
+                       priv->freq_offset = 2750000;
                        b = 8;
                }
                dprintk(1, "%s() Bandwidth %dMHz (%d)\n", __func__,
@@ -793,6 +793,8 @@ static int xc5000_set_params(struct dvb_frontend *fe)
                return -EINVAL;
        }
 
+       priv->freq_hz = freq - priv->freq_offset;
+
        dprintk(1, "%s() frequency=%d (compensated to %d)\n",
                __func__, freq, priv->freq_hz);
 
@@ -1043,7 +1045,7 @@ static int xc5000_get_frequency(struct dvb_frontend *fe, u32 *freq)
 {
        struct xc5000_priv *priv = fe->tuner_priv;
        dprintk(1, "%s()\n", __func__);
-       *freq = priv->freq_hz;
+       *freq = priv->freq_hz + priv->freq_offset;
        return 0;
 }