public inbox for linux-media@vger.kernel.org
 help / color / mirror / Atom feed
From: Antti Palosaari <crope@iki.fi>
To: Malcolm Priestley <tvboxspy@gmail.com>
Cc: linux-media <linux-media@vger.kernel.org>
Subject: Re: [PATCH FOR 3.2 FIX] af9015: limit I2C access to keep FW happy
Date: Tue, 15 Nov 2011 00:56:37 +0200	[thread overview]
Message-ID: <4EC19CA5.60904@iki.fi> (raw)
In-Reply-To: <4ec1955e.e813b40a.37be.3fce@mx.google.com>

[-- Attachment #1: Type: text/plain, Size: 1825 bytes --]

On 11/15/2011 12:25 AM, Malcolm Priestley wrote:
>> On 11/13/2011 09:05 PM, Antti Palosaari wrote:
>>> AF9015 firmware does not like if it gets interrupted by I2C adapter
>>> request on some critical phases. During normal operation I2C adapter
>>> is used only 2nd demodulator and tuner on dual tuner devices.
>>>
>>> Override demodulator callbacks and use mutex for limit access to
>>> those "critical" paths to keep AF9015 happy.

> I have tried this patch, while it initially got MythTV working, there is
> too many call backs and some failed to acquire the lock. The device
> became unstable on both single and dual devices.
>
> The callbacks
>
> af9015_af9013_read_status,
> af9015_af9013_init
> af9015_af9013_sleep
>
> had to be removed.

init and sleep are called very rarely, only when open or close device. 
If that mutex locking cause problems it is most likely high I2C I/O + 
some waiting due to mux => we have more I/O than we can handle.

> I take your point, a call back can be an alternative.
>
> The patch didn't stop the firmware fails either.

You mean the loading fw to 2nd FE? I didn't done nothing for that.

> The af9015 usb bridge on the whole is so unstable in its early stages,
> especially on a cold boot and when the USB controller has another device
> on it, such as card reader or wifi device.
>
> I am, at the moment looking to see if the fails are due to interface 1
> being claimed by HID.

I still suspect corruptions to stream are coming from too high I2C 
traffic. I have feeling those who always squawk are just MythTV users, 
so maybe it is MythTV that does some very much polls and channel changes.

I added patch I tested reducing I2C I/O. Feel free to test.

I can try to optimize af9013 next weekend if we found it is one stream 
corruption cause.


Antti


-- 
http://palosaari.fi/

[-- Attachment #2: af9013_reduce_i2c.patch --]
[-- Type: text/plain, Size: 3587 bytes --]

diff --git a/drivers/media/dvb/frontends/af9013.c b/drivers/media/dvb/frontends/af9013.c
index f4276e4..4694f4b 100644
--- a/drivers/media/dvb/frontends/af9013.c
+++ b/drivers/media/dvb/frontends/af9013.c
@@ -50,6 +50,8 @@ struct af9013_state {
 	u16 snr;
 	u32 frequency;
 	unsigned long next_statistics_check;
+
+	u8 fe_set;
 };
 
 static u8 regmask[8] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
@@ -606,19 +608,29 @@ static int af9013_set_frontend(struct dvb_frontend *fe,
 
 	state->frequency = params->frequency;
 
+	/* Stop OFSM */ // from Malcom
+	ret = af9013_write_reg(state, 0xffff, 1);
+	if (ret)
+		goto error;
+
 	/* program tuner */
 	if (fe->ops.tuner_ops.set_params)
 		fe->ops.tuner_ops.set_params(fe, params);
 
-	/* program CFOE coefficients */
-	ret = af9013_set_coeff(state, params->u.ofdm.bandwidth);
-	if (ret)
-		goto error;
+	if (!state->fe_set) {
 
-	/* program frequency control */
-	ret = af9013_set_freq_ctrl(state, fe);
-	if (ret)
-		goto error;
+		/* program CFOE coefficients */
+		ret = af9013_set_coeff(state, params->u.ofdm.bandwidth);
+		if (ret)
+			goto error;
+
+		/* program frequency control */
+		ret = af9013_set_freq_ctrl(state, fe);
+		if (ret)
+			goto error;
+
+		state->fe_set = 1;
+	}
 
 	/* clear TPS lock flag (inverted flag) */
 	ret = af9013_write_reg_bits(state, 0xd330, 3, 1, 1);
@@ -917,6 +929,7 @@ static int af9013_update_snr(struct dvb_frontend *fe)
 		if (ret)
 			goto error;
 
+#if 0
 		/* check quantizer availability */
 		for (i = 0; i < 10; i++) {
 			msleep(10);
@@ -927,7 +940,7 @@ static int af9013_update_snr(struct dvb_frontend *fe)
 			if (!buf[0])
 				break;
 		}
-
+#endif
 		/* reset quantizer */
 		ret = af9013_write_reg_bits(state, 0xd2e1, 3, 1, 1);
 		if (ret)
@@ -978,6 +991,8 @@ static int af9013_update_statistics(struct dvb_frontend *fe)
 	struct af9013_state *state = fe->demodulator_priv;
 	int ret;
 
+	return 0;
+
 	if (time_before(jiffies, state->next_statistics_check))
 		return 0;
 
@@ -1015,6 +1030,15 @@ static int af9013_read_status(struct dvb_frontend *fe, fe_status_t *status)
 	u8 tmp;
 	*status = 0;
 
+
+	if (state->config.output_mode == AF9013_OUTPUT_MODE_USB) {
+		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
+	} else {
+		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
+//		*status = 0;
+	}
+
+#if 0
 	/* MPEG2 lock */
 	ret = af9013_read_reg_bits(state, 0xd507, 6, 1, &tmp);
 	if (ret)
@@ -1061,6 +1085,7 @@ static int af9013_read_status(struct dvb_frontend *fe, fe_status_t *status)
 	}
 
 	ret = af9013_update_statistics(fe);
+#endif
 
 error:
 	return ret;
@@ -1109,11 +1134,14 @@ static int af9013_sleep(struct dvb_frontend *fe)
 	int ret;
 	deb_info("%s\n", __func__);
 
+	state->fe_set = 0;
+
 	ret = af9013_lock_led(state, 0);
 	if (ret)
 		goto error;
 
 	ret = af9013_power_ctrl(state, 0);
+
 error:
 	return ret;
 }
@@ -1126,6 +1154,9 @@ static int af9013_init(struct dvb_frontend *fe)
 	struct regdesc *init;
 	deb_info("%s\n", __func__);
 
+	state->fe_set = 0;
+
+
 	/* reset OFDM */
 	ret = af9013_reset(state, 0);
 	if (ret)
@@ -1292,6 +1323,8 @@ static int af9013_init(struct dvb_frontend *fe)
 			goto error;
 	}
 
+	ret = af9013_write_reg(state, 0xd503, 0x0);
+
 error:
 	return ret;
 }
@@ -1530,7 +1563,7 @@ static struct dvb_frontend_ops af9013_ops = {
 	.i2c_gate_ctrl = af9013_i2c_gate_ctrl,
 
 	.set_frontend = af9013_set_frontend,
-	.get_frontend = af9013_get_frontend,
+//	.get_frontend = af9013_get_frontend,
 
 	.get_tune_settings = af9013_get_tune_settings,
 

  reply	other threads:[~2011-11-14 22:56 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-13 19:05 [PATCH FOR 3.2 FIX] af9015: limit I2C access to keep FW happy Antti Palosaari
2011-11-13 19:19 ` Antti Palosaari
2011-11-14 22:25   ` Malcolm Priestley
2011-11-14 22:56     ` Antti Palosaari [this message]
2011-11-29  0:09     ` Antti Palosaari
2011-11-30 21:31       ` Malcolm Priestley

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4EC19CA5.60904@iki.fi \
    --to=crope@iki.fi \
    --cc=linux-media@vger.kernel.org \
    --cc=tvboxspy@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox