From 58d3de19bca074247bbd0126e727d0003a78c52e Mon Sep 17 00:00:00 2001 From: Peng Fan Date: Fri, 27 Jul 2018 10:20:36 +0800 Subject: power-domain: add dummy functions when CONFIG_POWER_DOMAIN not defined Add dummy functions when CONFIG_POWER_DOMAIN not defined. Signed-off-by: Peng Fan Reviewed-by: Simon Glass Signed-off-by: Anatolij Gustschin --- include/power-domain.h | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'include') diff --git a/include/power-domain.h b/include/power-domain.h index aba8c0f65c4..a558fbbdb21 100644 --- a/include/power-domain.h +++ b/include/power-domain.h @@ -87,7 +87,15 @@ struct power_domain { * @power_domain A pointer to a power domain struct to initialize. * @return 0 if OK, or a negative error code. */ +#if CONFIG_IS_ENABLED(POWER_DOMAIN) int power_domain_get(struct udevice *dev, struct power_domain *power_domain); +#else +static inline +int power_domain_get(struct udevice *dev, struct power_domain *power_domain) +{ + return -ENOSYS; +} +#endif /** * power_domain_free - Free a previously requested power domain. @@ -96,7 +104,14 @@ int power_domain_get(struct udevice *dev, struct power_domain *power_domain); * requested by power_domain_get(). * @return 0 if OK, or a negative error code. */ +#if CONFIG_IS_ENABLED(POWER_DOMAIN) int power_domain_free(struct power_domain *power_domain); +#else +static inline int power_domain_free(struct power_domain *power_domain) +{ + return -ENOSYS; +} +#endif /** * power_domain_on - Enable power to a power domain. @@ -105,7 +120,14 @@ int power_domain_free(struct power_domain *power_domain); * requested by power_domain_get(). * @return 0 if OK, or a negative error code. */ +#if CONFIG_IS_ENABLED(POWER_DOMAIN) int power_domain_on(struct power_domain *power_domain); +#else +static inline int power_domain_on(struct power_domain *power_domain) +{ + return -ENOSYS; +} +#endif /** * power_domain_off - Disable power ot a power domain. @@ -114,6 +136,13 @@ int power_domain_on(struct power_domain *power_domain); * requested by power_domain_get(). * @return 0 if OK, or a negative error code. */ +#if CONFIG_IS_ENABLED(POWER_DOMAIN) int power_domain_off(struct power_domain *power_domain); +#else +static inline int power_domain_off(struct power_domain *power_domain) +{ + return -ENOSYS; +} +#endif #endif -- cgit v1.3.1 From 3d7690aec1020aa579eee189ed07d5e6289e3617 Mon Sep 17 00:00:00 2001 From: Peng Fan Date: Tue, 17 Jul 2018 20:38:33 +0800 Subject: i2c: imx_lpi2c: add uclass api support Use uclass clk api to get per clk when CONFIG_CLK enabled. Signed-off-by: Peng Fan Reviewed-by: Anatolij Gustschin --- drivers/i2c/imx_lpi2c.c | 47 ++++++++++++++++++++++++++++++++++++++++------- include/imx_lpi2c.h | 3 +++ 2 files changed, 43 insertions(+), 7 deletions(-) (limited to 'include') diff --git a/drivers/i2c/imx_lpi2c.c b/drivers/i2c/imx_lpi2c.c index ff07ca34aac..6c343072fb2 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(®s->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 3fbb40bdd1a..2700e5f8763 100644 --- a/include/imx_lpi2c.h +++ b/include/imx_lpi2c.h @@ -8,6 +8,8 @@ #ifndef __IMX_LPI2C_H__ #define __IMX_LPI2C_H__ +#include + 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 { -- cgit v1.3.1