diff options
author | Steven Toth <stoth@linuxtv.org> | 2008-10-20 09:19:07 -0400 |
---|---|---|
committer | Steven Toth <stoth@linuxtv.org> | 2008-10-20 09:19:07 -0400 |
commit | 053f35499249506e2e5aea4080483e318d4d45ea (patch) | |
tree | 2f299898dd6e144a071fab9f2faf959c1f25ae2d /linux/drivers/media/dvb/frontends | |
parent | 702a75991fe92586daefdfd2517ed990bb2a6f76 (diff) | |
download | mediapointer-dvb-s2-053f35499249506e2e5aea4080483e318d4d45ea.tar.gz mediapointer-dvb-s2-053f35499249506e2e5aea4080483e318d4d45ea.tar.bz2 |
s5h1411: Skip reconfiguring demod modulation if already at the desired modulation
From: Devin Heitmueller <devin.heitmueller@gmail.com>
If we are already at the desired modulation, there is no need to reconfigure
the demod (at a tuning time cost)
Note that this change revealed that although the datasheet says the demod
starts out in VSB-8 mode, the first tuning was failing consistently unless
we went through the work of setting the registers. So add a field to denote
this case so we always do the enable_frontend call, even if the first tuning
request is for VSB-8.
Signed-off-by: Devin Heitmueller <devin.heitmueller@gmail.com>
Reviewed-by: Michael Krufky <mkrufky@linuxtv.org>
Acked-by: Steven Toth <stoth@linuxtv.org>
Diffstat (limited to 'linux/drivers/media/dvb/frontends')
-rw-r--r-- | linux/drivers/media/dvb/frontends/s5h1411.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/linux/drivers/media/dvb/frontends/s5h1411.c b/linux/drivers/media/dvb/frontends/s5h1411.c index 40e0fedf3..b9ac6d35a 100644 --- a/linux/drivers/media/dvb/frontends/s5h1411.c +++ b/linux/drivers/media/dvb/frontends/s5h1411.c @@ -38,6 +38,7 @@ struct s5h1411_state { struct dvb_frontend frontend; fe_modulation_t current_modulation; + unsigned int first_tune:1; u32 current_frequency; int if_freq; @@ -489,6 +490,12 @@ static int s5h1411_enable_modulation(struct dvb_frontend *fe, dprintk("%s(0x%08x)\n", __func__, m); + if ((state->first_tune == 0) && (m == state->current_modulation)) { + dprintk("%s() Already at desired modulation. Skipping...\n", + __func__); + return 0; + } + switch (m) { case VSB_8: dprintk("%s() VSB_8\n", __func__); @@ -513,6 +520,7 @@ static int s5h1411_enable_modulation(struct dvb_frontend *fe, } state->current_modulation = m; + state->first_tune = 0; s5h1411_softreset(fe); return 0; @@ -622,6 +630,11 @@ static int s5h1411_init(struct dvb_frontend *fe) /* The datasheet says that after initialisation, VSB is default */ state->current_modulation = VSB_8; + /* Although the datasheet says it's in VSB, empirical evidence + shows problems getting lock on the first tuning request. Make + sure we call enable_modulation the first time around */ + state->first_tune = 1; + if (state->config->output_mode == S5H1411_SERIAL_OUTPUT) /* Serial */ s5h1411_set_serialmode(fe, 1); |