diff options
| author | robert.valiquette@intel.com <robert.valiquette@intel.com> | 2013-11-14 19:52:30 -0500 |
|---|---|---|
| committer | Wolfram Sang <wsa@the-dreams.de> | 2014-01-13 11:45:33 -0500 |
| commit | 001cebf03f918c85404cb76db3a60c748be5efb5 (patch) | |
| tree | 7f7510e039ae92827684e5729185911d817ef056 | |
| parent | 83e53a8f120f2f273cf0ad717f5372ab79ac24fe (diff) | |
i2c-ismt: support I2C_SMBUS_I2C_BLOCK_DATA transaction type
This patch adds the support of the I2C_SMBUS_I2C_BLOCK_DATA transaction
type for the iSMT SMBus Controller.
Signed-off-by: Robert Valiquette <robert.valiquette@intel.com>
Acked-by: Seth Heasley <seth.heasley@intel.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
| -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 | ||
