i2c: hisi: Add support to get clock frequency from clock
authorWeilong Chen <chenweilong@huawei.com>
Tue, 8 Nov 2022 01:58:11 +0000 (09:58 +0800)
committerWolfram Sang <wsa@kernel.org>
Wed, 7 Dec 2022 20:03:26 +0000 (21:03 +0100)
The clk_rate attribute is not generic device tree bindings for I2C
busses described in Documentation/devicetree/bindings/i2c/i2c.txt.
It can be managed by clock binding.

Support the driver to obtain clock information by clk_rate or
clock property. Find clock first, if not, fall back to clk_rate.

Signed-off-by: Weilong Chen <chenweilong@huawei.com>
Acked-by: Yicong Yang <yangyicong@hisilicon.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
drivers/i2c/busses/i2c-hisi.c

index bcc97e4..8c6c707 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <linux/bits.h>
 #include <linux/bitfield.h>
+#include <linux/clk.h>
 #include <linux/completion.h>
 #include <linux/i2c.h>
 #include <linux/interrupt.h>
@@ -88,6 +89,7 @@ struct hisi_i2c_controller {
        struct i2c_adapter adapter;
        void __iomem *iobase;
        struct device *dev;
+       struct clk *clk;
        int irq;
 
        /* Intermediates for recording the transfer process */
@@ -454,10 +456,15 @@ static int hisi_i2c_probe(struct platform_device *pdev)
                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);