Commit 7f9906bd authored by Shubhrajyoti Datta's avatar Shubhrajyoti Datta Committed by Wolfram Sang

i2c: xiic: Service all interrupts in isr

Currently only one interrupt is serviced in the isr.
In case the multiple interrupts happen simultenously we service and ack
only one of them. Check for all the causes in the isr and service them.
Signed-off-by: default avatarShubhrajyoti Datta <shubhraj@xilinx.com>
Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
parent 542e2a9b
...@@ -401,11 +401,11 @@ static irqreturn_t xiic_process(int irq, void *dev_id) ...@@ -401,11 +401,11 @@ static irqreturn_t xiic_process(int irq, void *dev_id)
if (i2c->tx_msg) if (i2c->tx_msg)
xiic_wakeup(i2c, STATE_ERROR); xiic_wakeup(i2c, STATE_ERROR);
}
} else if (pend & XIIC_INTR_RX_FULL_MASK) { if (pend & XIIC_INTR_RX_FULL_MASK) {
/* Receive register/FIFO is full */ /* Receive register/FIFO is full */
clr = XIIC_INTR_RX_FULL_MASK; clr |= XIIC_INTR_RX_FULL_MASK;
if (!i2c->rx_msg) { if (!i2c->rx_msg) {
dev_dbg(i2c->adap.dev.parent, dev_dbg(i2c->adap.dev.parent,
"%s unexpexted RX IRQ\n", __func__); "%s unexpexted RX IRQ\n", __func__);
...@@ -438,9 +438,10 @@ static irqreturn_t xiic_process(int irq, void *dev_id) ...@@ -438,9 +438,10 @@ static irqreturn_t xiic_process(int irq, void *dev_id)
__xiic_start_xfer(i2c); __xiic_start_xfer(i2c);
} }
} }
} else if (pend & XIIC_INTR_BNB_MASK) { }
if (pend & XIIC_INTR_BNB_MASK) {
/* IIC bus has transitioned to not busy */ /* IIC bus has transitioned to not busy */
clr = XIIC_INTR_BNB_MASK; clr |= XIIC_INTR_BNB_MASK;
/* The bus is not busy, disable BusNotBusy interrupt */ /* The bus is not busy, disable BusNotBusy interrupt */
xiic_irq_dis(i2c, XIIC_INTR_BNB_MASK); xiic_irq_dis(i2c, XIIC_INTR_BNB_MASK);
...@@ -453,12 +454,12 @@ static irqreturn_t xiic_process(int irq, void *dev_id) ...@@ -453,12 +454,12 @@ static irqreturn_t xiic_process(int irq, void *dev_id)
xiic_wakeup(i2c, STATE_DONE); xiic_wakeup(i2c, STATE_DONE);
else else
xiic_wakeup(i2c, STATE_ERROR); xiic_wakeup(i2c, STATE_ERROR);
}
} else if (pend & (XIIC_INTR_TX_EMPTY_MASK | XIIC_INTR_TX_HALF_MASK)) { if (pend & (XIIC_INTR_TX_EMPTY_MASK | XIIC_INTR_TX_HALF_MASK)) {
/* Transmit register/FIFO is empty or ½ empty */ /* Transmit register/FIFO is empty or ½ empty */
clr = pend & clr |= (pend &
(XIIC_INTR_TX_EMPTY_MASK | XIIC_INTR_TX_HALF_MASK); (XIIC_INTR_TX_EMPTY_MASK | XIIC_INTR_TX_HALF_MASK));
if (!i2c->tx_msg) { if (!i2c->tx_msg) {
dev_dbg(i2c->adap.dev.parent, dev_dbg(i2c->adap.dev.parent,
...@@ -489,11 +490,6 @@ static irqreturn_t xiic_process(int irq, void *dev_id) ...@@ -489,11 +490,6 @@ static irqreturn_t xiic_process(int irq, void *dev_id)
* make sure to disable tx half * make sure to disable tx half
*/ */
xiic_irq_dis(i2c, XIIC_INTR_TX_HALF_MASK); xiic_irq_dis(i2c, XIIC_INTR_TX_HALF_MASK);
} else {
/* got IRQ which is not acked */
dev_err(i2c->adap.dev.parent, "%s Got unexpected IRQ\n",
__func__);
clr = pend;
} }
out: out:
dev_dbg(i2c->adap.dev.parent, "%s clr: 0x%x\n", __func__, clr); dev_dbg(i2c->adap.dev.parent, "%s clr: 0x%x\n", __func__, clr);
......
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