diff mbox series

[U-Boot,2/2] i2c: imx_lpi2c: add uclass api support

Message ID 20180717123833.28346-2-peng.fan@nxp.com
State Accepted
Commit 3d7690aec1020aa579eee189ed07d5e6289e3617
Delegated to: Heiko Schocher
Headers show
Series [U-Boot,1/2] i2c-mux: pca954x: support pca9646 i2c switch | expand

Commit Message

Peng Fan July 17, 2018, 12:38 p.m. UTC
Use uclass clk api to get per clk when CONFIG_CLK enabled.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 drivers/i2c/imx_lpi2c.c | 47 ++++++++++++++++++++++++++++++++++++++++-------
 include/imx_lpi2c.h     |  3 +++
 2 files changed, 43 insertions(+), 7 deletions(-)

Comments

Anatolij Gustschin Aug. 6, 2018, 12:18 p.m. UTC | #1
On Tue, 17 Jul 2018 20:38:33 +0800
Peng Fan peng.fan@nxp.com wrote:

> Use uclass clk api to get per clk when CONFIG_CLK enabled.
> 
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
>  drivers/i2c/imx_lpi2c.c | 47 ++++++++++++++++++++++++++++++++++++++++-------
>  include/imx_lpi2c.h     |  3 +++
>  2 files changed, 43 insertions(+), 7 deletions(-)

Reviewed-by: Anatolij Gustschin <agust@denx.de>

--
Anatolij
Anatolij Gustschin Aug. 6, 2018, 12:40 p.m. UTC | #2
On Tue, 17 Jul 2018 20:38:33 +0800
Peng Fan peng.fan@nxp.com wrote:

> Use uclass clk api to get per clk when CONFIG_CLK enabled.
> 
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
>  drivers/i2c/imx_lpi2c.c | 47 ++++++++++++++++++++++++++++++++++++++++-------
>  include/imx_lpi2c.h     |  3 +++
>  2 files changed, 43 insertions(+), 7 deletions(-)

Applied to u-boot-staging/agust@denx.de, thanks!

--
Anatolij
diff mbox series

Patch

diff --git a/drivers/i2c/imx_lpi2c.c b/drivers/i2c/imx_lpi2c.c
index ff07ca34aa..6c343072fb 100644
--- a/drivers/i2c/imx_lpi2c.c
+++ b/drivers/i2c/imx_lpi2c.c
@@ -261,8 +261,14 @@  static int bus_i2c_write(struct udevice *bus, u32 chip, u8 *buf, int len)
 }
 
 
+u32 __weak imx_get_i2cclk(u32 i2c_num)
+{
+	return 0;
+}
+
 static int bus_i2c_set_bus_speed(struct udevice *bus, int speed)
 {
+	struct imx_lpi2c_bus *i2c_bus = dev_get_priv(bus);
 	struct imx_lpi2c_reg *regs;
 	u32 val;
 	u32 preescale = 0, best_pre = 0, clkhi = 0;
@@ -273,9 +279,18 @@  static int bus_i2c_set_bus_speed(struct udevice *bus, int speed)
 	int i;
 
 	regs = (struct imx_lpi2c_reg *)devfdt_get_addr(bus);
-	clock_rate = imx_get_i2cclk(bus->seq);
-	if (!clock_rate)
-		return -EPERM;
+
+	if (IS_ENABLED(CONFIG_CLK)) {
+		clock_rate = clk_get_rate(&i2c_bus->per_clk);
+		if (clock_rate <= 0) {
+			dev_err(bus, "Failed to get i2c clk: %d\n", clock_rate);
+			return clock_rate;
+		}
+	} else {
+		clock_rate = imx_get_i2cclk(bus->seq);
+		if (!clock_rate)
+			return -EPERM;
+	}
 
 	mode = (readl(&regs->mcr) & LPI2C_MCR_MEN_MASK) >> LPI2C_MCR_MEN_SHIFT;
 	/* disable master mode */
@@ -417,6 +432,11 @@  static int imx_lpi2c_set_bus_speed(struct udevice *bus, unsigned int speed)
 	return bus_i2c_set_bus_speed(bus, speed);
 }
 
+__weak int enable_i2c_clk(unsigned char enable, unsigned int i2c_num)
+{
+	return 0;
+}
+
 static int imx_lpi2c_probe(struct udevice *bus)
 {
 	struct imx_lpi2c_bus *i2c_bus = dev_get_priv(bus);
@@ -440,10 +460,23 @@  static int imx_lpi2c_probe(struct udevice *bus)
 		return ret;
 	}
 
-	/* To i.MX7ULP, only i2c4-7 can be handled by A7 core */
-	ret = enable_i2c_clk(1, bus->seq);
-	if (ret < 0)
-		return ret;
+	if (IS_ENABLED(CONFIG_CLK)) {
+		ret = clk_get_by_name(bus, "per", &i2c_bus->per_clk);
+		if (ret) {
+			dev_err(bus, "Failed to get per clk\n");
+			return ret;
+		}
+		ret = clk_enable(&i2c_bus->per_clk);
+		if (ret) {
+			dev_err(bus, "Failed to enable per clk\n");
+			return ret;
+		}
+	} else {
+		/* To i.MX7ULP, only i2c4-7 can be handled by A7 core */
+		ret = enable_i2c_clk(1, bus->seq);
+		if (ret < 0)
+			return ret;
+	}
 
 	ret = bus_i2c_init(bus, 100000);
 	if (ret < 0)
diff --git a/include/imx_lpi2c.h b/include/imx_lpi2c.h
index 3fbb40bdd1..2700e5f876 100644
--- a/include/imx_lpi2c.h
+++ b/include/imx_lpi2c.h
@@ -8,6 +8,8 @@ 
 #ifndef __IMX_LPI2C_H__
 #define __IMX_LPI2C_H__
 
+#include <clk.h>
+
 struct imx_lpi2c_bus {
 	int index;
 	ulong base;
@@ -15,6 +17,7 @@  struct imx_lpi2c_bus {
 	int speed;
 	struct i2c_pads_info *pads_info;
 	struct udevice *bus;
+	struct clk per_clk;
 };
 
 struct imx_lpi2c_reg {