From 20e28228950f2e54c99e5143404bfc657468eff0 Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Sun, 12 Feb 2012 15:03:03 -0300 Subject: [PATCH] --- yaml --- r: 294995 b: refs/heads/master c: 06302ffbb470359c8cbcf1ee8b057d6930300f90 h: refs/heads/master i: 294993: 871861bb0188f6cd6355a25d86aa2008bba1e951 294991: de6e998954b2716f3085fff483898bf046db222e v: v3 --- [refs] | 2 +- trunk/drivers/media/dvb/frontends/cx22702.c | 22 ++++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 7ca10a45080a..de660444da9a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6c5637e4eda58292f7d9ee6ee0b1f9aa4b0a7e7f +refs/heads/master: 06302ffbb470359c8cbcf1ee8b057d6930300f90 diff --git a/trunk/drivers/media/dvb/frontends/cx22702.c b/trunk/drivers/media/dvb/frontends/cx22702.c index faba82485086..edc8eafc5c09 100644 --- a/trunk/drivers/media/dvb/frontends/cx22702.c +++ b/trunk/drivers/media/dvb/frontends/cx22702.c @@ -502,10 +502,26 @@ static int cx22702_read_signal_strength(struct dvb_frontend *fe, u16 *signal_strength) { struct cx22702_state *state = fe->demodulator_priv; + u8 reg23; - u16 rs_ber; - rs_ber = cx22702_readreg(state, 0x23); - *signal_strength = (rs_ber << 8) | rs_ber; + /* + * Experience suggests that the strength signal register works as + * follows: + * - In the absence of signal, value is 0xff. + * - In the presence of a weak signal, bit 7 is set, not sure what + * the lower 7 bits mean. + * - In the presence of a strong signal, the register holds a 7-bit + * value (bit 7 is cleared), with greater values standing for + * weaker signals. + */ + reg23 = cx22702_readreg(state, 0x23); + if (reg23 & 0x80) { + *signal_strength = 0; + } else { + reg23 = ~reg23 & 0x7f; + /* Scale to 16 bit */ + *signal_strength = (reg23 << 9) | (reg23 << 2) | (reg23 >> 5); + } return 0; }