struct imx_i2c_struct *i2c_imx = platform_get_drvdata(pdev);
        int irq, ret;
 
-       ret = pm_runtime_resume_and_get(&pdev->dev);
-       if (ret < 0)
-               return ret;
+       ret = pm_runtime_get_sync(&pdev->dev);
 
        hrtimer_cancel(&i2c_imx->slave_timer);
 
        if (i2c_imx->dma)
                i2c_imx_dma_free(i2c_imx);
 
-       /* setup chip registers to defaults */
-       imx_i2c_write_reg(0, i2c_imx, IMX_I2C_IADR);
-       imx_i2c_write_reg(0, i2c_imx, IMX_I2C_IFDR);
-       imx_i2c_write_reg(0, i2c_imx, IMX_I2C_I2CR);
-       imx_i2c_write_reg(0, i2c_imx, IMX_I2C_I2SR);
+       if (ret == 0) {
+               /* setup chip registers to defaults */
+               imx_i2c_write_reg(0, i2c_imx, IMX_I2C_IADR);
+               imx_i2c_write_reg(0, i2c_imx, IMX_I2C_IFDR);
+               imx_i2c_write_reg(0, i2c_imx, IMX_I2C_I2CR);
+               imx_i2c_write_reg(0, i2c_imx, IMX_I2C_I2SR);
+               clk_disable(i2c_imx->clk);
+       }
 
        clk_notifier_unregister(i2c_imx->clk, &i2c_imx->clk_change_nb);
        irq = platform_get_irq(pdev, 0);
        if (irq >= 0)
                free_irq(irq, i2c_imx);
-       clk_disable_unprepare(i2c_imx->clk);
+
+       clk_unprepare(i2c_imx->clk);
 
        pm_runtime_put_noidle(&pdev->dev);
        pm_runtime_disable(&pdev->dev);