[media] af9033: wrap DVBv3 read SNR to DVBv5 CNR
authorAntti Palosaari <crope@iki.fi>
Tue, 2 Sep 2014 08:03:21 +0000 (05:03 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Sun, 21 Sep 2014 22:45:27 +0000 (19:45 -0300)
Remove 'duplicate' DVBv3 read SNR implementation and return value,
calculated already by DVBv5 CNR, from the cache.

Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/dvb-frontends/af9033.c
drivers/media/dvb-frontends/af9033_priv.h

index 576e9b5f4bbffa1ee35ca448e24512b287b12a96..4c2061676bbe5d9fa0ccb715dabb3cffd2e89571 100644 (file)
@@ -832,55 +832,15 @@ err:
 static int af9033_read_snr(struct dvb_frontend *fe, u16 *snr)
 {
        struct af9033_dev *dev = fe->demodulator_priv;
-       int ret, i, len;
-       u8 buf[3], tmp;
-       u32 snr_val;
-       const struct val_snr *snr_lut;
-
-       /* read value */
-       ret = af9033_rd_regs(dev, 0x80002c, buf, 3);
-       if (ret < 0)
-               goto err;
-
-       snr_val = (buf[2] << 16) | (buf[1] << 8) | buf[0];
-
-       /* read current modulation */
-       ret = af9033_rd_reg(dev, 0x80f903, &tmp);
-       if (ret < 0)
-               goto err;
-
-       switch ((tmp >> 0) & 3) {
-       case 0:
-               len = ARRAY_SIZE(qpsk_snr_lut);
-               snr_lut = qpsk_snr_lut;
-               break;
-       case 1:
-               len = ARRAY_SIZE(qam16_snr_lut);
-               snr_lut = qam16_snr_lut;
-               break;
-       case 2:
-               len = ARRAY_SIZE(qam64_snr_lut);
-               snr_lut = qam64_snr_lut;
-               break;
-       default:
-               goto err;
-       }
-
-       for (i = 0; i < len; i++) {
-               tmp = snr_lut[i].snr;
-
-               if (snr_val < snr_lut[i].val)
-                       break;
-       }
+       struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
 
-       *snr = tmp * 10; /* dB/10 */
+       /* use DVBv5 CNR */
+       if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL)
+               *snr = div_s64(c->cnr.stat[0].svalue, 100); /* 1000x => 10x */
+       else
+               *snr = 0;
 
        return 0;
-
-err:
-       dev_dbg(&dev->client->dev, "failed=%d\n", ret);
-
-       return ret;
 }
 
 static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
index ded7b67d7526cab8b9cd364dfe6ce19fdb3da36e..c12c92cb5855ae587f332f1d32673947ac90d912 100644 (file)
@@ -24,6 +24,7 @@
 
 #include "dvb_frontend.h"
 #include "af9033.h"
+#include <linux/math64.h>
 
 struct reg_val {
        u32 reg;