diff options
| author | Jean Delvare <khali@linux-fr.org> | 2007-05-01 17:26:29 -0400 |
|---|---|---|
| committer | Jean Delvare <khali@hyperion.delvare> | 2007-05-01 17:26:29 -0400 |
| commit | 3c4bb241d34ee3d9ab87aad265734885385f179b (patch) | |
| tree | 6a90d86fa2cf3e7aafeee1cc829a5396c662fffb /drivers/i2c/algos | |
| parent | 209d27c3b1676c0497108f0642c51a08b98a7856 (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')
| -rw-r--r-- | drivers/i2c/algos/i2c-algo-bit.c | 17 |
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 28b7e25ca79..fcef6ff3d28 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: | |||
| 509 | static u32 bit_func(struct i2c_adapter *adap) | 524 | static 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 | ||
