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]>
---
 arch/arm/mach-davinci/board-evm.c        |   17 ++++++++++++++++-
 arch/arm/mach-davinci/devices.c          |   13 +++++++++----
 arch/arm/mach-davinci/include/mach/i2c.h |    7 +++++--
 3 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/arch/arm/mach-davinci/board-evm.c 
b/arch/arm/mach-davinci/board-evm.c
index 1b2a68e..670c642 100644
--- a/arch/arm/mach-davinci/board-evm.c
+++ b/arch/arm/mach-davinci/board-evm.c
@@ -36,6 +36,7 @@
 #include <mach/common.h>
 #include <mach/board.h>
 #include <mach/emac.h>
+#include <mach/i2c.h>
 
 /* other misc. init functions */
 void __init davinci_psc_init(void);
@@ -415,6 +416,20 @@ static struct i2c_board_info __initdata i2c_info[] =  {
         */
 };
 
+/* 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_MTD_PHYSMAP) || \
     defined(CONFIG_MTD_PHYSMAP_MODULE)
@@ -462,7 +477,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();
diff --git a/arch/arm/mach-davinci/devices.c b/arch/arm/mach-davinci/devices.c
index 68d8d24..58b3009 100644
--- a/arch/arm/mach-davinci/devices.c
+++ b/arch/arm/mach-davinci/devices.c
@@ -23,8 +23,10 @@
 
 #include <mach/hardware.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[] = {
        {
@@ -45,14 +47,18 @@ static struct platform_device davinci_i2c_device = {
        .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
 
@@ -157,7 +163,6 @@ static int __init davinci_init_devices(void)
        /* 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;
diff --git a/arch/arm/mach-davinci/include/mach/i2c.h 
b/arch/arm/mach-davinci/include/mach/i2c.h
index e2f5416..c248e9b 100644
--- 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 */
-- 
1.5.6.4


_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to