[media] rtl2830: implement DVBv5 BER statistic
authorAntti Palosaari <crope@iki.fi>
Tue, 9 Dec 2014 12:45:16 +0000 (09:45 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Mon, 2 Feb 2015 19:55:08 +0000 (17:55 -0200)
DVBv5 BER.

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

index 641047b89e0574782f4eade9dc7deea02d97f91d..147b3a6898e17e8005229842b8c6dcb722fddd0b 100644 (file)
@@ -250,6 +250,10 @@ static int rtl2830_init(struct dvb_frontend *fe)
        c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
        c->cnr.len = 1;
        c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+       c->post_bit_error.len = 1;
+       c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+       c->post_bit_count.len = 1;
+       c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
        /* start statistics polling */
        schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
 
@@ -759,6 +763,27 @@ static void rtl2830_stat_work(struct work_struct *work)
                c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
        }
 
+       /* BER */
+       if (dev->fe_status & FE_HAS_LOCK) {
+               ret = rtl2830_rd_regs(client, 0x34e, buf, 2);
+               if (ret)
+                       goto err;
+
+               u16tmp = buf[0] << 8 | buf[1] << 0;
+               dev->post_bit_error += u16tmp;
+               dev->post_bit_count += 1000000;
+
+               dev_dbg(&client->dev, "BER errors=%u total=1000000\n", u16tmp);
+
+               c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
+               c->post_bit_error.stat[0].uvalue = dev->post_bit_error;
+               c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
+               c->post_bit_count.stat[0].uvalue = dev->post_bit_count;
+       } else {
+               c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+               c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+       }
+
 err_schedule_delayed_work:
        schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
        return;
index 7cf316d0d149249382cc9170b2b9a9af176f2ef4..cdcaacfa89c836596ce7472ae8117e978079b4cc 100644 (file)
@@ -32,6 +32,8 @@ struct rtl2830_dev {
        u8 page; /* active register page */
        struct delayed_work stat_work;
        fe_status_t fe_status;
+       u64 post_bit_error;
+       u64 post_bit_count;
 };
 
 struct rtl2830_reg_val_mask {