i2c_writel(I2C_IPD_ALL_CLEAN, i2c->regs + I2C_IPD);
goto out;
}
-
+ i2c->complete_what |= 1<<i2c->state;
i2c_writel(I2C_STARTIPD, i2c->regs + I2C_IPD);
rk30_i2c_clean_start(i2c);
if(i2c->mode == I2C_CON_MOD_TX){
i2c_writel(I2C_IPD_ALL_CLEAN, i2c->regs + I2C_IPD);
goto out;
}
+ i2c->complete_what |= 1<<i2c->state;
i2c_writel(I2C_MBTFIPD, i2c->regs + I2C_IPD);
prepare_write:
rk30_irq_write_prepare(i2c);
i2c_writel(I2C_IPD_ALL_CLEAN, i2c->regs + I2C_IPD);
goto out;
}
+ i2c->complete_what |= 1<<i2c->state;
i2c_writel(I2C_MBRFIPD, i2c->regs + I2C_IPD);
rk30_irq_read_get_data(i2c);
prepare_read:
i2c_writel(I2C_STOPIPD, i2c->regs + I2C_IPD);
i2c->state = STATE_IDLE;
i2c->is_busy = 0;
+ i2c->complete_what |= 1<<i2c->state;
wake_up(&i2c->wait);
break;
default:
i2c->error = 0;
i2c->is_busy = 1;
i2c->state = STATE_START;
+ i2c->complete_what = 0;
i2c_writel(I2C_STARTIEN, i2c->regs + I2C_IEN);
spin_unlock_irqrestore(&i2c->lock, flags);
spin_unlock_irqrestore(&i2c->lock, flags);
if (timeout == 0){
- dev_err(i2c->dev, "addr[0x%02x] wait event timeout, state: %d, is_busy: %d, error: %d\n",
- msgs[0].addr, i2c->state, i2c->is_busy, i2c->error);
+ dev_err(i2c->dev, "addr[0x%02x] wait event timeout, state: %d, is_busy: %d, error: %d, complete_what: 0x%x\n",
+ msgs[0].addr, i2c->state, i2c->is_busy, i2c->error, i2c->complete_what);
i2c->state = STATE_IDLE;
if(i2c->error < 0) i2c->error = -ETIMEDOUT;
rk30_i2c_send_stop(i2c);
rk30_i2c_disable(i2c);
if(i2c->error == -EAGAIN)
- dev_err(i2c->dev, "No ack(retry %d), Maybe slave(addr: 0x%02x) not exist or abnormal power-on\n",
- i2c->adap.retries + 1, i2c->addr);
+ dev_err(i2c->dev, "No ack(retry: %d, complete_what: 0x%x), Maybe slave(addr: 0x%02x) not exist or abnormal power-on\n",
+ i2c->adap.retries + 1, i2c->complete_what, i2c->addr);
return i2c->error;
}