diff options
author | Evgeny Plehov <EvgenyPlehov@ukr.net> | 2012-09-13 09:19:39 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-09-23 20:27:19 -0400 |
commit | f9040ef3fab8f6f5f6fced5583203695d08efde3 (patch) | |
tree | 0ab85b43443923287f16b17d17998c654e6aa2f9 /drivers/media | |
parent | 81800159eff5ae8369a0e21a469cb7241a34a7dc (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.c | 32 |
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 | ||
3428 | static 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; | ||
3450 | err: | ||
3451 | dprintk(FE_ERROR, 1, "I/O error"); | ||
3452 | return -1; | ||
3453 | } | ||
3454 | |||
3428 | static enum dvbfe_search stv090x_search(struct dvb_frontend *fe) | 3455 | static 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); |