[U-Boot] [PATCH v2] i2c: mvtwsi: Fix problem with baud rate calculation
Hans de Goede
hdegoede at redhat.com
Wed Mar 18 09:41:32 CET 2015
Hi,
On 18-03-15 09:30, Stefan Roese wrote:
> The current implementation for baudrate calculation is incorrect.
> This part from the formula:
>
> "2 ^ (n + 1)" is not equivalent to (1 << n) but to (2 << n)!
>
> This patch fixes this and moves this calculation to a function instead of using a macro.
> This new function is taken from the Linux kernel.
>
> This was detected and tested on the Marvell Armada A38x DB-88F6820-GP eval board.
>
> Signed-off-by: Stefan Roese <sr at denx.de>
> Cc: Prafulla Wadaskar <prafulla at marvell.com>
> Cc: Luka Perkov <luka.perkov at sartura.hr>
> Cc: Hans de Goede <hdegoede at redhat.com>
> Cc: Ian Campbell <ijc at hellion.org.uk>
> Cc: Heiko Schocher <hs at denx.de>
> ---
> v2:
> - Still use the old formula for SUNXI, as this was checked
> by Hans with Allwinner to be the correct formula. This means
> that the Linux baudrate is incorrect for SUNXI I2C though.
>
Thanks for the v2. This looks good to me:
Acked-by: Hans de Goede <hdegoede at redhat.com>
Regards,
Hans
> drivers/i2c/mvtwsi.c | 17 +++++++++--------
> 1 file changed, 9 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/i2c/mvtwsi.c b/drivers/i2c/mvtwsi.c
> index 9b2ca1e..6f6edd5 100644
> --- a/drivers/i2c/mvtwsi.c
> +++ b/drivers/i2c/mvtwsi.c
> @@ -228,13 +228,14 @@ static int twsi_stop(int status)
> return status;
> }
>
> -/*
> - * Ugly formula to convert m and n values to a frequency comes from
> - * TWSI specifications
> - */
> -
> -#define TWSI_FREQUENCY(m, n) \
> - (CONFIG_SYS_TCLK / (10 * (m + 1) * (1 << n)))
> +static unsigned int twsi_calc_freq(const int n, const int m)
> +{
> +#ifdef CONFIG_SUNXI
> + return CONFIG_SYS_TCLK / (10 * (m + 1) * (1 << n));
> +#else
> + return CONFIG_SYS_TCLK / (10 * (m + 1) * (2 << n));
> +#endif
> +}
>
> /*
> * Reset controller.
> @@ -266,7 +267,7 @@ static unsigned int twsi_i2c_set_bus_speed(struct i2c_adapter *adap,
> /* compute m, n setting for highest speed not above requested speed */
> for (n = 0; n < 8; n++) {
> for (m = 0; m < 16; m++) {
> - tmp_speed = TWSI_FREQUENCY(m, n);
> + tmp_speed = twsi_calc_freq(n, m);
> if ((tmp_speed <= requested_speed)
> && (tmp_speed > highest_speed)) {
> highest_speed = tmp_speed;
>
More information about the U-Boot
mailing list