Commit 15bd1e5cb36306a015328aa1c2b6470a25153171
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
Merge branch 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
Pull i2c fixes from Wolfram Sang: "Here are two more driver bugfixes for I2C which would be good to have" * 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: i2c: cadence: Set the hardware time-out register to maximum value i2c: davinci: generate STP always when NACK is received
Showing 2 changed files Side-by-side Diff
drivers/i2c/busses/i2c-cadence.c
... | ... | @@ -111,6 +111,8 @@ |
111 | 111 | #define CDNS_I2C_DIVA_MAX 4 |
112 | 112 | #define CDNS_I2C_DIVB_MAX 64 |
113 | 113 | |
114 | +#define CDNS_I2C_TIMEOUT_MAX 0xFF | |
115 | + | |
114 | 116 | #define cdns_i2c_readreg(offset) readl_relaxed(id->membase + offset) |
115 | 117 | #define cdns_i2c_writereg(val, offset) writel_relaxed(val, id->membase + offset) |
116 | 118 | |
... | ... | @@ -851,6 +853,15 @@ |
851 | 853 | dev_err(&pdev->dev, "reg adap failed: %d\n", ret); |
852 | 854 | goto err_clk_dis; |
853 | 855 | } |
856 | + | |
857 | + /* | |
858 | + * Cadence I2C controller has a bug wherein it generates | |
859 | + * invalid read transaction after HW timeout in master receiver mode. | |
860 | + * HW timeout is not used by this driver and the interrupt is disabled. | |
861 | + * But the feature itself cannot be disabled. Hence maximum value | |
862 | + * is written to this register to reduce the chances of error. | |
863 | + */ | |
864 | + cdns_i2c_writereg(CDNS_I2C_TIMEOUT_MAX, CDNS_I2C_TIME_OUT_OFFSET); | |
854 | 865 | |
855 | 866 | dev_info(&pdev->dev, "%u kHz mmio %08lx irq %d\n", |
856 | 867 | id->i2c_clk / 1000, (unsigned long)r_mem->start, id->irq); |
drivers/i2c/busses/i2c-davinci.c
... | ... | @@ -407,11 +407,9 @@ |
407 | 407 | if (dev->cmd_err & DAVINCI_I2C_STR_NACK) { |
408 | 408 | if (msg->flags & I2C_M_IGNORE_NAK) |
409 | 409 | return msg->len; |
410 | - if (stop) { | |
411 | - w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); | |
412 | - w |= DAVINCI_I2C_MDR_STP; | |
413 | - davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); | |
414 | - } | |
410 | + w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); | |
411 | + w |= DAVINCI_I2C_MDR_STP; | |
412 | + davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); | |
415 | 413 | return -EREMOTEIO; |
416 | 414 | } |
417 | 415 | return -EIO; |