diff options
Diffstat (limited to 'drivers/i2c')
-rw-r--r-- | drivers/i2c/busses/i2c-mxs.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/drivers/i2c/busses/i2c-mxs.c b/drivers/i2c/busses/i2c-mxs.c index e2e9a0dade96..43e2273ac610 100644 --- a/drivers/i2c/busses/i2c-mxs.c +++ b/drivers/i2c/busses/i2c-mxs.c | |||
@@ -123,9 +123,11 @@ struct mxs_i2c_dev { | |||
123 | bool dma_read; | 123 | bool dma_read; |
124 | }; | 124 | }; |
125 | 125 | ||
126 | static void mxs_i2c_reset(struct mxs_i2c_dev *i2c) | 126 | static int mxs_i2c_reset(struct mxs_i2c_dev *i2c) |
127 | { | 127 | { |
128 | stmp_reset_block(i2c->regs); | 128 | int ret = stmp_reset_block(i2c->regs); |
129 | if (ret) | ||
130 | return ret; | ||
129 | 131 | ||
130 | /* | 132 | /* |
131 | * Configure timing for the I2C block. The I2C TIMING2 register has to | 133 | * Configure timing for the I2C block. The I2C TIMING2 register has to |
@@ -139,6 +141,8 @@ static void mxs_i2c_reset(struct mxs_i2c_dev *i2c) | |||
139 | writel(0x00300030, i2c->regs + MXS_I2C_TIMING2); | 141 | writel(0x00300030, i2c->regs + MXS_I2C_TIMING2); |
140 | 142 | ||
141 | writel(MXS_I2C_IRQ_MASK << 8, i2c->regs + MXS_I2C_CTRL1_SET); | 143 | writel(MXS_I2C_IRQ_MASK << 8, i2c->regs + MXS_I2C_CTRL1_SET); |
144 | |||
145 | return 0; | ||
142 | } | 146 | } |
143 | 147 | ||
144 | static void mxs_i2c_dma_finish(struct mxs_i2c_dev *i2c) | 148 | static void mxs_i2c_dma_finish(struct mxs_i2c_dev *i2c) |
@@ -475,7 +479,7 @@ static int mxs_i2c_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, | |||
475 | int stop) | 479 | int stop) |
476 | { | 480 | { |
477 | struct mxs_i2c_dev *i2c = i2c_get_adapdata(adap); | 481 | struct mxs_i2c_dev *i2c = i2c_get_adapdata(adap); |
478 | int ret; | 482 | int ret, err; |
479 | int flags; | 483 | int flags; |
480 | 484 | ||
481 | flags = stop ? MXS_I2C_CTRL0_POST_SEND_STOP : 0; | 485 | flags = stop ? MXS_I2C_CTRL0_POST_SEND_STOP : 0; |
@@ -495,8 +499,11 @@ static int mxs_i2c_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, | |||
495 | i2c->cmd_err = 0; | 499 | i2c->cmd_err = 0; |
496 | if (0) { /* disable PIO mode until a proper fix is made */ | 500 | if (0) { /* disable PIO mode until a proper fix is made */ |
497 | ret = mxs_i2c_pio_setup_xfer(adap, msg, flags); | 501 | ret = mxs_i2c_pio_setup_xfer(adap, msg, flags); |
498 | if (ret) | 502 | if (ret) { |
499 | mxs_i2c_reset(i2c); | 503 | err = mxs_i2c_reset(i2c); |
504 | if (err) | ||
505 | return err; | ||
506 | } | ||
500 | } else { | 507 | } else { |
501 | INIT_COMPLETION(i2c->cmd_complete); | 508 | INIT_COMPLETION(i2c->cmd_complete); |
502 | ret = mxs_i2c_dma_setup_xfer(adap, msg, flags); | 509 | ret = mxs_i2c_dma_setup_xfer(adap, msg, flags); |
@@ -527,7 +534,10 @@ static int mxs_i2c_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, | |||
527 | timeout: | 534 | timeout: |
528 | dev_dbg(i2c->dev, "Timeout!\n"); | 535 | dev_dbg(i2c->dev, "Timeout!\n"); |
529 | mxs_i2c_dma_finish(i2c); | 536 | mxs_i2c_dma_finish(i2c); |
530 | mxs_i2c_reset(i2c); | 537 | ret = mxs_i2c_reset(i2c); |
538 | if (ret) | ||
539 | return ret; | ||
540 | |||
531 | return -ETIMEDOUT; | 541 | return -ETIMEDOUT; |
532 | } | 542 | } |
533 | 543 | ||
@@ -683,7 +693,9 @@ static int mxs_i2c_probe(struct platform_device *pdev) | |||
683 | platform_set_drvdata(pdev, i2c); | 693 | platform_set_drvdata(pdev, i2c); |
684 | 694 | ||
685 | /* Do reset to enforce correct startup after pinmuxing */ | 695 | /* Do reset to enforce correct startup after pinmuxing */ |
686 | mxs_i2c_reset(i2c); | 696 | err = mxs_i2c_reset(i2c); |
697 | if (err) | ||
698 | return err; | ||
687 | 699 | ||
688 | adap = &i2c->adapter; | 700 | adap = &i2c->adapter; |
689 | strlcpy(adap->name, "MXS I2C adapter", sizeof(adap->name)); | 701 | strlcpy(adap->name, "MXS I2C adapter", sizeof(adap->name)); |