diff options
Diffstat (limited to 'drivers/media/dvb-frontends')
-rw-r--r-- | drivers/media/dvb-frontends/mb86a20s.c | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/drivers/media/dvb-frontends/mb86a20s.c b/drivers/media/dvb-frontends/mb86a20s.c index 8f4fff1f0fa5..03b74d3afd8f 100644 --- a/drivers/media/dvb-frontends/mb86a20s.c +++ b/drivers/media/dvb-frontends/mb86a20s.c | |||
@@ -320,16 +320,14 @@ static int mb86a20s_read_signal_strength(struct dvb_frontend *fe, u16 *strength) | |||
320 | static int mb86a20s_read_status(struct dvb_frontend *fe, fe_status_t *status) | 320 | static int mb86a20s_read_status(struct dvb_frontend *fe, fe_status_t *status) |
321 | { | 321 | { |
322 | struct mb86a20s_state *state = fe->demodulator_priv; | 322 | struct mb86a20s_state *state = fe->demodulator_priv; |
323 | u8 val; | 323 | int val; |
324 | 324 | ||
325 | dprintk("\n"); | 325 | dprintk("\n"); |
326 | *status = 0; | 326 | *status = 0; |
327 | 327 | ||
328 | if (fe->ops.i2c_gate_ctrl) | ||
329 | fe->ops.i2c_gate_ctrl(fe, 0); | ||
330 | val = mb86a20s_readreg(state, 0x0a) & 0xf; | 328 | val = mb86a20s_readreg(state, 0x0a) & 0xf; |
331 | if (fe->ops.i2c_gate_ctrl) | 329 | if (val < 0) |
332 | fe->ops.i2c_gate_ctrl(fe, 1); | 330 | return val; |
333 | 331 | ||
334 | if (val >= 2) | 332 | if (val >= 2) |
335 | *status |= FE_HAS_SIGNAL; | 333 | *status |= FE_HAS_SIGNAL; |
@@ -635,6 +633,25 @@ error: | |||
635 | 633 | ||
636 | } | 634 | } |
637 | 635 | ||
636 | static int mb86a20s_read_status_gate(struct dvb_frontend *fe, | ||
637 | fe_status_t *status) | ||
638 | { | ||
639 | int ret; | ||
640 | |||
641 | dprintk("\n"); | ||
642 | *status = 0; | ||
643 | |||
644 | if (fe->ops.i2c_gate_ctrl) | ||
645 | fe->ops.i2c_gate_ctrl(fe, 0); | ||
646 | |||
647 | ret = mb86a20s_read_status(fe, status); | ||
648 | |||
649 | if (fe->ops.i2c_gate_ctrl) | ||
650 | fe->ops.i2c_gate_ctrl(fe, 1); | ||
651 | |||
652 | return ret; | ||
653 | } | ||
654 | |||
638 | static int mb86a20s_tune(struct dvb_frontend *fe, | 655 | static int mb86a20s_tune(struct dvb_frontend *fe, |
639 | bool re_tune, | 656 | bool re_tune, |
640 | unsigned int mode_flags, | 657 | unsigned int mode_flags, |
@@ -649,7 +666,7 @@ static int mb86a20s_tune(struct dvb_frontend *fe, | |||
649 | rc = mb86a20s_set_frontend(fe); | 666 | rc = mb86a20s_set_frontend(fe); |
650 | 667 | ||
651 | if (!(mode_flags & FE_TUNE_MODE_ONESHOT)) | 668 | if (!(mode_flags & FE_TUNE_MODE_ONESHOT)) |
652 | mb86a20s_read_status(fe, status); | 669 | mb86a20s_read_status_gate(fe, status); |
653 | 670 | ||
654 | return rc; | 671 | return rc; |
655 | } | 672 | } |
@@ -730,7 +747,7 @@ static struct dvb_frontend_ops mb86a20s_ops = { | |||
730 | .init = mb86a20s_initfe, | 747 | .init = mb86a20s_initfe, |
731 | .set_frontend = mb86a20s_set_frontend, | 748 | .set_frontend = mb86a20s_set_frontend, |
732 | .get_frontend = mb86a20s_get_frontend, | 749 | .get_frontend = mb86a20s_get_frontend, |
733 | .read_status = mb86a20s_read_status, | 750 | .read_status = mb86a20s_read_status_gate, |
734 | .read_signal_strength = mb86a20s_read_signal_strength, | 751 | .read_signal_strength = mb86a20s_read_signal_strength, |
735 | .tune = mb86a20s_tune, | 752 | .tune = mb86a20s_tune, |
736 | }; | 753 | }; |