mgcoge, mgsuvd: add I2C support.
authorHeiko Schocher <hs@denx.de>
Wed, 15 Oct 2008 07:36:03 +0000 (09:36 +0200)
committerWolfgang Denk <wd@denx.de>
Sat, 18 Oct 2008 19:54:01 +0000 (21:54 +0200)
Signed-off-by: Heiko Schocher <hs@denx.de>
board/keymile/mgcoge/mgcoge.c
board/keymile/mgsuvd/mgsuvd.c
include/configs/mgcoge.h
include/configs/mgsuvd.h

index a6bf9bc5db229dbb69a2b3ef7bd59925b143cccf..d3e46f55e7053f373ff37facc477d897152bcf2b 100644 (file)
 #include <common.h>
 #include <mpc8260.h>
 #include <ioports.h>
+#include <malloc.h>
 
 #if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
 #include <libfdt.h>
 #endif
 
+#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
+#include <i2c.h>
+#endif
+
 /*
  * I/O Port configuration table
  *
@@ -163,8 +168,13 @@ const iop_conf_t iop_conf_tab[4][32] = {
        /* PD18 */ { 0,          0,   0,   0,   0,   0 }, /* PD18            */
        /* PD17 */ { 0,          0,   0,   0,   0,   0 }, /* PD17            */
        /* PD16 */ { 0,          0,   0,   0,   0,   0 }, /* PD16            */
-       /* PD15 */ { 0,          0,   0,   0,   0,   0 }, /* PD15            */
-       /* PD14 */ { 0,          0,   0,   0,   0,   0 }, /* PD14            */
+#if defined(CONFIG_HARD_I2C)
+       /* PD15 */ { 1,          1,   1,   0,   1,   0 }, /* I2C SDA         */
+       /* PD14 */ { 1,          1,   1,   0,   1,   0 }, /* I2C SCL         */
+#else
+       /* PD15 */ { 1,          0,   0,   0,   1,   1 }, /* PD15            */
+       /* PD14 */ { 1,          0,   0,   1,   1,   1 }, /* PD14            */
+#endif
        /* PD13 */ { 0,          0,   0,   0,   0,   0 }, /* PD13            */
        /* PD12 */ { 0,          0,   0,   0,   0,   0 }, /* PD12            */
        /* PD11 */ { 0,          0,   0,   0,   0,   0 }, /* PD11            */
index c51ea7e76eb997db7cad580f10c78c9bd72aeca5..d78b2da653bacad0292bd02f0c038d2dc5bcbe1b 100644 (file)
@@ -225,3 +225,14 @@ void ft_board_setup(void *blob, bd_t *bd)
        ft_blob_update(blob, bd);
 }
 #endif /* defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT) */
+
+int i2c_soft_read_pin (void)
+{
+       int val;
+
+       *(unsigned short *)(I2C_BASE_DIR) &=  ~SDA_CONF;
+       udelay(1);
+       val = *(unsigned char *)(I2C_BASE_PORT);
+
+       return ((val & SDA_BIT) == SDA_BIT);
+}
index 23af3ec4834ce924285d093b756ee53aacad7073..159eeaecfb2ac581c490c7282a2e8a9f27d72bd0 100644 (file)
@@ -82,6 +82,7 @@
 #include <config_cmd_default.h>
 
 #define CONFIG_CMD_ECHO
+#define CONFIG_CMD_I2C
 #define CONFIG_CMD_IMMAP
 #define CONFIG_CMD_MII
 #define CONFIG_CMD_PING
 #define CONFIG_ENV_ADDR                (CFG_MONITOR_BASE + CFG_MONITOR_LEN)
 #endif /* CONFIG_ENV_IS_IN_FLASH */
 
+/* enable I2C and select the hardware/software driver */
+#undef CONFIG_HARD_I2C                 /* I2C with hardware support    */
+#define        CONFIG_SOFT_I2C         1       /* I2C bit-banged               */
+#define CFG_I2C_SPEED          50000   /* I2C speed and slave address  */
+#define CFG_I2C_SLAVE          0x7F
+
+/*
+ * Software (bit-bang) I2C driver configuration
+ */
+
+#define I2C_PORT       3               /* Port A=0, B=1, C=2, D=3 */
+#define I2C_ACTIVE     (iop->pdir |=  0x00010000)
+#define I2C_TRISTATE   (iop->pdir &= ~0x00010000)
+#define I2C_READ       ((iop->pdat & 0x00010000) != 0)
+#define I2C_SDA(bit)   if(bit) iop->pdat |=  0x00010000; \
+                       else    iop->pdat &= ~0x00010000
+#define I2C_SCL(bit)   if(bit) iop->pdat |=  0x00020000; \
+                       else    iop->pdat &= ~0x00020000
+#define I2C_DELAY      udelay(5)       /* 1/4 I2C clock duration */
+
+#define CONFIG_I2C_MULTI_BUS   1
+#define CONFIG_I2C_CMD_TREE    1
+#define CFG_MAX_I2C_BUS                2
+
 #define CFG_IMMR               0xF0000000
 
 #define CFG_INIT_RAM_ADDR      CFG_IMMR
index 740767e1e2f340e751b0f6a5007fd27f558af26e..f2cfe6e274777133be5c718de940d2d9d7e0137a 100644 (file)
 
 #define CONFIG_CMD_ASKENV
 #define CONFIG_CMD_DHCP
+#define CONFIG_CMD_I2C
 #define CONFIG_CMD_NFS
 #define CONFIG_CMD_PING
 
 #define OF_TBCLK               (bd->bi_busfreq / 4)
 #define OF_STDOUT_PATH         "/soc/cpm/serial@a80"
 
+/* enable I2C and select the hardware/software driver */
+#undef CONFIG_HARD_I2C                 /* I2C with hardware support    */
+#define        CONFIG_SOFT_I2C         1       /* I2C bit-banged               */
+#define CFG_I2C_SPEED          50000   /* I2C speed and slave address  */
+#define CFG_I2C_SLAVE          0x7F
+#define I2C_SOFT_DECLARATIONS
+
+/*
+ * Software (bit-bang) I2C driver configuration
+ */
+#define I2C_BASE_DIR   (CFG_PIGGY_BASE + 0x04)
+#define I2C_BASE_PORT  (CFG_PIGGY_BASE + 0x09)
+
+#define SDA_BIT                0x40
+#define SCL_BIT                0x80
+#define SDA_CONF       0x1000
+#define SCL_CONF       0x2000
+
+#define I2C_ACTIVE     do {} while (0)
+#define I2C_TRISTATE   do {} while (0)
+#define I2C_READ       i2c_soft_read_pin ()
+#define I2C_SDA(bit)   if(bit) { \
+                               *(unsigned short *)(I2C_BASE_DIR) &=  ~SDA_CONF; \
+                               } \
+                       else    { \
+                               *(unsigned char *)(I2C_BASE_PORT) &= ~SDA_BIT; \
+                               *(unsigned short *)(I2C_BASE_DIR) |= SDA_CONF; \
+                               }
+#define I2C_SCL(bit)   if(bit) { \
+                               *(unsigned short *)(I2C_BASE_DIR) &=  ~SCL_CONF; \
+                               } \
+                       else    { \
+                               *(unsigned char *)(I2C_BASE_PORT) &= ~SCL_BIT; \
+                               *(unsigned short *)(I2C_BASE_DIR) |= SCL_CONF; \
+                               }
+#define I2C_DELAY      udelay(50)      /* 1/4 I2C clock duration */
+
+#define CONFIG_I2C_MULTI_BUS   1
+#define CONFIG_I2C_CMD_TREE    1
+#define CFG_MAX_I2C_BUS                2
+
+
 #endif /* __CONFIG_H */