Commit c5b74b0f authored by Manu Abraham's avatar Manu Abraham Committed by Mauro Carvalho Chehab

V4L/DVB: [STV090x, STV6110x] Use tuner sleep within the demodulator control

Oliver Endriss <o.endriss@gmx.de> pointed out:
Imho not a good idea, as the frontend thread calls
- fe->ops.tuner_ops.init
- fe->ops.tuner_ops.sleep

If you remove fe->ops.i2c_gate_ctrl, init and sleep will fail,
because gate_ctrl was never called...

--
Signed-off-by: default avatarManu Abraham <manu@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 19c4ee58
...@@ -3838,6 +3838,11 @@ static int stv090x_sleep(struct dvb_frontend *fe) ...@@ -3838,6 +3838,11 @@ static int stv090x_sleep(struct dvb_frontend *fe)
struct stv090x_state *state = fe->demodulator_priv; struct stv090x_state *state = fe->demodulator_priv;
u32 reg; u32 reg;
if (state->config->tuner_init) {
if (state->config->tuner_sleep(fe) < 0)
goto err_gateoff;
}
dprintk(FE_DEBUG, 1, "Set %s to sleep", dprintk(FE_DEBUG, 1, "Set %s to sleep",
state->device == STV0900 ? "STV0900" : "STV0903"); state->device == STV0900 ? "STV0900" : "STV0903");
...@@ -3852,6 +3857,9 @@ static int stv090x_sleep(struct dvb_frontend *fe) ...@@ -3852,6 +3857,9 @@ static int stv090x_sleep(struct dvb_frontend *fe)
goto err; goto err;
return 0; return 0;
err_gateoff:
stv090x_i2c_gate_ctrl(state, 0);
err: err:
dprintk(FE_ERROR, 1, "I/O error"); dprintk(FE_ERROR, 1, "I/O error");
return -1; return -1;
......
...@@ -87,6 +87,7 @@ struct stv090x_config { ...@@ -87,6 +87,7 @@ struct stv090x_config {
bool diseqc_envelope_mode; bool diseqc_envelope_mode;
int (*tuner_init) (struct dvb_frontend *fe); int (*tuner_init) (struct dvb_frontend *fe);
int (*tuner_sleep) (struct dvb_frontend *fe);
int (*tuner_set_mode) (struct dvb_frontend *fe, enum tuner_mode mode); int (*tuner_set_mode) (struct dvb_frontend *fe, enum tuner_mode mode);
int (*tuner_set_frequency) (struct dvb_frontend *fe, u32 frequency); int (*tuner_set_frequency) (struct dvb_frontend *fe, u32 frequency);
int (*tuner_get_frequency) (struct dvb_frontend *fe, u32 *frequency); int (*tuner_get_frequency) (struct dvb_frontend *fe, u32 *frequency);
......
...@@ -338,14 +338,12 @@ static struct dvb_tuner_ops stv6110x_ops = { ...@@ -338,14 +338,12 @@ static struct dvb_tuner_ops stv6110x_ops = {
.frequency_max = 2150000, .frequency_max = 2150000,
.frequency_step = 0, .frequency_step = 0,
}, },
.init = stv6110x_init,
.sleep = stv6110x_sleep,
.release = stv6110x_release .release = stv6110x_release
}; };
static struct stv6110x_devctl stv6110x_ctl = { static struct stv6110x_devctl stv6110x_ctl = {
.tuner_init = stv6110x_init, .tuner_init = stv6110x_init,
.tuner_sleep = stv6110x_sleep,
.tuner_set_mode = stv6110x_set_mode, .tuner_set_mode = stv6110x_set_mode,
.tuner_set_frequency = stv6110x_set_frequency, .tuner_set_frequency = stv6110x_set_frequency,
.tuner_get_frequency = stv6110x_get_frequency, .tuner_get_frequency = stv6110x_get_frequency,
......
...@@ -40,6 +40,7 @@ enum tuner_status { ...@@ -40,6 +40,7 @@ enum tuner_status {
struct stv6110x_devctl { struct stv6110x_devctl {
int (*tuner_init) (struct dvb_frontend *fe); int (*tuner_init) (struct dvb_frontend *fe);
int (*tuner_sleep) (struct dvb_frontend *fe);
int (*tuner_set_mode) (struct dvb_frontend *fe, enum tuner_mode mode); int (*tuner_set_mode) (struct dvb_frontend *fe, enum tuner_mode mode);
int (*tuner_set_frequency) (struct dvb_frontend *fe, u32 frequency); int (*tuner_set_frequency) (struct dvb_frontend *fe, u32 frequency);
int (*tuner_get_frequency) (struct dvb_frontend *fe, u32 *frequency); int (*tuner_get_frequency) (struct dvb_frontend *fe, u32 *frequency);
......
...@@ -442,6 +442,7 @@ static struct stv090x_config tt1600_stv090x_config = { ...@@ -442,6 +442,7 @@ static struct stv090x_config tt1600_stv090x_config = {
.repeater_level = STV090x_RPTLEVEL_16, .repeater_level = STV090x_RPTLEVEL_16,
.tuner_init = NULL, .tuner_init = NULL,
.tuner_sleep = NULL,
.tuner_set_mode = NULL, .tuner_set_mode = NULL,
.tuner_set_frequency = NULL, .tuner_set_frequency = NULL,
.tuner_get_frequency = NULL, .tuner_get_frequency = NULL,
...@@ -628,6 +629,7 @@ static void frontend_init(struct budget *budget) ...@@ -628,6 +629,7 @@ static void frontend_init(struct budget *budget)
&budget->i2c_adap); &budget->i2c_adap);
tt1600_stv090x_config.tuner_init = ctl->tuner_init; tt1600_stv090x_config.tuner_init = ctl->tuner_init;
tt1600_stv090x_config.tuner_sleep = ctl->tuner_sleep;
tt1600_stv090x_config.tuner_set_mode = ctl->tuner_set_mode; tt1600_stv090x_config.tuner_set_mode = ctl->tuner_set_mode;
tt1600_stv090x_config.tuner_set_frequency = ctl->tuner_set_frequency; tt1600_stv090x_config.tuner_set_frequency = ctl->tuner_set_frequency;
tt1600_stv090x_config.tuner_get_frequency = ctl->tuner_get_frequency; tt1600_stv090x_config.tuner_get_frequency = ctl->tuner_get_frequency;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment