aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorEvgeny Plehov <EvgenyPlehov@ukr.net>2012-09-13 09:19:39 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-09-23 20:27:19 -0400
commitf9040ef3fab8f6f5f6fced5583203695d08efde3 (patch)
tree0ab85b43443923287f16b17d17998c654e6aa2f9 /drivers/media
parent81800159eff5ae8369a0e21a469cb7241a34a7dc (diff)
[media] stv090x: add support for multistream
Adds support for filtering multistream TS using stv090x hardware. Signed-off-by: Evgeny Plehov <EvgenyPlehov@ukr.net> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/dvb-frontends/stv090x.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/drivers/media/dvb-frontends/stv090x.c b/drivers/media/dvb-frontends/stv090x.c
index ea86a5603e57..13caec013902 100644
--- a/drivers/media/dvb-frontends/stv090x.c
+++ b/drivers/media/dvb-frontends/stv090x.c
@@ -3425,6 +3425,33 @@ err:
3425 return -1; 3425 return -1;
3426} 3426}
3427 3427
3428static int stv090x_set_mis(struct stv090x_state *state, int mis)
3429{
3430 u32 reg;
3431
3432 if (mis < 0 || mis > 255) {
3433 dprintk(FE_DEBUG, 1, "Disable MIS filtering");
3434 reg = STV090x_READ_DEMOD(state, PDELCTRL1);
3435 STV090x_SETFIELD_Px(reg, FILTER_EN_FIELD, 0x00);
3436 if (STV090x_WRITE_DEMOD(state, PDELCTRL1, reg) < 0)
3437 goto err;
3438 } else {
3439 dprintk(FE_DEBUG, 1, "Enable MIS filtering - %d", mis);
3440 reg = STV090x_READ_DEMOD(state, PDELCTRL1);
3441 STV090x_SETFIELD_Px(reg, FILTER_EN_FIELD, 0x01);
3442 if (STV090x_WRITE_DEMOD(state, PDELCTRL1, reg) < 0)
3443 goto err;
3444 if (STV090x_WRITE_DEMOD(state, ISIENTRY, mis) < 0)
3445 goto err;
3446 if (STV090x_WRITE_DEMOD(state, ISIBITENA, 0xff) < 0)
3447 goto err;
3448 }
3449 return 0;
3450err:
3451 dprintk(FE_ERROR, 1, "I/O error");
3452 return -1;
3453}
3454
3428static enum dvbfe_search stv090x_search(struct dvb_frontend *fe) 3455static enum dvbfe_search stv090x_search(struct dvb_frontend *fe)
3429{ 3456{
3430 struct stv090x_state *state = fe->demodulator_priv; 3457 struct stv090x_state *state = fe->demodulator_priv;
@@ -3447,6 +3474,8 @@ static enum dvbfe_search stv090x_search(struct dvb_frontend *fe)
3447 state->search_range = 5000000; 3474 state->search_range = 5000000;
3448 } 3475 }
3449 3476
3477 stv090x_set_mis(state, props->stream_id);
3478
3450 if (stv090x_algo(state) == STV090x_RANGEOK) { 3479 if (stv090x_algo(state) == STV090x_RANGEOK) {
3451 dprintk(FE_DEBUG, 1, "Search success!"); 3480 dprintk(FE_DEBUG, 1, "Search success!");
3452 return DVBFE_ALGO_SEARCH_SUCCESS; 3481 return DVBFE_ALGO_SEARCH_SUCCESS;
@@ -4798,6 +4827,9 @@ struct dvb_frontend *stv090x_attach(const struct stv090x_config *config,
4798 } 4827 }
4799 } 4828 }
4800 4829
4830 if (state->internal->dev_ver >= 0x30)
4831 state->frontend.ops.info.caps |= FE_CAN_MULTISTREAM;
4832
4801 /* workaround for stuck DiSEqC output */ 4833 /* workaround for stuck DiSEqC output */
4802 if (config->diseqc_envelope_mode) 4834 if (config->diseqc_envelope_mode)
4803 stv090x_send_diseqc_burst(&state->frontend, SEC_MINI_A); 4835 stv090x_send_diseqc_burst(&state->frontend, SEC_MINI_A);