[media] dvb-frontends/cxd2841er: improved snr reporting
authorDaniel Scheller <d.scheller@gmx.net>
Sun, 9 Apr 2017 19:38:24 +0000 (16:38 -0300)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Tue, 20 Jun 2017 12:56:51 +0000 (09:56 -0300)
On DVB-T/T2 at least, SNR might be reported as >2500dB, which not only is
just wrong but also ridiculous, so fix this by improving the conversion
of the register value.

The INTLOG10X100 function/macro and the way the values are converted were
both taken from DD's cxd2843 driver.

Signed-off-by: Daniel Scheller <d.scheller@gmx.net>
Acked-by: Abylay Ospan <aospan@netup.ru>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/dvb-frontends/cxd2841er.c

index d9e8be50c5fa8cfdd30af43a10d6a1fed379dd4e..08f67d60a7d9f644b7d59fd847036ae4a8224f13 100644 (file)
@@ -38,6 +38,8 @@
 #define MAX_WRITE_REGSIZE      16
 #define LOG2_E_100X 144
 
+#define INTLOG10X100(x) ((u32) (((u64) intlog10(x) * 100) >> 24))
+
 /* DVB-C constellation */
 enum sony_dvbc_constellation_t {
        SONY_DVBC_CONSTELLATION_16QAM,
@@ -1817,7 +1819,7 @@ static int cxd2841er_read_snr_t(struct cxd2841er_priv *priv, u32 *snr)
        }
        if (reg > 4996)
                reg = 4996;
-       *snr = 10000 * ((intlog10(reg) - intlog10(5350 - reg)) >> 24) + 28500;
+       *snr = 100 * ((INTLOG10X100(reg) - INTLOG10X100(5350 - reg)) + 285);
        return 0;
 }
 
@@ -1846,8 +1848,7 @@ static int cxd2841er_read_snr_t2(struct cxd2841er_priv *priv, u32 *snr)
        }
        if (reg > 10876)
                reg = 10876;
-       *snr = 10000 * ((intlog10(reg) -
-               intlog10(12600 - reg)) >> 24) + 32000;
+       *snr = 100 * ((INTLOG10X100(reg) - INTLOG10X100(12600 - reg)) + 320);
        return 0;
 }