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,
next prev parent 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