static irqreturn_t stm32f7_i2c_isr_event(int irq, void *data)
 {
        struct stm32f7_i2c_dev *i2c_dev = data;
-       struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
-       struct stm32_i2c_dma *dma = i2c_dev->dma;
-       void __iomem *base = i2c_dev->base;
-       u32 status, mask;
-       int ret = IRQ_HANDLED;
+       u32 status;
 
-       /* Check if the interrupt if for a slave device */
-       if (!i2c_dev->master_mode) {
-               ret = stm32f7_i2c_slave_isr_event(i2c_dev);
-               return ret;
-       }
+       /* Check if the interrupt is for a slave device */
+       if (!i2c_dev->master_mode)
+               return IRQ_WAKE_THREAD;
 
        status = readl_relaxed(i2c_dev->base + STM32F7_I2C_ISR);
 
        if (status & STM32F7_I2C_ISR_RXNE)
                stm32f7_i2c_read_rx_data(i2c_dev);
 
+       /* Wake up the thread if other flags are raised */
+       if (status &
+           (STM32F7_I2C_ISR_NACKF | STM32F7_I2C_ISR_STOPF |
+            STM32F7_I2C_ISR_TC | STM32F7_I2C_ISR_TCR))
+               return IRQ_WAKE_THREAD;
+
+       return IRQ_HANDLED;
+}
+
+static irqreturn_t stm32f7_i2c_isr_event_thread(int irq, void *data)
+{
+       struct stm32f7_i2c_dev *i2c_dev = data;
+       struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
+       struct stm32_i2c_dma *dma = i2c_dev->dma;
+       void __iomem *base = i2c_dev->base;
+       u32 status, mask;
+       int ret;
+
+       if (!i2c_dev->master_mode)
+               return stm32f7_i2c_slave_isr_event(i2c_dev);
+
+       status = readl_relaxed(i2c_dev->base + STM32F7_I2C_ISR);
+
        /* NACK received */
        if (status & STM32F7_I2C_ISR_NACKF) {
                dev_dbg(i2c_dev->dev, "<%s>: Receive NACK (addr %x)\n",
                f7_msg->result = -ENXIO;
        }
 
-       /* STOP detection flag */
-       if (status & STM32F7_I2C_ISR_STOPF) {
-               /* Disable interrupts */
-               if (stm32f7_i2c_is_slave_registered(i2c_dev))
-                       mask = STM32F7_I2C_XFER_IRQ_MASK;
+       if (status & STM32F7_I2C_ISR_TCR) {
+               if (f7_msg->smbus)
+                       stm32f7_i2c_smbus_reload(i2c_dev);
                else
-                       mask = STM32F7_I2C_ALL_IRQ_MASK;
-               stm32f7_i2c_disable_irq(i2c_dev, mask);
-
-               /* Clear STOP flag */
-               writel_relaxed(STM32F7_I2C_ICR_STOPCF, base + STM32F7_I2C_ICR);
-
-               if (i2c_dev->use_dma && !f7_msg->result) {
-                       ret = IRQ_WAKE_THREAD;
-               } else {
-                       i2c_dev->master_mode = false;
-                       complete(&i2c_dev->complete);
-               }
+                       stm32f7_i2c_reload(i2c_dev);
        }
 
        /* Transfer complete */
        if (status & STM32F7_I2C_ISR_TC) {
+               /* Wait for dma transfer completion before sending next message */
+               if (i2c_dev->use_dma && !f7_msg->result) {
+                       ret = wait_for_completion_timeout(&i2c_dev->dma->dma_complete, HZ);
+                       if (!ret) {
+                               dev_dbg(i2c_dev->dev, "<%s>: Timed out\n", __func__);
+                               stm32f7_i2c_disable_dma_req(i2c_dev);
+                               dmaengine_terminate_async(dma->chan_using);
+                               f7_msg->result = -ETIMEDOUT;
+                       }
+               }
                if (f7_msg->stop) {
                        mask = STM32F7_I2C_CR2_STOP;
                        stm32f7_i2c_set_bits(base + STM32F7_I2C_CR2, mask);
-               } else if (i2c_dev->use_dma && !f7_msg->result) {
-                       ret = IRQ_WAKE_THREAD;
                } else if (f7_msg->smbus) {
                        stm32f7_i2c_smbus_rep_start(i2c_dev);
                } else {
                }
        }
 
-       if (status & STM32F7_I2C_ISR_TCR) {
-               if (f7_msg->smbus)
-                       stm32f7_i2c_smbus_reload(i2c_dev);
+       /* STOP detection flag */
+       if (status & STM32F7_I2C_ISR_STOPF) {
+               /* Disable interrupts */
+               if (stm32f7_i2c_is_slave_registered(i2c_dev))
+                       mask = STM32F7_I2C_XFER_IRQ_MASK;
                else
-                       stm32f7_i2c_reload(i2c_dev);
-       }
-
-       return ret;
-}
-
-static irqreturn_t stm32f7_i2c_isr_event_thread(int irq, void *data)
-{
-       struct stm32f7_i2c_dev *i2c_dev = data;
-       struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
-       struct stm32_i2c_dma *dma = i2c_dev->dma;
-       u32 status;
-       int ret;
-
-       /*
-        * Wait for dma transfer completion before sending next message or
-        * notity the end of xfer to the client
-        */
-       ret = wait_for_completion_timeout(&i2c_dev->dma->dma_complete, HZ);
-       if (!ret) {
-               dev_dbg(i2c_dev->dev, "<%s>: Timed out\n", __func__);
-               stm32f7_i2c_disable_dma_req(i2c_dev);
-               dmaengine_terminate_async(dma->chan_using);
-               f7_msg->result = -ETIMEDOUT;
-       }
+                       mask = STM32F7_I2C_ALL_IRQ_MASK;
+               stm32f7_i2c_disable_irq(i2c_dev, mask);
 
-       status = readl_relaxed(i2c_dev->base + STM32F7_I2C_ISR);
+               /* Clear STOP flag */
+               writel_relaxed(STM32F7_I2C_ICR_STOPCF, base + STM32F7_I2C_ICR);
 
-       if (status & STM32F7_I2C_ISR_TC) {
-               if (f7_msg->smbus) {
-                       stm32f7_i2c_smbus_rep_start(i2c_dev);
-               } else {
-                       i2c_dev->msg_id++;
-                       i2c_dev->msg++;
-                       stm32f7_i2c_xfer_msg(i2c_dev, i2c_dev->msg);
-               }
-       } else {
                i2c_dev->master_mode = false;
                complete(&i2c_dev->complete);
        }
        return IRQ_HANDLED;
 }
 
-static irqreturn_t stm32f7_i2c_isr_error(int irq, void *data)
+static irqreturn_t stm32f7_i2c_isr_error_thread(int irq, void *data)
 {
        struct stm32f7_i2c_dev *i2c_dev = data;
        struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
        if (ret)
                return dev_err_probe(&pdev->dev, ret, "Failed to request irq event\n");
 
-       ret = devm_request_irq(&pdev->dev, irq_error, stm32f7_i2c_isr_error, 0,
-                              pdev->name, i2c_dev);
+       ret = devm_request_threaded_irq(&pdev->dev, irq_error,
+                                       NULL,
+                                       stm32f7_i2c_isr_error_thread,
+                                       IRQF_ONESHOT,
+                                       pdev->name, i2c_dev);
        if (ret)
                return dev_err_probe(&pdev->dev, ret, "Failed to request irq error\n");