diff options
-rw-r--r-- | drivers/i2c/busses/i2c-ismt.c | 37 |
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 | ||