[media] s5h1411: Calculate signal strength shown as percentage from SNR up to 35dB
authorMichael Krufky <mkrufky@linuxtv.org>
Mon, 31 Oct 2011 11:12:54 +0000 (08:12 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 7 Nov 2011 15:20:17 +0000 (13:20 -0200)
As done first in lgdt330x.c, calculate signal strength from SNR up to 35dB
Even though the SNR can go higher than 35dB, there is some comfort factor
in having a range of strong signals that can show at 100%

Signed-off-by: Michael Krufky <mkrufky@kernellabs.com>
Signed-off-by: Devin Heitmueller <dheitmueller@kernellabs.com>
Signed-off-by: Steven Toth <stoth@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/frontends/s5h1411.c

index d8adf1e32019a9f7b62a712d693dd242ee79e036..5fca113a2013f25d043a3666cf361970de18e1e1 100644 (file)
@@ -794,7 +794,36 @@ static int s5h1411_read_snr(struct dvb_frontend *fe, u16 *snr)
 static int s5h1411_read_signal_strength(struct dvb_frontend *fe,
        u16 *signal_strength)
 {
-       return s5h1411_read_snr(fe, signal_strength);
+       /* borrowed from lgdt330x.c
+        *
+        * Calculate strength from SNR up to 35dB
+        * Even though the SNR can go higher than 35dB,
+        * there is some comfort factor in having a range of
+        * strong signals that can show at 100%
+        */
+       u16 snr;
+       u32 tmp;
+       int ret = s5h1411_read_snr(fe, &snr);
+
+       *signal_strength = 0;
+
+       if (0 == ret) {
+               /* The following calculation method was chosen
+                * purely for the sake of code re-use from the
+                * other demod drivers that use this method */
+
+               /* Convert from SNR in dB * 10 to 8.24 fixed-point */
+               tmp = (snr * ((1 << 24) / 10));
+
+               /* Convert from 8.24 fixed-point to
+                * scale the range 0 - 35*2^24 into 0 - 65535*/
+               if (tmp >= 8960 * 0x10000)
+                       *signal_strength = 0xffff;
+               else
+                       *signal_strength = tmp / 8960;
+       }
+
+       return ret;
 }
 
 static int s5h1411_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)