David Brownell <[EMAIL PROTECTED]> writes:
> From: David Brownell <[EMAIL PROTECTED]>
>
> Generalize DaVinci I2C controller initialization to cope with the
> constraints imposed by the software I2C implementation the EVM's
> MSP430 firmare uses. Prevents EVM's I2C bus from wedging after
> a short period of hard work, blinking the heartbeat LED.
>
> Signed-off-by: David Brownell <[EMAIL PROTECTED]>
Thanks, pushing today.
Kevin
> arch/arm/mach-davinci/board-evm.c | 18 +++++++++++++++++-
> arch/arm/mach-davinci/devices.c | 13 +++++++++----
> arch/arm/mach-davinci/include/mach/i2c.h | 7 +++++--
> 3 files changed, 31 insertions(+), 7 deletions(-)
>
> --- a/arch/arm/mach-davinci/board-evm.c
> +++ b/arch/arm/mach-davinci/board-evm.c
> @@ -35,6 +35,8 @@
>
> #include <mach/common.h>
> #include <mach/board.h>
> +#include <mach/i2c.h>
> +
>
> /* other misc. init functions */
> void __init davinci_psc_init(void);
> @@ -452,6 +454,20 @@ static struct i2c_board_info __initdata
> */
> };
>
> +/* The msp430 uses a slow bitbanged I2C implementation (ergo 20 KHz),
> + * which requires 100 usec of idle bus after i2c writes sent to it.
> + */
> +static struct davinci_i2c_platform_data i2c_pdata = {
> + .bus_freq = 20 /* kHz */,
> + .bus_delay = 100 /* usec */,
> +};
> +
> +static void __init evm_init_i2c(void)
> +{
> + davinci_init_i2c(&i2c_pdata);
> + i2c_register_board_info(1, i2c_info, ARRAY_SIZE(i2c_info));
> +}
> +
> static struct platform_device *davinci_evm_devices[] __initdata = {
> #if defined(CONFIG_CONFIG_MTD_PHYSMAP) || \
> defined(CONFIG_CONFIG_MTD_PHYSMAP_MODULE)
> @@ -502,7 +518,7 @@ static __init void davinci_evm_init(void
>
> platform_add_devices(davinci_evm_devices,
> ARRAY_SIZE(davinci_evm_devices));
> - i2c_register_board_info(1, i2c_info, ARRAY_SIZE(i2c_info));
> + evm_init_i2c();
> davinci_board_config = davinci_evm_config;
> davinci_board_config_size = ARRAY_SIZE(davinci_evm_config);
> davinci_serial_init();
> --- a/arch/arm/mach-davinci/devices.c
> +++ b/arch/arm/mach-davinci/devices.c
> @@ -22,8 +22,10 @@
> #include <mach/hardware.h>
> #include <mach/eeprom.h>
> #include <mach/emac.h>
> +#include <mach/i2c.h>
>
> -#if defined(CONFIG_I2C_DAVINCI) || defined(CONFIG_I2C_DAVINCI_MODULE)
> +
> +#if defined(CONFIG_I2C_DAVINCI) || defined(CONFIG_I2C_DAVINCI_MODULE)
>
> static struct resource i2c_resources[] = {
> {
> @@ -44,14 +46,18 @@ static struct platform_device davinci_i2
> .resource = i2c_resources,
> };
>
> -static void davinci_init_i2c(void)
> +void __init davinci_init_i2c(struct davinci_i2c_platform_data *pdata)
> {
> + davinci_i2c_device.dev.platform_data = pdata;
> (void) platform_device_register(&davinci_i2c_device);
> }
>
> #else
>
> -static void davinci_init_i2c(void) {}
> +void __init davinci_init_i2c(struct davinci_i2c_platform_data *pdata)
> +{
> + /* nothing */
> +}
>
> #endif
>
> @@ -154,7 +160,6 @@ static int __init davinci_init_devices(v
> /* please keep these calls, and their implementations above,
> * in alphabetical order so they're easier to sort through.
> */
> - davinci_init_i2c();
> davinci_init_mmcsd();
>
> return 0;
> --- a/arch/arm/mach-davinci/include/mach/i2c.h
> +++ b/arch/arm/mach-davinci/include/mach/i2c.h
> @@ -14,8 +14,11 @@
>
> /* All frequencies are expressed in kHz */
> struct davinci_i2c_platform_data {
> - unsigned int bus_freq; /* standard bus frequency */
> - unsigned int bus_delay; /* transaction delay */
> + unsigned int bus_freq; /* standard bus frequency (kHz) */
> + unsigned int bus_delay; /* post-transaction delay (usec) */
> };
>
> +/* for board setup code */
> +void davinci_init_i2c(struct davinci_i2c_platform_data *);
> +
> #endif /* __ASM_ARCH_I2C_H */
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source