From: Chris David Subject: i2c-au1550: Fix a misused register problem Here is a trivial patch to fix a "mis-used register" problem on the AMD MIPS Alchemy au1550 I2C interface. In summary, The programmable serial controller seem to hang the kernel when I sent a single an 'address' byte on the I2C bus. The patch essentially uses the PSC_SMBSTAT register's TE (transmit FIFO empty) bit to check when the transmit FIFO is empty, instead of using the PSC_SMBEVNT register's TU (transmit underflow) bit. Using the TE bit fixed the hang problem. Signed-off-by: Chris David Acked-by: Ralf Baechle Signed-off-by: Jean Delvare --- drivers/i2c/busses/i2c-au1550.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) --- linux-2.6.23-rc9.orig/drivers/i2c/busses/i2c-au1550.c 2007-07-09 14:53:47.000000000 +0200 +++ linux-2.6.23-rc9/drivers/i2c/busses/i2c-au1550.c 2007-10-03 13:23:13.000000000 +0200 @@ -48,17 +48,14 @@ wait_xfer_done(struct i2c_au1550_data *a sp = (volatile psc_smb_t *)(adap->psc_base); - /* Wait for Tx FIFO Underflow. + /* Wait for Tx Buffer Empty */ for (i = 0; i < adap->xfer_timeout; i++) { - stat = sp->psc_smbevnt; + stat = sp->psc_smbstat; au_sync(); - if ((stat & PSC_SMBEVNT_TU) != 0) { - /* Clear it. */ - sp->psc_smbevnt = PSC_SMBEVNT_TU; - au_sync(); + if ((stat & PSC_SMBSTAT_TE) != 0) return 0; - } + udelay(1); }