diff options
author | Marek Vasut <marek.vasut@gmail.com> | 2011-09-27 06:34:11 +0000 |
---|---|---|
committer | Albert ARIBAUD <albert.u.boot@aribaud.net> | 2011-10-27 21:56:30 +0200 |
commit | b567b8ff793e7048d9c0fc2ddf73998d2d7c0052 (patch) | |
tree | d132a55c1d4357b581c2f3745c41e114137f359f | |
parent | 47af6f61bcd9fdd5dcf389cff0a7406eba756c6f (diff) | |
download | u-boot-imx-b567b8ff793e7048d9c0fc2ddf73998d2d7c0052.zip u-boot-imx-b567b8ff793e7048d9c0fc2ddf73998d2d7c0052.tar.gz u-boot-imx-b567b8ff793e7048d9c0fc2ddf73998d2d7c0052.tar.bz2 |
I2C: Add i2c_get/set_speed() to mxc_i2c.c
Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
Cc: Stefano Babic <sbabic@denx.de>
Cc: Heiko Schocher <hs@denx.de>
Acked-by: Heiko Schocher <hs@denx.de>
-rw-r--r-- | drivers/i2c/mxc_i2c.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/drivers/i2c/mxc_i2c.c b/drivers/i2c/mxc_i2c.c index a805bf6..2869d7c 100644 --- a/drivers/i2c/mxc_i2c.c +++ b/drivers/i2c/mxc_i2c.c @@ -95,7 +95,7 @@ static u16 i2c_clk_div[50][2] = { { 3072, 0x1E }, { 3840, 0x1F } }; -static u8 clk_idx; +static u8 clk_div; /* * Calculate and set proper clock divider @@ -105,7 +105,6 @@ static void i2c_imx_set_clk(unsigned int rate) struct mxc_i2c_regs *i2c_regs = (struct mxc_i2c_regs *)I2C_BASE; unsigned int i2c_clk_rate; unsigned int div; - int i; #if defined(CONFIG_MX31) struct clock_control_regs *sc_regs = @@ -120,16 +119,15 @@ static void i2c_imx_set_clk(unsigned int rate) i2c_clk_rate = mxc_get_clock(MXC_IPG_PERCLK); div = (i2c_clk_rate + rate - 1) / rate; if (div < i2c_clk_div[0][0]) - i = 0; + clk_div = 0; else if (div > i2c_clk_div[ARRAY_SIZE(i2c_clk_div) - 1][0]) - i = ARRAY_SIZE(i2c_clk_div) - 1; + clk_div = ARRAY_SIZE(i2c_clk_div) - 1; else - for (i = 0; i2c_clk_div[i][0] < div; i++) + for (clk_div = 0; i2c_clk_div[clk_div][0] < div; clk_div++) ; /* Store divider value */ - clk_idx = i2c_clk_div[i][1]; - writeb(clk_idx, &i2c_regs->ifdr); + writeb(i2c_clk_div[clk_div][1], &i2c_regs->ifdr); } /* @@ -153,6 +151,23 @@ void i2c_init(int speed, int unused) } /* + * Set I2C Speed + */ +int i2c_set_bus_speed(unsigned int speed) +{ + i2c_init(speed, 0); + return 0; +} + +/* + * Get I2C Speed + */ +unsigned int i2c_get_bus_speed(void) +{ + return mxc_get_clock(MXC_IPG_PERCLK) / i2c_clk_div[clk_div][0]; +} + +/* * Wait for bus to be busy (or free if for_busy = 0) * * for_busy = 1: Wait for IBB to be asserted @@ -218,7 +233,7 @@ int i2c_imx_start(void) unsigned int temp = 0; int result; - writeb(clk_idx, &i2c_regs->ifdr); + writeb(i2c_clk_div[clk_div][1], &i2c_regs->ifdr); /* Enable I2C controller */ writeb(0, &i2c_regs->i2sr); |