From b567b8ff793e7048d9c0fc2ddf73998d2d7c0052 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Tue, 27 Sep 2011 06:34:11 +0000 Subject: [PATCH] I2C: Add i2c_get/set_speed() to mxc_i2c.c Signed-off-by: Marek Vasut Cc: Stefano Babic Cc: Heiko Schocher Acked-by: Heiko Schocher --- drivers/i2c/mxc_i2c.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/drivers/i2c/mxc_i2c.c b/drivers/i2c/mxc_i2c.c index a805bf62dd..2869d7cec3 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); } /* @@ -152,6 +150,23 @@ void i2c_init(int speed, int unused) i2c_reset(); } +/* + * 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) * @@ -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); -- 2.39.5