summaryrefslogtreecommitdiff
path: root/drivers/i2c/soft_i2c.c
diff options
context:
space:
mode:
authorHeiko Schocher <hs@denx.de>2008-10-15 09:38:38 +0200
committerWolfgang Denk <wd@denx.de>2008-10-18 21:54:02 +0200
commit4ca107effebfbabac1057c39632105dacef95957 (patch)
tree0eafe32f9850092895c6c556e4c7b3ff10c87bc6 /drivers/i2c/soft_i2c.c
parente5e4edd9f1f76210a09c34ee835f6cff60fdbbd1 (diff)
downloadu-boot-imx-4ca107effebfbabac1057c39632105dacef95957.zip
u-boot-imx-4ca107effebfbabac1057c39632105dacef95957.tar.gz
u-boot-imx-4ca107effebfbabac1057c39632105dacef95957.tar.bz2
soft_i2c: Add CFG_I2C_INIT_BOARD option
This patch adds the option for a boardspecific I2C deblocking mechanism for the soft i2c driver. Signed-off-by: Heiko Schocher <hs@denx.de>
Diffstat (limited to 'drivers/i2c/soft_i2c.c')
-rw-r--r--drivers/i2c/soft_i2c.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/i2c/soft_i2c.c b/drivers/i2c/soft_i2c.c
index 19c364b..63e6a7b 100644
--- a/drivers/i2c/soft_i2c.c
+++ b/drivers/i2c/soft_i2c.c
@@ -75,13 +75,16 @@ static unsigned int i2c_bus_num __attribute__ ((section ("data"))) = 0;
/*-----------------------------------------------------------------------
* Local functions
*/
+#if !defined(CFG_I2C_INIT_BOARD)
static void send_reset (void);
+#endif
static void send_start (void);
static void send_stop (void);
static void send_ack (int);
static int write_byte (uchar byte);
static uchar read_byte (int);
+#if !defined(CFG_I2C_INIT_BOARD)
/*-----------------------------------------------------------------------
* Send a reset sequence consisting of 9 clocks with the data signal high
* to clock any confused device back into an idle state. Also send a
@@ -109,6 +112,7 @@ static void send_reset(void)
send_stop();
I2C_TRISTATE;
}
+#endif
/*-----------------------------------------------------------------------
* START: High -> Low on SDA while SCL is High
@@ -280,6 +284,12 @@ static uchar read_byte(int ack)
*/
void i2c_init (int speed, int slaveaddr)
{
+#if defined(CFG_I2C_INIT_BOARD)
+ /* call board specific i2c bus reset routine before accessing the */
+ /* environment, which might be in a chip on that bus. For details */
+ /* about this problem see doc/I2C_Edge_Conditions. */
+ i2c_init_board();
+#else
/*
* WARNING: Do NOT save speed in a static variable: if the
* I2C routines are called before RAM is initialized (to read
@@ -287,6 +297,7 @@ void i2c_init (int speed, int slaveaddr)
* system will crash.
*/
send_reset ();
+#endif
}
/*-----------------------------------------------------------------------