sb/intel/common: More SMBus block_cmd_loop()
Setup to different block transactions are similar enough to have common place to call execute_command() in. Change-Id: I671fed280f47e6bc673eb7506f09ed6ed36d2804 Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Reviewed-on: https://review.coreboot.org/c/26763 Reviewed-by: Arthur Heymans <arthur@aheymans.xyz> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
893edeebc6
commit
d6c15d0c8c
|
@ -239,6 +239,27 @@ static int block_cmd_loop(unsigned int smbus_base,
|
|||
if (flags == (BLOCK_WRITE | BLOCK_I2C))
|
||||
return SMBUS_ERROR;
|
||||
|
||||
/* Set number of bytes to transfer. */
|
||||
/* Reset number of bytes to transfer so we notice later it
|
||||
* was really updated with the transaction. */
|
||||
if (!sw_drives_nak) {
|
||||
if (is_write_cmd)
|
||||
outb(max_bytes, smbus_base + SMBHSTDAT0);
|
||||
else
|
||||
outb(0, smbus_base + SMBHSTDAT0);
|
||||
}
|
||||
|
||||
/* Send first byte from buffer, bytes_sent increments after
|
||||
* hardware acknowledges it.
|
||||
*/
|
||||
if (is_write_cmd)
|
||||
outb(*buf++, smbus_base + SMBBLKDAT);
|
||||
|
||||
/* Start the command */
|
||||
ret = execute_command(smbus_base);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Poll for transaction completion */
|
||||
do {
|
||||
status = inb(smbus_base + SMBHSTSTAT);
|
||||
|
@ -301,16 +322,7 @@ int do_smbus_block_read(unsigned int smbus_base, u8 device, u8 cmd,
|
|||
/* Set the command/address... */
|
||||
outb(cmd, smbus_base + SMBHSTCMD);
|
||||
|
||||
/* Reset number of bytes to transfer so we notice later it
|
||||
* was really updated with the transaction. */
|
||||
outb(0, smbus_base + SMBHSTDAT0);
|
||||
|
||||
/* Start the command */
|
||||
ret = execute_command(smbus_base);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Poll for transaction completion */
|
||||
/* Execute block transaction. */
|
||||
ret = block_cmd_loop(smbus_base, buf, max_bytes, BLOCK_READ);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
@ -339,20 +351,7 @@ int do_smbus_block_write(unsigned int smbus_base, u8 device, u8 cmd,
|
|||
/* Set the command/address... */
|
||||
outb(cmd, smbus_base + SMBHSTCMD);
|
||||
|
||||
/* Set number of bytes to transfer. */
|
||||
outb(bytes, smbus_base + SMBHSTDAT0);
|
||||
|
||||
/* Send first byte from buffer, bytes_sent increments after
|
||||
* hardware acknowledges it.
|
||||
*/
|
||||
outb(*buf++, smbus_base + SMBBLKDAT);
|
||||
|
||||
/* Start the command */
|
||||
ret = execute_command(smbus_base);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Poll for transaction completion */
|
||||
/* Execute block transaction. */
|
||||
ret = block_cmd_loop(smbus_base, (u8 *)buf, bytes, BLOCK_WRITE);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
@ -383,12 +382,7 @@ int do_i2c_block_read(unsigned int smbus_base, u8 device,
|
|||
/* device offset */
|
||||
outb(offset, smbus_base + SMBHSTDAT1);
|
||||
|
||||
/* Start the command */
|
||||
ret = execute_command(smbus_base);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Poll for transaction completion */
|
||||
/* Execute block transaction. */
|
||||
ret = block_cmd_loop(smbus_base, buf, bytes, BLOCK_READ | BLOCK_I2C);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue