Now that b2c2 has an option to allow us to do so, turn off the
flexcop streams when we turn off mpeg output whilst tuning.

Signed-off-by: Jemma Denson <jden...@gmail.com>
---
 drivers/media/common/b2c2/flexcop-fe-tuner.c | 10 ++++++++++
 drivers/media/dvb-frontends/cx24120.c        | 29 +++++++++++++++++++---------
 drivers/media/dvb-frontends/cx24120.h        |  1 +
 3 files changed, 31 insertions(+), 9 deletions(-)

diff --git a/drivers/media/common/b2c2/flexcop-fe-tuner.c 
b/drivers/media/common/b2c2/flexcop-fe-tuner.c
index 31ebf1e..706ff26 100644
--- a/drivers/media/common/b2c2/flexcop-fe-tuner.c
+++ b/drivers/media/common/b2c2/flexcop-fe-tuner.c
@@ -625,11 +625,20 @@ fail:
 
 /* SkyStar S2 PCI DVB-S/S2 card based on Conexant cx24120/cx24118 */
 #if FE_SUPPORTED(CX24120) && FE_SUPPORTED(ISL6421)
+static int skystarS2_rev33_stream_control(struct dvb_frontend *fe, int onoff)
+{
+       struct flexcop_device *fc = fe->dvb->priv;
+
+       flexcop_external_stream_control(fc, onoff);
+       return 0;
+}
+
 static const struct cx24120_config skystar2_rev3_3_cx24120_config = {
        .i2c_addr = 0x55,
        .xtal_khz = 10111,
        .initial_mpeg_config = { 0xa1, 0x76, 0x07 },
        .request_firmware = flexcop_fe_request_firmware,
+       .stream_control = skystarS2_rev33_stream_control,
        .i2c_wr_max = 4,
 };
 
@@ -651,6 +660,7 @@ static int skystarS2_rev33_attach(struct flexcop_device *fc,
        }
        info("ISL6421 successfully attached.");
 
+       fc->use_external_stream_control = 1;
        if (fc->has_32_hw_pid_filter)
                fc->skip_6_hw_pid_filter = 1;
 
diff --git a/drivers/media/dvb-frontends/cx24120.c 
b/drivers/media/dvb-frontends/cx24120.c
index a14d0f1..d625c1c 100644
--- a/drivers/media/dvb-frontends/cx24120.c
+++ b/drivers/media/dvb-frontends/cx24120.c
@@ -371,6 +371,8 @@ static void cx24120_check_cmd(struct cx24120_state *state, 
u8 id)
        case CMD_DISEQC_BURST:
                cx24120_msg_mpeg_output_global_config(state, 0);
                /* Old driver would do a msleep(100) here */
+               state->config->stream_control(&state->frontend, 0);
+               state->mpeg_enabled = 0;
        default:
                return;
        }
@@ -382,10 +384,9 @@ static int cx24120_message_send(struct cx24120_state 
*state,
 {
        int ficus;
 
-       if (state->mpeg_enabled) {
-               /* Disable mpeg out on certain commands */
+       /* If controlling stream, turn if off whilst tuning */
+       if (state->config->stream_control && state->mpeg_enabled)
                cx24120_check_cmd(state, cmd->id);
-       }
 
        cx24120_writereg(state, CX24120_REG_CMD_START, cmd->id);
        cx24120_writeregs(state, CX24120_REG_CMD_ARGS, &cmd->arg[0],
@@ -464,7 +465,6 @@ static int cx24120_msg_mpeg_output_global_config(struct 
cx24120_state *state,
                return ret;
        }
 
-       state->mpeg_enabled = enable;
        dev_dbg(&state->i2c->dev, "MPEG output %s\n",
                enable ? "enabled" : "disabled");
 
@@ -743,11 +743,13 @@ static int cx24120_read_status(struct dvb_frontend *fe, 
fe_status_t *status)
                /* Set clock ratios */
                cx24120_set_clock_ratios(fe);
 
-               /* Old driver would do a msleep(200) here */
-
                /* Renable mpeg output */
-               if (!state->mpeg_enabled)
+               if (state->config->stream_control && !state->mpeg_enabled) {
+                       /* Old driver would do a msleep(200) here */
                        cx24120_msg_mpeg_output_global_config(state, 1);
+                       state->config->stream_control(fe, 1);
+                       state->mpeg_enabled = 1;
+               }
 
                state->need_clock_set = 0;
        }
@@ -1418,8 +1420,17 @@ static int cx24120_init(struct dvb_frontend *fe)
 
        /* Initialise mpeg outputs */
        cx24120_writereg(state, 0xeb, 0x0a);
-       if (cx24120_msg_mpeg_output_global_config(state, 0) ||
-           cx24120_msg_mpeg_output_config(state, 0) ||
+
+       /* Enable global output now if we're not doing stream control */
+       if (!state->config->stream_control)
+               ret = cx24120_msg_mpeg_output_global_config(state, 1);
+       else
+               ret = cx24120_msg_mpeg_output_global_config(state, 0);
+
+       if (ret != 0)
+               return ret;
+
+       if (cx24120_msg_mpeg_output_config(state, 0) ||
            cx24120_msg_mpeg_output_config(state, 1) ||
            cx24120_msg_mpeg_output_config(state, 2)) {
                err("Error initialising mpeg output. :(\n");
diff --git a/drivers/media/dvb-frontends/cx24120.h 
b/drivers/media/dvb-frontends/cx24120.h
index f097042..313518c 100644
--- a/drivers/media/dvb-frontends/cx24120.h
+++ b/drivers/media/dvb-frontends/cx24120.h
@@ -37,6 +37,7 @@ struct cx24120_config {
 
        int (*request_firmware)(struct dvb_frontend *fe,
                                const struct firmware **fw, char *name);
+       int (*stream_control)(struct dvb_frontend *fe, int onoff);
 
        /* max bytes I2C provider can write at once */
        u16 i2c_wr_max;
-- 
2.1.0

--
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