fsl_i2c: Added a callpoint for i2c_board_late_init
authorRichard Retanubun <RichardRetanubun@RuggedCom.com>
Mon, 12 Apr 2010 19:08:17 +0000 (15:08 -0400)
committerHeiko Schocher <hs@denx.de>
Mon, 19 Apr 2010 05:46:35 +0000 (07:46 +0200)
This patch adds a callpoint in i2c_init that allows board specific
i2c board initialization (typically for i2c bus reset) that is called
after i2c_init operations, allowing the i2c_board_late_init function
to use the pre-configured i2c bus speed and slave address.

README
drivers/i2c/fsl_i2c.c
include/i2c.h

diff --git a/README b/README
index 99320abadd8e94f131077d7efd2b34e55a4e67b6..cf6b8982490412e15aa399eee37b90aa4e48347a 100644 (file)
--- a/README
+++ b/README
@@ -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
index 2241990f94f5c87a76af7e9933342f28a3506a52..cb13deeea968c91ae73db887b33793c0d3fef86a 100644 (file)
@@ -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
index d828964256eb9d14374168c2cf384d4ab10f8df4..cd23c8ac124cd38075d0330ad4a6a212a4bbcd49 100644 (file)
@@ -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)