|
@@ -117,8 +117,7 @@
|
|
|
#define I801_PROC_CALL 0x10 /* unimplemented */
|
|
|
#define I801_BLOCK_DATA 0x14
|
|
|
#define I801_I2C_BLOCK_DATA 0x18 /* ICH5 and later */
|
|
|
-#define I801_BLOCK_LAST 0x34
|
|
|
-#define I801_I2C_BLOCK_LAST 0x38 /* ICH5 and later */
|
|
|
+#define I801_LAST_BYTE 0x20
|
|
|
#define I801_START 0x40
|
|
|
#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;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * 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,
|
|
|
union i2c_smbus_data *data,
|
|
|
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));
|
|
|
}
|
|
|
|
|
|
+ if (command == I2C_SMBUS_I2C_BLOCK_DATA &&
|
|
|
+ read_write == I2C_SMBUS_READ)
|
|
|
+ smbcmd = I801_I2C_BLOCK_DATA;
|
|
|
+ else
|
|
|
+ smbcmd = I801_BLOCK_DATA;
|
|
|
+
|
|
|
for (i = 1; i <= len; i++) {
|
|
|
- if (i == len && 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;
|
|
|
- else
|
|
|
- smbcmd = I801_BLOCK_DATA;
|
|
|
- }
|
|
|
+ if (i == len && read_write == I2C_SMBUS_READ)
|
|
|
+ smbcmd |= I801_LAST_BYTE;
|
|
|
outb_p(smbcmd | ENABLE_INT9, SMBHSTCNT(priv));
|
|
|
|
|
|
if (i == 1)
|