aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/i2c/busses/i2c-ismt.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/i2c/busses/i2c-ismt.c b/drivers/i2c/busses/i2c-ismt.c
index 0043ede234c2..bb132ea7d2b4 100644
--- a/drivers/i2c/busses/i2c-ismt.c
+++ b/drivers/i2c/busses/i2c-ismt.c
@@ -344,6 +344,7 @@ static int ismt_process_desc(const struct ismt_desc *desc,
344 data->word = dma_buffer[0] | (dma_buffer[1] << 8); 344 data->word = dma_buffer[0] | (dma_buffer[1] << 8);
345 break; 345 break;
346 case I2C_SMBUS_BLOCK_DATA: 346 case I2C_SMBUS_BLOCK_DATA:
347 case I2C_SMBUS_I2C_BLOCK_DATA:
347 memcpy(&data->block[1], dma_buffer, desc->rxbytes); 348 memcpy(&data->block[1], dma_buffer, desc->rxbytes);
348 data->block[0] = desc->rxbytes; 349 data->block[0] = desc->rxbytes;
349 break; 350 break;
@@ -509,6 +510,41 @@ static int ismt_access(struct i2c_adapter *adap, u16 addr,
509 } 510 }
510 break; 511 break;
511 512
513 case I2C_SMBUS_I2C_BLOCK_DATA:
514 /* Make sure the length is valid */
515 if (data->block[0] < 1)
516 data->block[0] = 1;
517
518 if (data->block[0] > I2C_SMBUS_BLOCK_MAX)
519 data->block[0] = I2C_SMBUS_BLOCK_MAX;
520
521 if (read_write == I2C_SMBUS_WRITE) {
522 /* i2c Block Write */
523 dev_dbg(dev, "I2C_SMBUS_I2C_BLOCK_DATA: WRITE\n");
524 dma_size = data->block[0] + 1;
525 dma_direction = DMA_TO_DEVICE;
526 desc->wr_len_cmd = dma_size;
527 desc->control |= ISMT_DESC_I2C;
528 priv->dma_buffer[0] = command;
529 memcpy(&priv->dma_buffer[1], &data->block[1], dma_size);
530 } else {
531 /* i2c Block Read */
532 dev_dbg(dev, "I2C_SMBUS_I2C_BLOCK_DATA: READ\n");
533 dma_size = data->block[0];
534 dma_direction = DMA_FROM_DEVICE;
535 desc->rd_len = dma_size;
536 desc->wr_len_cmd = command;
537 desc->control |= (ISMT_DESC_I2C | ISMT_DESC_CWRL);
538 /*
539 * Per the "Table 15-15. I2C Commands",
540 * in the External Design Specification (EDS),
541 * (Document Number: 508084, Revision: 2.0),
542 * the _rw bit must be 0
543 */
544 desc->tgtaddr_rw = ISMT_DESC_ADDR_RW(addr, 0);
545 }
546 break;
547
512 default: 548 default:
513 dev_err(dev, "Unsupported transaction %d\n", 549 dev_err(dev, "Unsupported transaction %d\n",
514 size); 550 size);
@@ -582,6 +618,7 @@ static u32 ismt_func(struct i2c_adapter *adap)
582 I2C_FUNC_SMBUS_WORD_DATA | 618 I2C_FUNC_SMBUS_WORD_DATA |
583 I2C_FUNC_SMBUS_PROC_CALL | 619 I2C_FUNC_SMBUS_PROC_CALL |
584 I2C_FUNC_SMBUS_BLOCK_DATA | 620 I2C_FUNC_SMBUS_BLOCK_DATA |
621 I2C_FUNC_SMBUS_I2C_BLOCK |
585 I2C_FUNC_SMBUS_PEC; 622 I2C_FUNC_SMBUS_PEC;
586} 623}
587 624