diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-03-02 08:15:30 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-03-04 14:33:43 -0500 |
commit | 0921ecfdc2b93ebbe8f2371dac634d91e4fbdf60 (patch) | |
tree | bdb3955c1f2970941458069a7cd118d947f5d6c1 /drivers/media/dvb-frontends/mb86a20s.c | |
parent | dad78c56620d425eede52d74e8ba73ea136703dd (diff) |
[media] mb86a20s: don't allow updating signal strength too fast
Getting signal strength requires some loop poking with I2C.
Don't let it happen too fast.
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb-frontends/mb86a20s.c')
-rw-r--r-- | drivers/media/dvb-frontends/mb86a20s.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/media/dvb-frontends/mb86a20s.c b/drivers/media/dvb-frontends/mb86a20s.c index 0fbfae23d904..9948fcbf1596 100644 --- a/drivers/media/dvb-frontends/mb86a20s.c +++ b/drivers/media/dvb-frontends/mb86a20s.c | |||
@@ -34,6 +34,7 @@ struct mb86a20s_state { | |||
34 | u32 if_freq; | 34 | u32 if_freq; |
35 | 35 | ||
36 | u32 estimated_rate[3]; | 36 | u32 estimated_rate[3]; |
37 | unsigned long get_strength_time; | ||
37 | 38 | ||
38 | bool need_init; | 39 | bool need_init; |
39 | }; | 40 | }; |
@@ -318,9 +319,17 @@ static int mb86a20s_read_status(struct dvb_frontend *fe, fe_status_t *status) | |||
318 | static int mb86a20s_read_signal_strength(struct dvb_frontend *fe) | 319 | static int mb86a20s_read_signal_strength(struct dvb_frontend *fe) |
319 | { | 320 | { |
320 | struct mb86a20s_state *state = fe->demodulator_priv; | 321 | struct mb86a20s_state *state = fe->demodulator_priv; |
322 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; | ||
321 | int rc; | 323 | int rc; |
322 | unsigned rf_max, rf_min, rf; | 324 | unsigned rf_max, rf_min, rf; |
323 | 325 | ||
326 | if (state->get_strength_time && | ||
327 | (!time_after(jiffies, state->get_strength_time))) | ||
328 | return c->strength.stat[0].uvalue; | ||
329 | |||
330 | /* Reset its value if an error happen */ | ||
331 | c->strength.stat[0].uvalue = 0; | ||
332 | |||
324 | /* Does a binary search to get RF strength */ | 333 | /* Does a binary search to get RF strength */ |
325 | rf_max = 0xfff; | 334 | rf_max = 0xfff; |
326 | rf_min = 0; | 335 | rf_min = 0; |
@@ -350,15 +359,19 @@ static int mb86a20s_read_signal_strength(struct dvb_frontend *fe) | |||
350 | rf = (rf_max + rf_min) / 2; | 359 | rf = (rf_max + rf_min) / 2; |
351 | 360 | ||
352 | /* Rescale it from 2^12 (4096) to 2^16 */ | 361 | /* Rescale it from 2^12 (4096) to 2^16 */ |
353 | rf <<= (16 - 12); | 362 | rf = rf << (16 - 12); |
363 | if (rf) | ||
364 | rf |= (1 << 12) - 1; | ||
365 | |||
354 | dev_dbg(&state->i2c->dev, | 366 | dev_dbg(&state->i2c->dev, |
355 | "%s: signal strength = %d (%d < RF=%d < %d)\n", | 367 | "%s: signal strength = %d (%d < RF=%d < %d)\n", |
356 | __func__, rf, rf_min, rf >> 4, rf_max); | 368 | __func__, rf, rf_min, rf >> 4, rf_max); |
357 | return rf; | 369 | c->strength.stat[0].uvalue = rf; |
370 | state->get_strength_time = jiffies + | ||
371 | msecs_to_jiffies(1000); | ||
372 | return 0; | ||
358 | } | 373 | } |
359 | } while (1); | 374 | } while (1); |
360 | |||
361 | return 0; | ||
362 | } | 375 | } |
363 | 376 | ||
364 | static int mb86a20s_get_modulation(struct mb86a20s_state *state, | 377 | static int mb86a20s_get_modulation(struct mb86a20s_state *state, |
@@ -1882,7 +1895,6 @@ static int mb86a20s_read_status_and_stats(struct dvb_frontend *fe, | |||
1882 | fe_status_t *status) | 1895 | fe_status_t *status) |
1883 | { | 1896 | { |
1884 | struct mb86a20s_state *state = fe->demodulator_priv; | 1897 | struct mb86a20s_state *state = fe->demodulator_priv; |
1885 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; | ||
1886 | int rc, status_nr; | 1898 | int rc, status_nr; |
1887 | 1899 | ||
1888 | dev_dbg(&state->i2c->dev, "%s called.\n", __func__); | 1900 | dev_dbg(&state->i2c->dev, "%s called.\n", __func__); |
@@ -1913,8 +1925,6 @@ static int mb86a20s_read_status_and_stats(struct dvb_frontend *fe, | |||
1913 | rc = 0; /* Status is OK */ | 1925 | rc = 0; /* Status is OK */ |
1914 | goto error; | 1926 | goto error; |
1915 | } | 1927 | } |
1916 | /* Fill signal strength */ | ||
1917 | c->strength.stat[0].uvalue = rc; | ||
1918 | 1928 | ||
1919 | if (status_nr >= 7) { | 1929 | if (status_nr >= 7) { |
1920 | /* Get TMCC info*/ | 1930 | /* Get TMCC info*/ |