@@ -734,27 +734,29 @@ static void au8522_get_stats(struct dvb_frontend *fe, enum fe_status status)
}
/* Get (or estimate) RF strength */
- if (fe->ops.tuner_ops.get_rf_strength) {
+ if (fe->ops.tuner_ops.get_rf_attenuation) {
+ s32 strength;
+
/* If the tuner has RF strength, use it */
-
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1);
- ret = fe->ops.tuner_ops.get_rf_strength(fe, &state->strength);
+ strength = fe->ops.tuner_ops.get_rf_attenuation(fe);
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 0);
- if (ret < 0)
- state->strength = 0;
- /*
- * FIXME: As this frontend is used only with au0828, and,
- * currently, the tuner is eiter xc5000 or tda18271, and
- * only the first implements get_rf_strength(), we'll assume
- * that the strength will be returned in dB.
- */
- c->strength.stat[0].svalue = 35000 - 1000 * (65535 - state->strength) / 256;
c->strength.stat[0].scale = FE_SCALE_DECIBEL;
+ c->strength.stat[0].svalue = 35000 - strength;
+
+ dprintk("Signal strength = %d.%02d dBm\n",
+ strength / 1000, (strength % 1000) / 10);
+
+
+ /* For DVBv3 legacy support, adjust scale */
+ strength = 65535 - strength;
+ state->strength = (strength < 0) ? 0 : strength;
} else {
u32 tmp;
+
/*
* If it doen't, estimate from SNR
* (borrowed from lgdt330x.c)
@@ -569,24 +569,18 @@ static int xc_get_totalgain(struct xc5000_priv *priv, u16 *totalgain)
return xc5000_readreg(priv, XREG_TOTALGAIN, totalgain);
}
-static int xc5000_get_rf_strength(struct dvb_frontend *fe, u16 *strength)
+static s32 xc5000_get_rf_attenuation(struct dvb_frontend *fe)
{
struct xc5000_priv *priv = fe->tuner_priv;
int ret;
- u16 gain = 0;
-
- *strength = 0;
+ u16 gain = 65535;
ret = xc_get_totalgain(priv, &gain);
if (ret < 0)
- return ret;
+ return 256000;
- *strength = 65535 - gain;
-
- dprintk(1, "Signal strength = 0x%04x (gain = 0x%04x)\n",
- *strength, gain);
-
- return 0;
+ /* In theory, it will range from 256 dB to 0 dB */
+ return (1000 * gain) / 256;
}
static u16 wait_for_lock(struct xc5000_priv *priv)
@@ -1399,20 +1393,20 @@ static const struct dvb_tuner_ops xc5000_tuner_ops = {
.frequency_step = 50000,
},
- .release = xc5000_release,
- .init = xc5000_init,
- .sleep = xc5000_sleep,
- .suspend = xc5000_suspend,
- .resume = xc5000_resume,
+ .release = xc5000_release,
+ .init = xc5000_init,
+ .sleep = xc5000_sleep,
+ .suspend = xc5000_suspend,
+ .resume = xc5000_resume,
- .set_config = xc5000_set_config,
- .set_params = xc5000_set_digital_params,
- .set_analog_params = xc5000_set_analog_params,
- .get_frequency = xc5000_get_frequency,
- .get_if_frequency = xc5000_get_if_frequency,
- .get_bandwidth = xc5000_get_bandwidth,
- .get_status = xc5000_get_status,
- .get_rf_strength = xc5000_get_rf_strength
+ .set_config = xc5000_set_config,
+ .set_params = xc5000_set_digital_params,
+ .set_analog_params = xc5000_set_analog_params,
+ .get_frequency = xc5000_get_frequency,
+ .get_if_frequency = xc5000_get_if_frequency,
+ .get_bandwidth = xc5000_get_bandwidth,
+ .get_status = xc5000_get_status,
+ .get_rf_attenuation = xc5000_get_rf_attenuation,
};
struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
Switch to the new get_rf_attenuation(), in order to remove some hacks at au8522. Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com> --- drivers/media/dvb-frontends/au8522_dig.c | 26 +++++++++++--------- drivers/media/tuners/xc5000.c | 42 ++++++++++++++------------------ 2 files changed, 32 insertions(+), 36 deletions(-)