diff options
| author | Heiko Schocher <hs@denx.de> | 2008-10-15 09:38:38 +0200 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2008-10-18 21:54:02 +0200 | 
| commit | 4ca107effebfbabac1057c39632105dacef95957 (patch) | |
| tree | 0eafe32f9850092895c6c556e4c7b3ff10c87bc6 /drivers/i2c/soft_i2c.c | |
| parent | e5e4edd9f1f76210a09c34ee835f6cff60fdbbd1 (diff) | |
| download | olio-uboot-2014.01-4ca107effebfbabac1057c39632105dacef95957.tar.xz olio-uboot-2014.01-4ca107effebfbabac1057c39632105dacef95957.zip | |
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.c | 11 | 
1 files changed, 11 insertions, 0 deletions
| diff --git a/drivers/i2c/soft_i2c.c b/drivers/i2c/soft_i2c.c index 19c364b13..63e6a7b0d 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  }  /*----------------------------------------------------------------------- |