* @clk: function clk for rk3399 or function & Bus clks for others
  * @pclk: Bus clk for rk3399
  * @clk_rate_nb: i2c clk rate change notify
+ * @irq: irq number
  * @t: I2C known timing information
  * @lock: spinlock for the i2c bus
  * @wait: the waitqueue to wait for i2c transfer
        struct clk *clk;
        struct clk *pclk;
        struct notifier_block clk_rate_nb;
+       int irq;
 
        /* Settings */
        struct i2c_timings t;
 
                spin_unlock_irqrestore(&i2c->lock, flags);
 
-               rk3x_i2c_start(i2c);
-
                if (!polling) {
+                       rk3x_i2c_start(i2c);
+
                        timeout = wait_event_timeout(i2c->wait, !i2c->busy,
                                                     msecs_to_jiffies(WAIT_TIMEOUT));
                } else {
+                       disable_irq(i2c->irq);
+                       rk3x_i2c_start(i2c);
+
                        timeout = rk3x_i2c_wait_xfer_poll(i2c);
+
+                       enable_irq(i2c->irq);
                }
 
                spin_lock_irqsave(&i2c->lock, flags);
                return ret;
        }
 
+       i2c->irq = irq;
+
        platform_set_drvdata(pdev, i2c);
 
        if (i2c->soc_data->calc_timings == rk3x_i2c_v0_calc_timings) {