aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c/algos/i2c-algo-bit.c
diff options
context:
space:
mode:
authorJean Delvare <khali@linux-fr.org>2007-05-01 17:26:29 -0400
committerJean Delvare <khali@hyperion.delvare>2007-05-01 17:26:29 -0400
commit3c4bb241d34ee3d9ab87aad265734885385f179b (patch)
tree6a90d86fa2cf3e7aafeee1cc829a5396c662fffb /drivers/i2c/algos/i2c-algo-bit.c
parent209d27c3b1676c0497108f0642c51a08b98a7856 (diff)
i2c-algo-bit: Emulate SMBus block read
Now that i2c-core lets the i2c bus drivers emulate the SMBus block read and SMBus block process call transaction types, let's implement that in the popular i2c bit-banging driver. This will also act as a reference implementation for other bus drivers which want to do the same. Signed-off-by: Jean Delvare <khali@linux-fr.org>
Diffstat (limited to 'drivers/i2c/algos/i2c-algo-bit.c')
-rw-r--r--drivers/i2c/algos/i2c-algo-bit.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c
index 28b7e25ca79c..fcef6ff3d287 100644
--- a/drivers/i2c/algos/i2c-algo-bit.c
+++ b/drivers/i2c/algos/i2c-algo-bit.c
@@ -391,6 +391,21 @@ static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
391 }; 391 };
392 scllo(adap); 392 scllo(adap);
393 sdahi(adap); 393 sdahi(adap);
394
395 /* Some SMBus transactions require that we receive the
396 transaction length as the first read byte. */
397 if (rdcount == 1 && (msg->flags & I2C_M_RECV_LEN)) {
398 if (inval <= 0 || inval > I2C_SMBUS_BLOCK_MAX) {
399 printk(KERN_ERR "i2c-algo-bit: readbytes: "
400 "invalid block length (%d)\n", inval);
401 return -EREMOTEIO;
402 }
403 /* The original count value accounts for the extra
404 bytes, that is, either 1 for a regular transaction,
405 or 2 for a PEC transaction. */
406 count += inval;
407 msg->len += inval;
408 }
394 } 409 }
395 return rdcount; 410 return rdcount;
396} 411}
@@ -509,6 +524,8 @@ bailout:
509static u32 bit_func(struct i2c_adapter *adap) 524static u32 bit_func(struct i2c_adapter *adap)
510{ 525{
511 return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | 526 return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
527 I2C_FUNC_SMBUS_READ_BLOCK_DATA |
528 I2C_FUNC_SMBUS_BLOCK_PROC_CALL |
512 I2C_FUNC_10BIT_ADDR | I2C_FUNC_PROTOCOL_MANGLING; 529 I2C_FUNC_10BIT_ADDR | I2C_FUNC_PROTOCOL_MANGLING;
513} 530}
514 531