Add support for I2C in i.MX27 chip.

Tested on imx27_visstrim_m10 board.

Signed-off-by: Javier Martin <javier.mar...@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.ha...@pengutronix.de>
+ * (c) 2009 Vista Silicon, Javier Martin
+ *                             <javier.mar...@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
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to