diff options
author | Michael Krufky <mkrufky@linuxtv.org> | 2008-06-13 16:33:23 -0400 |
---|---|---|
committer | Michael Krufky <mkrufky@linuxtv.org> | 2008-06-13 16:33:23 -0400 |
commit | e5aea1ac83af542c544bd607a83c1c4193140e2b (patch) | |
tree | 01781810e53f27ec450682e85702c6b88d49235e /linux/drivers/media/dvb/frontends | |
parent | f19c906d471fdd9a55e926da387459e757c469b0 (diff) | |
download | mediapointer-dvb-s2-e5aea1ac83af542c544bd607a83c1c4193140e2b.tar.gz mediapointer-dvb-s2-e5aea1ac83af542c544bd607a83c1c4193140e2b.tar.bz2 |
au8522: tuning optimizations
From: Michael Krufky <mkrufky@linuxtv.org>
If the current modulation and frequency is already set to
the desired parameters, then don't re-tune.
Don't store current frequency until after we've tuned successfully.
Force a re-tune after resume from standby.
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Diffstat (limited to 'linux/drivers/media/dvb/frontends')
-rw-r--r-- | linux/drivers/media/dvb/frontends/au8522.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/linux/drivers/media/dvb/frontends/au8522.c b/linux/drivers/media/dvb/frontends/au8522.c index 3e1b0d96f..6d80ca2bd 100644 --- a/linux/drivers/media/dvb/frontends/au8522.c +++ b/linux/drivers/media/dvb/frontends/au8522.c @@ -462,10 +462,13 @@ static int au8522_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *p) { struct au8522_state *state = fe->demodulator_priv; + int ret = -EINVAL; dprintk("%s(frequency=%d)\n", __func__, p->frequency); - state->current_frequency = p->frequency; + if ((state->current_frequency == p->frequency) && + (state->current_modulation == p->u.vsb.modulation)) + return 0; au8522_enable_modulation(fe, p->u.vsb.modulation); @@ -475,11 +478,16 @@ static int au8522_set_frontend(struct dvb_frontend *fe, if (fe->ops.tuner_ops.set_params) { if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 1); - fe->ops.tuner_ops.set_params(fe, p); + ret = fe->ops.tuner_ops.set_params(fe, p); if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); } + if (ret < 0) + return ret; + + state->current_frequency = p->frequency; + return 0; } @@ -497,6 +505,16 @@ static int au8522_init(struct dvb_frontend *fe) return 0; } +static int au8522_sleep(struct dvb_frontend *fe) +{ + struct au8522_state *state = fe->demodulator_priv; + dprintk("%s()\n", __func__); + + state->current_frequency = 0; + + return 0; +} + static int au8522_read_status(struct dvb_frontend *fe, fe_status_t *status) { struct au8522_state *state = fe->demodulator_priv; @@ -677,6 +695,7 @@ static struct dvb_frontend_ops au8522_ops = { }, .init = au8522_init, + .sleep = au8522_sleep, .i2c_gate_ctrl = au8522_i2c_gate_ctrl, .set_frontend = au8522_set_frontend, .get_frontend = au8522_get_frontend, |