Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: Manu Abraham <manu@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Manu Abraham and committed by
Mauro Carvalho Chehab
c5b74b0f 19c4ee58

+13 -3
+8
drivers/media/dvb/frontends/stv090x.c
··· 3838 3838 struct stv090x_state *state = fe->demodulator_priv; 3839 3839 u32 reg; 3840 3840 3841 + if (state->config->tuner_init) { 3842 + if (state->config->tuner_sleep(fe) < 0) 3843 + goto err_gateoff; 3844 + } 3845 + 3841 3846 dprintk(FE_DEBUG, 1, "Set %s to sleep", 3842 3847 state->device == STV0900 ? "STV0900" : "STV0903"); 3843 3848 ··· 3857 3852 goto err; 3858 3853 3859 3854 return 0; 3855 + 3856 + err_gateoff: 3857 + stv090x_i2c_gate_ctrl(state, 0); 3860 3858 err: 3861 3859 dprintk(FE_ERROR, 1, "I/O error"); 3862 3860 return -1;
+1
drivers/media/dvb/frontends/stv090x.h
··· 87 87 bool diseqc_envelope_mode; 88 88 89 89 int (*tuner_init) (struct dvb_frontend *fe); 90 + int (*tuner_sleep) (struct dvb_frontend *fe); 90 91 int (*tuner_set_mode) (struct dvb_frontend *fe, enum tuner_mode mode); 91 92 int (*tuner_set_frequency) (struct dvb_frontend *fe, u32 frequency); 92 93 int (*tuner_get_frequency) (struct dvb_frontend *fe, u32 *frequency);
+1 -3
drivers/media/dvb/frontends/stv6110x.c
··· 338 338 .frequency_max = 2150000, 339 339 .frequency_step = 0, 340 340 }, 341 - 342 - .init = stv6110x_init, 343 - .sleep = stv6110x_sleep, 344 341 .release = stv6110x_release 345 342 }; 346 343 347 344 static struct stv6110x_devctl stv6110x_ctl = { 348 345 .tuner_init = stv6110x_init, 346 + .tuner_sleep = stv6110x_sleep, 349 347 .tuner_set_mode = stv6110x_set_mode, 350 348 .tuner_set_frequency = stv6110x_set_frequency, 351 349 .tuner_get_frequency = stv6110x_get_frequency,
+1
drivers/media/dvb/frontends/stv6110x.h
··· 40 40 41 41 struct stv6110x_devctl { 42 42 int (*tuner_init) (struct dvb_frontend *fe); 43 + int (*tuner_sleep) (struct dvb_frontend *fe); 43 44 int (*tuner_set_mode) (struct dvb_frontend *fe, enum tuner_mode mode); 44 45 int (*tuner_set_frequency) (struct dvb_frontend *fe, u32 frequency); 45 46 int (*tuner_get_frequency) (struct dvb_frontend *fe, u32 *frequency);
+2
drivers/media/dvb/ttpci/budget.c
··· 442 442 .repeater_level = STV090x_RPTLEVEL_16, 443 443 444 444 .tuner_init = NULL, 445 + .tuner_sleep = NULL, 445 446 .tuner_set_mode = NULL, 446 447 .tuner_set_frequency = NULL, 447 448 .tuner_get_frequency = NULL, ··· 629 628 &budget->i2c_adap); 630 629 631 630 tt1600_stv090x_config.tuner_init = ctl->tuner_init; 631 + tt1600_stv090x_config.tuner_sleep = ctl->tuner_sleep; 632 632 tt1600_stv090x_config.tuner_set_mode = ctl->tuner_set_mode; 633 633 tt1600_stv090x_config.tuner_set_frequency = ctl->tuner_set_frequency; 634 634 tt1600_stv090x_config.tuner_get_frequency = ctl->tuner_get_frequency;