V4L/DVB (13356): stv090x: fixes signal lock logic

This patch contains several fixes for the stv090x driver:
- added missing else
- use calculated timeout instead of fixed one
- use correct frequency when doing zigzag scan
- added missing read of GENCFG register

Signed-off-by: Andreas Regel <andreas.regel@gmx.de>
Signed-off-by: Manu Abraham <manu@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Andreas Regel 2009-11-13 18:17:45 -03:00 committed by Mauro Carvalho Chehab
parent b4a4248d56
commit a4978a83e5
1 changed files with 14 additions and 13 deletions

View File

@ -1436,9 +1436,7 @@ static int stv090x_start_search(struct stv090x_state *state)
} }
if (STV090x_WRITE_DEMOD(state, CARHDR, 0x40) < 0) if (STV090x_WRITE_DEMOD(state, CARHDR, 0x40) < 0)
goto err; goto err;
} } else if (state->srate < 10000000) {
if (state->srate < 10000000) {
if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x4c) < 0) if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x4c) < 0)
goto err; goto err;
} else { } else {
@ -1689,7 +1687,7 @@ static u32 stv090x_srate_srch_coarse(struct stv090x_state *state)
goto err; goto err;
if (state->config->tuner_set_frequency) { if (state->config->tuner_set_frequency) {
if (state->config->tuner_set_frequency(fe, state->frequency) < 0) if (state->config->tuner_set_frequency(fe, freq) < 0)
goto err; goto err;
} }
@ -1867,7 +1865,7 @@ static int stv090x_get_dmdlock(struct stv090x_state *state, s32 timeout)
static int stv090x_blind_search(struct stv090x_state *state) static int stv090x_blind_search(struct stv090x_state *state)
{ {
u32 agc2, reg, srate_coarse; u32 agc2, reg, srate_coarse;
s32 timeout_dmd = 500, cpt_fail, agc2_ovflw, i; s32 cpt_fail, agc2_ovflw, i;
u8 k_ref, k_max, k_min; u8 k_ref, k_max, k_min;
int coarse_fail, lock; int coarse_fail, lock;
@ -1911,7 +1909,8 @@ static int stv090x_blind_search(struct stv090x_state *state)
srate_coarse = stv090x_srate_srch_fine(state); srate_coarse = stv090x_srate_srch_fine(state);
if (srate_coarse != 0) { if (srate_coarse != 0) {
stv090x_get_lock_tmg(state); stv090x_get_lock_tmg(state);
lock = stv090x_get_dmdlock(state, timeout_dmd); lock = stv090x_get_dmdlock(state,
state->DemodTimeout);
} else { } else {
lock = 0; lock = 0;
} }
@ -2073,7 +2072,7 @@ static int stv090x_get_coldlock(struct stv090x_state *state, s32 timeout_dmd)
goto err; goto err;
if (state->config->tuner_set_frequency) { if (state->config->tuner_set_frequency) {
if (state->config->tuner_set_frequency(fe, state->frequency) < 0) if (state->config->tuner_set_frequency(fe, freq) < 0)
goto err; goto err;
} }
@ -3053,7 +3052,7 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state)
struct dvb_frontend *fe = &state->frontend; struct dvb_frontend *fe = &state->frontend;
enum stv090x_signal_state signal_state = STV090x_NOCARRIER; enum stv090x_signal_state signal_state = STV090x_NOCARRIER;
u32 reg; u32 reg;
s32 timeout_dmd = 500, timeout_fec = 50, agc1_power, power_iq = 0, i; s32 agc1_power, power_iq = 0, i;
int lock = 0, low_sr = 0, no_signal = 0; int lock = 0, low_sr = 0, no_signal = 0;
reg = STV090x_READ_DEMOD(state, TSCFGH); reg = STV090x_READ_DEMOD(state, TSCFGH);
@ -3218,10 +3217,10 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state)
lock = stv090x_blind_search(state); lock = stv090x_blind_search(state);
else if (state->algo == STV090x_COLD_SEARCH) else if (state->algo == STV090x_COLD_SEARCH)
lock = stv090x_get_coldlock(state, timeout_dmd); lock = stv090x_get_coldlock(state, state->DemodTimeout);
else if (state->algo == STV090x_WARM_SEARCH) else if (state->algo == STV090x_WARM_SEARCH)
lock = stv090x_get_dmdlock(state, timeout_dmd); lock = stv090x_get_dmdlock(state, state->DemodTimeout);
if ((!lock) && (state->algo == STV090x_COLD_SEARCH)) { if ((!lock) && (state->algo == STV090x_COLD_SEARCH)) {
if (!low_sr) { if (!low_sr) {
@ -3256,8 +3255,9 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state)
goto err; goto err;
} }
if (stv090x_get_lock(state, timeout_fec, timeout_fec)) { lock = stv090x_get_lock(state, state->FecTimeout,
lock = 1; state->FecTimeout);
if (lock) {
if (state->delsys == STV090x_DVBS2) { if (state->delsys == STV090x_DVBS2) {
stv090x_set_s2rolloff(state); stv090x_set_s2rolloff(state);
@ -3284,7 +3284,6 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state)
if (STV090x_WRITE_DEMOD(state, ERRCTRL2, 0xc1) < 0) if (STV090x_WRITE_DEMOD(state, ERRCTRL2, 0xc1) < 0)
goto err; goto err;
} else { } else {
lock = 0;
signal_state = STV090x_NODATA; signal_state = STV090x_NODATA;
no_signal = stv090x_chk_signal(state); no_signal = stv090x_chk_signal(state);
} }
@ -3769,6 +3768,8 @@ static int stv090x_ldpc_mode(struct stv090x_state *state, enum stv090x_mode ldpc
{ {
u32 reg = 0; u32 reg = 0;
reg = stv090x_read_reg(state, STV090x_GENCFG);
switch (ldpc_mode) { switch (ldpc_mode) {
case STV090x_DUAL: case STV090x_DUAL:
default: default: