lkml.org 
[lkml]   [2014]   [Feb]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.13 91/99] i2c: mv64xxx: refactor message start to ensure proper initialization
    Date
    3.13-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Wolfram Sang <wsa@the-dreams.de>

    commit 79970db213344b4a4034645db5ebfc31571f3fa3 upstream.

    Because the offload mechanism can fall back to a standard transfer,
    having two seperate initialization states is unfortunate. Let's just
    have one state which does things consistently. This fixes a bug where
    some preparation was missing when the fallback happened. And it makes
    the code much easier to follow. To implement this, we put the check
    if offload is possible at the top of the offload setup function.

    Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
    Tested-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
    Fixes: 930ab3d403ae (i2c: mv64xxx: Add I2C Transaction Generator support)
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/i2c/busses/i2c-mv64xxx.c | 33 ++++++++++++++-------------------
    1 file changed, 14 insertions(+), 19 deletions(-)

    --- a/drivers/i2c/busses/i2c-mv64xxx.c
    +++ b/drivers/i2c/busses/i2c-mv64xxx.c
    @@ -97,7 +97,6 @@ enum {
    enum {
    MV64XXX_I2C_ACTION_INVALID,
    MV64XXX_I2C_ACTION_CONTINUE,
    - MV64XXX_I2C_ACTION_OFFLOAD_SEND_START,
    MV64XXX_I2C_ACTION_SEND_START,
    MV64XXX_I2C_ACTION_SEND_RESTART,
    MV64XXX_I2C_ACTION_OFFLOAD_RESTART,
    @@ -204,6 +203,9 @@ static int mv64xxx_i2c_offload_msg(struc
    unsigned long ctrl_reg;
    struct i2c_msg *msg = drv_data->msgs;

    + if (!drv_data->offload_enabled)
    + return -EOPNOTSUPP;
    +
    drv_data->msg = msg;
    drv_data->byte_posn = 0;
    drv_data->bytes_left = msg->len;
    @@ -433,8 +435,7 @@ mv64xxx_i2c_do_action(struct mv64xxx_i2c

    drv_data->msgs++;
    drv_data->num_msgs--;
    - if (!(drv_data->offload_enabled &&
    - mv64xxx_i2c_offload_msg(drv_data))) {
    + if (mv64xxx_i2c_offload_msg(drv_data) < 0) {
    drv_data->cntl_bits |= MV64XXX_I2C_REG_CONTROL_START;
    writel(drv_data->cntl_bits,
    drv_data->reg_base + drv_data->reg_offsets.control);
    @@ -458,15 +459,14 @@ mv64xxx_i2c_do_action(struct mv64xxx_i2c
    drv_data->reg_base + drv_data->reg_offsets.control);
    break;

    - case MV64XXX_I2C_ACTION_OFFLOAD_SEND_START:
    - if (!mv64xxx_i2c_offload_msg(drv_data))
    - break;
    - else
    - drv_data->action = MV64XXX_I2C_ACTION_SEND_START;
    - /* FALLTHRU */
    case MV64XXX_I2C_ACTION_SEND_START:
    - writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_START,
    - drv_data->reg_base + drv_data->reg_offsets.control);
    + /* Can we offload this msg ? */
    + if (mv64xxx_i2c_offload_msg(drv_data) < 0) {
    + /* No, switch to standard path */
    + mv64xxx_i2c_prepare_for_io(drv_data, drv_data->msgs);
    + writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_START,
    + drv_data->reg_base + drv_data->reg_offsets.control);
    + }
    break;

    case MV64XXX_I2C_ACTION_SEND_ADDR_1:
    @@ -625,15 +625,10 @@ mv64xxx_i2c_execute_msg(struct mv64xxx_i
    unsigned long flags;

    spin_lock_irqsave(&drv_data->lock, flags);
    - if (drv_data->offload_enabled) {
    - drv_data->action = MV64XXX_I2C_ACTION_OFFLOAD_SEND_START;
    - drv_data->state = MV64XXX_I2C_STATE_WAITING_FOR_START_COND;
    - } else {
    - mv64xxx_i2c_prepare_for_io(drv_data, msg);

    - drv_data->action = MV64XXX_I2C_ACTION_SEND_START;
    - drv_data->state = MV64XXX_I2C_STATE_WAITING_FOR_START_COND;
    - }
    + drv_data->action = MV64XXX_I2C_ACTION_SEND_START;
    + drv_data->state = MV64XXX_I2C_STATE_WAITING_FOR_START_COND;
    +
    drv_data->send_stop = is_last;
    drv_data->block = 1;
    mv64xxx_i2c_do_action(drv_data);



    \
     
     \ /
      Last update: 2014-02-21 02:02    [W:4.162 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site