diff options
author | Domen Puncer <domen.puncer@ultra.si> | 2006-08-13 17:35:40 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-09-26 18:38:50 -0400 |
commit | 8859942ede8154c1e90e3b0d1b60aecf0cfaa169 (patch) | |
tree | b71e1447c4bce6ce4b7dfca581430cacdfc95533 | |
parent | 643bd3fbd9dc73ed3dc1e4f6980e6f15fdbb9bb6 (diff) |
i2c-au1550: Fix timeout problem
i2c-au1550: Fix timeout problem
Fix from Jordan Crouse:
If the transmit and recieve FIFOS are not empty, forceably flush them
rather then waiting for them to drain on their own.
This solves at least a problem reported by Clem Taylor:
http://www.linux-mips.org/archives/linux-mips/2006-05/msg00240.html
(1% of I2C transactions would timeout)
Signed-off-by: Domen Puncer <domen.puncer@ultra.si>
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/i2c/busses/i2c-au1550.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/i2c/busses/i2c-au1550.c b/drivers/i2c/busses/i2c-au1550.c index d06edce03bf..02a359ebc0f 100644 --- a/drivers/i2c/busses/i2c-au1550.c +++ b/drivers/i2c/busses/i2c-au1550.c | |||
@@ -118,13 +118,19 @@ do_address(struct i2c_au1550_data *adap, unsigned int addr, int rd) | |||
118 | 118 | ||
119 | /* Reset the FIFOs, clear events. | 119 | /* Reset the FIFOs, clear events. |
120 | */ | 120 | */ |
121 | sp->psc_smbpcr = PSC_SMBPCR_DC; | 121 | stat = sp->psc_smbstat; |
122 | sp->psc_smbevnt = PSC_SMBEVNT_ALLCLR; | 122 | sp->psc_smbevnt = PSC_SMBEVNT_ALLCLR; |
123 | au_sync(); | 123 | au_sync(); |
124 | do { | 124 | |
125 | stat = sp->psc_smbpcr; | 125 | if (!(stat & PSC_SMBSTAT_TE) || !(stat & PSC_SMBSTAT_RE)) { |
126 | sp->psc_smbpcr = PSC_SMBPCR_DC; | ||
126 | au_sync(); | 127 | au_sync(); |
127 | } while ((stat & PSC_SMBPCR_DC) != 0); | 128 | do { |
129 | stat = sp->psc_smbpcr; | ||
130 | au_sync(); | ||
131 | } while ((stat & PSC_SMBPCR_DC) != 0); | ||
132 | udelay(50); | ||
133 | } | ||
128 | 134 | ||
129 | /* Write out the i2c chip address and specify operation | 135 | /* Write out the i2c chip address and specify operation |
130 | */ | 136 | */ |