Commit 3256412f authored by Weilong Chen's avatar Weilong Chen Committed by Wolfram Sang
Browse files

i2c: hisi: Add support to get clock frequency from clock



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: default avatarWeilong Chen <chenweilong@huawei.com>
Acked-by: default avatarYicong Yang <yangyicong@hisilicon.com>
Signed-off-by: default avatarWolfram Sang <wsa@kernel.org>
parent d78a1673
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -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,11 +456,16 @@ static int hisi_i2c_probe(struct platform_device *pdev)
		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);