aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb-frontends/mb86a20s.c
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2013-03-02 08:15:30 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2013-03-04 14:33:43 -0500
commit0921ecfdc2b93ebbe8f2371dac634d91e4fbdf60 (patch)
treebdb3955c1f2970941458069a7cd118d947f5d6c1 /drivers/media/dvb-frontends/mb86a20s.c
parentdad78c56620d425eede52d74e8ba73ea136703dd (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.c24
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)
318static int mb86a20s_read_signal_strength(struct dvb_frontend *fe) 319static 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
364static int mb86a20s_get_modulation(struct mb86a20s_state *state, 377static 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*/