forked from Minki/linux
[media] af9013: cache some reg values to reduce reg reads
Demod + tuner specific RF AGC and IF AGC limit values are read from demod memory in every signal strength query. Cache those to reduce I2C traffic. Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
edb709b61a
commit
9e35cd222b
@ -42,6 +42,8 @@ struct af9013_state {
|
||||
|
||||
struct af9013_config config;
|
||||
|
||||
/* tuner/demod RF and IF AGC limits used for signal strength calc */
|
||||
u8 signal_strength_en, rf_50, rf_80, if_50, if_80;
|
||||
u16 signal_strength;
|
||||
u32 ber;
|
||||
u32 ucblocks;
|
||||
@ -963,45 +965,31 @@ static int af9013_update_signal_strength(struct dvb_frontend *fe)
|
||||
{
|
||||
struct af9013_state *state = fe->demodulator_priv;
|
||||
int ret;
|
||||
u8 tmp0;
|
||||
u8 rf_gain, rf_50, rf_80, if_gain, if_50, if_80;
|
||||
u8 rf_gain, if_gain;
|
||||
int signal_strength;
|
||||
|
||||
deb_info("%s\n", __func__);
|
||||
|
||||
state->signal_strength = 0;
|
||||
|
||||
ret = af9013_read_reg_bits(state, 0x9bee, 0, 1, &tmp0);
|
||||
if (ret)
|
||||
goto error;
|
||||
if (tmp0) {
|
||||
ret = af9013_read_reg(state, 0x9bbd, &rf_50);
|
||||
if (ret)
|
||||
goto error;
|
||||
ret = af9013_read_reg(state, 0x9bd0, &rf_80);
|
||||
if (ret)
|
||||
goto error;
|
||||
ret = af9013_read_reg(state, 0x9be2, &if_50);
|
||||
if (ret)
|
||||
goto error;
|
||||
ret = af9013_read_reg(state, 0x9be4, &if_80);
|
||||
if (ret)
|
||||
goto error;
|
||||
if (state->signal_strength_en) {
|
||||
ret = af9013_read_reg(state, 0xd07c, &rf_gain);
|
||||
if (ret)
|
||||
goto error;
|
||||
ret = af9013_read_reg(state, 0xd07d, &if_gain);
|
||||
if (ret)
|
||||
goto error;
|
||||
signal_strength = (0xffff / (9 * (rf_50 + if_50) - \
|
||||
11 * (rf_80 + if_80))) * (10 * (rf_gain + if_gain) - \
|
||||
11 * (rf_80 + if_80));
|
||||
signal_strength = (0xffff / \
|
||||
(9 * (state->rf_50 + state->if_50) - \
|
||||
11 * (state->rf_80 + state->if_80))) * \
|
||||
(10 * (rf_gain + if_gain) - \
|
||||
11 * (state->rf_80 + state->if_80));
|
||||
if (signal_strength < 0)
|
||||
signal_strength = 0;
|
||||
else if (signal_strength > 0xffff)
|
||||
signal_strength = 0xffff;
|
||||
|
||||
state->signal_strength = signal_strength;
|
||||
} else {
|
||||
state->signal_strength = 0;
|
||||
}
|
||||
|
||||
error:
|
||||
@ -1306,6 +1294,27 @@ static int af9013_init(struct dvb_frontend *fe)
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
/* read values needed for signal strength calculation */
|
||||
ret = af9013_read_reg_bits(state, 0x9bee, 0, 1,
|
||||
&state->signal_strength_en);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
if (state->signal_strength_en) {
|
||||
ret = af9013_read_reg(state, 0x9bbd, &state->rf_50);
|
||||
if (ret)
|
||||
goto error;
|
||||
ret = af9013_read_reg(state, 0x9bd0, &state->rf_80);
|
||||
if (ret)
|
||||
goto error;
|
||||
ret = af9013_read_reg(state, 0x9be2, &state->if_50);
|
||||
if (ret)
|
||||
goto error;
|
||||
ret = af9013_read_reg(state, 0x9be4, &state->if_80);
|
||||
if (ret)
|
||||
goto error;
|
||||
}
|
||||
|
||||
error:
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user