diff mbox

[3/4] cx24120: Take control of b2c2 receive stream

Message ID 1432326508-6825-4-git-send-email-jdenson@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jemma Denson May 22, 2015, 8:28 p.m. UTC
Now that b2c2 has an option to allow us to do so, turn off the
flexcop receive stream when we turn off mpeg output whilst tuning.

This "turning off whilst tuning" feature is a bit unusual, and can
now also be easily disabled by leaving stream_control unset in the
config struct.

Signed-off-by: Jemma Denson <jdenson@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(-)

Comments

Patrick Boettcher May 26, 2015, 9:05 a.m. UTC | #1
Hi Jemma,

On Fri, 22 May 2015 21:28:27 +0100 Jemma Denson <jdenson@gmail.com>
wrote:

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

Does this not fix (and your '[PATCH 2/4]') the problem of receiving
PAT from the previously tuned transport-stream?

Then patch 1 and 4 should not be necessary, should they?!

--
Patrick.



--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jemma Denson May 26, 2015, 9:21 a.m. UTC | #2
Hi Patrick,

On 26/05/15 10:05, Patrick Boettcher wrote:
>> Now that b2c2 has an option to allow us to do so, turn off the
>> flexcop receive stream when we turn off mpeg output whilst tuning.
> Does this not fix (and your '[PATCH 2/4]') the problem of receiving
> PAT from the previously tuned transport-stream?
>
> Then patch 1 and 4 should not be necessary, should they?!

Only patch 1 fixes that problem, so out of the 4 here that one is the 
most necessary. Controlling the flexcop receive stream and/or stopping 
the cx24120 from sending doesn't actually appear to do much of anything 
- it doesn't seem any better or worse doing one or the other, both or 
even neither! (Apart from Patch 4 breaking things, as mentioned).

I'm including it though because I presume the reference driver advised 
it was done, and it does tidy up the cx24120 codebase considerably by 
being able to disable the whole turn off sending the stream whilst 
tuning feature - I'm envisioning that in the future someone might want 
to take on the task of merging cx24117 & cx24120 as they're quite 
similar, and allowing what seems to just be a flexcop oddity to be 
turned off would make this possible.


Jemma.
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Mauro Carvalho Chehab June 9, 2015, 11:56 p.m. UTC | #3
Em Tue, 26 May 2015 10:21:11 +0100
Jemma Denson <jdenson@gmail.com> escreveu:

> Hi Patrick,
> 
> On 26/05/15 10:05, Patrick Boettcher wrote:
> >> Now that b2c2 has an option to allow us to do so, turn off the
> >> flexcop receive stream when we turn off mpeg output whilst tuning.
> > Does this not fix (and your '[PATCH 2/4]') the problem of receiving
> > PAT from the previously tuned transport-stream?
> >
> > Then patch 1 and 4 should not be necessary, should they?!
> 
> Only patch 1 fixes that problem, so out of the 4 here that one is the 
> most necessary. Controlling the flexcop receive stream and/or stopping 
> the cx24120 from sending doesn't actually appear to do much of anything 
> - it doesn't seem any better or worse doing one or the other, both or 
> even neither! (Apart from Patch 4 breaking things, as mentioned).
> 
> I'm including it though because I presume the reference driver advised 
> it was done, and it does tidy up the cx24120 codebase considerably by 
> being able to disable the whole turn off sending the stream whilst 
> tuning feature - I'm envisioning that in the future someone might want 
> to take on the task of merging cx24117 & cx24120 as they're quite 
> similar, and allowing what seems to just be a flexcop oddity to be 
> turned off would make this possible.

Hmm... if patch 1 is enough to fix the issue, and patch 4 may break
things, I'll apply only patch 1/4 for now.

If Patrick agrees, and you find a way to avoid breakages, please
resubmit for me to apply the other ones.

Regards,
Mauro

> 
> 
> Jemma.
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jemma Denson June 10, 2015, 7:32 a.m. UTC | #4
Hi Mauro,

On 10/06/15 00:56, Mauro Carvalho Chehab wrote:
> Hmm... if patch 1 is enough to fix the issue, and patch 4 may break 
> things, I'll apply only patch 1/4 for now. If Patrick agrees, and you 
> find a way to avoid breakages, please resubmit for me to apply the 
> other ones. Regards, Mauro 

I already posted a v2 of this patch series which does the stream control 
in a much better way - that v2 version has been running on my mythtv 
recording box for a few weeks now without issue.

Jemma.
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/media/common/b2c2/flexcop-fe-tuner.c b/drivers/media/common/b2c2/flexcop-fe-tuner.c
index 31ebf1e..fdd3a18 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_stream_control(struct dvb_frontend *fe, int onoff)
+{
+	struct flexcop_device *fc = fe->dvb->priv;
+
+	flexcop_rcv_data_ctrl(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_stream_control,
 	.i2c_wr_max = 4,
 };
 
@@ -651,6 +660,7 @@  static int skystarS2_rev33_attach(struct flexcop_device *fc,
 	}
 	info("ISL6421 successfully attached.");
 
+	fc->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;