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