lkml.org 
[lkml]   [2020]   [Sep]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v8 22/32] i2c: tegra: Factor out error recovery from tegra_i2c_xfer_msg()
    Date
    Factor out error recovery code from tegra_i2c_xfer_msg() in order to
    make this function easier to read and follow.

    Reviewed-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
    Acked-by: Thierry Reding <treding@nvidia.com>
    Tested-by: Thierry Reding <treding@nvidia.com>
    Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
    ---
    drivers/i2c/busses/i2c-tegra.c | 46 ++++++++++++++++++++++------------
    1 file changed, 30 insertions(+), 16 deletions(-)

    diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
    index f8bee67370aa..95d257cbd800 100644
    --- a/drivers/i2c/busses/i2c-tegra.c
    +++ b/drivers/i2c/busses/i2c-tegra.c
    @@ -1105,6 +1105,32 @@ static int tegra_i2c_issue_bus_clear(struct i2c_adapter *adap)
    return -EAGAIN;
    }

    +static int tegra_i2c_error_recover(struct tegra_i2c_dev *i2c_dev,
    + struct i2c_msg *msg)
    +{
    + if (i2c_dev->msg_err == I2C_ERR_NONE)
    + return 0;
    +
    + tegra_i2c_init(i2c_dev);
    +
    + /* start recovery upon arbitration loss in single master mode */
    + if (i2c_dev->msg_err == I2C_ERR_ARBITRATION_LOST) {
    + if (!i2c_dev->is_multimaster_mode)
    + return i2c_recover_bus(&i2c_dev->adapter);
    +
    + return -EAGAIN;
    + }
    +
    + if (i2c_dev->msg_err == I2C_ERR_NO_ACK) {
    + if (msg->flags & I2C_M_IGNORE_NAK)
    + return 0;
    +
    + return -EREMOTEIO;
    + }
    +
    + return -EIO;
    +}
    +
    static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev,
    struct i2c_msg *msg,
    enum msg_end_type end_state)
    @@ -1288,24 +1314,12 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev,
    i2c_dev->msg_err);

    i2c_dev->is_curr_dma_xfer = false;
    - if (i2c_dev->msg_err == I2C_ERR_NONE)
    - return 0;

    - tegra_i2c_init(i2c_dev);
    - /* start recovery upon arbitration loss in single master mode */
    - if (i2c_dev->msg_err == I2C_ERR_ARBITRATION_LOST) {
    - if (!i2c_dev->is_multimaster_mode)
    - return i2c_recover_bus(&i2c_dev->adapter);
    - return -EAGAIN;
    - }
    -
    - if (i2c_dev->msg_err == I2C_ERR_NO_ACK) {
    - if (msg->flags & I2C_M_IGNORE_NAK)
    - return 0;
    - return -EREMOTEIO;
    - }
    + err = tegra_i2c_error_recover(i2c_dev, msg);
    + if (err)
    + return err;

    - return -EIO;
    + return 0;
    }

    static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
    --
    2.27.0
    \
     
     \ /
      Last update: 2020-09-23 00:53    [W:4.263 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site