i2c-stub: Implement I2C block support
Jean Delvare [Sun, 6 Dec 2009 16:06:28 +0000 (17:06 +0100)]
This is required to test some drivers, for example at24.

Signed-off-by: Jean Delvare <khali@linux-fr.org>

Documentation/i2c/i2c-stub
drivers/i2c/busses/i2c-stub.c

index 0d8be1c..d9c383b 100644 (file)
@@ -2,9 +2,9 @@ MODULE: i2c-stub
 
 DESCRIPTION:
 
-This module is a very simple fake I2C/SMBus driver.  It implements four
-types of SMBus commands: write quick, (r/w) byte, (r/w) byte data, and
-(r/w) word data.
+This module is a very simple fake I2C/SMBus driver.  It implements five
+types of SMBus commands: write quick, (r/w) byte, (r/w) byte data, (r/w)
+word data, and (r/w) I2C block data.
 
 You need to provide chip addresses as a module parameter when loading this
 driver, which will then only react to SMBus commands to these addresses.
index 1b7b2af..52ebeda 100644 (file)
@@ -48,7 +48,7 @@ static s32 stub_xfer(struct i2c_adapter * adap, u16 addr, unsigned short flags,
        char read_write, u8 command, int size, union i2c_smbus_data * data)
 {
        s32 ret;
-       int i;
+       int i, len;
        struct stub_chip *chip = NULL;
 
        /* Search for the right chip */
@@ -118,6 +118,29 @@ static s32 stub_xfer(struct i2c_adapter * adap, u16 addr, unsigned short flags,
                ret = 0;
                break;
 
+       case I2C_SMBUS_I2C_BLOCK_DATA:
+               len = data->block[0];
+               if (read_write == I2C_SMBUS_WRITE) {
+                       for (i = 0; i < len; i++) {
+                               chip->words[command + i] &= 0xff00;
+                               chip->words[command + i] |= data->block[1 + i];
+                       }
+                       dev_dbg(&adap->dev, "i2c block data - addr 0x%02x, "
+                                       "wrote %d bytes at 0x%02x.\n",
+                                       addr, len, command);
+               } else {
+                       for (i = 0; i < len; i++) {
+                               data->block[1 + i] =
+                                       chip->words[command + i] & 0xff;
+                       }
+                       dev_dbg(&adap->dev, "i2c block data - addr 0x%02x, "
+                                       "read  %d bytes at 0x%02x.\n",
+                                       addr, len, command);
+               }
+
+               ret = 0;
+               break;
+
        default:
                dev_dbg(&adap->dev, "Unsupported I2C/SMBus command\n");
                ret = -EOPNOTSUPP;
@@ -130,7 +153,8 @@ static s32 stub_xfer(struct i2c_adapter * adap, u16 addr, unsigned short flags,
 static u32 stub_func(struct i2c_adapter *adapter)
 {
        return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
-               I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA;
+               I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
+               I2C_FUNC_SMBUS_I2C_BLOCK;
 }
 
 static const struct i2c_algorithm smbus_algorithm = {