[U-Boot] [RFC] [PATCH] DaVinci/i2c: allow multiple buses
Tom Rini
tom.rini at gmail.com
Thu Jan 5 20:46:41 CET 2012
On Wed, Dec 21, 2011 at 10:36 PM, Jérôme Carretero <cJ-uboot at zougloub.eu> wrote:
> Hi Tom,
>
> I'm requesting comments on the following (untested) patch.
> It adds support for multiple i2c buses on davinci_i2c, without altering one line of code.
> What I don't like is that I'm doing a bit of macro black magic to transform constants into variables.
> But I don't know whether refactoring the code would be accepted, so this is a first shot.
So, this follows the example of other i2c drivers, but as Wolfgang
likes to point out, following another bad example isn't a valid reason
to do something. So, is this the right way or a bad example to
follow, Wolfgang or Heiko? Thanks!
>
> Regards,
>
> --
> cJ
>
>
> commit 53d99d331dc7fc4bf3384a59bbca564bf1b85f6b
> Author: Jerome Carretero <cJ-uboot at zougloub.eu>
> Date: Thu Dec 22 00:26:13 2011 -0500
>
> DaVinci/i2c: Support for multiple buses
>
> diff --git a/arch/arm/include/asm/arch-davinci/i2c_defs.h b/arch/arm/include/asm/arch-davinci/i2c_defs.h
> index 24cd268..1d24fbf 100644
> --- a/arch/arm/include/asm/arch-davinci/i2c_defs.h
> +++ b/arch/arm/include/asm/arch-davinci/i2c_defs.h
> @@ -25,13 +25,18 @@
> #ifndef _DAVINCI_I2C_H_
> #define _DAVINCI_I2C_H_
>
> +#include <asm/arch/hardware.h>
> +
> #define I2C_WRITE 0
> #define I2C_READ 1
>
> #ifndef CONFIG_SOC_DA8XX
> -#define I2C_BASE 0x01c21000
> +# define I2C_BASE DAVINCI_I2C_BASE
> +# define I2C_DEFAULT_BASE I2C_BASE
> #else
> -#define I2C_BASE 0x01c22000
> +# define I2C_BASE0 DAVINCI_I2C0_BASE
> +# define I2C_BASE1 DAVINCI_I2C1_BASE
> +# define I2C_DEFAULT_BASE I2C_BASE0
> #endif
>
> #define I2C_OA (I2C_BASE + 0x00)
> diff --git a/drivers/i2c/davinci_i2c.c b/drivers/i2c/davinci_i2c.c
> index 2abddfb..be7fb7a 100644
> --- a/drivers/i2c/davinci_i2c.c
> +++ b/drivers/i2c/davinci_i2c.c
> @@ -29,6 +29,44 @@
> #include <asm/arch/hardware.h>
> #include <asm/arch/i2c_defs.h>
>
> +#if defined(CONFIG_I2C_MULTI_BUS)
> +
> +static unsigned int bus_initialized[I2C_BUS_MAX];
> +static unsigned int current_bus;
> +static unsigned long i2c_base = I2C_DEFAULT_BASE;
> +
> +#ifndef I2C_BASE
> +# define I2C_BASE i2c_base
> +#else
> +# error CONFIG_I2C_MULTI_BUS *and* I2C_BASE defined !
> +#endif
> +
> +int i2c_set_bus_num(unsigned int bus)
> +{
> + if ((bus < 0) || (bus >= I2C_BUS_MAX)) { // TODO where to put I2C_BUS_MAX ?
> + printf("Bad bus: %d\n", bus);
> + return -1;
> + }
> +
> + if (bus == 1)
> + i2c_base = I2C_BASE1;
> + else
> + i2c_base = I2C_BASE0;
> +
> + current_bus = bus;
> +
> + if (!bus_initialized[current_bus])
> + i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
> + return 0;
> +}
> +
> +unsigned int i2c_get_bus_num(void)
> +{
> + return current_bus;
> +}
> +
> +#endif
> +
> #define CHECK_NACK() \
> do {\
> if (tmp & (I2C_TIMEOUT | I2C_STAT_NACK)) {\
>
--
Tom
More information about the U-Boot
mailing list