diff options
Diffstat (limited to 'drivers/i2c/busses/i2c-designware-core.c')
-rw-r--r-- | drivers/i2c/busses/i2c-designware-core.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c index dbecf08399f8..5888feef1ac5 100644 --- a/drivers/i2c/busses/i2c-designware-core.c +++ b/drivers/i2c/busses/i2c-designware-core.c | |||
@@ -98,6 +98,8 @@ | |||
98 | 98 | ||
99 | #define DW_IC_ERR_TX_ABRT 0x1 | 99 | #define DW_IC_ERR_TX_ABRT 0x1 |
100 | 100 | ||
101 | #define DW_IC_TAR_10BITADDR_MASTER BIT(12) | ||
102 | |||
101 | /* | 103 | /* |
102 | * status codes | 104 | * status codes |
103 | */ | 105 | */ |
@@ -388,22 +390,34 @@ static int i2c_dw_wait_bus_not_busy(struct dw_i2c_dev *dev) | |||
388 | static void i2c_dw_xfer_init(struct dw_i2c_dev *dev) | 390 | static void i2c_dw_xfer_init(struct dw_i2c_dev *dev) |
389 | { | 391 | { |
390 | struct i2c_msg *msgs = dev->msgs; | 392 | struct i2c_msg *msgs = dev->msgs; |
391 | u32 ic_con; | 393 | u32 ic_con, ic_tar = 0; |
392 | 394 | ||
393 | /* Disable the adapter */ | 395 | /* Disable the adapter */ |
394 | __i2c_dw_enable(dev, false); | 396 | __i2c_dw_enable(dev, false); |
395 | 397 | ||
396 | /* set the slave (target) address */ | ||
397 | dw_writel(dev, msgs[dev->msg_write_idx].addr, DW_IC_TAR); | ||
398 | |||
399 | /* if the slave address is ten bit address, enable 10BITADDR */ | 398 | /* if the slave address is ten bit address, enable 10BITADDR */ |
400 | ic_con = dw_readl(dev, DW_IC_CON); | 399 | ic_con = dw_readl(dev, DW_IC_CON); |
401 | if (msgs[dev->msg_write_idx].flags & I2C_M_TEN) | 400 | if (msgs[dev->msg_write_idx].flags & I2C_M_TEN) { |
402 | ic_con |= DW_IC_CON_10BITADDR_MASTER; | 401 | ic_con |= DW_IC_CON_10BITADDR_MASTER; |
403 | else | 402 | /* |
403 | * If I2C_DYNAMIC_TAR_UPDATE is set, the 10-bit addressing | ||
404 | * mode has to be enabled via bit 12 of IC_TAR register. | ||
405 | * We set it always as I2C_DYNAMIC_TAR_UPDATE can't be | ||
406 | * detected from registers. | ||
407 | */ | ||
408 | ic_tar = DW_IC_TAR_10BITADDR_MASTER; | ||
409 | } else { | ||
404 | ic_con &= ~DW_IC_CON_10BITADDR_MASTER; | 410 | ic_con &= ~DW_IC_CON_10BITADDR_MASTER; |
411 | } | ||
412 | |||
405 | dw_writel(dev, ic_con, DW_IC_CON); | 413 | dw_writel(dev, ic_con, DW_IC_CON); |
406 | 414 | ||
415 | /* | ||
416 | * Set the slave (target) address and enable 10-bit addressing mode | ||
417 | * if applicable. | ||
418 | */ | ||
419 | dw_writel(dev, msgs[dev->msg_write_idx].addr | ic_tar, DW_IC_TAR); | ||
420 | |||
407 | /* Enable the adapter */ | 421 | /* Enable the adapter */ |
408 | __i2c_dw_enable(dev, true); | 422 | __i2c_dw_enable(dev, true); |
409 | 423 | ||