aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/i2c/busses/i2c-mv64xxx.c33
1 files changed, 14 insertions, 19 deletions
diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c
index b8c5187b9ee0..d52d84937ad3 100644
--- a/drivers/i2c/busses/i2c-mv64xxx.c
+++ b/drivers/i2c/busses/i2c-mv64xxx.c
@@ -97,7 +97,6 @@ enum {
97enum { 97enum {
98 MV64XXX_I2C_ACTION_INVALID, 98 MV64XXX_I2C_ACTION_INVALID,
99 MV64XXX_I2C_ACTION_CONTINUE, 99 MV64XXX_I2C_ACTION_CONTINUE,
100 MV64XXX_I2C_ACTION_OFFLOAD_SEND_START,
101 MV64XXX_I2C_ACTION_SEND_START, 100 MV64XXX_I2C_ACTION_SEND_START,
102 MV64XXX_I2C_ACTION_SEND_RESTART, 101 MV64XXX_I2C_ACTION_SEND_RESTART,
103 MV64XXX_I2C_ACTION_OFFLOAD_RESTART, 102 MV64XXX_I2C_ACTION_OFFLOAD_RESTART,
@@ -204,6 +203,9 @@ static int mv64xxx_i2c_offload_msg(struct mv64xxx_i2c_data *drv_data)
204 unsigned long ctrl_reg; 203 unsigned long ctrl_reg;
205 struct i2c_msg *msg = drv_data->msgs; 204 struct i2c_msg *msg = drv_data->msgs;
206 205
206 if (!drv_data->offload_enabled)
207 return -EOPNOTSUPP;
208
207 drv_data->msg = msg; 209 drv_data->msg = msg;
208 drv_data->byte_posn = 0; 210 drv_data->byte_posn = 0;
209 drv_data->bytes_left = msg->len; 211 drv_data->bytes_left = msg->len;
@@ -433,8 +435,7 @@ mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data)
433 435
434 drv_data->msgs++; 436 drv_data->msgs++;
435 drv_data->num_msgs--; 437 drv_data->num_msgs--;
436 if (!(drv_data->offload_enabled && 438 if (mv64xxx_i2c_offload_msg(drv_data) < 0) {
437 mv64xxx_i2c_offload_msg(drv_data))) {
438 drv_data->cntl_bits |= MV64XXX_I2C_REG_CONTROL_START; 439 drv_data->cntl_bits |= MV64XXX_I2C_REG_CONTROL_START;
439 writel(drv_data->cntl_bits, 440 writel(drv_data->cntl_bits,
440 drv_data->reg_base + drv_data->reg_offsets.control); 441 drv_data->reg_base + drv_data->reg_offsets.control);
@@ -458,15 +459,14 @@ mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data)
458 drv_data->reg_base + drv_data->reg_offsets.control); 459 drv_data->reg_base + drv_data->reg_offsets.control);
459 break; 460 break;
460 461
461 case MV64XXX_I2C_ACTION_OFFLOAD_SEND_START:
462 if (!mv64xxx_i2c_offload_msg(drv_data))
463 break;
464 else
465 drv_data->action = MV64XXX_I2C_ACTION_SEND_START;
466 /* FALLTHRU */
467 case MV64XXX_I2C_ACTION_SEND_START: 462 case MV64XXX_I2C_ACTION_SEND_START:
468 writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_START, 463 /* Can we offload this msg ? */
469 drv_data->reg_base + drv_data->reg_offsets.control); 464 if (mv64xxx_i2c_offload_msg(drv_data) < 0) {
465 /* No, switch to standard path */
466 mv64xxx_i2c_prepare_for_io(drv_data, drv_data->msgs);
467 writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_START,
468 drv_data->reg_base + drv_data->reg_offsets.control);
469 }
470 break; 470 break;
471 471
472 case MV64XXX_I2C_ACTION_SEND_ADDR_1: 472 case MV64XXX_I2C_ACTION_SEND_ADDR_1:
@@ -625,15 +625,10 @@ mv64xxx_i2c_execute_msg(struct mv64xxx_i2c_data *drv_data, struct i2c_msg *msg,
625 unsigned long flags; 625 unsigned long flags;
626 626
627 spin_lock_irqsave(&drv_data->lock, flags); 627 spin_lock_irqsave(&drv_data->lock, flags);
628 if (drv_data->offload_enabled) {
629 drv_data->action = MV64XXX_I2C_ACTION_OFFLOAD_SEND_START;
630 drv_data->state = MV64XXX_I2C_STATE_WAITING_FOR_START_COND;
631 } else {
632 mv64xxx_i2c_prepare_for_io(drv_data, msg);
633 628
634 drv_data->action = MV64XXX_I2C_ACTION_SEND_START; 629 drv_data->action = MV64XXX_I2C_ACTION_SEND_START;
635 drv_data->state = MV64XXX_I2C_STATE_WAITING_FOR_START_COND; 630 drv_data->state = MV64XXX_I2C_STATE_WAITING_FOR_START_COND;
636 } 631
637 drv_data->send_stop = is_last; 632 drv_data->send_stop = is_last;
638 drv_data->block = 1; 633 drv_data->block = 1;
639 mv64xxx_i2c_do_action(drv_data); 634 mv64xxx_i2c_do_action(drv_data);