diff options
author | Fabio Estevam <fabio.estevam@freescale.com> | 2013-07-11 01:19:28 (GMT) |
---|---|---|
committer | Wolfram Sang <wsa@the-dreams.de> | 2013-08-15 09:59:09 (GMT) |
commit | 63151c539d790732f22d59d4c89766dd9b5284d2 (patch) | |
tree | 2a372196eb1871ed3157bc8a442c596a37338863 /drivers/i2c | |
parent | 2806914f5d027c225c7562a0f2dd7e20c3ba8beb (diff) | |
download | linux-63151c539d790732f22d59d4c89766dd9b5284d2.tar.xz |
i2c: mxs: Check the return value from stmp_reset_block()
stmp_reset_block() may fail, so let's check its return value and propagate it in
the case of error.
Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Acked-by: Marek Vasut <marex@denx.de>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
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 e2e9a0d..43e2273 100644 --- a/drivers/i2c/busses/i2c-mxs.c +++ b/drivers/i2c/busses/i2c-mxs.c @@ -123,9 +123,11 @@ struct mxs_i2c_dev { bool dma_read; }; -static void mxs_i2c_reset(struct mxs_i2c_dev *i2c) +static int mxs_i2c_reset(struct mxs_i2c_dev *i2c) { - stmp_reset_block(i2c->regs); + int ret = stmp_reset_block(i2c->regs); + if (ret) + return ret; /* * 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) writel(0x00300030, i2c->regs + MXS_I2C_TIMING2); writel(MXS_I2C_IRQ_MASK << 8, i2c->regs + MXS_I2C_CTRL1_SET); + + return 0; } 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, int stop) { struct mxs_i2c_dev *i2c = i2c_get_adapdata(adap); - int ret; + int ret, err; int flags; 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, i2c->cmd_err = 0; if (0) { /* disable PIO mode until a proper fix is made */ ret = mxs_i2c_pio_setup_xfer(adap, msg, flags); - if (ret) - mxs_i2c_reset(i2c); + if (ret) { + err = mxs_i2c_reset(i2c); + if (err) + return err; + } } else { INIT_COMPLETION(i2c->cmd_complete); 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, timeout: dev_dbg(i2c->dev, "Timeout!\n"); mxs_i2c_dma_finish(i2c); - mxs_i2c_reset(i2c); + ret = mxs_i2c_reset(i2c); + if (ret) + return ret; + return -ETIMEDOUT; } @@ -683,7 +693,9 @@ static int mxs_i2c_probe(struct platform_device *pdev) platform_set_drvdata(pdev, i2c); /* Do reset to enforce correct startup after pinmuxing */ - mxs_i2c_reset(i2c); + err = mxs_i2c_reset(i2c); + if (err) + return err; adap = &i2c->adapter; strlcpy(adap->name, "MXS I2C adapter", sizeof(adap->name)); |