struct meson_i2c *i2c = adap->algo_data;
        int i, ret = 0;
 
-       clk_enable(i2c->clk);
-
        for (i = 0; i < num; i++) {
                ret = meson_i2c_xfer_msg(i2c, msgs + i, i == num - 1, atomic);
                if (ret)
                        break;
        }
 
-       clk_disable(i2c->clk);
-
        return ret ?: i;
 }
 
                return ret;
        }
 
-       ret = clk_prepare(i2c->clk);
+       ret = clk_prepare_enable(i2c->clk);
        if (ret < 0) {
                dev_err(&pdev->dev, "can't prepare clock\n");
                return ret;
 
        ret = i2c_add_adapter(&i2c->adap);
        if (ret < 0) {
-               clk_unprepare(i2c->clk);
+               clk_disable_unprepare(i2c->clk);
                return ret;
        }
 
        struct meson_i2c *i2c = platform_get_drvdata(pdev);
 
        i2c_del_adapter(&i2c->adap);
-       clk_unprepare(i2c->clk);
+       clk_disable_unprepare(i2c->clk);
 
        return 0;
 }