[media] cx24120: Assume ucb registers is a counter
authorJemma Denson <jdenson@gmail.com>
Wed, 20 May 2015 14:57:49 +0000 (11:57 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Sat, 30 May 2015 11:12:39 +0000 (08:12 -0300)
The ucblocks register is probably a counter and not a rate; assume
it is so and change the calculations as required.

Signed-off-by: Jemma Denson <jdenson@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/dvb-frontends/cx24120.c

index a14d0f1cc71e87849ac58292fe7533ef0490c8e6..10a948ef844028a16fcd43c6cc9b30c6055589c8 100644 (file)
@@ -154,7 +154,7 @@ struct cx24120_state {
        u32 bitrate;
        u32 berw_usecs;
        u32 ber_prev;
-       u32 per_prev;
+       u32 ucb_offset;
        unsigned long ber_jiffies_stats;
        unsigned long per_jiffies_stats;
 };
@@ -698,8 +698,12 @@ static void cx24120_get_stats(struct cx24120_state *state)
                ucb |= cx24120_readreg(state, CX24120_REG_UCB_L);
                dev_dbg(&state->i2c->dev, "ucblocks = %d\n", ucb);
 
+               /* handle reset */
+               if (ucb < state->ucb_offset)
+                       state->ucb_offset = c->block_error.stat[0].uvalue;
+
                c->block_error.stat[0].scale = FE_SCALE_COUNTER;
-               c->block_error.stat[0].uvalue += ucb;
+               c->block_error.stat[0].uvalue = ucb + state->ucb_offset;
 
                c->block_count.stat[0].scale = FE_SCALE_COUNTER;
                c->block_count.stat[0].uvalue += state->bitrate / 8 / 208;
@@ -1541,8 +1545,7 @@ static int cx24120_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
                return 0;
        }
 
-       *ucblocks = c->block_error.stat[0].uvalue - state->per_prev;
-       state->per_prev = c->block_error.stat[0].uvalue;
+       *ucblocks = c->block_error.stat[0].uvalue - state->ucb_offset;
 
        return 0;
 }