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 /drivers/i2c/mxc_i2c.c | |
| parent | 47af6f61bcd9fdd5dcf389cff0a7406eba756c6f (diff) | |
| download | olio-uboot-2014.01-b567b8ff793e7048d9c0fc2ddf73998d2d7c0052.tar.xz olio-uboot-2014.01-b567b8ff793e7048d9c0fc2ddf73998d2d7c0052.zip | |
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>
Diffstat (limited to 'drivers/i2c/mxc_i2c.c')
| -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 a805bf62d..2869d7cec 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); |