Pull i2c bugfixes from Wolfram Sang: "A few driver bugfixes for 3.18" * 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: i2c: omap: fix i207 errata handling i2c: designware: prevent early stop on TX FIFO empty i2c: omap: fix NACK and Arbitration Lost irq handling
Unified · Split
| @@ -359,7 +359,7 @@ int i2c_dw_init(struct dw_i2c_dev *dev) · 358 unmodified lines | ||
| 359 | 359 | } |
| 360 | 360 | |
| 361 | 361 | /* Configure Tx/Rx FIFO threshold levels */ |
| 362 | − dw_writel(dev, dev->tx_fifo_depth - 1, DW_IC_TX_TL); | |
| 362 | + dw_writel(dev, dev->tx_fifo_depth / 2, DW_IC_TX_TL); | |
| 363 | 363 | dw_writel(dev, 0, DW_IC_RX_TL); |
| 364 | 364 | |
| 365 | 365 | /* configure the i2c master */ |
| @@ -922,14 +922,12 @@ omap_i2c_isr_thread(int this_irq, void *dev_id) · 921 unmodified lines | ||
| 922 | 922 | if (stat & OMAP_I2C_STAT_NACK) { |
| 923 | 923 | err |= OMAP_I2C_STAT_NACK; |
| 924 | 924 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK); |
| 925 | − break; | |
| 926 | 925 | } |
| 927 | 926 | |
| 928 | 927 | if (stat & OMAP_I2C_STAT_AL) { |
| 929 | 928 | dev_err(dev->dev, "Arbitration lost\n"); |
| 930 | 929 | err |= OMAP_I2C_STAT_AL; |
| 931 | 930 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_AL); |
| 932 | − break; | |
| 933 | 931 | } |
| 934 | 932 | |
| 935 | 933 | /* |
| @@ -954,11 +952,13 @@ omap_i2c_isr_thread(int this_irq, void *dev_id) · 18 unmodified lines | ||
| 954 | 952 | if (dev->fifo_size) |
| 955 | 953 | num_bytes = dev->buf_len; |
| 956 | 954 | |
| 957 | − omap_i2c_receive_data(dev, num_bytes, true); | |
| 958 | − | |
| 959 | − if (dev->errata & I2C_OMAP_ERRATA_I207) | |
| 955 | + if (dev->errata & I2C_OMAP_ERRATA_I207) { | |
| 960 | 956 | i2c_omap_errata_i207(dev, stat); |
| 957 | + num_bytes = (omap_i2c_read_reg(dev, | |
| 958 | + OMAP_I2C_BUFSTAT_REG) >> 8) & 0x3F; | |
| 959 | + } | |
| 961 | 960 | |
| 961 | + omap_i2c_receive_data(dev, num_bytes, true); | |
| 962 | 962 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RDR); |
| 963 | 963 | continue; |
| 964 | 964 | } |