Commit efa3cb15 authored by Daniel Kurtz's avatar Daniel Kurtz Committed by Jean Delvare

i2c-i801: Refactor use of LAST_BYTE in i801_block_transaction_byte_by_byte

As a slight optimization, pull some logic out of the polling loop during
byte-by-byte transactions by just setting the I801_LAST_BYTE bit, as
defined in the i801 (PCH) datasheet, when reading the last byte of a
byte-by-byte I2C_SMBUS_READ.
Signed-off-by: default avatarDaniel Kurtz <djkurtz@chromium.org>
Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
parent fda2f4af
...@@ -117,8 +117,7 @@ ...@@ -117,8 +117,7 @@
#define I801_PROC_CALL 0x10 /* unimplemented */ #define I801_PROC_CALL 0x10 /* unimplemented */
#define I801_BLOCK_DATA 0x14 #define I801_BLOCK_DATA 0x14
#define I801_I2C_BLOCK_DATA 0x18 /* ICH5 and later */ #define I801_I2C_BLOCK_DATA 0x18 /* ICH5 and later */
#define I801_BLOCK_LAST 0x34 #define I801_LAST_BYTE 0x20
#define I801_I2C_BLOCK_LAST 0x38 /* ICH5 and later */
#define I801_START 0x40 #define I801_START 0x40
#define I801_PEC_EN 0x80 /* ICH3 and later */ #define I801_PEC_EN 0x80 /* ICH3 and later */
...@@ -338,6 +337,11 @@ static int i801_block_transaction_by_block(struct i801_priv *priv, ...@@ -338,6 +337,11 @@ static int i801_block_transaction_by_block(struct i801_priv *priv,
return 0; return 0;
} }
/*
* For "byte-by-byte" block transactions:
* I2C write uses cmd=I801_BLOCK_DATA, I2C_EN=1
* I2C read uses cmd=I801_I2C_BLOCK_DATA
*/
static int i801_block_transaction_byte_by_byte(struct i801_priv *priv, static int i801_block_transaction_byte_by_byte(struct i801_priv *priv,
union i2c_smbus_data *data, union i2c_smbus_data *data,
char read_write, int command, char read_write, int command,
...@@ -360,19 +364,15 @@ static int i801_block_transaction_byte_by_byte(struct i801_priv *priv, ...@@ -360,19 +364,15 @@ static int i801_block_transaction_byte_by_byte(struct i801_priv *priv,
outb_p(data->block[1], SMBBLKDAT(priv)); outb_p(data->block[1], SMBBLKDAT(priv));
} }
for (i = 1; i <= len; i++) { if (command == I2C_SMBUS_I2C_BLOCK_DATA &&
if (i == len && read_write == I2C_SMBUS_READ) { read_write == I2C_SMBUS_READ)
if (command == I2C_SMBUS_I2C_BLOCK_DATA)
smbcmd = I801_I2C_BLOCK_LAST;
else
smbcmd = I801_BLOCK_LAST;
} else {
if (command == I2C_SMBUS_I2C_BLOCK_DATA
&& read_write == I2C_SMBUS_READ)
smbcmd = I801_I2C_BLOCK_DATA; smbcmd = I801_I2C_BLOCK_DATA;
else else
smbcmd = I801_BLOCK_DATA; smbcmd = I801_BLOCK_DATA;
}
for (i = 1; i <= len; i++) {
if (i == len && read_write == I2C_SMBUS_READ)
smbcmd |= I801_LAST_BYTE;
outb_p(smbcmd | ENABLE_INT9, SMBHSTCNT(priv)); outb_p(smbcmd | ENABLE_INT9, SMBHSTCNT(priv));
if (i == 1) if (i == 1)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment