* MPC85xx erratum "I2C1 - I2C controller is unable to generate clocks when SDA is low coming out of reset"
@ 2009-05-26 8:22 Fredrik Arnerup
2009-06-11 4:32 ` Kumar Gala
0 siblings, 1 reply; 2+ messages in thread
From: Fredrik Arnerup @ 2009-05-26 8:22 UTC (permalink / raw)
To: linuxppc-dev
We've had some trouble with I2C not working after a soft reboot,
which we think is due to the the erratum "I2C1" which is present in
at least the mpc8540 and the mpc8560. Since there is no good workaround,
the only choice seems to be to avoid resetting the CPU while the I2C bus is
busy.
The problem seems to be that the i2c-mpc driver leaves I2C in a busy state
when
it receives a signal (e.g. upon shutdown).
The code below is not meant as a patch, just me thinking aloud.
Thoughts?
/Fredrik Arnerup
fredrik.arnerup@edgeware.tv
Index: drivers/i2c/busses/i2c-mpc.c
===================================================================
--- drivers/i2c/busses/i2c-mpc.c (revision 6933)
+++ drivers/i2c/busses/i2c-mpc.c (working copy)
@@ -262,12 +262,14 @@
/* Allow bus up to 1s to become not busy */
while (readb(i2c->base + MPC_I2C_SR) & CSR_MBB) {
if (signal_pending(current)) {
- pr_debug("I2C: Interrupted\n");
- writeccr(i2c, 0);
+ printk(KERN_WARNING "I2C: Interrupted\n");
+ if (readb(i2c->base + MPC_I2C_SR) ==
+ (CSR_MCF | CSR_MBB | CSR_RXAK))
+ mpc_i2c_fixup(i2c);
return -EINTR;
}
if (time_after(jiffies, orig_jiffies + HZ)) {
- pr_debug("I2C: timeout\n");
+ printk(KERN_WARNING "I2C: mpc_xfer() timeout\n");
if (readb(i2c->base + MPC_I2C_SR) ==
(CSR_MCF | CSR_MBB | CSR_RXAK))
mpc_i2c_fixup(i2c);
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: MPC85xx erratum "I2C1 - I2C controller is unable to generate clocks when SDA is low coming out of reset"
2009-05-26 8:22 MPC85xx erratum "I2C1 - I2C controller is unable to generate clocks when SDA is low coming out of reset" Fredrik Arnerup
@ 2009-06-11 4:32 ` Kumar Gala
0 siblings, 0 replies; 2+ messages in thread
From: Kumar Gala @ 2009-06-11 4:32 UTC (permalink / raw)
To: Fredrik Arnerup; +Cc: linuxppc-dev
On May 26, 2009, at 3:22 AM, Fredrik Arnerup wrote:
> We've had some trouble with I2C not working after a soft reboot,
> which we think is due to the the erratum "I2C1" which is present in
> at least the mpc8540 and the mpc8560. Since there is no good
> workaround,
> the only choice seems to be to avoid resetting the CPU while the I2C
> bus is
> busy.
>
> The problem seems to be that the i2c-mpc driver leaves I2C in a busy
> state
> when
> it receives a signal (e.g. upon shutdown).
> The code below is not meant as a patch, just me thinking aloud.
> Thoughts?
>
> /Fredrik Arnerup
> fredrik.arnerup@edgeware.tv
>
> Index: drivers/i2c/busses/i2c-mpc.c
> ===================================================================
> --- drivers/i2c/busses/i2c-mpc.c (revision 6933)
> +++ drivers/i2c/busses/i2c-mpc.c (working copy)
> @@ -262,12 +262,14 @@
> /* Allow bus up to 1s to become not busy */
> while (readb(i2c->base + MPC_I2C_SR) & CSR_MBB) {
> if (signal_pending(current)) {
> - pr_debug("I2C: Interrupted\n");
> - writeccr(i2c, 0);
> + printk(KERN_WARNING "I2C: Interrupted\n");
> + if (readb(i2c->base + MPC_I2C_SR) ==
> + (CSR_MCF | CSR_MBB | CSR_RXAK))
> + mpc_i2c_fixup(i2c);
> return -EINTR;
> }
> if (time_after(jiffies, orig_jiffies + HZ)) {
> - pr_debug("I2C: timeout\n");
> + printk(KERN_WARNING "I2C: mpc_xfer() timeout
> \n");
> if (readb(i2c->base + MPC_I2C_SR) ==
> (CSR_MCF | CSR_MBB | CSR_RXAK))
> mpc_i2c_fixup(i2c);
I don't think we should have the printk's. Its possible that we hit
the interrupted condition while using the i2c from user space.
- k
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-06-11 4:32 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-05-26 8:22 MPC85xx erratum "I2C1 - I2C controller is unable to generate clocks when SDA is low coming out of reset" Fredrik Arnerup
2009-06-11 4:32 ` Kumar Gala
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox