From d6c15d0c8c39015994a180da82c3e6f9538b42de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ky=C3=B6sti=20M=C3=A4lkki?= Date: Sun, 20 Aug 2017 21:36:24 +0300 Subject: sb/intel/common: More SMBus block_cmd_loop() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-on: https://review.coreboot.org/c/26763 Reviewed-by: Arthur Heymans Tested-by: build bot (Jenkins) --- src/southbridge/intel/common/smbus.c | 54 ++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 30 deletions(-) (limited to 'src/southbridge/intel/common') diff --git a/src/southbridge/intel/common/smbus.c b/src/southbridge/intel/common/smbus.c index 12fb9ea3c2..fd8b6aa8dd 100644 --- a/src/southbridge/intel/common/smbus.c +++ b/src/southbridge/intel/common/smbus.c @@ -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; -- cgit v1.2.3