mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 17:23:56 -06:00
i2c: pm_smbus: Fix the semantics of block I2C transfers
The I2C block transfer commands was not implemented correctly, it read a length byte and such like it was an smbus transfer. So fix the smbus_read_block() and smbus_write_block() functions so they can properly handle I2C transfers, and normal SMBus transfers (for upcoming changes). Pass in a transfer size and a bool to know whether to use the size byte (like SMBus) or use the length given (like I2C). Signed-off-by: Corey Minyard <cminyard@mvista.com> Cc: Michael S. Tsirkin <mst@redhat.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <1534796770-10295-3-git-send-email-minyard@acm.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
b8fb9043eb
commit
4b615be540
3 changed files with 47 additions and 17 deletions
|
@ -117,10 +117,16 @@ static void smb_transaction(PMSMBus *s)
|
|||
break;
|
||||
case PROT_I2C_BLOCK_DATA:
|
||||
if (read) {
|
||||
ret = smbus_read_block(bus, addr, cmd, s->smb_data);
|
||||
int xfersize = s->smb_data0;
|
||||
if (xfersize > sizeof(s->smb_data)) {
|
||||
xfersize = sizeof(s->smb_data);
|
||||
}
|
||||
ret = smbus_read_block(bus, addr, s->smb_data1, s->smb_data,
|
||||
xfersize, false, true);
|
||||
goto data8;
|
||||
} else {
|
||||
ret = smbus_write_block(bus, addr, cmd, s->smb_data, s->smb_data0);
|
||||
ret = smbus_write_block(bus, addr, cmd, s->smb_data, s->smb_data0,
|
||||
false);
|
||||
goto done;
|
||||
}
|
||||
break;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue