History

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 some driver bugfixes from I2C. Unusual this time are the two reverts. One because I accidently picked a patch from the list which I should have pulled from my co-maintainer instead ("missing of_node_put"). And one which I wrongly assumed to be an easy fix but it turned out already that it needs more iterations ("copy device properties")" * 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: Revert "i2c: copy device properties when using i2c_register_board_info()" Revert "i2c: add missing of_node_put in i2c_mux_del_adapters" i2c: exynos5: Avoid transaction timeouts due TRANSFER_DONE_AUTO not set i2c: designware: add reset interface i2c: meson: fix wrong variable usage in meson_i2c_put_data i2c: copy device properties when using i2c_register_board_info() i2c: m65xx: drop superfluous quirk structure i2c: brcmstb: Fix START and STOP conditions i2c: add missing of_node_put in i2c_mux_del_adapters i2c: riic: fix restart condition i2c: add missing of_node_put in i2c_mux_del_adapters

Linus Torvalds committed 9 years ago

Commit 2baf3802 parents 7c7fba9 806dbb28 files · +56 −22Browse files

Unified · Split

8 files
  1. drivers/i2c/busses/i2c-brcmstb.c +21 −6
  2. drivers/i2c/busses/i2c-designware-core.h +1 −0
  3. drivers/i2c/busses/i2c-designware-platdrv.c +24 −4
  4. drivers/i2c/busses/i2c-exynos5.c +2 −1
  5. drivers/i2c/busses/i2c-meson.c +1 −1
  6. drivers/i2c/busses/i2c-mt65xx.c +0 −9
  7. drivers/i2c/busses/i2c-riic.c +5 −1
  8. drivers/i2c/i2c-mux.c +2 −0
drivers/i2c/busses/i2c-brcmstb.c+21−6
@@ -465,6 +465,7 @@ static int brcmstb_i2c_xfer(struct i2c_adapter *adapter, · 464 unmodified lines
465465 u8 *tmp_buf;
466466 int len = 0;
467467 int xfersz = brcmstb_i2c_get_xfersz(dev);
468+ u32 cond, cond_per_msg;
468469
469470 if (dev->is_suspended)
470471 return -EBUSY;
@@ -481,10 +482,11 @@ static int brcmstb_i2c_xfer(struct i2c_adapter *adapter, · 10 unmodified lines
481482 pmsg->buf ? pmsg->buf[0] : '0', pmsg->len);
482483
483484 if (i < (num - 1) && (msgs[i + 1].flags & I2C_M_NOSTART))
484− brcmstb_set_i2c_start_stop(dev, ~(COND_START_STOP));
485+ cond = ~COND_START_STOP;
485486 else
486− brcmstb_set_i2c_start_stop(dev,
487− COND_RESTART | COND_NOSTOP);
487+ cond = COND_RESTART | COND_NOSTOP;
488+
489+ brcmstb_set_i2c_start_stop(dev, cond);
488490
489491 /* Send slave address */
490492 if (!(pmsg->flags & I2C_M_NOSTART)) {
@@ -497,13 +499,24 @@ static int brcmstb_i2c_xfer(struct i2c_adapter *adapter, · 6 unmodified lines
497499 }
498500 }
499501
502+ cond_per_msg = cond;
503+
500504 /* Perform data transfer */
501505 while (len) {
502506 bytes_to_xfer = min(len, xfersz);
503507
504− if (len <= xfersz && i == (num - 1))
505− brcmstb_set_i2c_start_stop(dev,
506− ~(COND_START_STOP));
508+ if (len <= xfersz) {
509+ if (i == (num - 1))
510+ cond_per_msg = cond_per_msg &
511+ ~(COND_RESTART | COND_NOSTOP);
512+ else
513+ cond_per_msg = cond;
514+ } else {
515+ cond_per_msg = (cond_per_msg & ~COND_RESTART) |
516+ COND_NOSTOP;
517+ }
518+
519+ brcmstb_set_i2c_start_stop(dev, cond_per_msg);
507520
508521 rc = brcmstb_i2c_xfer_bsc_data(dev, tmp_buf,
509522 bytes_to_xfer, pmsg);
@@ -512,6 +525,8 @@ static int brcmstb_i2c_xfer(struct i2c_adapter *adapter, · 2 unmodified lines
512525
513526 len -= bytes_to_xfer;
514527 tmp_buf += bytes_to_xfer;
528+
529+ cond_per_msg = COND_NOSTART | COND_NOSTOP;
515530 }
516531 }
517532
drivers/i2c/busses/i2c-designware-core.h+1−0
@@ -88,6 +88,7 @@ struct dw_i2c_dev { · 87 unmodified lines
8888 void __iomem *base;
8989 struct completion cmd_complete;
9090 struct clk *clk;
91+ struct reset_control *rst;
9192 u32 (*get_clk_rate_khz) (struct dw_i2c_dev *dev);
9293 struct dw_pci_controller *controller;
9394 int cmd_err;
drivers/i2c/busses/i2c-designware-platdrv.c+24−4
@@ -38,6 +38,7 @@ · 37 unmodified lines
3838 #include <linux/pm_runtime.h>
3939 #include <linux/property.h>
4040 #include <linux/io.h>
41+#include <linux/reset.h>
4142 #include <linux/slab.h>
4243 #include <linux/acpi.h>
4344 #include <linux/platform_data/i2c-designware.h>
@@ -199,6 +200,14 @@ static int dw_i2c_plat_probe(struct platform_device *pdev) · 155 unmodified lines
199200 dev->irq = irq;
200201 platform_set_drvdata(pdev, dev);
201202
203+ dev->rst = devm_reset_control_get_optional_exclusive(&pdev->dev, NULL);
204+ if (IS_ERR(dev->rst)) {
205+ if (PTR_ERR(dev->rst) == -EPROBE_DEFER)
206+ return -EPROBE_DEFER;
207+ } else {
208+ reset_control_deassert(dev->rst);
209+ }
210+
202211 if (pdata) {
203212 dev->clk_freq = pdata->i2c_scl_freq;
204213 } else {
@@ -235,12 +244,13 @@ static int dw_i2c_plat_probe(struct platform_device *pdev) · 30 unmodified lines
235244 && dev->clk_freq != 1000000 && dev->clk_freq != 3400000) {
236245 dev_err(&pdev->dev,
237246 "Only 100kHz, 400kHz, 1MHz and 3.4MHz supported");
238− return -EINVAL;
247+ r = -EINVAL;
248+ goto exit_reset;
239249 }
240250
241251 r = i2c_dw_eval_lock_support(dev);
242252 if (r)
243− return r;
253+ goto exit_reset;
244254
245255 dev->functionality = I2C_FUNC_10BIT_ADDR | DW_IC_DEFAULT_FUNCTIONALITY;
246256
@@ -286,10 +296,18 @@ static int dw_i2c_plat_probe(struct platform_device *pdev) · 39 unmodified lines
286296 }
287297
288298 r = i2c_dw_probe(dev);
289− if (r && !dev->pm_runtime_disabled)
290− pm_runtime_disable(&pdev->dev);
299+ if (r)
300+ goto exit_probe;
291301
292302 return r;
303+
304+exit_probe:
305+ if (!dev->pm_runtime_disabled)
306+ pm_runtime_disable(&pdev->dev);
307+exit_reset:
308+ if (!IS_ERR_OR_NULL(dev->rst))
309+ reset_control_assert(dev->rst);
310+ return r;
293311 }
294312
295313 static int dw_i2c_plat_remove(struct platform_device *pdev)
@@ -306,6 +324,8 @@ static int dw_i2c_plat_remove(struct platform_device *pdev) · 10 unmodified lines
306324 pm_runtime_put_sync(&pdev->dev);
307325 if (!dev->pm_runtime_disabled)
308326 pm_runtime_disable(&pdev->dev);
327+ if (!IS_ERR_OR_NULL(dev->rst))
328+ reset_control_assert(dev->rst);
309329
310330 return 0;
311331 }
drivers/i2c/busses/i2c-exynos5.c+2−1
@@ -457,7 +457,6 @@ static irqreturn_t exynos5_i2c_irq(int irqno, void *dev_id) · 456 unmodified lines
457457
458458 int_status = readl(i2c->regs + HSI2C_INT_STATUS);
459459 writel(int_status, i2c->regs + HSI2C_INT_STATUS);
460− trans_status = readl(i2c->regs + HSI2C_TRANS_STATUS);
461460
462461 /* handle interrupt related to the transfer status */
463462 if (i2c->variant->hw == HSI2C_EXYNOS7) {
@@ -482,11 +481,13 @@ static irqreturn_t exynos5_i2c_irq(int irqno, void *dev_id) · 18 unmodified lines
482481 goto stop;
483482 }
484483
484+ trans_status = readl(i2c->regs + HSI2C_TRANS_STATUS);
485485 if ((trans_status & HSI2C_MASTER_ST_MASK) == HSI2C_MASTER_ST_LOSE) {
486486 i2c->state = -EAGAIN;
487487 goto stop;
488488 }
489489 } else if (int_status & HSI2C_INT_I2C) {
490+ trans_status = readl(i2c->regs + HSI2C_TRANS_STATUS);
490491 if (trans_status & HSI2C_NO_DEV_ACK) {
491492 dev_dbg(i2c->dev, "No ACK from device\n");
492493 i2c->state = -ENXIO;
drivers/i2c/busses/i2c-meson.c+1−1
@@ -175,7 +175,7 @@ static void meson_i2c_put_data(struct meson_i2c *i2c, char *buf, int len) · 174 unmodified lines
175175 wdata1 |= *buf++ << ((i - 4) * 8);
176176
177177 writel(wdata0, i2c->regs + REG_TOK_WDATA0);
178− writel(wdata0, i2c->regs + REG_TOK_WDATA1);
178+ writel(wdata1, i2c->regs + REG_TOK_WDATA1);
179179
180180 dev_dbg(i2c->dev, "%s: data %08x %08x len %d\n", __func__,
181181 wdata0, wdata1, len);
drivers/i2c/busses/i2c-mt65xx.c+0−9
@@ -172,14 +172,6 @@ static const struct i2c_adapter_quirks mt6577_i2c_quirks = { · 171 unmodified lines
172172 .max_comb_2nd_msg_len = 31,
173173 };
174174
175−static const struct i2c_adapter_quirks mt8173_i2c_quirks = {
176− .max_num_msgs = 65535,
177− .max_write_len = 65535,
178− .max_read_len = 65535,
179− .max_comb_1st_msg_len = 65535,
180− .max_comb_2nd_msg_len = 65535,
181−};
182−
183175 static const struct mtk_i2c_compatible mt6577_compat = {
184176 .quirks = &mt6577_i2c_quirks,
185177 .pmic_i2c = 0,
@@ -199,7 +191,6 @@ static const struct mtk_i2c_compatible mt6589_compat = { · 13 unmodified lines
199191 };
200192
201193 static const struct mtk_i2c_compatible mt8173_compat = {
202− .quirks = &mt8173_i2c_quirks,
203194 .pmic_i2c = 0,
204195 .dcm = 1,
205196 .auto_restart = 1,
drivers/i2c/busses/i2c-riic.c+5−1
@@ -218,8 +218,12 @@ static irqreturn_t riic_tend_isr(int irq, void *data) · 217 unmodified lines
218218 }
219219
220220 if (riic->is_last || riic->err) {
221− riic_clear_set_bit(riic, 0, ICIER_SPIE, RIIC_ICIER);
221+ riic_clear_set_bit(riic, ICIER_TEIE, ICIER_SPIE, RIIC_ICIER);
222222 writeb(ICCR2_SP, riic->base + RIIC_ICCR2);
223+ } else {
224+ /* Transfer is complete, but do not send STOP */
225+ riic_clear_set_bit(riic, ICIER_TEIE, 0, RIIC_ICIER);
226+ complete(&riic->msg_done);
223227 }
224228
225229 return IRQ_HANDLED;
drivers/i2c/i2c-mux.c+2−0
@@ -429,6 +429,7 @@ void i2c_mux_del_adapters(struct i2c_mux_core *muxc) · 428 unmodified lines
429429 while (muxc->num_adapters) {
430430 struct i2c_adapter *adap = muxc->adapter[--muxc->num_adapters];
431431 struct i2c_mux_priv *priv = adap->algo_data;
432+ struct device_node *np = adap->dev.of_node;
432433
433434 muxc->adapter[muxc->num_adapters] = NULL;
434435
@@ -438,6 +439,7 @@ void i2c_mux_del_adapters(struct i2c_mux_core *muxc) · 3 unmodified lines
438439
439440 sysfs_remove_link(&priv->adap.dev.kobj, "mux_device");
440441 i2c_del_adapter(adap);
442+ of_node_put(np);
441443 kfree(priv);
442444 }
443445 }