|
@@ -118,13 +118,19 @@ do_address(struct i2c_au1550_data *adap, unsigned int addr, int rd)
|
|
|
|
|
|
/* Reset the FIFOs, clear events.
|
|
|
*/
|
|
|
- sp->psc_smbpcr = PSC_SMBPCR_DC;
|
|
|
+ stat = sp->psc_smbstat;
|
|
|
sp->psc_smbevnt = PSC_SMBEVNT_ALLCLR;
|
|
|
au_sync();
|
|
|
- do {
|
|
|
- stat = sp->psc_smbpcr;
|
|
|
+
|
|
|
+ if (!(stat & PSC_SMBSTAT_TE) || !(stat & PSC_SMBSTAT_RE)) {
|
|
|
+ sp->psc_smbpcr = PSC_SMBPCR_DC;
|
|
|
au_sync();
|
|
|
- } while ((stat & PSC_SMBPCR_DC) != 0);
|
|
|
+ do {
|
|
|
+ stat = sp->psc_smbpcr;
|
|
|
+ au_sync();
|
|
|
+ } while ((stat & PSC_SMBPCR_DC) != 0);
|
|
|
+ udelay(50);
|
|
|
+ }
|
|
|
|
|
|
/* Write out the i2c chip address and specify operation
|
|
|
*/
|