[U-Boot] [PATCH v3 3/3] ARM: AM33XX: Add i2c support

Patil, Rachna rachna at ti.com
Mon Jan 23 10:47:01 CET 2012


Add i2c driver board hookup for AM335X EVM

Signed-off-by: Chandan Nath <chandan.nath at ti.com>
Signed-off-by: Patil, Rachna <rachna at ti.com>
---
Changes for v3:
rebased, patches applied on top of master branch

 arch/arm/cpu/armv7/am33xx/clock.c             |    5 ++
 arch/arm/include/asm/arch-am33xx/common_def.h |    1 +
 arch/arm/include/asm/arch-am33xx/cpu.h        |    3 +-
 arch/arm/include/asm/arch-am33xx/i2c.h        |   81 +++++++++++++++++++++++++
 board/ti/am335x/evm.c                         |    7 ++
 board/ti/am335x/mux.c                         |   13 ++++
 include/configs/am335x_evm.h                  |    9 +++
 7 files changed, 118 insertions(+), 1 deletions(-)
 create mode 100644 arch/arm/include/asm/arch-am33xx/i2c.h

diff --git a/arch/arm/cpu/armv7/am33xx/clock.c b/arch/arm/cpu/armv7/am33xx/clock.c
index 98cfd93..bbb9c13 100644
--- a/arch/arm/cpu/armv7/am33xx/clock.c
+++ b/arch/arm/cpu/armv7/am33xx/clock.c
@@ -113,6 +113,11 @@ static void enable_per_clocks(void)
 	writel(PRCM_MOD_EN, &cmper->mmc0clkctrl);
 	while (readl(&cmper->mmc0clkctrl) != PRCM_MOD_EN)
 		;
+
+	/* i2c0 */
+	writel(PRCM_MOD_EN, &cmwkup->wkup_i2c0ctrl);
+	while (readl(&cmwkup->wkup_i2c0ctrl) != PRCM_MOD_EN)
+		;
 }
 
 static void mpu_pll_config(void)
diff --git a/arch/arm/include/asm/arch-am33xx/common_def.h b/arch/arm/include/asm/arch-am33xx/common_def.h
index 767932d..aa3b554 100644
--- a/arch/arm/include/asm/arch-am33xx/common_def.h
+++ b/arch/arm/include/asm/arch-am33xx/common_def.h
@@ -18,5 +18,6 @@
 
 extern void enable_uart0_pin_mux(void);
 extern void enable_mmc0_pin_mux(void);
+extern void enable_i2c0_pin_mux(void);
 
 #endif/*__COMMON_DEF_H__ */
diff --git a/arch/arm/include/asm/arch-am33xx/cpu.h b/arch/arm/include/asm/arch-am33xx/cpu.h
index 25558a2..cd002e6 100644
--- a/arch/arm/include/asm/arch-am33xx/cpu.h
+++ b/arch/arm/include/asm/arch-am33xx/cpu.h
@@ -95,7 +95,8 @@ struct cm_wkuppll {
 	unsigned int divm2dpllper;	/* offset 0xAC */
 	unsigned int resv11[1];
 	unsigned int wkup_uart0ctrl;	/* offset 0xB4 */
-	unsigned int resv12[8];
+	unsigned int wkup_i2c0ctrl;	/* offset 0xB8 */
+	unsigned int resv12[7];
 	unsigned int divm6dpllcore;	/* offset 0xD8 */
 };
 
diff --git a/arch/arm/include/asm/arch-am33xx/i2c.h b/arch/arm/include/asm/arch-am33xx/i2c.h
new file mode 100644
index 0000000..366e2bb
--- /dev/null
+++ b/arch/arm/include/asm/arch-am33xx/i2c.h
@@ -0,0 +1,81 @@
+/*
+ * (C) Copyright 2012
+ * Texas Instruments, <www.ti.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+#ifndef _I2C_H_
+#define _I2C_H_
+
+#define  I2C_BASE1		0x44E0B000
+#define  I2C_BASE2		0x4802A000
+#define  I2C_BASE3		0x4819C000
+#define	 I2C_BUS_MAX		3
+
+#define I2C_DEFAULT_BASE		I2C_BASE1
+
+struct i2c {
+	unsigned short revnb_lo;        /* 0x00 */
+	unsigned short res1;
+	unsigned short revnb_hi;        /* 0x04 */
+	unsigned short res2[13];
+	unsigned short sysc;            /* 0x20 */
+	unsigned short res3;
+	unsigned short irqstatus_raw;   /* 0x24 */
+	unsigned short res4;
+	unsigned short stat;            /* 0x28 */
+	unsigned short res5;
+	unsigned short ie;              /* 0x2C */
+	unsigned short res6;
+	unsigned short irqenable_clr;   /* 0x30 */
+	unsigned short res7;
+	unsigned short iv;              /* 0x34 */
+	unsigned short res8[45];
+	unsigned short syss;            /* 0x90 */
+	unsigned short res9;
+	unsigned short buf;             /* 0x94 */
+	unsigned short res10;
+	unsigned short cnt;             /* 0x98 */
+	unsigned short res11;
+	unsigned short data;            /* 0x9C */
+	unsigned short res13;
+	unsigned short res14;           /* 0xA0 */
+	unsigned short res15;
+	unsigned short con;             /* 0xA4 */
+	unsigned short res16;
+	unsigned short oa;              /* 0xA8 */
+	unsigned short res17;
+	unsigned short sa;              /* 0xAC */
+	unsigned short res18;
+	unsigned short psc;             /* 0xB0 */
+	unsigned short res19;
+	unsigned short scll;            /* 0xB4 */
+	unsigned short res20;
+	unsigned short sclh;            /* 0xB8 */
+	unsigned short res21;
+	unsigned short systest;         /* 0xBC */
+	unsigned short res22;
+	unsigned short bufstat;         /* 0xC0 */
+	unsigned short res23;
+};
+
+#define I2C_IP_CLK			48000000
+#define I2C_INTERNAL_SAMLPING_CLK	12000000
+
+#endif /* _I2C_H_ */
diff --git a/board/ti/am335x/evm.c b/board/ti/am335x/evm.c
index 6a9f788..13dc603 100644
--- a/board/ti/am335x/evm.c
+++ b/board/ti/am335x/evm.c
@@ -18,6 +18,7 @@
 #include <asm/arch/hardware.h>
 #include <asm/arch/common_def.h>
 #include <serial.h>
+#include <i2c.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -42,6 +43,12 @@ int init_basic_setup(void)
 int board_init(void)
 {
 	enable_uart0_pin_mux();
+
+#ifdef CONFIG_I2C
+	enable_i2c0_pin_mux();
+	i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
+#endif
+
 	init_basic_setup();
 
 	return 0;
diff --git a/board/ti/am335x/mux.c b/board/ti/am335x/mux.c
index 4cb0cdf..9ccb436 100644
--- a/board/ti/am335x/mux.c
+++ b/board/ti/am335x/mux.c
@@ -272,6 +272,14 @@ static struct module_pin_mux mmc0_pin_mux[] = {
 };
 #endif
 
+static struct module_pin_mux i2c0_pin_mux[] = {
+	{OFFSET(i2c0_sda), (MODE(0) | RXACTIVE |
+			PULLUDEN | SLEWCTRL)}, /* I2C_DATA */
+	{OFFSET(i2c0_scl), (MODE(0) | RXACTIVE |
+			PULLUDEN | SLEWCTRL)}, /* I2C_SCLK */
+	{-1},
+};
+
 /*
  * Configure the pin mux for the module
  */
@@ -297,3 +305,8 @@ void enable_mmc0_pin_mux(void)
 	configure_module_pin_mux(mmc0_pin_mux);
 }
 #endif
+
+void enable_i2c0_pin_mux(void)
+{
+	configure_module_pin_mux(i2c0_pin_mux);
+}
diff --git a/include/configs/am335x_evm.h b/include/configs/am335x_evm.h
index 2cea1f4..6683b3e 100644
--- a/include/configs/am335x_evm.h
+++ b/include/configs/am335x_evm.h
@@ -103,6 +103,14 @@
 #define CONFIG_SYS_NS16550_CLK		(48000000)
 #define CONFIG_SYS_NS16550_COM1		0x44e09000	/* Base EVM has UART0 */
 
+/* I2C Configuration */
+#define CONFIG_I2C
+#define CONFIG_CMD_I2C
+#define CONFIG_HARD_I2C
+#define CONFIG_SYS_I2C_SPEED		100000
+#define CONFIG_SYS_I2C_SLAVE		1
+#define CONFIG_DRIVER_OMAP24XX_I2C
+
 #define CONFIG_BAUDRATE		115200
 #define CONFIG_SYS_BAUDRATE_TABLE	{ 110, 300, 600, 1200, 2400, \
 4800, 9600, 14400, 19200, 28800, 38400, 56000, 57600, 115200 }
@@ -131,6 +139,7 @@
 #define CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME	"u-boot.img"
 #define CONFIG_SPL_MMC_SUPPORT
 #define CONFIG_SPL_FAT_SUPPORT
+#define CONFIG_SPL_I2C_SUPPORT
 
 #define CONFIG_SPL_LIBCOMMON_SUPPORT
 #define CONFIG_SPL_LIBDISK_SUPPORT
-- 
1.7.1



More information about the U-Boot mailing list