scx200_acb: Fix the state machine
Subsystems (2)
PATCH 3/13 scx200_acb: Fix the state machine
From: Thomas Andrews <tandrews at grok.co.za>
Fix the scx200_acb state machine:
* Nack was sent one byte too late on reads >= 2 bytes.
* Stop bit was set one byte too late on reads.
Signed-off-by Jean Delvare <khali at linux-fr.org>
Signed-off-by Greg Kroah-Hartman <gregkh at suse.de>
--- drivers/i2c/busses/scx200_acb.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-)
drivers/i2c/busses/scx200_acb.c +6 -6
@@ -184,21 +184,21 @@ static void scx200_acb_machine(struct scbreak ;case state_read: -/* Set ACK if receiving the last byte */ -if (iface->len =1 ) +/* Set ACK if _next_ byte will be the last one */ +if (iface->len =2 )outb (inb (ACBCTL1 ) |ACBCTL1_ACK ,ACBCTL1 );else outb (inb (ACBCTL1 ) & ~ACBCTL1_ACK ,ACBCTL1 ); - *iface->ptr++ =inb (ACBSDA ); - --iface->len; - -if (iface->len =0 ) { +if (iface->len =1 ) { iface->result =0 ; iface->state = state_idle;outb (inb (ACBCTL1 ) |ACBCTL1_STOP ,ACBCTL1 ); } + *iface->ptr++ =inb (ACBSDA ); + --iface->len; +break ;case state_write:
Signature · 1 line
1.4.1