diff options
Diffstat (limited to 'drivers/media/dvb-frontends/stv0900_core.c')
| -rw-r--r-- | drivers/media/dvb-frontends/stv0900_core.c | 40 | 
1 files changed, 30 insertions, 10 deletions
diff --git a/drivers/media/dvb-frontends/stv0900_core.c b/drivers/media/dvb-frontends/stv0900_core.c index b551ca350e0..e5a87b57d85 100644 --- a/drivers/media/dvb-frontends/stv0900_core.c +++ b/drivers/media/dvb-frontends/stv0900_core.c @@ -524,11 +524,8 @@ void stv0900_set_tuner(struct dvb_frontend *fe, u32 frequency,  	struct dvb_frontend_ops *frontend_ops = NULL;  	struct dvb_tuner_ops *tuner_ops = NULL; -	if (&fe->ops) -		frontend_ops = &fe->ops; - -	if (&frontend_ops->tuner_ops) -		tuner_ops = &frontend_ops->tuner_ops; +	frontend_ops = &fe->ops; +	tuner_ops = &frontend_ops->tuner_ops;  	if (tuner_ops->set_frequency) {  		if ((tuner_ops->set_frequency(fe, frequency)) < 0) @@ -552,11 +549,8 @@ void stv0900_set_bandwidth(struct dvb_frontend *fe, u32 bandwidth)  	struct dvb_frontend_ops *frontend_ops = NULL;  	struct dvb_tuner_ops *tuner_ops = NULL; -	if (&fe->ops) -		frontend_ops = &fe->ops; - -	if (&frontend_ops->tuner_ops) -		tuner_ops = &frontend_ops->tuner_ops; +	frontend_ops = &fe->ops; +	tuner_ops = &frontend_ops->tuner_ops;  	if (tuner_ops->set_bandwidth) {  		if ((tuner_ops->set_bandwidth(fe, bandwidth)) < 0) @@ -1558,6 +1552,27 @@ static int stv0900_status(struct stv0900_internal *intp,  	return locked;  } +static int stv0900_set_mis(struct stv0900_internal *intp, +				enum fe_stv0900_demod_num demod, int mis) +{ +	enum fe_stv0900_error error = STV0900_NO_ERROR; + +	dprintk("%s\n", __func__); + +	if (mis < 0 || mis > 255) { +		dprintk("Disable MIS filtering\n"); +		stv0900_write_bits(intp, FILTER_EN, 0); +	} else { +		dprintk("Enable MIS filtering - %d\n", mis); +		stv0900_write_bits(intp, FILTER_EN, 1); +		stv0900_write_reg(intp, ISIENTRY, mis); +		stv0900_write_reg(intp, ISIBITENA, 0xff); +	} + +	return error; +} + +  static enum dvbfe_search stv0900_search(struct dvb_frontend *fe)  {  	struct stv0900_state *state = fe->demodulator_priv; @@ -1578,6 +1593,8 @@ static enum dvbfe_search stv0900_search(struct dvb_frontend *fe)  	if (state->config->set_ts_params)  		state->config->set_ts_params(fe, 0); +	stv0900_set_mis(intp, demod, c->stream_id); +  	p_result.locked = FALSE;  	p_search.path = demod;  	p_search.frequency = c->frequency; @@ -1935,6 +1952,9 @@ struct dvb_frontend *stv0900_attach(const struct stv0900_config *config,  		if (err_stv0900)  			goto error; +		if (state->internal->chip_id >= 0x30) +			state->frontend.ops.info.caps |= FE_CAN_MULTISTREAM; +  		break;  	default:  		goto error;  |