#include <linux/bits.h>
 #include <linux/bitfield.h>
+#include <linux/clk.h>
 #include <linux/completion.h>
 #include <linux/i2c.h>
 #include <linux/interrupt.h>
        struct i2c_adapter adapter;
        void __iomem *iobase;
        struct device *dev;
+       struct clk *clk;
        int irq;
 
        /* Intermediates for recording the transfer process */
                return ret;
        }
 
-       ret = device_property_read_u64(dev, "clk_rate", &clk_rate_hz);
-       if (ret) {
-               dev_err(dev, "failed to get clock frequency, ret = %d\n", ret);
-               return ret;
+       ctlr->clk = devm_clk_get_optional_enabled(&pdev->dev, NULL);
+       if (IS_ERR_OR_NULL(ctlr->clk)) {
+               ret = device_property_read_u64(dev, "clk_rate", &clk_rate_hz);
+               if (ret) {
+                       dev_err(dev, "failed to get clock frequency, ret = %d\n", ret);
+                       return ret;
+               }
+       } else {
+               clk_rate_hz = clk_get_rate(ctlr->clk);
        }
 
        ctlr->clk_rate_khz = DIV_ROUND_UP_ULL(clk_rate_hz, HZ_PER_KHZ);