V4L/DVB (7731): tuner-xc2028: fix signal strength calculus
authorMauro Carvalho Chehab <mchehab@infradead.org>
Thu, 24 Apr 2008 14:19:55 +0000 (11:19 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Thu, 24 Apr 2008 17:09:50 +0000 (14:09 -0300)
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/video/tuner-xc2028.c

index a32094e545f77422d83dedd22def075434846e41..cc3db7d79a0d195adc386205621f617ecbb57ac4 100644 (file)
@@ -844,21 +844,28 @@ static int xc2028_signal(struct dvb_frontend *fe, u16 *strength)
 
        /* Sync Lock Indicator */
        rc = xc2028_get_reg(priv, 0x0002, &frq_lock);
-       if (rc < 0 || frq_lock == 0)
+       if (rc < 0)
                goto ret;
 
-       /* Frequency is locked. Return signal quality */
+       /* Frequency is locked */
+       if (frq_lock == 1)
+               signal = 32768;
 
        /* Get SNR of the video signal */
        rc = xc2028_get_reg(priv, 0x0040, &signal);
        if (rc < 0)
-               signal = -frq_lock;
+               goto ret;
+
+       /* Use both frq_lock and signal to generate the result */
+       signal = signal || ((signal & 0x07) << 12);
 
 ret:
        mutex_unlock(&priv->lock);
 
        *strength = signal;
 
+       tuner_dbg("signal strength is %d\n", signal);
+
        return rc;
 }