[U-Boot] [PATCH] I2C: Add i2c_get/set_bus_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 --- drivers/i2c/mxc_i2c.c | 32 ++++++++++++++++++++++++-------- 1 files changed, 24 insertions(+), 8 deletions(-)
diff --git a/drivers/i2c/mxc_i2c.c b/drivers/i2c/mxc_i2c.c index a805bf6..e12a08a 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,24 @@ 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 +234,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);

Signed-off-by: Marek Vasut marek.vasut@gmail.com Cc: Stefano Babic sbabic@denx.de Cc: Heiko Schocher hs@denx.de --- drivers/i2c/mxc_i2c.c | 31 +++++++++++++++++++++++-------- 1 files changed, 23 insertions(+), 8 deletions(-)
V2: Drop redundant newline
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);

Hello Stefano,
Marek Vasut wrote:
Signed-off-by: Marek Vasut marek.vasut@gmail.com Cc: Stefano Babic sbabic@denx.de Cc: Heiko Schocher hs@denx.de
drivers/i2c/mxc_i2c.c | 31 +++++++++++++++++++++++-------- 1 files changed, 23 insertions(+), 8 deletions(-)
V2: Drop redundant newline
Could you Ack this patch, or do you want to apply it, so you can add my:
Acked-by: Heiko Schocher hs@denx.de
bye, Heiko

On 09/30/2011 11:56 AM, Heiko Schocher wrote:
Hello Stefano,
Marek Vasut wrote:
Signed-off-by: Marek Vasut marek.vasut@gmail.com Cc: Stefano Babic sbabic@denx.de Cc: Heiko Schocher hs@denx.de
drivers/i2c/mxc_i2c.c | 31 +++++++++++++++++++++++-------- 1 files changed, 23 insertions(+), 8 deletions(-)
V2: Drop redundant newline
Could you Ack this patch, or do you want to apply it, so you can add my:
Acked-by: Heiko Schocher hs@denx.de
Thanks, Heiko - I will apply directly to u-boot-imx.
bye, Stefano

On 09/27/2011 06:29 PM, Marek Vasut wrote:
Signed-off-by: Marek Vasut marek.vasut@gmail.com Cc: Stefano Babic sbabic@denx.de Cc: Heiko Schocher hs@denx.de
Applied to u-boot-imx, thanks.
Best regards, Stefano Babic
participants (3)
-
Heiko Schocher
-
Marek Vasut
-
Stefano Babic