Commit d9826351 authored by Yicong Yang's avatar Yicong Yang Committed by Wolfram Sang

i2c: hisi: Only use the completion interrupt to finish the transfer

The controller will always generate a completion interrupt when the
transfer is finished normally or not. Currently we use either error or
completion interrupt to finish, this may result the completion
interrupt unhandled and corrupt the next transfer, especially at low
speed mode. Since on error case, the error interrupt will come first
then is the completion interrupt. So only use the completion interrupt
to finish the whole transfer process.

Fixes: d62fbdb9 ("i2c: add support for HiSilicon I2C controller")
Reported-by: default avatarSheng Feng <fengsheng5@huawei.com>
Signed-off-by: default avatarSheng Feng <fengsheng5@huawei.com>
Signed-off-by: default avatarYicong Yang <yangyicong@hisilicon.com>
Signed-off-by: default avatarWolfram Sang <wsa@kernel.org>
parent cc9812a3
...@@ -348,7 +348,11 @@ static irqreturn_t hisi_i2c_irq(int irq, void *context) ...@@ -348,7 +348,11 @@ static irqreturn_t hisi_i2c_irq(int irq, void *context)
hisi_i2c_read_rx_fifo(ctlr); hisi_i2c_read_rx_fifo(ctlr);
out: out:
if (int_stat & HISI_I2C_INT_TRANS_CPLT || ctlr->xfer_err) { /*
* Only use TRANS_CPLT to indicate the completion. On error cases we'll
* get two interrupts, INT_ERR first then TRANS_CPLT.
*/
if (int_stat & HISI_I2C_INT_TRANS_CPLT) {
hisi_i2c_disable_int(ctlr, HISI_I2C_INT_ALL); hisi_i2c_disable_int(ctlr, HISI_I2C_INT_ALL);
hisi_i2c_clear_int(ctlr, HISI_I2C_INT_ALL); hisi_i2c_clear_int(ctlr, HISI_I2C_INT_ALL);
complete(ctlr->completion); complete(ctlr->completion);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment