DVB-S2 Multistream support for stv090x

Signed-off-by: Evgeny Plehov <evgenyple...@ukr.net>
diff --git a/drivers/media/dvb/frontends/stv090x.c 
b/drivers/media/dvb/frontends/stv090x.c
index ea86a56..13caec0 100644
--- a/drivers/media/dvb/frontends/stv090x.c
+++ b/drivers/media/dvb/frontends/stv090x.c
@@ -3425,6 +3425,33 @@ err:
        return -1;
 }
 
+static int stv090x_set_mis(struct stv090x_state *state, int mis)
+{
+       u32 reg;
+
+       if (mis < 0 || mis > 255) {
+               dprintk(FE_DEBUG, 1, "Disable MIS filtering");
+               reg = STV090x_READ_DEMOD(state, PDELCTRL1);
+               STV090x_SETFIELD_Px(reg, FILTER_EN_FIELD, 0x00);
+               if (STV090x_WRITE_DEMOD(state, PDELCTRL1, reg) < 0)
+                       goto err;
+       } else {
+               dprintk(FE_DEBUG, 1, "Enable MIS filtering - %d", mis);
+               reg = STV090x_READ_DEMOD(state, PDELCTRL1);
+               STV090x_SETFIELD_Px(reg, FILTER_EN_FIELD, 0x01);
+               if (STV090x_WRITE_DEMOD(state, PDELCTRL1, reg) < 0)
+                       goto err;
+               if (STV090x_WRITE_DEMOD(state, ISIENTRY, mis) < 0)
+                       goto err;
+               if (STV090x_WRITE_DEMOD(state, ISIBITENA, 0xff) < 0)
+                       goto err;
+       }
+       return 0;
+err:
+       dprintk(FE_ERROR, 1, "I/O error");
+       return -1;
+}
+
 static enum dvbfe_search stv090x_search(struct dvb_frontend *fe)
 {
        struct stv090x_state *state = fe->demodulator_priv;
@@ -3447,6 +3474,8 @@ static enum dvbfe_search stv090x_search(struct 
dvb_frontend *fe)
                state->search_range = 5000000;
        }
 
+       stv090x_set_mis(state, props->stream_id);
+
        if (stv090x_algo(state) == STV090x_RANGEOK) {
                dprintk(FE_DEBUG, 1, "Search success!");
                return DVBFE_ALGO_SEARCH_SUCCESS;
@@ -4798,6 +4827,9 @@ struct dvb_frontend *stv090x_attach(const struct 
stv090x_config *config,
                }
        }
 
+       if (state->internal->dev_ver >= 0x30)
+               state->frontend.ops.info.caps |= FE_CAN_MULTISTREAM;
+
        /* workaround for stuck DiSEqC output */
        if (config->diseqc_envelope_mode)
                stv090x_send_diseqc_burst(&state->frontend, SEC_MINI_A);
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to