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: Daniel Kurtz <djkurtz@chromium.org> Signed-off-by: Jean Delvare <khali@linux-fr.org>
This commit is contained in:
parent
fda2f4af37
commit
efa3cb15ad
1 changed files with 14 additions and 14 deletions
|
@ -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,
|
||||||
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,
|
||||||
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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue