Skip to contentSkip to conversation

6/9: i2c_init_board

PATCH New Robert Schwebel 2 participants 2 messages Mar 6, 2003

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 6/9: i2c_init_board

I2C_INIT_BOARD
==============

- introduced a new i2c_init_board() function, to be implemented by the board maintainers for boards that support it.

Robert

Signature · 101 lines
 Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de
 Pengutronix - Linux Solutions for Science and Industry
   Braunschweiger Str. 79,  31134 Hildesheim, Germany
   Handelsregister:  Amtsgericht Hildesheim, HRA 2686
    Phone: +49-5121-28619-0 |  Fax: +49-5121-28619-4
-------------- next part --------------
diff -urN -x CVS -x ptx-patches -x logfile -x logfile1 u-boot/README u-boot-ptx/README
--- u-boot/README	2003-03-06 08:41:17.000000000 +0100
+++ u-boot-ptx/README	2003-03-06 09:21:57.000000000 +0100
@@ -897,6 +897,16 @@
 		controls the rate of data transfer.  The data rate thus
 		is 1 / (I2C_DELAY * 4).
 
+		CFG_I2C_INIT_BOARD
+
+		When a board is resetted during an i2c bus transfer chips
+		might think that the current transfer is still in progress. 
+		On some boards it is possible to access the i2c SCLK line
+		directly, either by using the processor pin as a GPIO or 
+		by having a second pin connected to the bus. If this option
+		is defined a custom i2c_coldstart() routine in 
+		boards/xxx/board.c is run early in the boot sequence. 
+
 - SPI Support:	CONFIG_SPI
 
 
diff -urN -x CVS -x ptx-patches -x logfile -x logfile1 u-boot/cpu/mpc8260/i2c.c u-boot-ptx/cpu/mpc8260/i2c.c
--- u-boot/cpu/mpc8260/i2c.c	2002-11-03 01:31:58.000000000 +0100
+++ u-boot-ptx/cpu/mpc8260/i2c.c	2003-03-06 10:41:59.000000000 +0100
@@ -221,6 +221,13 @@
 	volatile I2C_BD *rxbd, *txbd;
 	uint dpaddr;
 
+#ifdef 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();
+#endif
+
 	dpaddr = *((unsigned short*)(&immap->im_dprambase[PROFF_I2C_BASE]));
 	if (dpaddr == 0) {
 	    /* need to allocate dual port ram */
diff -urN -x CVS -x ptx-patches -x logfile -x logfile1 u-boot/cpu/mpc8xx/i2c.c u-boot-ptx/cpu/mpc8xx/i2c.c
--- u-boot/cpu/mpc8xx/i2c.c	2002-10-02 22:40:41.000000000 +0200
+++ u-boot-ptx/cpu/mpc8xx/i2c.c	2003-03-06 10:42:46.000000000 +0100
@@ -215,6 +215,13 @@
 	volatile I2C_BD *rxbd, *txbd;
 	uint dpaddr;
 
+#ifdef 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();
+#endif
+
 #ifdef CFG_I2C_UCODE_PATCH
 	iip = (iic_t *)&cp->cp_dpmem[iip->iic_rpbase];
 #else
diff -urN -x CVS -x ptx-patches -x logfile -x logfile1 u-boot/cpu/ppc4xx/i2c.c u-boot-ptx/cpu/ppc4xx/i2c.c
--- u-boot/cpu/ppc4xx/i2c.c	2002-11-03 01:32:03.000000000 +0100
+++ u-boot-ptx/cpu/ppc4xx/i2c.c	2003-03-06 10:43:54.000000000 +0100
@@ -85,7 +85,15 @@
 	unsigned long freqOPB;
 	int val, divisor;
 
+#ifdef 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();
+#endif
+
 	/* Handle possible failed I2C state */
+	/* FIXME: put this into i2c_init_board()? */
 	_i2c_bus_reset ();
 
 	/* clear lo master address */
diff -urN -x CVS -x ptx-patches -x logfile -x logfile1 u-boot/cpu/xscale/i2c.c u-boot-ptx/cpu/xscale/i2c.c
--- u-boot/cpu/xscale/i2c.c	2003-03-06 01:02:09.000000000 +0100
+++ u-boot-ptx/cpu/xscale/i2c.c	2003-03-06 10:44:30.000000000 +0100
@@ -41,6 +41,7 @@
  *	- I2C_PXA_SLAVE_ADDR 
  */
 
+#include <asm/arch/hardware.h>
 #include <asm/arch/pxa-regs.h>
 #include <i2c.h>
 
@@ -244,6 +245,12 @@
 
 void i2c_init(int speed, int slaveaddr)
 {
+#ifdef 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();
+#endif
 }
#1 lore raw

PATCH 1/1 6/9: i2c_init_board

Quoted 3 lines · In message <[email protected]> you wrote:

- introduced a new i2c_init_board() function, to be implemented by the board maintainers for boards that support it.

...

Review

Quoted 3 lines
(quoted diff) +3 -0
+		CFG_I2C_INIT_BOARD
+
+		When a board is resetted during an i2c bus transfer chips

<fascist mode>
See your 7th grade English book if you don't know that it's reset|reset|reset.
</fascist mode>

Dear Robert, as you can see, nobody is perfect. Not even you. So please save your malicious comments.

Review

Quoted 4 lines
(quoted diff) +4 -0
+		directly, either by using the processor pin as a GPIO or 
+		by having a second pin connected to the bus. If this option
+		is defined a custom i2c_coldstart() routine in 
+		boards/xxx/board.c is run early in the boot sequence. 

Also, the comment seems to be wrong.

cpu/mpc8260/i2c.c

Quoted 2 lines
cpu/mpc8260/i2c.c +0 -0

...

Did you just miss it, or is there any special reason not to add this to cpu/mpc824x/drivers/i2c/i2c1.c , too?

Added.

Wolfgang Denk

Signature · 3 lines
Software Engineering:  Embedded and Realtime Systems,  Embedded Linux
Phone: (+49)-8142-4596-87  Fax: (+49)-8142-4596-88  Email: wd at denx.de
The high cost of living hasn't affected its popularity.