i2c-i801: Refactor use of LAST_BYTE in i801_block_transaction_byte_by_byte
authorDaniel Kurtz <djkurtz@chromium.org>
Tue, 24 Jul 2012 12:13:57 +0000 (14:13 +0200)
committerJean Delvare <khali@endymion.delvare>
Tue, 24 Jul 2012 12:13:57 +0000 (14:13 +0200)
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>
drivers/i2c/busses/i2c-i801.c

index ae2945a..51e11eb 100644 (file)
 #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)