[U-Boot] [u-boot][PATCH][2/2] i2c_mxc: Add I2C support for i.MX27 chip processor.

Javier Martin javier.martin at vista-silicon.com
Fri Oct 30 15:46:45 CET 2009


Add support for I2C in i.MX27 chip.

Tested on imx27_visstrim_m10 board.

Signed-off-by: Javier Martin <javier.martin at vista-silicon.com>
--
diff --git a/drivers/i2c/mxc_i2c.c b/drivers/i2c/mxc_i2c.c
index 8e10fbb..63a8085 100644
--- a/drivers/i2c/mxc_i2c.c
+++ b/drivers/i2c/mxc_i2c.c
@@ -2,6 +2,8 @@
  * i2c driver for Freescale mx31
  *
  * (c) 2007 Pengutronix, Sascha Hauer <s.hauer at pengutronix.de>
+ * (c) 2009 Vista Silicon, Javier Martin
+ *				<javier.martin at vista-silicon.com>
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -21,13 +23,19 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  * MA 02111-1307 USA
  */
-
 #include <common.h>

 #if defined(CONFIG_HARD_I2C)

+#ifdef CONFIG_MX31
 #include <asm/arch/mx31.h>
 #include <asm/arch/mx31-regs.h>
+#elif defined (CONFIG_MX27)
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/asm-offsets.h>
+#else
+#error "architecture not supported by mxc_i2c driver"
+#endif

 #define IADR	0x00
 #define IFDR	0x04
@@ -47,6 +55,7 @@
 #define I2SR_IIF	(1 << 1)
 #define I2SR_RX_NO_AK	(1 << 0)

+#ifdef CONFIG_MX31
 #ifdef CONFIG_SYS_I2C_MX31_PORT1
 #define I2C_BASE	0x43f80000
 #define I2C_CLK_OFFSET	26
@@ -59,6 +68,18 @@
 #else
 #error "define CONFIG_SYS_I2C_MX31_PORTx to use the mx31 I2C driver"
 #endif
+#endif	/* CONFIG_MX31 */
+
+#ifdef CONFIG_MX27
+#ifdef CONFIG_SYS_I2C_MX27_PORT1
+#define I2C_BASE	IMX_I2C1_BASE
+#elif defined (CONFIG_SYS_I2C_MX27_PORT2)
+#define I2C_BASE	IMX_I2C2_BASE
+#else
+#error "define CONFIG_SYS_I2C_MX27_PORTx to use the mx27 I2C driver"
+#endif
+#endif  /* CONFIG_MX27 */
+

 #ifdef DEBUG
 #define DPRINTF(args...)  printf(args)
@@ -70,17 +91,37 @@ static u16 div[] = { 30, 32, 36, 42, 48, 52, 60, 72, 80, 88, 104, 128, 144,
 	             160, 192, 240, 288, 320, 384, 480, 576, 640, 768, 960,
 	             1152, 1280, 1536, 1920, 2304, 2560, 3072, 3840};

+static void i2c_clken(void)
+{
+#ifdef CONFIG_MX31
+	__REG(CCM_CGR0) = __REG(CCM_CGR0) | (3 << I2C_CLK_OFFSET);
+#elif	defined(CONFIG_MX27)
+#ifdef CONFIG_SYS_I2C_MX27_PORT1
+	__REG(PCCR0) = __REG(PCCR0) | PCCR0_I2C1_EN;
+#else
+	__REG(PCCR0) = __REG(PCCR0) | PCCR0_I2C2_EN;
+#endif
+#endif /* CONFIG_MX31 */
+}
+
 void i2c_init(int speed, int unused)
 {
-	int freq = mx31_get_ipg_clk();
+	int freq;
 	int i;

+#ifdef CONFIG_MX31
+	freq = mx31_get_ipg_clk();
+#elif defined(CONFIG_MX27)
+	freq = imx_get_ipgclk();
+#endif
 	/* start the required I2C clock */
-	__REG(CCM_CGR0) = __REG(CCM_CGR0) | (3 << I2C_CLK_OFFSET);
+	i2c_clken();

+	DPRINTF("ipg_freq is %d\n", freq);
 	for (i = 0; i < 0x1f; i++)
 		if (freq / div[i] <= speed)
 			break;
+	DPRINTF("i2c_clk divisor is %d\n", div[i]);

 	DPRINTF("%s: speed: %d\n",__FUNCTION__, speed);

@@ -121,7 +162,6 @@ static int rx_byte(void)
 int i2c_probe(uchar chip)
 {
 	int ret;
-
 	__REG16(I2C_BASE + I2CR) = 0; /* Reset module */
 	__REG16(I2C_BASE + I2CR) = I2CR_IEN;
--
Javier Martin
Vista Silicon S.L.
CDTUC - FASE C - Oficina S-345
Avda de los Castros s/n
39005- Santander. Cantabria. Spain
+34 942 25 32 60
www.vista-silicon.com


More information about the U-Boot mailing list