|
@@ -346,6 +346,12 @@ static inline int is_lastmsg(struct s3c24xx_i2c *i2c)
|
|
|
|
|
|
static inline int is_msglast(struct s3c24xx_i2c *i2c)
|
|
|
{
|
|
|
+ /* msg->len is always 1 for the first byte of smbus block read.
|
|
|
+ * Actual length will be read from slave. More bytes will be
|
|
|
+ * read according to the length then. */
|
|
|
+ if (i2c->msg->flags & I2C_M_RECV_LEN && i2c->msg->len == 1)
|
|
|
+ return 0;
|
|
|
+
|
|
|
return i2c->msg_ptr == i2c->msg->len-1;
|
|
|
}
|
|
|
|
|
@@ -485,6 +491,9 @@ static int i2c_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
|
|
|
byte = readb(i2c->regs + S3C2410_IICDS);
|
|
|
i2c->msg->buf[i2c->msg_ptr++] = byte;
|
|
|
|
|
|
+ /* Add actual length to read for smbus block read */
|
|
|
+ if (i2c->msg->flags & I2C_M_RECV_LEN && i2c->msg->len == 1)
|
|
|
+ i2c->msg->len += byte;
|
|
|
prepare_read:
|
|
|
if (is_msglast(i2c)) {
|
|
|
/* last byte of buffer */
|