diff options
| -rw-r--r-- | README | 11 | ||||
| -rw-r--r-- | drivers/i2c/fsl_i2c.c | 16 | ||||
| -rw-r--r-- | include/i2c.h | 3 | 
3 files changed, 27 insertions, 3 deletions
| @@ -1509,6 +1509,17 @@ The following options need to be configured:  		custom i2c_init_board() routine in boards/xxx/board.c  		is run early in the boot sequence. +		CONFIG_SYS_I2C_BOARD_LATE_INIT + +		An alternative to CONFIG_SYS_I2C_INIT_BOARD. If this option is +		defined a custom i2c_board_late_init() routine in +		boards/xxx/board.c is run AFTER the operations in i2c_init() +		is completed. This callpoint can be used to unreset i2c bus +		using CPU i2c controller register accesses for CPUs whose i2c +		controller provide such a method. It is called at the end of +		i2c_init() to allow i2c_init operations to setup the i2c bus +		controller on the CPU (e.g. setting bus speed & slave address). +  		CONFIG_I2CFAST (PPC405GP|PPC405EP only)  		This option enables configuration of bi_iic_fast[] flags diff --git a/drivers/i2c/fsl_i2c.c b/drivers/i2c/fsl_i2c.c index 2241990f9..cb13deeea 100644 --- a/drivers/i2c/fsl_i2c.c +++ b/drivers/i2c/fsl_i2c.c @@ -221,9 +221,10 @@ i2c_init(int speed, int slaveadd)  	unsigned int temp;  #ifdef CONFIG_SYS_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.                  */ +	/* 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();  #endif  	dev = (struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_I2C_OFFSET); @@ -249,6 +250,15 @@ i2c_init(int speed, int slaveadd)  	writeb(0x0, &dev->sr);			/* clear status register */  	writeb(I2C_CR_MEN, &dev->cr);		/* start I2C controller */  #endif + +#ifdef CONFIG_SYS_I2C_BOARD_LATE_INIT +	/* Call board specific i2c bus reset routine AFTER the bus has been +	 * initialized. Use either this callpoint or i2c_init_board; +	 * which is called before i2c_init operations. +	 * For details about this problem see doc/I2C_Edge_Conditions. +	*/ +	i2c_board_late_init(); +#endif  }  static int diff --git a/include/i2c.h b/include/i2c.h index d82896425..cd23c8ac1 100644 --- a/include/i2c.h +++ b/include/i2c.h @@ -111,6 +111,9 @@ void i2c_init(int speed, int slaveaddr);  #ifdef CONFIG_SYS_I2C_INIT_BOARD  void i2c_init_board(void);  #endif +#ifdef CONFIG_SYS_I2C_BOARD_LATE_INIT +void i2c_board_late_init(void); +#endif  #if defined(CONFIG_I2C_MUX) |