From: "Jordan Crouse" This is a fix for the CS5535 errata 111: When the SMB controller tries to access a non-existing device, it sets the NEGACK bit, SMB I/O Offset 01h[4], to 1 after it detects no acknowledge at the ninth clock. The specification says there are only two ways to clear this status bit: write 1 to this bit or disable the SMB controller. Sometimes this bit is cleared by a read of this register, but not always. Signed-off-by: Jordan Crouse Cc: Jean Delvare Cc: eGreg KH Signed-off-by: Andrew Morton --- drivers/i2c/busses/scx200_acb.c | 7 +++++++ 1 files changed, 7 insertions(+) diff -puN drivers/i2c/busses/scx200_acb.c~scx200_acb-fix-for-cs5535-eratta drivers/i2c/busses/scx200_acb.c --- devel/drivers/i2c/busses/scx200_acb.c~scx200_acb-fix-for-cs5535-eratta 2006-04-01 16:32:47.000000000 -0800 +++ devel-akpm/drivers/i2c/busses/scx200_acb.c 2006-04-01 16:32:47.000000000 -0800 @@ -133,6 +133,9 @@ static void scx200_acb_machine(struct sc outb(inb(ACBCTL1) | ACBCTL1_STOP, ACBCTL1); outb(ACBST_STASTR | ACBST_NEGACK, ACBST); + + /* Reset the status register */ + outb(0, ACBST); return; } @@ -228,6 +231,10 @@ static void scx200_acb_poll(struct scx20 timeout = jiffies + POLL_TIMEOUT; while (time_before(jiffies, timeout)) { status = inb(ACBST); + + /* Reset the status register to avoid the hang */ + outb(0, ACBST); + if ((status & (ACBST_SDAST|ACBST_BER|ACBST_NEGACK)) != 0) { scx200_acb_machine(iface, status); return; _