Enable i2c support, update mmc driver for beagle and overo, bump version
authorSteve Sakoman <steve@sakoman.com>
Thu, 7 Aug 2008 21:00:58 +0000 (14:00 -0700)
committerSteve Sakoman <steve@sakoman.com>
Thu, 7 Aug 2008 21:00:58 +0000 (14:00 -0700)
to 1.42 and add time stamp to boot banner

TODO: omap3evm

20 files changed:
board/omap3530beagle/omap3530beagle.c
board/overo/overo.c
cpu/omap3/config.mk
cpu/omap3/mmc.c
cpu/omap3/mmc_host_def.h [deleted file]
cpu/omap3/mmc_protocol.h [deleted file]
drivers/Makefile
drivers/omap24xx_i2c.c [new file with mode: 0644]
include/asm/arch-omap3/clocks.h
include/asm/arch-omap3/i2c.h [changed mode: 0755->0644]
include/asm/arch-omap3/mmc.h [changed mode: 0755->0644]
include/asm/arch-omap3/mmc_host_def.h [new file with mode: 0644]
include/asm/io.h [new file with mode: 0644]
include/asm/memory.h [new file with mode: 0644]
include/asm/types.h
include/configs/omap3530beagle.h
include/configs/overo.h
include/i2c.h [new file with mode: 0644]
include/mmc.h
lib/board.c

index 79e6d71..19dd405 100644 (file)
@@ -66,6 +66,10 @@ static inline void delay(unsigned long loops)
                          "bne 1b":"=r" (loops):"0"(loops));
 }
 
+void udelay (unsigned long usecs) {
+       delay(usecs);
+}
+
 /*****************************************
  * Routine: board_init
  * Description: Early hardware init.
@@ -596,6 +600,28 @@ void per_clocks_enable(void)
 
 #endif
 
+#ifdef CONFIG_DRIVER_OMAP34XX_I2C
+       /* Turn on all 3 I2C clocks */
+       sr32(CM_FCLKEN1_CORE, 15, 3, 0x7);
+       sr32(CM_ICLKEN1_CORE, 15, 3, 0x7);      /* I2C1,2,3 = on */
+#endif
+
+       /* Enable the ICLK for 32K Sync Timer as its used in udelay */
+       sr32(CM_ICLKEN_WKUP, 2, 1, 0x1);
+
+       sr32(CM_FCLKEN_IVA2, 0, 32, FCK_IVA2_ON);
+       sr32(CM_FCLKEN1_CORE, 0, 32, FCK_CORE1_ON);
+       sr32(CM_ICLKEN1_CORE, 0, 32, ICK_CORE1_ON);
+       sr32(CM_ICLKEN2_CORE, 0, 32, ICK_CORE2_ON);
+       sr32(CM_FCLKEN_WKUP, 0, 32, FCK_WKUP_ON);
+       sr32(CM_ICLKEN_WKUP, 0, 32, ICK_WKUP_ON);
+       sr32(CM_FCLKEN_DSS, 0, 32, FCK_DSS_ON);
+       sr32(CM_ICLKEN_DSS, 0, 32, ICK_DSS_ON);
+       sr32(CM_FCLKEN_CAM, 0, 32, FCK_CAM_ON);
+       sr32(CM_ICLKEN_CAM, 0, 32, ICK_CAM_ON);
+       sr32(CM_FCLKEN_PER, 0, 32, FCK_PER_ON);
+       sr32(CM_ICLKEN_PER, 0, 32, ICK_PER_ON);
+
        /* Enable GPIO5 clocks for blinky LEDs */
        sr32(CM_FCLKEN_PER, 16, 1, 0x1);        /* FCKen GPIO5 */
        sr32(CM_ICLKEN_PER, 16, 1, 0x1);        /* ICKen GPIO5 */
@@ -707,6 +733,16 @@ void per_clocks_enable(void)
        MUX_VAL(CP(DSS_DATA20),     (IEN  | PTD | DIS | M4)) /*GPIO_90*/\
        MUX_VAL(CP(DSS_DATA21),     (IEN  | PTD | DIS | M4)) /*GPIO_91*/\
        MUX_VAL(CP(CAM_WEN),        (IEN  | PTD | DIS | M4)) /*GPIO_167*/\
+       MUX_VAL(CP(MMC1_CLK),       (IDIS | PTU | EN  | M0)) /*MMC1_CLK*/\
+       MUX_VAL(CP(MMC1_CMD),       (IEN  | PTU | EN  | M0)) /*MMC1_CMD*/\
+       MUX_VAL(CP(MMC1_DAT0),      (IEN  | PTU | EN  | M0)) /*MMC1_DAT0*/\
+       MUX_VAL(CP(MMC1_DAT1),      (IEN  | PTU | EN  | M0)) /*MMC1_DAT1*/\
+       MUX_VAL(CP(MMC1_DAT2),      (IEN  | PTU | EN  | M0)) /*MMC1_DAT2*/\
+       MUX_VAL(CP(MMC1_DAT3),      (IEN  | PTU | EN  | M0)) /*MMC1_DAT3*/\
+       MUX_VAL(CP(MMC1_DAT4),      (IEN  | PTU | EN  | M0)) /*MMC1_DAT4*/\
+       MUX_VAL(CP(MMC1_DAT5),      (IEN  | PTU | EN  | M0)) /*MMC1_DAT5*/\
+       MUX_VAL(CP(MMC1_DAT6),      (IEN  | PTU | EN  | M0)) /*MMC1_DAT6*/\
+       MUX_VAL(CP(MMC1_DAT7),      (IEN  | PTU | EN  | M0)) /*MMC1_DAT7*/\
        MUX_VAL(CP(UART1_TX),       (IDIS | PTD | DIS | M0)) /*UART1_TX*/\
        MUX_VAL(CP(UART1_RTS),      (IDIS | PTD | DIS | M4)) /*GPIO_149*/\
        MUX_VAL(CP(UART1_CTS),      (IDIS | PTD | DIS | M4)) /*GPIO_150*/\
@@ -715,6 +751,14 @@ void per_clocks_enable(void)
        MUX_VAL(CP(UART3_RTS_SD),   (IDIS | PTD | DIS | M0)) /*UART3_RTS_SD */\
        MUX_VAL(CP(UART3_RX_IRRX),  (IEN  | PTD | DIS | M0)) /*UART3_RX_IRRX*/\
        MUX_VAL(CP(UART3_TX_IRTX),  (IDIS | PTD | DIS | M0)) /*UART3_TX_IRTX*/\
+       MUX_VAL(CP(I2C1_SCL),       (IEN  | PTU | EN  | M0)) /*I2C1_SCL*/\
+       MUX_VAL(CP(I2C1_SDA),       (IEN  | PTU | EN  | M0)) /*I2C1_SDA*/\
+       MUX_VAL(CP(I2C2_SCL),       (IEN  | PTU | EN  | M0)) /*I2C2_SCL*/\
+       MUX_VAL(CP(I2C2_SDA),       (IEN  | PTU | EN  | M0)) /*I2C2_SDA*/\
+       MUX_VAL(CP(I2C3_SCL),       (IEN  | PTU | EN  | M0)) /*I2C3_SCL*/\
+       MUX_VAL(CP(I2C3_SDA),       (IEN  | PTU | EN  | M0)) /*I2C3_SDA*/\
+       MUX_VAL(CP(I2C4_SCL),       (IEN  | PTU | EN  | M0)) /*I2C4_SCL*/\
+       MUX_VAL(CP(I2C4_SDA),       (IEN  | PTU | EN  | M0)) /*I2C4_SDA*/\
        MUX_VAL(CP(McBSP1_DX),      (IEN  | PTD | DIS | M4)) /*GPIO_158*/\
        MUX_VAL(CP(SYS_32K),        (IEN  | PTD | DIS | M0)) /*SYS_32K*/\
        MUX_VAL(CP(SYS_BOOT0),      (IEN  | PTD | DIS | M4)) /*GPIO_2 */\
@@ -847,39 +891,23 @@ void blinkLEDs()
        }
 }
 
-typedef int (mmc_boot_addr) (void);
-int mmc_boot(unsigned char *buf)
-{
-
-       long size = 0;
-#ifdef CFG_CMD_FAT
-       block_dev_desc_t *dev_desc = NULL;
-       unsigned char ret = 0;
-
-       printf("Starting X-loader on MMC \n");
-
-       ret = mmc_init(1);
-       if (ret == 0) {
-               printf("\n MMC init failed \n");
-               return 0;
-       }
-
-       dev_desc = mmc_get_dev(0);
-       fat_register_device(dev_desc, 1);
-       size = file_fat_read("u-boot.bin", buf, 0);
-       if (size == -1)
-               return 0;
-
-       printf("\n%ld Bytes Read from MMC \n", size);
-
-       printf("Starting OS Bootloader from MMC...\n");
-#endif
-       return size;
-}
-
 /* optionally do something like blinking LED */
 void board_hang(void)
 {
        while (1)
                blinkLEDs();
 }
+
+/******************************************************************************
+ * Dummy function to handle errors for EABI incompatibility
+ *****************************************************************************/
+void raise(void)
+{
+}
+
+/******************************************************************************
+ * Dummy function to handle errors for EABI incompatibility
+ *****************************************************************************/
+void abort(void)
+{
+}
index 0d4aba5..ec00ddf 100644 (file)
@@ -69,6 +69,10 @@ static inline void delay(unsigned long loops)
                          "bne 1b":"=r" (loops):"0"(loops));
 }
 
+void udelay (unsigned long usecs) {
+       delay(usecs);
+}
+
 /*****************************************
  * Routine: board_init
  * Description: Early hardware init.
@@ -525,6 +529,13 @@ void s_init(void)
  ********************************************************/
 int misc_init_r(void)
 {
+       /* REMOVE!! for proto boards only */
+       /* set vaux2 to 2.8V */
+       unsigned char byte = 0x20;
+       i2c_write(0x4B, 0x76, 1, &byte, 1);
+       byte = 0x09;
+       i2c_write(0x4B, 0x79, 1, &byte, 1);
+
        return 0;
 }
 
@@ -590,6 +601,33 @@ void per_clocks_enable(void)
        sr32(CM_ICLKEN_PER, 11, 1, 0x1);
 
 #endif
+
+#ifdef CONFIG_DRIVER_OMAP34XX_I2C
+       /* Turn on all 3 I2C clocks */
+       sr32(CM_FCLKEN1_CORE, 15, 3, 0x7);
+       sr32(CM_ICLKEN1_CORE, 15, 3, 0x7);      /* I2C1,2,3 = on */
+#endif
+
+       /* Enable the ICLK for 32K Sync Timer as its used in udelay */
+       sr32(CM_ICLKEN_WKUP, 2, 1, 0x1);
+
+       sr32(CM_FCLKEN_IVA2, 0, 32, FCK_IVA2_ON);
+       sr32(CM_FCLKEN1_CORE, 0, 32, FCK_CORE1_ON);
+       sr32(CM_ICLKEN1_CORE, 0, 32, ICK_CORE1_ON);
+       sr32(CM_ICLKEN2_CORE, 0, 32, ICK_CORE2_ON);
+       sr32(CM_FCLKEN_WKUP, 0, 32, FCK_WKUP_ON);
+       sr32(CM_ICLKEN_WKUP, 0, 32, ICK_WKUP_ON);
+       sr32(CM_FCLKEN_DSS, 0, 32, FCK_DSS_ON);
+       sr32(CM_ICLKEN_DSS, 0, 32, ICK_DSS_ON);
+       sr32(CM_FCLKEN_CAM, 0, 32, FCK_CAM_ON);
+       sr32(CM_ICLKEN_CAM, 0, 32, ICK_CAM_ON);
+       sr32(CM_FCLKEN_PER, 0, 32, FCK_PER_ON);
+       sr32(CM_ICLKEN_PER, 0, 32, ICK_PER_ON);
+
+       /* Enable GPIO5 clocks for blinky LEDs */
+       sr32(CM_FCLKEN_PER, 16, 1, 0x1);        /* FCKen GPIO5 */
+       sr32(CM_ICLKEN_PER, 16, 1, 0x1);        /* ICKen GPIO5 */
+
        delay(1000);
 }
 
@@ -697,6 +735,16 @@ void per_clocks_enable(void)
        MUX_VAL(CP(DSS_DATA20),     (IEN  | PTD | DIS | M4)) /*GPIO_90*/\
        MUX_VAL(CP(DSS_DATA21),     (IEN  | PTD | DIS | M4)) /*GPIO_91*/\
        MUX_VAL(CP(CAM_WEN),        (IEN  | PTD | DIS | M4)) /*GPIO_167*/\
+       MUX_VAL(CP(MMC1_CLK),       (IDIS | PTU | EN  | M0)) /*MMC1_CLK*/\
+       MUX_VAL(CP(MMC1_CMD),       (IEN  | PTU | EN  | M0)) /*MMC1_CMD*/\
+       MUX_VAL(CP(MMC1_DAT0),      (IEN  | PTU | EN  | M0)) /*MMC1_DAT0*/\
+       MUX_VAL(CP(MMC1_DAT1),      (IEN  | PTU | EN  | M0)) /*MMC1_DAT1*/\
+       MUX_VAL(CP(MMC1_DAT2),      (IEN  | PTU | EN  | M0)) /*MMC1_DAT2*/\
+       MUX_VAL(CP(MMC1_DAT3),      (IEN  | PTU | EN  | M0)) /*MMC1_DAT3*/\
+       MUX_VAL(CP(MMC1_DAT4),      (IEN  | PTU | EN  | M0)) /*MMC1_DAT4*/\
+       MUX_VAL(CP(MMC1_DAT5),      (IEN  | PTU | EN  | M0)) /*MMC1_DAT5*/\
+       MUX_VAL(CP(MMC1_DAT6),      (IEN  | PTU | EN  | M0)) /*MMC1_DAT6*/\
+       MUX_VAL(CP(MMC1_DAT7),      (IEN  | PTU | EN  | M0)) /*MMC1_DAT7*/\
        MUX_VAL(CP(UART1_TX),       (IDIS | PTD | DIS | M0)) /*UART1_TX*/\
        MUX_VAL(CP(UART1_RTS),      (IDIS | PTD | DIS | M0)) /*UART1_RTS*/\
        MUX_VAL(CP(UART1_CTS),      (IEN  | PTU | DIS | M0)) /*UART1_CTS*/\
@@ -705,6 +753,14 @@ void per_clocks_enable(void)
        MUX_VAL(CP(UART3_RTS_SD),   (IDIS | PTD | DIS | M0)) /*UART3_RTS_SD */\
        MUX_VAL(CP(UART3_RX_IRRX),  (IEN  | PTD | DIS | M0)) /*UART3_RX_IRRX*/\
        MUX_VAL(CP(UART3_TX_IRTX),  (IDIS | PTD | DIS | M0)) /*UART3_TX_IRTX*/\
+       MUX_VAL(CP(I2C1_SCL),       (IEN  | PTU | EN  | M0)) /*I2C1_SCL*/\
+       MUX_VAL(CP(I2C1_SDA),       (IEN  | PTU | EN  | M0)) /*I2C1_SDA*/\
+       MUX_VAL(CP(I2C2_SCL),       (IEN  | PTU | EN  | M0)) /*I2C2_SCL*/\
+       MUX_VAL(CP(I2C2_SDA),       (IEN  | PTU | EN  | M0)) /*I2C2_SDA*/\
+       MUX_VAL(CP(I2C3_SCL),       (IEN  | PTU | EN  | M0)) /*I2C3_SCL*/\
+       MUX_VAL(CP(I2C3_SDA),       (IEN  | PTU | EN  | M0)) /*I2C3_SDA*/\
+       MUX_VAL(CP(I2C4_SCL),       (IEN  | PTU | EN  | M0)) /*I2C4_SCL*/\
+       MUX_VAL(CP(I2C4_SDA),       (IEN  | PTU | EN  | M0)) /*I2C4_SDA*/\
        MUX_VAL(CP(McBSP1_DX),      (IEN  | PTD | DIS | M4)) /*GPIO_158*/\
        MUX_VAL(CP(SYS_32K),        (IEN  | PTD | DIS | M0)) /*SYS_32K*/\
        MUX_VAL(CP(SYS_BOOT0),      (IEN  | PTD | DIS | M4)) /*GPIO_2 */\
@@ -810,40 +866,23 @@ int nand_init(void)
        return 0;
 }
 
-
-typedef int (mmc_boot_addr) (void);
-int mmc_boot(unsigned char *buf)
-{
-
-       long size = 0;
-#ifdef CFG_CMD_FAT
-       block_dev_desc_t *dev_desc = NULL;
-       unsigned char ret = 0;
-
-       printf("Starting X-loader on MMC \n");
-
-       ret = mmc_init(1);
-       if (ret == 0) {
-               printf("\n MMC init failed \n");
-               return 0;
-       }
-
-       dev_desc = mmc_get_dev(0);
-       fat_register_device(dev_desc, 1);
-       size = file_fat_read("u-boot.bin", buf, 0);
-       if (size == -1)
-               return 0;
-
-       printf("\n%ld Bytes Read from MMC \n", size);
-
-       printf("Starting OS Bootloader from MMC...\n");
-#endif
-       return size;
-}
-
 /* optionally do something like blinking LED */
 void board_hang(void)
 {
        while (0)
                ;
 }
+
+/******************************************************************************
+ * Dummy function to handle errors for EABI incompatibility
+ *****************************************************************************/
+void raise(void)
+{
+}
+
+/******************************************************************************
+ * Dummy function to handle errors for EABI incompatibility
+ *****************************************************************************/
+void abort(void)
+{
+}
index e802035..29c8343 100644 (file)
@@ -28,5 +28,5 @@ PLATFORM_CPPFLAGS += -march=armv7a
 # Supply options according to compiler version
 #
 # =========================================================================
-PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
+PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32)
 PLATFORM_RELFLAGS +=$(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))
index 4b95093..e0c63b0 100644 (file)
  * MA 02111-1307 USA
  */
 
-
 #include <config.h>
 #include <common.h>
-#include <mmc.h>
 #include <part.h>
-
-#ifdef CFG_CMD_MMC
-
-#include "mmc_host_def.h"
-#include "mmc_protocol.h"
-
-#define OMAP_MMC_MASTER_CLOCK   96000000
-extern int fat_register_device(block_dev_desc_t *dev_desc, int part_no);
+#include <fat.h>
+#include <mmc.h>
+#include <i2c.h>
+
+const unsigned short mmc_transspeed_val[15][4] = {
+       {CLKD(10, 1), CLKD(10, 10), CLKD(10, 100), CLKD(10, 1000)},
+       {CLKD(12, 1), CLKD(12, 10), CLKD(12, 100), CLKD(12, 1000)},
+       {CLKD(13, 1), CLKD(13, 10), CLKD(13, 100), CLKD(13, 1000)},
+       {CLKD(15, 1), CLKD(15, 10), CLKD(15, 100), CLKD(15, 1000)},
+       {CLKD(20, 1), CLKD(20, 10), CLKD(20, 100), CLKD(20, 1000)},
+       {CLKD(26, 1), CLKD(26, 10), CLKD(26, 100), CLKD(26, 1000)},
+       {CLKD(30, 1), CLKD(30, 10), CLKD(30, 100), CLKD(30, 1000)},
+       {CLKD(35, 1), CLKD(35, 10), CLKD(35, 100), CLKD(35, 1000)},
+       {CLKD(40, 1), CLKD(40, 10), CLKD(40, 100), CLKD(40, 1000)},
+       {CLKD(45, 1), CLKD(45, 10), CLKD(45, 100), CLKD(45, 1000)},
+       {CLKD(52, 1), CLKD(52, 10), CLKD(52, 100), CLKD(52, 1000)},
+       {CLKD(55, 1), CLKD(55, 10), CLKD(55, 100), CLKD(55, 1000)},
+       {CLKD(60, 1), CLKD(60, 10), CLKD(60, 100), CLKD(60, 1000)},
+       {CLKD(70, 1), CLKD(70, 10), CLKD(70, 100), CLKD(70, 1000)},
+       {CLKD(80, 1), CLKD(80, 10), CLKD(80, 100), CLKD(80, 1000)}
+};
 
 mmc_card_data cur_card_data;
 static block_dev_desc_t mmc_blk_dev;
@@ -44,10 +55,22 @@ block_dev_desc_t *mmc_get_dev(int dev)
        return ((block_dev_desc_t *) &mmc_blk_dev);
 }
 
+void twl4030_mmc_config(void)
+{
+       unsigned char data;
+
+       data = 0x20;
+       i2c_write(0x4B, 0x82, 1, &data, 1);
+       data = 0x2;
+       i2c_write(0x4B, 0x85, 1, &data, 1);
+}
+
 unsigned char mmc_board_init(void)
 {
        unsigned int value = 0;
 
+       twl4030_mmc_config();
+
        value = CONTROL_PBIAS_LITE;
        CONTROL_PBIAS_LITE = value | (1 << 2) | (1 << 1) | (1 << 9);
 
@@ -102,8 +125,8 @@ unsigned char mmc_clock_config(unsigned int iclk, unsigned short clk_div)
        mmc_reg_out(OMAP_HSMMC_SYSCTL,
                    ICE_MASK | CLKD_MASK, (val << CLKD_OFFSET) | ICE_OSCILLATE);
 
-       while ((OMAP_HSMMC_SYSCTL & ICS_MASK) == ICS_NOTREADY);
-
+       while ((OMAP_HSMMC_SYSCTL & ICS_MASK) == ICS_NOTREADY) {
+       }
 
        OMAP_HSMMC_SYSCTL |= CEN_ENABLE;
        return 1;
@@ -112,7 +135,6 @@ unsigned char mmc_clock_config(unsigned int iclk, unsigned short clk_div)
 unsigned char mmc_init_setup(void)
 {
        unsigned int reg_val;
-       unsigned int val = 0;
 
        mmc_board_init();
 
@@ -143,10 +165,10 @@ unsigned char mmc_init_setup(void)
 unsigned char mmc_send_cmd(unsigned int cmd, unsigned int arg,
                           unsigned int *response)
 {
-       unsigned int mmc_stat;
-
-       while ((OMAP_HSMMC_PSTATE & DATI_MASK) == DATI_CMDDIS);
+       volatile unsigned int mmc_stat;
 
+       while ((OMAP_HSMMC_PSTATE & DATI_MASK) == DATI_CMDDIS) {
+       }
 
        OMAP_HSMMC_BLK = BLEN_512BYTESLEN | NBLK_STPCNT;
        OMAP_HSMMC_STAT = 0xFFFFFFFF;
@@ -161,8 +183,7 @@ unsigned char mmc_send_cmd(unsigned int cmd, unsigned int arg,
                } while (mmc_stat == 0);
 
                if ((mmc_stat & ERRI_MASK) != 0)
-                       return (unsigned char)mmc_stat;
-
+                       return (unsigned char) mmc_stat;
 
                if (mmc_stat & CC_MASK) {
                        OMAP_HSMMC_STAT = CC_MASK;
@@ -180,7 +201,7 @@ unsigned char mmc_send_cmd(unsigned int cmd, unsigned int arg,
 
 unsigned char mmc_read_data(unsigned int *output_buf)
 {
-       unsigned int mmc_stat;
+       volatile unsigned int mmc_stat;
        unsigned int read_count = 0;
 
        /*
@@ -192,7 +213,7 @@ unsigned char mmc_read_data(unsigned int *output_buf)
                } while (mmc_stat == 0);
 
                if ((mmc_stat & ERRI_MASK) != 0)
-                       return (unsigned char)mmc_stat;
+                       return (unsigned char) mmc_stat;
 
                if (mmc_stat & BRR_MASK) {
                        unsigned int k;
@@ -351,7 +372,7 @@ unsigned char mmc_read_cardsize(mmc_card_data *mmc_dev_data,
                        err = mmc_send_cmd(MMC_CMD8, argument, resp);
                        if (err != 1)
                                return err;
-                       err = mmc_read_data((unsigned int *)&ext_csd);
+                       err = mmc_read_data((unsigned int *) &ext_csd);
                        if (err != 1)
                                return err;
                        mmc_dev_data->size = ext_csd.sectorcount;
@@ -371,11 +392,9 @@ unsigned char mmc_read_cardsize(mmc_card_data *mmc_dev_data,
                card_size = (cur_csd->c_size_lsb & MMC_CSD_C_SIZE_LSB_MASK) |
                    ((cur_csd->c_size_msb & MMC_CSD_C_SIZE_MSB_MASK)
                     << MMC_CSD_C_SIZE_MSB_OFFSET);
-
                blk_no = (card_size + 1) * count;
                blk_len = 1 << cur_csd->read_bl_len;
                size = blk_no * blk_len;
-
                mmc_dev_data->size = size / MMCSD_SECTOR_SIZE;
                if (mmc_dev_data->size == 0)
                        return 0;
@@ -385,7 +404,7 @@ unsigned char mmc_read_cardsize(mmc_card_data *mmc_dev_data,
 
 unsigned char omap_mmc_read_sect(unsigned int start_sec, unsigned int num_bytes,
                                 mmc_card_data *mmc_c,
-                                unsigned int *output_buf)
+                                unsigned long *output_buf)
 {
        unsigned char err;
        unsigned int argument;
@@ -410,8 +429,7 @@ unsigned char omap_mmc_read_sect(unsigned int start_sec, unsigned int num_bytes,
                if (err != 1)
                        return err;
 
-
-               err = mmc_read_data(output_buf);
+               err = mmc_read_data((unsigned int *) output_buf);
                if (err != 1)
                        return err;
 
@@ -427,13 +445,14 @@ unsigned char configure_mmc(mmc_card_data *mmc_card_cur)
        unsigned char ret_val;
        unsigned int argument;
        unsigned int resp[4];
-       unsigned int trans_fact, trans_unit, retries = 2;
-       unsigned int max_dtr;
-       int dsor;
+       unsigned int trans_clk, trans_fact, trans_unit, retries = 2;
        mmc_csd_reg_t Card_CSD;
        unsigned char trans_speed;
 
-       mmc_init_setup();
+       ret_val = mmc_init_setup();
+
+       if (ret_val != 1)
+               return ret_val;
 
        do {
                ret_val = mmc_detect_card(mmc_card_cur);
@@ -445,10 +464,10 @@ unsigned char configure_mmc(mmc_card_data *mmc_card_cur)
        if (ret_val != 1)
                return ret_val;
 
-       ((unsigned int *)&Card_CSD)[3] = resp[3];
-       ((unsigned int *)&Card_CSD)[2] = resp[2];
-       ((unsigned int *)&Card_CSD)[1] = resp[1];
-       ((unsigned int *)&Card_CSD)[0] = resp[0];
+       ((unsigned int *) &Card_CSD)[3] = resp[3];
+       ((unsigned int *) &Card_CSD)[2] = resp[2];
+       ((unsigned int *) &Card_CSD)[1] = resp[1];
+       ((unsigned int *) &Card_CSD)[0] = resp[0];
 
        if (mmc_card_cur->card_type == MMC_CARD)
                mmc_card_cur->version = Card_CSD.spec_vers;
@@ -472,15 +491,9 @@ unsigned char configure_mmc(mmc_card_data *mmc_card_cur)
        trans_unit >>= 0;
        trans_fact >>= 3;
 
-       max_dtr = tran_exp[trans_unit] * tran_mant[trans_fact];
-       dsor = OMAP_MMC_MASTER_CLOCK / max_dtr;
+       trans_clk = mmc_transspeed_val[trans_fact - 1][trans_unit] * 2;
+       ret_val = mmc_clock_config(CLK_MISC, trans_clk);
 
-       if (dsor == 4)
-               dsor = 5;
-       if (dsor == 3)
-               dsor = 4;
-
-       ret_val = mmc_clock_config(CLK_MISC, dsor);
        if (ret_val != 1)
                return ret_val;
 
@@ -502,56 +515,51 @@ unsigned char configure_mmc(mmc_card_data *mmc_card_cur)
 
        return 1;
 }
-
-unsigned long mmc_bread(int dev_num, ulong blknr, ulong blkcnt, ulong *dst)
+unsigned long mmc_bread(int dev_num, unsigned long blknr, lbaint_t blkcnt,
+                       void *dst)
 {
        omap_mmc_read_sect(blknr, (blkcnt * MMCSD_SECTOR_SIZE), &cur_card_data,
-                          (unsigned long *)dst);
+                          (unsigned long *) dst);
+       return 1;
 }
 
 int mmc_init(int verbose)
 {
-       unsigned char ret = 0;
+       unsigned char ret;
 
        ret = configure_mmc(&cur_card_data);
-       if (ret == 0)
-               return 0;
-
-       mmc_blk_dev.if_type = IF_TYPE_MMC;
-       mmc_blk_dev.part_type = PART_TYPE_DOS;
-       mmc_blk_dev.dev = 0;
-       mmc_blk_dev.lun = 0;
-       mmc_blk_dev.type = 0;
 
-       /* FIXME fill in the correct size (is set to 32MByte) */
-       mmc_blk_dev.blksz = MMCSD_SECTOR_SIZE;
-       mmc_blk_dev.lba = 0x10000;
-       mmc_blk_dev.removable = 0;
-       mmc_blk_dev.block_read = mmc_bread;
+       if (ret == 1) {
+               mmc_blk_dev.if_type = IF_TYPE_MMC;
+               mmc_blk_dev.part_type = PART_TYPE_DOS;
+               mmc_blk_dev.dev = 0;
+               mmc_blk_dev.lun = 0;
+               mmc_blk_dev.type = 0;
 
-       fat_register_device(&mmc_blk_dev, 1);
+               /* FIXME fill in the correct size (is set to 32MByte) */
+               mmc_blk_dev.blksz = MMCSD_SECTOR_SIZE;
+               mmc_blk_dev.lba = 0x10000;
+               mmc_blk_dev.removable = 0;
+               mmc_blk_dev.block_read = mmc_bread;
 
-       return 1;
+               fat_register_device(&mmc_blk_dev, 1);
+               return 1;
+       }
+       else 
+               return 0;
 }
 
-int mmc_read(unsigned int src, unsigned char *dst, int size)
+int mmc_read(ulong src, uchar *dst, int size)
 {
-       /*
-        * NOT Implemented
-        */
+       return 0;
 }
-int mmc_write(unsigned char *src, unsigned long dst, int size)
+
+int mmc_write(uchar *src, ulong dst, int size)
 {
-       /*
-        * NOT Implemented
-        */
+       return 0;
 }
 
-int mmc2info(unsigned int addr)
+int mmc2info(ulong addr)
 {
-       /*
-        * NOT Implemented
-        */
+       return 0;
 }
-#endif
-
diff --git a/cpu/omap3/mmc_host_def.h b/cpu/omap3/mmc_host_def.h
deleted file mode 100644 (file)
index b5dd040..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * (C) Copyright 2008
- * Texas Instruments, <www.ti.com>
- * Syed Mohammed Khasim <khasim@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's version 2 of
- * the License.
- *
- * 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 MMC_HOST_DEFINITIONS_H
-#define MMC_HOST_DEFINITIONS_H
-
-/*
- * OMAP HSMMC register definitions
- */
-#define OMAP_HSMMC_SYSCONFIG   (*(unsigned int *) 0x4809C010)
-#define OMAP_HSMMC_SYSSTATUS   (*(unsigned int *) 0x4809C014)
-#define OMAP_HSMMC_CON                 (*(unsigned int *) 0x4809C02C)
-#define OMAP_HSMMC_BLK                 (*(unsigned int *) 0x4809C104)
-#define OMAP_HSMMC_ARG                 (*(unsigned int *) 0x4809C108)
-#define OMAP_HSMMC_CMD                 (*(unsigned int *) 0x4809C10C)
-#define OMAP_HSMMC_RSP10               (*(unsigned int *) 0x4809C110)
-#define OMAP_HSMMC_RSP32               (*(unsigned int *) 0x4809C114)
-#define OMAP_HSMMC_RSP54               (*(unsigned int *) 0x4809C118)
-#define OMAP_HSMMC_RSP76               (*(unsigned int *) 0x4809C11C)
-#define OMAP_HSMMC_DATA                        (*(unsigned int *) 0x4809C120)
-#define OMAP_HSMMC_PSTATE              (*(unsigned int *) 0x4809C124)
-#define OMAP_HSMMC_HCTL                        (*(unsigned int *) 0x4809C128)
-#define OMAP_HSMMC_SYSCTL              (*(unsigned int *) 0x4809C12C)
-#define OMAP_HSMMC_STAT                        (*(unsigned int *) 0x4809C130)
-#define OMAP_HSMMC_IE                  (*(unsigned int *) 0x4809C134)
-#define OMAP_HSMMC_CAPA                        (*(unsigned int *) 0x4809C140)
-
-/* T2 Register definitions */
-#define CONTROL_DEV_CONF0              (*(unsigned int *) 0x48002274)
-#define CONTROL_PBIAS_LITE             (*(unsigned int *) 0x48002520)
-
-/*
- * OMAP HS MMC Bit definitions
- */
-#define MMC_SOFTRESET                          (0x1 << 1)
-#define RESETDONE                                      (0x1 << 0)
-#define NOOPENDRAIN                                    (0x0 << 0)
-#define OPENDRAIN                                      (0x1 << 0)
-#define OD                                                     (0x1 << 0)
-#define INIT_NOINIT                                    (0x0 << 1)
-#define INIT_INITSTREAM                                (0x1 << 1)
-#define HR_NOHOSTRESP                          (0x0 << 2)
-#define STR_BLOCK                                      (0x0 << 3)
-#define MODE_FUNC                                      (0x0 << 4)
-#define DW8_1_4BITMODE                                 (0x0 << 5)
-#define MIT_CTO                                                (0x0 << 6)
-#define CDP_ACTIVEHIGH                         (0x0 << 7)
-#define WPP_ACTIVEHIGH                                 (0x0 << 8)
-#define RESERVED_MASK                          (0x3 << 9)
-#define CTPL_MMC_SD                            (0x0 << 11)
-#define BLEN_512BYTESLEN                       (0x200 << 0)
-#define NBLK_STPCNT                                    (0x0 << 16)
-#define DE_DISABLE                                     (0x0 << 0)
-#define BCE_DISABLE                                    (0x0 << 1)
-#define ACEN_DISABLE                           (0x0 << 2)
-#define DDIR_OFFSET                                    (4)
-#define DDIR_MASK                                      (0x1 << 4)
-#define DDIR_WRITE                                     (0x0 << 4)
-#define DDIR_READ                                      (0x1 << 4)
-#define MSBS_SGLEBLK                           (0x0 << 5)
-#define RSP_TYPE_OFFSET                                (16)
-#define RSP_TYPE_MASK                          (0x3 << 16)
-#define RSP_TYPE_NORSP                         (0x0 << 16)
-#define RSP_TYPE_LGHT136                       (0x1 << 16)
-#define RSP_TYPE_LGHT48                                (0x2 << 16)
-#define RSP_TYPE_LGHT48B                       (0x3 << 16)
-#define CCCE_NOCHECK                           (0x0 << 19)
-#define CCCE_CHECK                                     (0x1 << 19)
-#define CICE_NOCHECK                           (0x0 << 20)
-#define CICE_CHECK                                     (0x1 << 20)
-#define DP_OFFSET                                      (21)
-#define DP_MASK                                                (0x1 << 21)
-#define DP_NO_DATA                                     (0x0 << 21)
-#define DP_DATA                                                (0x1 << 21)
-#define CMD_TYPE_NORMAL                                (0x0 << 22)
-#define INDEX_OFFSET                           (24)
-#define INDEX_MASK                                     (0x3f << 24)
-#define INDEX(i)                                       (i << 24)
-#define DATI_MASK                                      (0x1 << 1)
-#define DATI_CMDDIS                                    (0x1 << 1)
-#define DTW_1_BITMODE                          (0x0 << 1)
-#define DTW_4_BITMODE                          (0x1 << 1)
-#define SDBP_PWROFF                                    (0x0 << 8)
-#define SDBP_PWRON                                     (0x1 << 8)
-#define SDVS_1V8                                       (0x5 << 9)
-#define SDVS_3V0                                       (0x6 << 9)
-#define ICE_MASK                                       (0x1 << 0)
-#define ICE_STOP                                       (0x0 << 0)
-#define ICS_MASK                                       (0x1 << 1)
-#define ICS_NOTREADY                           (0x0 << 1)
-#define ICE_OSCILLATE                          (0x1 << 0)
-#define CEN_MASK                                       (0x1 << 2)
-#define CEN_DISABLE                                    (0x0 << 2)
-#define CEN_ENABLE                                     (0x1 << 2)
-#define CLKD_OFFSET                                    (6)
-#define CLKD_MASK                                      (0x3FF << 6)
-#define DTO_MASK                                       (0xF << 16)
-#define DTO_15THDTO                                    (0xE << 16)
-#define SOFTRESETALL                           (0x1 << 24)
-#define CC_MASK                                                (0x1 << 0)
-#define TC_MASK                                                (0x1 << 1)
-#define BWR_MASK                                       (0x1 << 4)
-#define BRR_MASK                                       (0x1 << 5)
-#define ERRI_MASK                                      (0x1 << 15)
-#define IE_CC                                          (0x01 << 0)
-#define IE_TC                                          (0x01 << 1)
-#define IE_BWR                                         (0x01 << 4)
-#define IE_BRR                                         (0x01 << 5)
-#define IE_CTO                                         (0x01 << 16)
-#define IE_CCRC                                                (0x01 << 17)
-#define IE_CEB                                         (0x01 << 18)
-#define IE_CIE                                         (0x01 << 19)
-#define IE_DTO                                         (0x01 << 20)
-#define IE_DCRC                                                (0x01 << 21)
-#define IE_DEB                                         (0x01 << 22)
-#define IE_CERR                                                (0x01 << 28)
-#define IE_BADA                                                (0x01 << 29)
-
-#define VS30_3V0SUP                                    (1 << 25)
-#define VS18_1V8SUP                                    (1 << 26)
-
-/* Driver definitions */
-#define MMCSD_SECTOR_SIZE              (512)
-#define MMC_CARD                               0
-#define SD_CARD                                        1
-#define BYTE_MODE                              0
-#define SECTOR_MODE                            1
-#define CLK_INITSEQ                            0
-#define CLK_400KHZ                             1
-#define CLK_MISC                               2
-
-typedef struct {
-       unsigned int card_type;
-       unsigned int version;
-       unsigned int mode;
-       unsigned int size;
-       unsigned int RCA;
-} mmc_card_data;
-
-#define mmc_reg_out(addr, mask, val) \
-       (addr) = (((addr)) & (~(mask)) ) | ( (val) & (mask));
-
-#endif                         /* MMC_HOST_DEFINITIONS_H */
diff --git a/cpu/omap3/mmc_protocol.h b/cpu/omap3/mmc_protocol.h
deleted file mode 100644 (file)
index 107eb2a..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * (C) Copyright 2008
- * Texas Instruments, <www.ti.com>
- * Syed Mohammed Khasim <khasim@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's version 2 of
- * the License.
- *
- * 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 MMC_PROTOCOL_H
-#define MMC_PROTOCOL_H
-
-#include "mmc_host_def.h"
-
-/* Responses */
-#define RSP_TYPE_NONE  (RSP_TYPE_NORSP   | CCCE_NOCHECK | CICE_NOCHECK)
-#define RSP_TYPE_R1            (RSP_TYPE_LGHT48  | CCCE_CHECK   | CICE_CHECK)
-#define RSP_TYPE_R1B   (RSP_TYPE_LGHT48B | CCCE_CHECK   | CICE_CHECK)
-#define RSP_TYPE_R2            (RSP_TYPE_LGHT136 | CCCE_CHECK   | CICE_NOCHECK)
-#define RSP_TYPE_R3            (RSP_TYPE_LGHT48  | CCCE_NOCHECK | CICE_NOCHECK)
-#define RSP_TYPE_R4            (RSP_TYPE_LGHT48  | CCCE_NOCHECK | CICE_NOCHECK)
-#define RSP_TYPE_R5            (RSP_TYPE_LGHT48  | CCCE_CHECK   | CICE_CHECK)
-#define RSP_TYPE_R6            (RSP_TYPE_LGHT48  | CCCE_CHECK   | CICE_CHECK)
-#define RSP_TYPE_R7     (RSP_TYPE_LGHT48  | CCCE_CHECK   | CICE_CHECK)
-
-/* All supported commands */
-#define MMC_CMD0       (INDEX(0)  | RSP_TYPE_NONE | DP_NO_DATA | DDIR_WRITE)
-#define MMC_CMD1       (INDEX(1)  | RSP_TYPE_R3   | DP_NO_DATA | DDIR_WRITE)
-#define MMC_CMD2       (INDEX(2)  | RSP_TYPE_R2   | DP_NO_DATA | DDIR_WRITE)
-#define MMC_CMD3       (INDEX(3)  | RSP_TYPE_R1   | DP_NO_DATA | DDIR_WRITE)
-#define MMC_SDCMD3     (INDEX(3)  | RSP_TYPE_R6   | DP_NO_DATA | DDIR_WRITE)
-#define MMC_CMD4       (INDEX(4)  | RSP_TYPE_NONE | DP_NO_DATA | DDIR_WRITE)
-#define MMC_CMD6       (INDEX(6)  | RSP_TYPE_R1B  | DP_NO_DATA | DDIR_WRITE)
-#define MMC_CMD7_SELECT        (INDEX(7)  | RSP_TYPE_R1B  | DP_NO_DATA | DDIR_WRITE)
-#define MMC_CMD7_DESELECT \
-       (INDEX(7)  | RSP_TYPE_NONE | DP_NO_DATA | DDIR_WRITE)
-#define MMC_CMD8       (INDEX(8)  | RSP_TYPE_R1   | DP_DATA    | DDIR_READ)
-#define MMC_SDCMD8     (INDEX(8)  | RSP_TYPE_R7   | DP_NO_DATA | DDIR_WRITE)
-#define MMC_CMD9       (INDEX(9)  | RSP_TYPE_R2   | DP_NO_DATA | DDIR_WRITE)
-#define MMC_CMD12      (INDEX(12) | RSP_TYPE_R1B  | DP_NO_DATA | DDIR_WRITE)
-#define MMC_CMD13      (INDEX(13) | RSP_TYPE_R1   | DP_NO_DATA | DDIR_WRITE)
-#define MMC_CMD15      (INDEX(15) | RSP_TYPE_NONE | DP_NO_DATA | DDIR_WRITE)
-#define MMC_CMD16      (INDEX(16) | RSP_TYPE_R1   | DP_NO_DATA | DDIR_WRITE)
-#define MMC_CMD17      (INDEX(17) | RSP_TYPE_R1   | DP_DATA    | DDIR_READ)
-#define MMC_CMD24      (INDEX(24) | RSP_TYPE_R1   | DP_DATA    | DDIR_WRITE)
-#define MMC_ACMD6      (INDEX(6)  | RSP_TYPE_R1   | DP_NO_DATA | DDIR_WRITE)
-#define MMC_ACMD41     (INDEX(41) | RSP_TYPE_R3   | DP_NO_DATA | DDIR_WRITE)
-#define MMC_ACMD51     (INDEX(51) | RSP_TYPE_R1   | DP_DATA    | DDIR_READ)
-#define MMC_CMD55      (INDEX(55) | RSP_TYPE_R1   | DP_NO_DATA | DDIR_WRITE)
-
-#define MMC_AC_CMD_RCA_MASK     (unsigned int)(0xFFFF << 16)
-#define MMC_BC_CMD_DSR_MASK     (unsigned int)(0xFFFF << 16)
-#define MMC_DSR_DEFAULT         (0x0404)
-#define SD_CMD8_CHECK_PATTERN       (0xAA)
-#define SD_CMD8_2_7_3_6_V_RANGE     (0x01 << 8)
-
-/* Clock Configurations and Macros */
-
-#define MMC_CLOCK_REFERENCE            (96)
-#define MMC_RELATIVE_CARD_ADDRESS      (0x1234)
-#define MMC_INIT_SEQ_CLK               (MMC_CLOCK_REFERENCE * 1000 / 80)
-#define MMC_400kHz_CLK                 (MMC_CLOCK_REFERENCE * 1000 / 400)
-#define CLKDR(r, f, u)                 ((((r)*100) / ((f)*(u))) + 1)
-#define CLKD(f, u)                     (CLKDR(MMC_CLOCK_REFERENCE, f, u))
-
-#define MMC_OCR_REG_ACCESS_MODE_MASK   (0x3 << 29)
-#define MMC_OCR_REG_ACCESS_MODE_BYTE    (0x0 << 29)
-#define MMC_OCR_REG_ACCESS_MODE_SECTOR  (0x2 << 29)
-
-#define MMC_OCR_REG_HOST_CAPACITY_SUPPORT_MASK         (0x1 << 30)
-#define MMC_OCR_REG_HOST_CAPACITY_SUPPORT_BYTE         (0x0 << 30)
-#define MMC_OCR_REG_HOST_CAPACITY_SUPPORT_SECTOR       (0x1 << 30)
-
-#define MMC_SD2_CSD_C_SIZE_LSB_MASK         (0xFFFF)
-#define MMC_SD2_CSD_C_SIZE_MSB_MASK         (0x003F)
-#define MMC_SD2_CSD_C_SIZE_MSB_OFFSET       (16)
-#define MMC_CSD_C_SIZE_LSB_MASK             (0x0003)
-#define MMC_CSD_C_SIZE_MSB_MASK             (0x03FF)
-#define MMC_CSD_C_SIZE_MSB_OFFSET           (2)
-
-#define MMC_CSD_TRAN_SPEED_UNIT_MASK        (0x07 << 0)
-#define MMC_CSD_TRAN_SPEED_FACTOR_MASK      (0x0F << 3)
-#define MMC_CSD_TRAN_SPEED_UNIT_100MHZ      (0x3 << 0)
-#define MMC_CSD_TRAN_SPEED_FACTOR_1_0       (0x01 << 3)
-#define MMC_CSD_TRAN_SPEED_FACTOR_8_0       (0x0F << 3)
-
-static const unsigned int tran_exp[] = {
-       10000,          100000,         1000000,        10000000,
-       0,              0,              0,              0
-};
-
-static const unsigned char tran_mant[] = {
-       0,      10,     12,     13,     15,     20,     25,     30,
-       35,     40,     45,     50,     55,     60,     70,     80,
-};
-
-typedef struct {
-       unsigned not_used:1;
-       unsigned crc:7;
-       unsigned ecc:2;
-       unsigned file_format:2;
-       unsigned tmp_write_protect:1;
-       unsigned perm_write_protect:1;
-       unsigned copy:1;
-       unsigned file_format_grp:1;
-       unsigned content_prot_app:1;
-       unsigned reserved_1:4;
-       unsigned write_bl_partial:1;
-       unsigned write_bl_len:4;
-       unsigned r2w_factor:3;
-       unsigned default_ecc:2;
-       unsigned wp_grp_enable:1;
-       unsigned wp_grp_size:5;
-       unsigned erase_grp_mult:5;
-       unsigned erase_grp_size:5;
-       unsigned c_size_mult:3;
-       unsigned vdd_w_curr_max:3;
-       unsigned vdd_w_curr_min:3;
-       unsigned vdd_r_curr_max:3;
-       unsigned vdd_r_curr_min:3;
-       unsigned c_size_lsb:2;
-       unsigned c_size_msb:10;
-       unsigned reserved_2:2;
-       unsigned dsr_imp:1;
-       unsigned read_blk_misalign:1;
-       unsigned write_blk_misalign:1;
-       unsigned read_bl_partial:1;
-       unsigned read_bl_len:4;
-       unsigned ccc:12;
-       unsigned tran_speed:8;
-       unsigned nsac:8;
-       unsigned taac:8;
-       unsigned reserved_3:2;
-       unsigned spec_vers:4;
-       unsigned csd_structure:2;
-} mmc_csd_reg_t;
-
-/* csd for sd2.0 */
-typedef struct {
-       unsigned not_used:1;
-       unsigned crc:7;
-       unsigned reserved_1:2;
-       unsigned file_format:2;
-       unsigned tmp_write_protect:1;
-       unsigned perm_write_protect:1;
-       unsigned copy:1;
-       unsigned file_format_grp:1;
-       unsigned reserved_2:5;
-       unsigned write_bl_partial:1;
-       unsigned write_bl_len:4;
-       unsigned r2w_factor:3;
-       unsigned reserved_3:2;
-       unsigned wp_grp_enable:1;
-       unsigned wp_grp_size:7;
-       unsigned sector_size:7;
-       unsigned erase_blk_len:1;
-       unsigned reserved_4:1;
-       unsigned c_size_lsb:16;
-       unsigned c_size_msb:6;
-       unsigned reserved_5:6;
-       unsigned dsr_imp:1;
-       unsigned read_blk_misalign:1;
-       unsigned write_blk_misalign:1;
-       unsigned read_bl_partial:1;
-       unsigned read_bl_len:4;
-       unsigned ccc:12;
-       unsigned tran_speed:8;
-       unsigned nsac:8;
-       unsigned taac:8;
-       unsigned reserved_6:6;
-       unsigned csd_structure:2;
-} mmc_sd2_csd_reg_t;
-
-/* extended csd - 512 bytes long */
-typedef struct {
-       unsigned char reserved_1[181];
-       unsigned char erasedmemorycontent;
-       unsigned char reserved_2;
-       unsigned char buswidthmode;
-       unsigned char reserved_3;
-       unsigned char highspeedinterfacetiming;
-       unsigned char reserved_4;
-       unsigned char powerclass;
-       unsigned char reserved_5;
-       unsigned char commandsetrevision;
-       unsigned char reserved_6;
-       unsigned char commandset;
-       unsigned char extendedcsdrevision;
-       unsigned char reserved_7;
-       unsigned char csdstructureversion;
-       unsigned char reserved_8;
-       unsigned char cardtype;
-       unsigned char reserved_9[3];
-       unsigned char powerclass_52mhz_1_95v;
-       unsigned char powerclass_26mhz_1_95v;
-       unsigned char powerclass_52mhz_3_6v;
-       unsigned char powerclass_26mhz_3_6v;
-       unsigned char reserved_10;
-       unsigned char minreadperf_4b_26mhz;
-       unsigned char minwriteperf_4b_26mhz;
-       unsigned char minreadperf_8b_26mhz_4b_52mhz;
-       unsigned char minwriteperf_8b_26mhz_4b_52mhz;
-       unsigned char minreadperf_8b_52mhz;
-       unsigned char minwriteperf_8b_52mhz;
-       unsigned char reserved_11;
-       unsigned int sectorcount;
-       unsigned char reserved_12[288];
-       unsigned char supportedcommandsets;
-       unsigned char reserved_13[7];
-} mmc_extended_csd_reg_t;
-
-/* mmc sd responce */
-typedef struct {
-       unsigned int ocr;
-} mmc_resp_r3;
-
-typedef struct {
-       unsigned short cardstatus;
-       unsigned short newpublishedrca;
-} mmc_resp_r6;
-
-extern mmc_card_data mmc_dev;
-
-unsigned char mmc_lowlevel_init(void);
-unsigned char mmc_send_command(unsigned int cmd, unsigned int arg,
-                              unsigned int *response);
-unsigned char mmc_setup_clock(unsigned int iclk, unsigned short clkd);
-unsigned char mmc_set_opendrain(unsigned char state);
-unsigned char mmc_read_data(unsigned int *output_buf);
-
-#endif                         /*MMC_PROTOCOL_H */
index 36b6fb2..c581817 100644 (file)
@@ -26,7 +26,7 @@ include $(TOPDIR)/config.mk
 # CFLAGS += -DET_DEBUG -DDEBUG
 
 LIB    = libdrivers.a
-OBJS   = serial.o ns16550.o onenand.o
+OBJS   = serial.o ns16550.o onenand.o omap24xx_i2c.o
 
 ifeq ($(BOARD), omap3430sdp)
 OBJS   += k9f1g08r0a.o
diff --git a/drivers/omap24xx_i2c.c b/drivers/omap24xx_i2c.c
new file mode 100644 (file)
index 0000000..7782e9d
--- /dev/null
@@ -0,0 +1,354 @@
+/*
+ * Basic I2C functions
+ *
+ * Copyright (c) 2004 Texas Instruments
+ *
+ * This package is free software;  you can redistribute it and/or
+ * modify it under the terms of the license found in the file
+ * named COPYING that should have accompanied this file.
+ *
+ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Author: Jian Zhang jzhang@ti.com, Texas Instruments
+ *
+ * Copyright (c) 2003 Wolfgang Denk, wd@denx.de
+ * Rewritten to fit into the current U-Boot framework
+ *
+ * Adapted for OMAP2420 I2C, r-woodruff2@ti.com
+ *
+ */
+
+#include <common.h>
+
+#if defined(CONFIG_DRIVER_OMAP24XX_I2C) || defined(CONFIG_DRIVER_OMAP34XX_I2C)
+
+#include <asm/arch/i2c.h>
+#include <asm/io.h>
+
+#define inb(a) __raw_readb(a)
+#define outb(a,v) __raw_writeb(a,v)
+#define inw(a) __raw_readw(a)
+#define outw(a,v) __raw_writew(a,v)
+
+static void wait_for_bb (void);
+static u16 wait_for_pin (void);
+static void flush_fifo(void);
+
+void i2c_init (int speed, int slaveadd)
+{
+       u16 scl;
+
+       outw(0x2, I2C_SYSC); /* for ES2 after soft reset */
+       udelay(1000);
+       outw(0x0, I2C_SYSC); /* will probably self clear but */
+
+       if (inw (I2C_CON) & I2C_CON_EN) {
+               outw (0, I2C_CON);
+               udelay (50000);
+       }
+
+       /* 12Mhz I2C module clock */
+       outw (0, I2C_PSC);
+       speed = speed/1000;                 /* 100 or 400 */
+       scl = ((12000/(speed*2)) - 7);  /* use 7 when PSC = 0 */
+       outw (scl, I2C_SCLL);
+       outw (scl, I2C_SCLH);
+       /* own address */
+       outw (slaveadd, I2C_OA);
+       outw (I2C_CON_EN, I2C_CON);
+
+       /* have to enable intrrupts or OMAP i2c module doesn't work */
+       outw (I2C_IE_XRDY_IE | I2C_IE_RRDY_IE | I2C_IE_ARDY_IE |
+             I2C_IE_NACK_IE | I2C_IE_AL_IE, I2C_IE);
+       udelay (1000);
+       flush_fifo();
+       outw (0xFFFF, I2C_STAT);
+       outw (0, I2C_CNT);
+}
+
+static int i2c_read_byte (u8 devaddr, u8 regoffset, u8 * value)
+{
+       int i2c_error = 0;
+       u16 status;
+
+       /* wait until bus not busy */
+       wait_for_bb ();
+
+       /* one byte only */
+       outw (1, I2C_CNT);
+       /* set slave address */
+       outw (devaddr, I2C_SA);
+       /* no stop bit needed here */
+       outw (I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_TRX, I2C_CON);
+
+       status = wait_for_pin ();
+
+       if (status & I2C_STAT_XRDY) {
+               /* Important: have to use byte access */
+               *(volatile u8 *) (I2C_DATA) = regoffset;
+               udelay (20000);
+               if (inw (I2C_STAT) & I2C_STAT_NACK) {
+                       i2c_error = 1;
+               }
+       } else {
+               i2c_error = 1;
+       }
+
+       if (!i2c_error) {
+               /* free bus, otherwise we can't use a combined transction */
+               outw (0, I2C_CON);
+               while (inw (I2C_STAT) || (inw (I2C_CON) & I2C_CON_MST)) {
+                       udelay (10000);
+                       /* Have to clear pending interrupt to clear I2C_STAT */
+                       outw (0xFFFF, I2C_STAT);
+               }
+
+               wait_for_bb ();
+               /* set slave address */
+               outw (devaddr, I2C_SA);
+               /* read one byte from slave */
+               outw (1, I2C_CNT);
+               /* need stop bit here */
+               outw (I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_STP,
+                     I2C_CON);
+
+               status = wait_for_pin ();
+               if (status & I2C_STAT_RRDY) {
+#if defined(CONFIG_OMAP243X) || defined(CONFIG_OMAP34XX)
+                        *value = inb(I2C_DATA);
+#else
+                        *value = inw(I2C_DATA);
+#endif
+                       udelay (20000);
+               } else {
+                       i2c_error = 1;
+               }
+
+               if (!i2c_error) {
+                       outw (I2C_CON_EN, I2C_CON);
+                       while (inw (I2C_STAT)
+                              || (inw (I2C_CON) & I2C_CON_MST)) {
+                               udelay (10000);
+                               outw (0xFFFF, I2C_STAT);
+                       }
+               }
+       }
+       flush_fifo();
+       outw (0xFFFF, I2C_STAT);
+       outw (0, I2C_CNT);
+       return i2c_error;
+}
+
+static int i2c_write_byte (u8 devaddr, u8 regoffset, u8 value)
+{
+       int i2c_error = 0;
+       u16 status, stat;
+
+       /* wait until bus not busy */
+       wait_for_bb ();
+
+       /* two bytes */
+       outw (2, I2C_CNT);
+       /* set slave address */
+       outw (devaddr, I2C_SA);
+       /* stop bit needed here */
+       outw (I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_TRX |
+             I2C_CON_STP, I2C_CON);
+
+       /* wait until state change */
+       status = wait_for_pin ();
+
+       if (status & I2C_STAT_XRDY) {
+#if defined(CONFIG_OMAP243X) || defined(CONFIG_OMAP34XX)
+                /* send out 1 byte */
+                outb(regoffset, I2C_DATA);
+                outw(I2C_STAT_XRDY, I2C_STAT);
+                status = wait_for_pin();
+                if ((status & I2C_STAT_XRDY)) {
+                        /* send out next 1 byte */
+                        outb(value, I2C_DATA);
+                        outw(I2C_STAT_XRDY, I2C_STAT);
+                } else {
+                        i2c_error = 1;
+                }
+#else
+                /* send out two bytes */
+                outw ((value << 8) + regoffset, I2C_DATA);
+#endif
+
+               /* must have enough delay to allow BB bit to go low */
+               udelay (50000);
+               if (inw (I2C_STAT) & I2C_STAT_NACK) {
+                       i2c_error = 1;
+               }
+       } else {
+               i2c_error = 1;
+       }
+
+       if (!i2c_error) {
+               int eout = 200;
+
+               outw (I2C_CON_EN, I2C_CON);
+               while ((stat = inw (I2C_STAT)) || (inw (I2C_CON) & I2C_CON_MST)) {
+                       udelay (1000);
+                       /* have to read to clear intrrupt */
+                       outw (0xFFFF, I2C_STAT);
+                       if(--eout == 0) /* better leave with error than hang */
+                               break;
+               }
+       }
+       flush_fifo();
+       outw (0xFFFF, I2C_STAT);
+       outw (0, I2C_CNT);
+       return i2c_error;
+}
+
+static void flush_fifo(void)
+{      u16 stat;
+
+       /* note: if you try and read data when its not there or ready
+        * you get a bus error
+        */
+       while(1){
+               stat = inw(I2C_STAT);
+               if(stat == I2C_STAT_RRDY){
+#if defined(CONFIG_OMAP243X) || defined(CONFIG_OMAP34XX)
+                        inb(I2C_DATA);
+#else
+                        inw(I2C_DATA);
+#endif
+                       outw(I2C_STAT_RRDY,I2C_STAT);
+                       udelay(1000);
+               }else
+                       break;
+       }
+}
+
+int i2c_probe (uchar chip)
+{
+       int res = 1; /* default = fail */
+
+       if (chip == inw (I2C_OA)) {
+               return res;
+       }
+
+       /* wait until bus not busy */
+       wait_for_bb ();
+
+       /* try to read one byte */
+       outw (1, I2C_CNT);
+       /* set slave address */
+       outw (chip, I2C_SA);
+       /* stop bit needed here */
+       outw (I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_STP, I2C_CON);
+       /* enough delay for the NACK bit set */
+       udelay (50000);
+
+       if (!(inw (I2C_STAT) & I2C_STAT_NACK)) {
+               res = 0;      /* success case */
+               flush_fifo();
+               outw(0xFFFF, I2C_STAT);
+       } else {
+               outw(0xFFFF, I2C_STAT);  /* failue, clear sources*/
+               outw (inw (I2C_CON) | I2C_CON_STP, I2C_CON); /* finish up xfer */
+               udelay(20000);
+               wait_for_bb ();
+       }
+       flush_fifo();
+       outw (0, I2C_CNT); /* don't allow any more data in...we don't want it.*/
+       outw(0xFFFF, I2C_STAT);
+       return res;
+}
+
+int i2c_read (uchar chip, uint addr, int alen, uchar * buffer, int len)
+{
+       int i;
+
+       if (alen > 1) {
+               printf ("I2C read: addr len %d not supported\n", alen);
+               return 1;
+       }
+
+       if (addr + len > 256) {
+               printf ("I2C read: address out of range\n");
+               return 1;
+       }
+
+       for (i = 0; i < len; i++) {
+               if (i2c_read_byte (chip, addr + i, &buffer[i])) {
+                       printf ("I2C read: I/O error\n");
+                       i2c_init (CFG_I2C_SPEED, CFG_I2C_SLAVE);
+                       return 1;
+               }
+       }
+
+       return 0;
+}
+
+int i2c_write (uchar chip, uint addr, int alen, uchar * buffer, int len)
+{
+       int i;
+
+       if (alen > 1) {
+               printf ("I2C read: addr len %d not supported\n", alen);
+               return 1;
+       }
+
+       if (addr + len > 256) {
+               printf ("I2C read: address out of range\n");
+               return 1;
+       }
+
+       for (i = 0; i < len; i++) {
+               if (i2c_write_byte (chip, addr + i, buffer[i])) {
+                       printf ("I2C read: I/O error\n");
+                       i2c_init (CFG_I2C_SPEED, CFG_I2C_SLAVE);
+                       return 1;
+               }
+       }
+
+       return 0;
+}
+
+static void wait_for_bb (void)
+{
+       int timeout = 10;
+       u16 stat;
+
+       outw(0xFFFF, I2C_STAT);  /* clear current interruts...*/
+       while ((stat = inw (I2C_STAT) & I2C_STAT_BB) && timeout--) {
+               outw (stat, I2C_STAT);
+               udelay (50000);
+       }
+
+       if (timeout <= 0) {
+               printf ("timed out in wait_for_bb: I2C_STAT=%x\n",
+                       inw (I2C_STAT));
+       }
+       outw(0xFFFF, I2C_STAT);  /* clear delayed stuff*/
+}
+
+static u16 wait_for_pin (void)
+{
+       u16 status;
+       int timeout = 10;
+
+       do {
+               udelay (1000);
+               status = inw (I2C_STAT);
+       } while (  !(status &
+                  (I2C_STAT_ROVR | I2C_STAT_XUDF | I2C_STAT_XRDY |
+                   I2C_STAT_RRDY | I2C_STAT_ARDY | I2C_STAT_NACK |
+                   I2C_STAT_AL)) && timeout--);
+
+       if (timeout <= 0) {
+               printf ("timed out in wait_for_pin: I2C_STAT=%x\n",
+                       inw (I2C_STAT));
+                       outw(0xFFFF, I2C_STAT);
+}
+       return status;
+}
+
+#endif /* CONFIG_DRIVER_OMAP24XX_I2C */
index a942e69..4f93a96 100644 (file)
 #define S26M           26000000
 #define S38_4M         38400000
 
+#define FCK_IVA2_ON    0x00000001
+#define FCK_CORE1_ON   0x03fffe29
+#define ICK_CORE1_ON   0x3ffffffb
+#define ICK_CORE2_ON   0x0000001f
+#define FCK_WKUP_ON    0x000000e9
+#define ICK_WKUP_ON    0x0000003f
+#define FCK_DSS_ON     0x00000005
+#define ICK_DSS_ON     0x00000001
+#define FCK_CAM_ON     0x00000001
+#define ICK_CAM_ON     0x00000001
+#define FCK_PER_ON     0x0003ffff
+#define ICK_PER_ON     0x0003ffff
+
 #include <asm/arch/clocks343x.h>
 
 #endif
old mode 100755 (executable)
new mode 100644 (file)
index afcda5e..5fb0979
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2004-2006
+ * (C) Copyright 2004-2008
  * Texas Instruments, <www.ti.com>
  *
  * See file CREDITS for list of people who contributed to this
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  * MA 02111-1307 USA
  */
-#ifndef _OMAP34XX_I2C_H_
-#define _OMAP34XX_I2C_H_
-
-/* Get the i2c base addresses */
-#include <asm/arch/cpu.h>
+#ifndef _I2C_H_
+#define _I2C_H_
 
 #define I2C_DEFAULT_BASE I2C_BASE1
 
-#define I2C_REV                 (0x00)
-#define I2C_IE                  (0x04)
-#define I2C_STAT                (0x08)
-#define I2C_IV                  (0x0c)
-#define I2C_BUF                 (0x14)
-#define I2C_CNT                 (0x18)
-#define I2C_DATA                (0x1c)
-#define I2C_SYSC                (0x20) 
-#define I2C_CON                 (0x24)
-#define I2C_OA                  (0x28)
-#define I2C_SA                  (0x2c)
-#define I2C_PSC                 (0x30)
-#define I2C_SCLL                (0x34)
-#define I2C_SCLH                (0x38)
-#define I2C_SYSTEST             (0x3c)
+#define I2C_REV                 (I2C_DEFAULT_BASE + 0x00)
+#define I2C_IE                  (I2C_DEFAULT_BASE + 0x04)
+#define I2C_STAT                (I2C_DEFAULT_BASE + 0x08)
+#define I2C_IV                  (I2C_DEFAULT_BASE + 0x0c)
+#define I2C_BUF                 (I2C_DEFAULT_BASE + 0x14)
+#define I2C_CNT                 (I2C_DEFAULT_BASE + 0x18)
+#define I2C_DATA                (I2C_DEFAULT_BASE + 0x1c)
+#define I2C_SYSC                (I2C_DEFAULT_BASE + 0x20)
+#define I2C_CON                 (I2C_DEFAULT_BASE + 0x24)
+#define I2C_OA                  (I2C_DEFAULT_BASE + 0x28)
+#define I2C_SA                  (I2C_DEFAULT_BASE + 0x2c)
+#define I2C_PSC                 (I2C_DEFAULT_BASE + 0x30)
+#define I2C_SCLL                (I2C_DEFAULT_BASE + 0x34)
+#define I2C_SCLH                (I2C_DEFAULT_BASE + 0x38)
+#define I2C_SYSTEST             (I2C_DEFAULT_BASE + 0x3c)
 
 /* I2C masks */
 
 /* I2C Interrupt Enable Register (I2C_IE): */
 #define I2C_IE_GC_IE    (1 << 5)
-#define I2C_IE_XRDY_IE  (1 << 4)        /* Transmit data ready interrupt enable */
-#define I2C_IE_RRDY_IE  (1 << 3)        /* Receive data ready interrupt enable */
-#define I2C_IE_ARDY_IE  (1 << 2)        /* Register access ready interrupt enable */
-#define I2C_IE_NACK_IE  (1 << 1)        /* No acknowledgment interrupt enable */
-#define I2C_IE_AL_IE    (1 << 0)        /* Arbitration lost interrupt enable */
+#define I2C_IE_XRDY_IE  (1 << 4) /* Transmit data ready interrupt enable */
+#define I2C_IE_RRDY_IE  (1 << 3) /* Receive data ready interrupt enable */
+#define I2C_IE_ARDY_IE  (1 << 2) /* Register access ready interrupt enable */
+#define I2C_IE_NACK_IE  (1 << 1) /* No acknowledgment interrupt enable */
+#define I2C_IE_AL_IE    (1 << 0) /* Arbitration lost interrupt enable */
 
 /* I2C Status Register (I2C_STAT): */
 
-#define I2C_STAT_SBD    (1 << 15)       /* Single byte data */
-#define I2C_STAT_BB     (1 << 12)       /* Bus busy */
-#define I2C_STAT_ROVR   (1 << 11)       /* Receive overrun */
-#define I2C_STAT_XUDF   (1 << 10)       /* Transmit underflow */
-#define I2C_STAT_AAS    (1 << 9)        /* Address as slave */
+#define I2C_STAT_SBD    (1 << 15) /* Single byte data */
+#define I2C_STAT_BB     (1 << 12) /* Bus busy */
+#define I2C_STAT_ROVR   (1 << 11) /* Receive overrun */
+#define I2C_STAT_XUDF   (1 << 10) /* Transmit underflow */
+#define I2C_STAT_AAS    (1 << 9)  /* Address as slave */
 #define I2C_STAT_GC     (1 << 5)
-#define I2C_STAT_XRDY   (1 << 4)        /* Transmit data ready */
-#define I2C_STAT_RRDY   (1 << 3)        /* Receive data ready */
-#define I2C_STAT_ARDY   (1 << 2)        /* Register access ready */
-#define I2C_STAT_NACK   (1 << 1)        /* No acknowledgment interrupt enable */
-#define I2C_STAT_AL     (1 << 0)        /* Arbitration lost interrupt enable */
-
+#define I2C_STAT_XRDY   (1 << 4)  /* Transmit data ready */
+#define I2C_STAT_RRDY   (1 << 3)  /* Receive data ready */
+#define I2C_STAT_ARDY   (1 << 2)  /* Register access ready */
+#define I2C_STAT_NACK   (1 << 1)  /* No acknowledgment interrupt enable */
+#define I2C_STAT_AL     (1 << 0)  /* Arbitration lost interrupt enable */
 
 /* I2C Interrupt Code Register (I2C_INTCODE): */
 
 #define I2C_INTCODE_MASK        7
 #define I2C_INTCODE_NONE        0
-#define I2C_INTCODE_AL          1       /* Arbitration lost */
-#define I2C_INTCODE_NAK         2       /* No acknowledgement/general call */
-#define I2C_INTCODE_ARDY        3       /* Register access ready */
-#define I2C_INTCODE_RRDY        4       /* Rcv data ready */
-#define I2C_INTCODE_XRDY        5       /* Xmit data ready */
+#define I2C_INTCODE_AL          1      /* Arbitration lost */
+#define I2C_INTCODE_NAK         2      /* No acknowledgement/general call */
+#define I2C_INTCODE_ARDY        3      /* Register access ready */
+#define I2C_INTCODE_RRDY        4      /* Rcv data ready */
+#define I2C_INTCODE_XRDY        5      /* Xmit data ready */
 
 /* I2C Buffer Configuration Register (I2C_BUF): */
 
-#define I2C_BUF_RDMA_EN         (1 << 15)       /* Receive DMA channel enable */
-#define I2C_BUF_XDMA_EN         (1 << 7)        /* Transmit DMA channel enable */
+#define I2C_BUF_RDMA_EN         (1 << 15) /* Receive DMA channel enable */
+#define I2C_BUF_XDMA_EN         (1 << 7)  /* Transmit DMA channel enable */
 
 /* I2C Configuration Register (I2C_CON): */
 
-#define I2C_CON_EN      (1 << 15)       /* I2C module enable */
-#define I2C_CON_BE      (1 << 14)       /* Big endian mode */
-#define I2C_CON_STB     (1 << 11)       /* Start byte mode (master mode only) */
-#define I2C_CON_MST     (1 << 10)       /* Master/slave mode */
-#define I2C_CON_TRX     (1 << 9)        /* Transmitter/receiver mode (master mode only) */
-#define I2C_CON_XA      (1 << 8)        /* Expand address */
-#define I2C_CON_STP     (1 << 1)        /* Stop condition (master mode only) */
-#define I2C_CON_STT     (1 << 0)        /* Start condition (master mode only) */
+#define I2C_CON_EN      (1 << 15)  /* I2C module enable */
+#define I2C_CON_BE      (1 << 14)  /* Big endian mode */
+#define I2C_CON_STB     (1 << 11)  /* Start byte mode (master mode only) */
+#define I2C_CON_MST     (1 << 10)  /* Master/slave mode */
+#define I2C_CON_TRX     (1 << 9)   /* Transmitter/receiver mode /*
+                                  /* (master mode only) */
+#define I2C_CON_XA      (1 << 8)   /* Expand address */
+#define I2C_CON_STP     (1 << 1)   /* Stop condition (master mode only) */
+#define I2C_CON_STT     (1 << 0)   /* Start condition (master mode only) */
 
 /* I2C System Test Register (I2C_SYSTEST): */
 
-#define I2C_SYSTEST_ST_EN       (1 << 15)       /* System test enable */
-#define I2C_SYSTEST_FREE        (1 << 14)       /* Free running mode (on breakpoint) */
-#define I2C_SYSTEST_TMODE_MASK  (3 << 12)       /* Test mode select */
-#define I2C_SYSTEST_TMODE_SHIFT (12)            /* Test mode select */
-#define I2C_SYSTEST_SCL_I       (1 << 3)        /* SCL line sense input value */
-#define I2C_SYSTEST_SCL_O       (1 << 2)        /* SCL line drive output value */
-#define I2C_SYSTEST_SDA_I       (1 << 1)        /* SDA line sense input value */
-#define I2C_SYSTEST_SDA_O       (1 << 0)        /* SDA line drive output value */
+#define I2C_SYSTEST_ST_EN       (1 << 15) /* System test enable */
+#define I2C_SYSTEST_FREE        (1 << 14) /* Free running mode, on brkpoint) */
+#define I2C_SYSTEST_TMODE_MASK  (3 << 12) /* Test mode select */
+#define I2C_SYSTEST_TMODE_SHIFT (12)     /* Test mode select */
+#define I2C_SYSTEST_SCL_I       (1 << 3)  /* SCL line sense input value */
+#define I2C_SYSTEST_SCL_O       (1 << 2)  /* SCL line drive output value */
+#define I2C_SYSTEST_SDA_I       (1 << 1)  /* SDA line sense input value */
+#define I2C_SYSTEST_SDA_O       (1 << 0)  /* SDA line drive output value */
 
 #define I2C_SCLL_SCLL        (0)
 #define I2C_SCLL_SCLL_M      (0xFF)
 #define I2C_SCLH_HSSCLH      (8)
 #define I2C_SCLH_HSSCLH_M    (0xFF)
 
-#define OMAP_I2C_STANDARD          100
-#define OMAP_I2C_FAST_MODE         400
-#define OMAP_I2C_HIGH_SPEED        3400
+#define OMAP_I2C_STANDARD    100
+#define OMAP_I2C_FAST_MODE   400
+#define OMAP_I2C_HIGH_SPEED  3400
 
-#define SYSTEM_CLOCK_12       12000
-#define SYSTEM_CLOCK_13       13000
-#define SYSTEM_CLOCK_192      19200
-#define SYSTEM_CLOCK_96       96000
+#define SYSTEM_CLOCK_12      12000
+#define SYSTEM_CLOCK_13      13000
+#define SYSTEM_CLOCK_192     19200
+#define SYSTEM_CLOCK_96      96000
 
 #define I2C_IP_CLK SYSTEM_CLOCK_96
 #define I2C_PSC_MAX          (0x0f)
 #define I2C_PSC_MIN          (0x00)
 
-#endif
+#endif /* _I2C_H_ */
old mode 100755 (executable)
new mode 100644 (file)
index 7bceb5f..8631aae
 /*
- *  linux/drivers/mmc/mmc_pxa.h
+ * (C) Copyright 2008
+ * Texas Instruments, <www.ti.com>
+ * Syed Mohammed Khasim <khasim@ti.com>
  *
- *  Author: Vladimir Shebordaev, Igor Oblakov
- *  Copyright:  MontaVista Software Inc.
+ * See file CREDITS for list of people who contributed to this
+ * project.
  *
- *  $Id: mmc_pxa.h,v 0.3.1.6 2002/09/25 19:25:48 ted Exp ted $
+ * 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's version 2 of
+ * the License.
  *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License version 2 as
- *  published by the Free Software Foundation.
+ * 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 __MMC_PXA_P_H__
-#define __MMC_PXA_P_H__
-
-/* PXA-250 MMC controller registers */
-
-/* MMC_STRPCL */
-#define MMC_STRPCL_STOP_CLK            (0x0001UL)
-#define MMC_STRPCL_START_CLK           (0x0002UL)
-
-/* MMC_STAT */
-
-#define MMC_STAT_ERRORS (MMC_STAT_RES_CRC_ERROR | MMC_STAT_SPI_READ_ERROR_TOKEN\
-       | MMC_STAT_CRC_READ_ERROR | MMC_STAT_TIME_OUT_RESPONSE \
-       | MMC_STAT_READ_TIME_OUT | MMC_STAT_CRC_WRITE_ERROR)
-
-/* MMC_CLKRT */
-#define MMC_CLKRT_20MHZ                        (0x0000UL)
-#define MMC_CLKRT_10MHZ                        (0x0001UL)
-#define MMC_CLKRT_5MHZ                 (0x0002UL)
-#define MMC_CLKRT_2_5MHZ               (0x0003UL)
-#define MMC_CLKRT_1_25MHZ              (0x0004UL)
-#define MMC_CLKRT_0_625MHZ             (0x0005UL)
-#define MMC_CLKRT_0_3125MHZ            (0x0006UL)
-
-/* MMC_SPI */
-#define MMC_SPI_DISABLE                        (0x00UL)
-#define MMC_SPI_EN                     (0x01UL)
-#define MMC_SPI_CS_EN                  (0x01UL << 2)
-#define MMC_SPI_CS_ADDRESS             (0x01UL << 3)
-#define MMC_SPI_CRC_ON                 (0x01UL << 1)
-
-/* MMC_CMDAT */
-#define MMC_CMDAT_MMC_DMA_EN           (0x0001UL << 7)
-#define MMC_CMDAT_INIT                 (0x0001UL << 6)
-#define MMC_CMDAT_BUSY                 (0x0001UL << 5)
-#define MMC_CMDAT_STREAM               (0x0001UL << 4)
-#define MMC_CMDAT_BLOCK                        (0x0000UL << 4)
-#define MMC_CMDAT_WRITE                        (0x0001UL << 3)
-#define MMC_CMDAT_READ                 (0x0000UL << 3)
-#define MMC_CMDAT_DATA_EN              (0x0001UL << 2)
-#define MMC_CMDAT_R1                   (0x0001UL)
-#define MMC_CMDAT_R2                   (0x0002UL)
-#define MMC_CMDAT_R3                   (0x0003UL)
-
-/* MMC_RESTO */
-#define MMC_RES_TO_MAX                 (0x007fUL) /* [6:0] */
-
-/* MMC_RDTO */
-#define MMC_READ_TO_MAX                        (0x0ffffUL) /* [15:0] */
-
-/* MMC_BLKLEN */
-#define MMC_BLK_LEN_MAX                        (0x03ffUL) /* [9:0] */
-
-/* MMC_PRTBUF */
-#define MMC_PRTBUF_BUF_PART_FULL               (0x01UL)
-#define MMC_PRTBUF_BUF_FULL            (0x00UL)
-
-/* MMC_I_MASK */
-#define MMC_I_MASK_TXFIFO_WR_REQ       (0x01UL << 6)
-#define MMC_I_MASK_RXFIFO_RD_REQ       (0x01UL << 5)
-#define MMC_I_MASK_CLK_IS_OFF          (0x01UL << 4)
-#define MMC_I_MASK_STOP_CMD            (0x01UL << 3)
-#define MMC_I_MASK_END_CMD_RES         (0x01UL << 2)
-#define MMC_I_MASK_PRG_DONE            (0x01UL << 1)
-#define MMC_I_MASK_DATA_TRAN_DONE       (0x01UL)
-#define MMC_I_MASK_ALL                 (0x07fUL)
-
-
-/* MMC_I_REG */
-#define MMC_I_REG_TXFIFO_WR_REQ        (0x01UL << 6)
-#define MMC_I_REG_RXFIFO_RD_REQ        (0x01UL << 5)
-#define MMC_I_REG_CLK_IS_OFF           (0x01UL << 4)
-#define MMC_I_REG_STOP_CMD             (0x01UL << 3)
-#define MMC_I_REG_END_CMD_RES          (0x01UL << 2)
-#define MMC_I_REG_PRG_DONE             (0x01UL << 1)
-#define MMC_I_REG_DATA_TRAN_DONE       (0x01UL)
-#define MMC_I_REG_ALL                  (0x007fUL)
-
-/* MMC_CMD */
-#define MMC_CMD_INDEX_MAX              (0x006fUL)  /* [5:0] */
-#define CMD(x)  (x)
-
-#define MMC_DEFAULT_RCA                        1
-
-#define MMC_BLOCK_SIZE                 512
-#define MMC_CMD_RESET                  0
-#define MMC_CMD_SEND_OP_COND           1
-#define MMC_CMD_ALL_SEND_CID           2
-#define MMC_CMD_SET_RCA                        3
-#define MMC_CMD_SEND_CSD               9
-#define MMC_CMD_SEND_CID               10
-#define MMC_CMD_SEND_STATUS            13
-#define MMC_CMD_SET_BLOCKLEN           16
-#define MMC_CMD_READ_BLOCK             17
-#define MMC_CMD_RD_BLK_MULTI           18
-#define MMC_CMD_WRITE_BLOCK            24
-
-#define MMC_MAX_BLOCK_SIZE             512
-
-#define MMC_R1_IDLE_STATE              0x01
-#define MMC_R1_ERASE_STATE             0x02
-#define MMC_R1_ILLEGAL_CMD             0x04
-#define MMC_R1_COM_CRC_ERR             0x08
-#define MMC_R1_ERASE_SEQ_ERR           0x01
-#define MMC_R1_ADDR_ERR                        0x02
-#define MMC_R1_PARAM_ERR               0x04
-
-#define MMC_R1B_WP_ERASE_SKIP          0x0002
-#define MMC_R1B_ERR                    0x0004
-#define MMC_R1B_CC_ERR                 0x0008
-#define MMC_R1B_CARD_ECC_ERR           0x0010
-#define MMC_R1B_WP_VIOLATION           0x0020
-#define MMC_R1B_ERASE_PARAM            0x0040
-#define MMC_R1B_OOR                    0x0080
-#define MMC_R1B_IDLE_STATE             0x0100
-#define MMC_R1B_ERASE_RESET            0x0200
-#define MMC_R1B_ILLEGAL_CMD            0x0400
-#define MMC_R1B_COM_CRC_ERR            0x0800
-#define MMC_R1B_ERASE_SEQ_ERR          0x1000
-#define MMC_R1B_ADDR_ERR               0x2000
-#define MMC_R1B_PARAM_ERR              0x4000
-
-typedef struct mmc_cid {
-/* FIXME: BYTE_ORDER */
-       unsigned char year:4,
-               month:4;
-       unsigned char sn[3];
-       unsigned char fwrev:4,
-               hwrev:4;
-       unsigned char name[6];
-       unsigned char id[3];
-} mmc_cid_t;
-
-typedef struct mmc_csd
-{
-       unsigned char   ecc:2,
-               file_format:2,
-               tmp_write_protect:1,
-               perm_write_protect:1,
-               copy:1,
-               file_format_grp:1;
-       unsigned long int content_prot_app:1,
-               rsvd3:4,
-               write_bl_partial:1,
-               write_bl_len:4,
-               r2w_factor:3,
-               default_ecc:2,
-               wp_grp_enable:1,
-               wp_grp_size:5,
-               erase_grp_mult:5,
-               erase_grp_size:5,
-               c_size_mult1:3,
-               vdd_w_curr_max:3,
-               vdd_w_curr_min:3,
-               vdd_r_curr_max:3,
-               vdd_r_curr_min:3,
-               c_size:12,
-               rsvd2:2,
-               dsr_imp:1,
-               read_blk_misalign:1,
-               write_blk_misalign:1,
-               read_bl_partial:1;
-
-       unsigned short  read_bl_len:4,
-               ccc:12;
-       unsigned char   tran_speed;
-       unsigned char   nsac;
-       unsigned char   taac;
-       unsigned char   rsvd1:2,
-               spec_vers:4,
-               csd_structure:2;
-} mmc_csd_t;
-
-
-#endif /* __MMC_PXA_P_H__ */
+
+#ifndef MMC_H
+#define MMC_H
+
+#include "mmc_host_def.h"
+
+/* Responses */
+#define RSP_TYPE_NONE    (RSP_TYPE_NORSP   | CCCE_NOCHECK | CICE_NOCHECK)
+#define RSP_TYPE_R1      (RSP_TYPE_LGHT48  | CCCE_CHECK   | CICE_CHECK)
+#define RSP_TYPE_R1B     (RSP_TYPE_LGHT48B | CCCE_CHECK   | CICE_CHECK)
+#define RSP_TYPE_R2      (RSP_TYPE_LGHT136 | CCCE_CHECK   | CICE_NOCHECK)
+#define RSP_TYPE_R3      (RSP_TYPE_LGHT48  | CCCE_NOCHECK | CICE_NOCHECK)
+#define RSP_TYPE_R4      (RSP_TYPE_LGHT48  | CCCE_NOCHECK | CICE_NOCHECK)
+#define RSP_TYPE_R5      (RSP_TYPE_LGHT48  | CCCE_CHECK   | CICE_CHECK)
+#define RSP_TYPE_R6      (RSP_TYPE_LGHT48  | CCCE_CHECK   | CICE_CHECK)
+#define RSP_TYPE_R7      (RSP_TYPE_LGHT48  | CCCE_CHECK   | CICE_CHECK)
+
+/* All supported commands */
+#define MMC_CMD0          (INDEX(0)  | RSP_TYPE_NONE | DP_NO_DATA | DDIR_WRITE)
+#define MMC_CMD1          (INDEX(1)  | RSP_TYPE_R3   | DP_NO_DATA | DDIR_WRITE)
+#define MMC_CMD2          (INDEX(2)  | RSP_TYPE_R2   | DP_NO_DATA | DDIR_WRITE)
+#define MMC_CMD3          (INDEX(3)  | RSP_TYPE_R1   | DP_NO_DATA | DDIR_WRITE)
+#define MMC_SDCMD3        (INDEX(3)  | RSP_TYPE_R6   | DP_NO_DATA | DDIR_WRITE)
+#define MMC_CMD4          (INDEX(4)  | RSP_TYPE_NONE | DP_NO_DATA | DDIR_WRITE)
+#define MMC_CMD6          (INDEX(6)  | RSP_TYPE_R1B  | DP_NO_DATA | DDIR_WRITE)
+#define MMC_CMD7_SELECT   (INDEX(7)  | RSP_TYPE_R1B  | DP_NO_DATA | DDIR_WRITE)
+#define MMC_CMD7_DESELECT (INDEX(7)  | RSP_TYPE_NONE | DP_NO_DATA | DDIR_WRITE)
+#define MMC_CMD8          (INDEX(8)  | RSP_TYPE_R1   | DP_DATA    | DDIR_READ)
+#define MMC_SDCMD8        (INDEX(8)  | RSP_TYPE_R7   | DP_NO_DATA | DDIR_WRITE)
+#define MMC_CMD9          (INDEX(9)  | RSP_TYPE_R2   | DP_NO_DATA | DDIR_WRITE)
+#define MMC_CMD12         (INDEX(12) | RSP_TYPE_R1B  | DP_NO_DATA | DDIR_WRITE)
+#define MMC_CMD13         (INDEX(13) | RSP_TYPE_R1   | DP_NO_DATA | DDIR_WRITE)
+#define MMC_CMD15         (INDEX(15) | RSP_TYPE_NONE | DP_NO_DATA | DDIR_WRITE)
+#define MMC_CMD16         (INDEX(16) | RSP_TYPE_R1   | DP_NO_DATA | DDIR_WRITE)
+#define MMC_CMD17         (INDEX(17) | RSP_TYPE_R1   | DP_DATA    | DDIR_READ)
+#define MMC_CMD24         (INDEX(24) | RSP_TYPE_R1   | DP_DATA    | DDIR_WRITE)
+#define MMC_ACMD6         (INDEX(6)  | RSP_TYPE_R1   | DP_NO_DATA | DDIR_WRITE)
+#define MMC_ACMD41        (INDEX(41) | RSP_TYPE_R3   | DP_NO_DATA | DDIR_WRITE)
+#define MMC_ACMD51        (INDEX(51) | RSP_TYPE_R1   | DP_DATA    | DDIR_READ)
+#define MMC_CMD55         (INDEX(55) | RSP_TYPE_R1   | DP_NO_DATA | DDIR_WRITE)
+
+#define MMC_AC_CMD_RCA_MASK     (unsigned int)(0xFFFF << 16)
+#define MMC_BC_CMD_DSR_MASK     (unsigned int)(0xFFFF << 16)
+#define MMC_DSR_DEFAULT         (0x0404)
+#define SD_CMD8_CHECK_PATTERN  (0xAA)
+#define SD_CMD8_2_7_3_6_V_RANGE        (0x01 << 8)
+
+/* Clock Configurations and Macros */
+
+#define MMC_CLOCK_REFERENCE            (96)
+#define MMC_RELATIVE_CARD_ADDRESS      (0x1234)
+#define MMC_INIT_SEQ_CLK               (MMC_CLOCK_REFERENCE * 1000 / 80)
+#define MMC_400kHz_CLK                 (MMC_CLOCK_REFERENCE * 1000 / 400)
+#define CLKDR(r, f, u)                 ((((r)*100) / ((f)*(u))) + 1)
+#define CLKD(f, u)                     (CLKDR(MMC_CLOCK_REFERENCE, f, u))
+
+#define MMC_OCR_REG_ACCESS_MODE_MASK                   (0x3 << 29)
+#define MMC_OCR_REG_ACCESS_MODE_BYTE                   (0x0 << 29)
+#define MMC_OCR_REG_ACCESS_MODE_SECTOR                 (0x2 << 29)
+
+#define MMC_OCR_REG_HOST_CAPACITY_SUPPORT_MASK         (0x1 << 30)
+#define MMC_OCR_REG_HOST_CAPACITY_SUPPORT_BYTE         (0x0 << 30)
+#define MMC_OCR_REG_HOST_CAPACITY_SUPPORT_SECTOR       (0x1 << 30)
+
+#define MMC_SD2_CSD_C_SIZE_LSB_MASK         (0xFFFF)
+#define MMC_SD2_CSD_C_SIZE_MSB_MASK         (0x003F)
+#define MMC_SD2_CSD_C_SIZE_MSB_OFFSET       (16)
+#define MMC_CSD_C_SIZE_LSB_MASK             (0x0003)
+#define MMC_CSD_C_SIZE_MSB_MASK             (0x03FF)
+#define MMC_CSD_C_SIZE_MSB_OFFSET           (2)
+
+#define MMC_CSD_TRAN_SPEED_UNIT_MASK        (0x07 << 0)
+#define MMC_CSD_TRAN_SPEED_FACTOR_MASK      (0x0F << 3)
+#define MMC_CSD_TRAN_SPEED_UNIT_100MHZ      (0x3 << 0)
+#define MMC_CSD_TRAN_SPEED_FACTOR_1_0       (0x01 << 3)
+#define MMC_CSD_TRAN_SPEED_FACTOR_8_0       (0x0F << 3)
+
+typedef struct {
+       unsigned not_used:1;
+       unsigned crc:7;
+       unsigned ecc:2;
+       unsigned file_format:2;
+       unsigned tmp_write_protect:1;
+       unsigned perm_write_protect:1;
+       unsigned copy:1;
+       unsigned file_format_grp:1;
+       unsigned content_prot_app:1;
+       unsigned reserved_1:4;
+       unsigned write_bl_partial:1;
+       unsigned write_bl_len:4;
+       unsigned r2w_factor:3;
+       unsigned default_ecc:2;
+       unsigned wp_grp_enable:1;
+       unsigned wp_grp_size:5;
+       unsigned erase_grp_mult:5;
+       unsigned erase_grp_size:5;
+       unsigned c_size_mult:3;
+       unsigned vdd_w_curr_max:3;
+       unsigned vdd_w_curr_min:3;
+       unsigned vdd_r_curr_max:3;
+       unsigned vdd_r_curr_min:3;
+       unsigned c_size_lsb:2;
+       unsigned c_size_msb:10;
+       unsigned reserved_2:2;
+       unsigned dsr_imp:1;
+       unsigned read_blk_misalign:1;
+       unsigned write_blk_misalign:1;
+       unsigned read_bl_partial:1;
+       unsigned read_bl_len:4;
+       unsigned ccc:12;
+       unsigned tran_speed:8;
+       unsigned nsac:8;
+       unsigned taac:8;
+       unsigned reserved_3:2;
+       unsigned spec_vers:4;
+       unsigned csd_structure:2;
+} mmc_csd_reg_t;
+
+/* csd for sd2.0 */
+typedef struct {
+       unsigned not_used:1;
+       unsigned crc:7;
+       unsigned reserved_1:2;
+       unsigned file_format:2;
+       unsigned tmp_write_protect:1;
+       unsigned perm_write_protect:1;
+       unsigned copy:1;
+       unsigned file_format_grp:1;
+       unsigned reserved_2:5;
+       unsigned write_bl_partial:1;
+       unsigned write_bl_len:4;
+       unsigned r2w_factor:3;
+       unsigned reserved_3:2;
+       unsigned wp_grp_enable:1;
+       unsigned wp_grp_size:7;
+       unsigned sector_size:7;
+       unsigned erase_blk_len:1;
+       unsigned reserved_4:1;
+       unsigned c_size_lsb:16;
+       unsigned c_size_msb:6;
+       unsigned reserved_5:6;
+       unsigned dsr_imp:1;
+       unsigned read_blk_misalign:1;
+       unsigned write_blk_misalign:1;
+       unsigned read_bl_partial:1;
+       unsigned read_bl_len:4;
+       unsigned ccc:12;
+       unsigned tran_speed:8;
+       unsigned nsac:8;
+       unsigned taac:8;
+       unsigned reserved_6:6;
+       unsigned csd_structure:2;
+} mmc_sd2_csd_reg_t;
+
+/* extended csd - 512 bytes long */
+typedef struct {
+       unsigned char reserved_1[181];
+       unsigned char erasedmemorycontent;
+       unsigned char reserved_2;
+       unsigned char buswidthmode;
+       unsigned char reserved_3;
+       unsigned char highspeedinterfacetiming;
+       unsigned char reserved_4;
+       unsigned char powerclass;
+       unsigned char reserved_5;
+       unsigned char commandsetrevision;
+       unsigned char reserved_6;
+       unsigned char commandset;
+       unsigned char extendedcsdrevision;
+       unsigned char reserved_7;
+       unsigned char csdstructureversion;
+       unsigned char reserved_8;
+       unsigned char cardtype;
+       unsigned char reserved_9[3];
+       unsigned char powerclass_52mhz_1_95v;
+       unsigned char powerclass_26mhz_1_95v;
+       unsigned char powerclass_52mhz_3_6v;
+       unsigned char powerclass_26mhz_3_6v;
+       unsigned char reserved_10;
+       unsigned char minreadperf_4b_26mhz;
+       unsigned char minwriteperf_4b_26mhz;
+       unsigned char minreadperf_8b_26mhz_4b_52mhz;
+       unsigned char minwriteperf_8b_26mhz_4b_52mhz;
+       unsigned char minreadperf_8b_52mhz;
+       unsigned char minwriteperf_8b_52mhz;
+       unsigned char reserved_11;
+       unsigned int sectorcount;
+       unsigned char reserved_12[288];
+       unsigned char supportedcommandsets;
+       unsigned char reserved_13[7];
+} mmc_extended_csd_reg_t;
+
+/* mmc sd responce */
+typedef struct {
+       unsigned int ocr;
+} mmc_resp_r3;
+
+typedef struct {
+       unsigned short cardstatus;
+       unsigned short newpublishedrca;
+} mmc_resp_r6;
+
+extern mmc_card_data mmc_dev;
+
+unsigned char mmc_lowlevel_init(void);
+unsigned char mmc_send_command(unsigned int cmd, unsigned int arg,
+                              unsigned int *response);
+unsigned char mmc_setup_clock(unsigned int iclk, unsigned short clkd);
+unsigned char mmc_set_opendrain(unsigned char state);
+unsigned char mmc_read_data(unsigned int *output_buf);
+
+#endif /* MMC_H */
diff --git a/include/asm/arch-omap3/mmc_host_def.h b/include/asm/arch-omap3/mmc_host_def.h
new file mode 100644 (file)
index 0000000..37aaa08
--- /dev/null
@@ -0,0 +1,166 @@
+/*
+ * (C) Copyright 2008
+ * Texas Instruments, <www.ti.com>
+ * Syed Mohammed Khasim <khasim@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's version 2 of
+ * the License.
+ *
+ * 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 MMC_HOST_DEF_H
+#define MMC_HOST_DEF_H
+
+/*
+ * OMAP HSMMC register definitions
+ */
+#define OMAP_HSMMC_SYSCONFIG           (*(unsigned int *) 0x4809C010)
+#define OMAP_HSMMC_SYSSTATUS           (*(unsigned int *) 0x4809C014)
+#define OMAP_HSMMC_CON                 (*(unsigned int *) 0x4809C02C)
+#define OMAP_HSMMC_BLK                 (*(unsigned int *) 0x4809C104)
+#define OMAP_HSMMC_ARG                 (*(unsigned int *) 0x4809C108)
+#define OMAP_HSMMC_CMD                 (*(unsigned int *) 0x4809C10C)
+#define OMAP_HSMMC_RSP10               (*(unsigned int *) 0x4809C110)
+#define OMAP_HSMMC_RSP32               (*(unsigned int *) 0x4809C114)
+#define OMAP_HSMMC_RSP54               (*(unsigned int *) 0x4809C118)
+#define OMAP_HSMMC_RSP76               (*(unsigned int *) 0x4809C11C)
+#define OMAP_HSMMC_DATA                        (*(unsigned int *) 0x4809C120)
+#define OMAP_HSMMC_PSTATE              (*(unsigned int *) 0x4809C124)
+#define OMAP_HSMMC_HCTL                        (*(unsigned int *) 0x4809C128)
+#define OMAP_HSMMC_SYSCTL              (*(unsigned int *) 0x4809C12C)
+#define OMAP_HSMMC_STAT                        (*(unsigned int *) 0x4809C130)
+#define OMAP_HSMMC_IE                  (*(unsigned int *) 0x4809C134)
+#define OMAP_HSMMC_CAPA                        (*(unsigned int *) 0x4809C140)
+
+/* T2 Register definitions */
+#define CONTROL_DEV_CONF0              (*(unsigned int *) 0x48002274)
+#define CONTROL_PBIAS_LITE             (*(unsigned int *) 0x48002520)
+
+/*
+ * OMAP HS MMC Bit definitions
+ */
+#define MMC_SOFTRESET                  (0x1 << 1)
+#define RESETDONE                      (0x1 << 0)
+#define NOOPENDRAIN                    (0x0 << 0)
+#define OPENDRAIN                      (0x1 << 0)
+#define OD                             (0x1 << 0)
+#define INIT_NOINIT                    (0x0 << 1)
+#define INIT_INITSTREAM                        (0x1 << 1)
+#define HR_NOHOSTRESP                  (0x0 << 2)
+#define STR_BLOCK                      (0x0 << 3)
+#define MODE_FUNC                      (0x0 << 4)
+#define DW8_1_4BITMODE                         (0x0 << 5)
+#define MIT_CTO                                (0x0 << 6)
+#define CDP_ACTIVEHIGH                 (0x0 << 7)
+#define WPP_ACTIVEHIGH                         (0x0 << 8)
+#define RESERVED_MASK                  (0x3 << 9)
+#define CTPL_MMC_SD                    (0x0 << 11)
+#define BLEN_512BYTESLEN               (0x200 << 0)
+#define NBLK_STPCNT                    (0x0 << 16)
+#define DE_DISABLE                     (0x0 << 0)
+#define BCE_DISABLE                    (0x0 << 1)
+#define ACEN_DISABLE                   (0x0 << 2)
+#define DDIR_OFFSET                    (4)
+#define DDIR_MASK                      (0x1 << 4)
+#define DDIR_WRITE                     (0x0 << 4)
+#define DDIR_READ                      (0x1 << 4)
+#define MSBS_SGLEBLK                   (0x0 << 5)
+#define RSP_TYPE_OFFSET                        (16)
+#define RSP_TYPE_MASK                  (0x3 << 16)
+#define RSP_TYPE_NORSP                 (0x0 << 16)
+#define RSP_TYPE_LGHT136               (0x1 << 16)
+#define RSP_TYPE_LGHT48                        (0x2 << 16)
+#define RSP_TYPE_LGHT48B               (0x3 << 16)
+#define CCCE_NOCHECK                   (0x0 << 19)
+#define CCCE_CHECK                     (0x1 << 19)
+#define CICE_NOCHECK                   (0x0 << 20)
+#define CICE_CHECK                     (0x1 << 20)
+#define DP_OFFSET                      (21)
+#define DP_MASK                                (0x1 << 21)
+#define DP_NO_DATA                     (0x0 << 21)
+#define DP_DATA                                (0x1 << 21)
+#define CMD_TYPE_NORMAL                        (0x0 << 22)
+#define INDEX_OFFSET                   (24)
+#define INDEX_MASK                     (0x3f << 24)
+#define INDEX(i)                       (i << 24)
+#define DATI_MASK                      (0x1 << 1)
+#define DATI_CMDDIS                    (0x1 << 1)
+#define DTW_1_BITMODE                  (0x0 << 1)
+#define DTW_4_BITMODE                  (0x1 << 1)
+#define SDBP_PWROFF                    (0x0 << 8)
+#define SDBP_PWRON                     (0x1 << 8)
+#define SDVS_1V8                       (0x5 << 9)
+#define SDVS_3V0                       (0x6 << 9)
+#define ICE_MASK                       (0x1 << 0)
+#define ICE_STOP                       (0x0 << 0)
+#define ICS_MASK                       (0x1 << 1)
+#define ICS_NOTREADY                   (0x0 << 1)
+#define ICE_OSCILLATE                  (0x1 << 0)
+#define CEN_MASK                       (0x1 << 2)
+#define CEN_DISABLE                    (0x0 << 2)
+#define CEN_ENABLE                     (0x1 << 2)
+#define CLKD_OFFSET                    (6)
+#define CLKD_MASK                      (0x3FF << 6)
+#define DTO_MASK                       (0xF << 16)
+#define DTO_15THDTO                    (0xE << 16)
+#define SOFTRESETALL                   (0x1 << 24)
+#define CC_MASK                                (0x1 << 0)
+#define TC_MASK                                (0x1 << 1)
+#define BWR_MASK                       (0x1 << 4)
+#define BRR_MASK                       (0x1 << 5)
+#define ERRI_MASK                      (0x1 << 15)
+#define IE_CC                          (0x01 << 0)
+#define IE_TC                          (0x01 << 1)
+#define IE_BWR                         (0x01 << 4)
+#define IE_BRR                         (0x01 << 5)
+#define IE_CTO                         (0x01 << 16)
+#define IE_CCRC                                (0x01 << 17)
+#define IE_CEB                         (0x01 << 18)
+#define IE_CIE                         (0x01 << 19)
+#define IE_DTO                         (0x01 << 20)
+#define IE_DCRC                                (0x01 << 21)
+#define IE_DEB                         (0x01 << 22)
+#define IE_CERR                                (0x01 << 28)
+#define IE_BADA                                (0x01 << 29)
+
+#define VS30_3V0SUP                    (1 << 25)
+#define VS18_1V8SUP                    (1 << 26)
+
+/* Driver definitions */
+#define MMCSD_SECTOR_SIZE              (512)
+#define MMC_CARD                       0
+#define SD_CARD                                1
+#define BYTE_MODE                      0
+#define SECTOR_MODE                    1
+#define CLK_INITSEQ                    0
+#define CLK_400KHZ                     1
+#define CLK_MISC                       2
+
+typedef struct {
+       unsigned int card_type;
+       unsigned int version;
+       unsigned int mode;
+       unsigned int size;
+       unsigned int RCA;
+} mmc_card_data;
+
+#define mmc_reg_out(addr, mask, val)\
+       (addr) = (((addr)) & (~(mask))) | ((val) & (mask));
+#define mmc_reg_out(addr, mask, val)\
+       (addr) = (((addr)) & (~(mask))) | ((val) & (mask));
+
+#endif /* MMC_HOST_DEF_H */
diff --git a/include/asm/io.h b/include/asm/io.h
new file mode 100644 (file)
index 0000000..f4ae307
--- /dev/null
@@ -0,0 +1,335 @@
+/*
+ *  linux/include/asm-arm/io.h
+ *
+ *  Copyright (C) 1996-2000 Russell King
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Modifications:
+ *  16-Sep-1996        RMK     Inlined the inx/outx functions & optimised for both
+ *                     constant addresses and variable addresses.
+ *  04-Dec-1997        RMK     Moved a lot of this stuff to the new architecture
+ *                     specific IO header files.
+ *  27-Mar-1999        PJB     Second parameter of memcpy_toio is const..
+ *  04-Apr-1999        PJB     Added check_signature.
+ *  12-Dec-1999        RMK     More cleanups
+ *  18-Jun-2000 RMK    Removed virt_to_* and friends definitions
+ */
+#ifndef __ASM_ARM_IO_H
+#define __ASM_ARM_IO_H
+
+#ifdef __KERNEL__
+
+#include <linux/types.h>
+#include <asm/byteorder.h>
+#include <asm/memory.h>
+#if 0  /* XXX###XXX */
+#include <asm/arch/hardware.h>
+#endif /* XXX###XXX */
+
+static inline void sync(void)
+{
+}
+
+/*
+ * Given a physical address and a length, return a virtual address
+ * that can be used to access the memory range with the caching
+ * properties specified by "flags".
+ */
+#define MAP_NOCACHE    (0)
+#define MAP_WRCOMBINE  (0)
+#define MAP_WRBACK     (0)
+#define MAP_WRTHROUGH  (0)
+
+static inline void *
+map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags)
+{
+       return (void *)paddr;
+}
+
+/*
+ * Take down a mapping set up by map_physmem().
+ */
+static inline void unmap_physmem(void *vaddr, unsigned long flags)
+{
+
+}
+
+/*
+ * Generic virtual read/write.  Note that we don't support half-word
+ * read/writes.  We define __arch_*[bl] here, and leave __arch_*w
+ * to the architecture specific code.
+ */
+#define __arch_getb(a)                 (*(volatile unsigned char *)(a))
+#define __arch_getw(a)                 (*(volatile unsigned short *)(a))
+#define __arch_getl(a)                 (*(volatile unsigned int *)(a))
+
+#define __arch_putb(v,a)               (*(volatile unsigned char *)(a) = (v))
+#define __arch_putw(v,a)               (*(volatile unsigned short *)(a) = (v))
+#define __arch_putl(v,a)               (*(volatile unsigned int *)(a) = (v))
+
+extern void __raw_writesb(unsigned int addr, const void *data, int bytelen);
+extern void __raw_writesw(unsigned int addr, const void *data, int wordlen);
+extern void __raw_writesl(unsigned int addr, const void *data, int longlen);
+
+extern void __raw_readsb(unsigned int addr, void *data, int bytelen);
+extern void __raw_readsw(unsigned int addr, void *data, int wordlen);
+extern void __raw_readsl(unsigned int addr, void *data, int longlen);
+
+#define __raw_writeb(v,a)              __arch_putb(v,a)
+#define __raw_writew(v,a)              __arch_putw(v,a)
+#define __raw_writel(v,a)              __arch_putl(v,a)
+
+#define __raw_readb(a)                 __arch_getb(a)
+#define __raw_readw(a)                 __arch_getw(a)
+#define __raw_readl(a)                 __arch_getl(a)
+
+#define writeb(v,a)                    __arch_putb(v,a)
+#define writew(v,a)                    __arch_putw(v,a)
+#define writel(v,a)                    __arch_putl(v,a)
+
+#define readb(a)                       __arch_getb(a)
+#define readw(a)                       __arch_getw(a)
+#define readl(a)                       __arch_getl(a)
+
+/*
+ * The compiler seems to be incapable of optimising constants
+ * properly.  Spell it out to the compiler in some cases.
+ * These are only valid for small values of "off" (< 1<<12)
+ */
+#define __raw_base_writeb(val,base,off)        __arch_base_putb(val,base,off)
+#define __raw_base_writew(val,base,off)        __arch_base_putw(val,base,off)
+#define __raw_base_writel(val,base,off)        __arch_base_putl(val,base,off)
+
+#define __raw_base_readb(base,off)     __arch_base_getb(base,off)
+#define __raw_base_readw(base,off)     __arch_base_getw(base,off)
+#define __raw_base_readl(base,off)     __arch_base_getl(base,off)
+
+/*
+ * Now, pick up the machine-defined IO definitions
+ */
+#if 0  /* XXX###XXX */
+#include <asm/arch/io.h>
+#endif /* XXX###XXX */
+
+/*
+ *  IO port access primitives
+ *  -------------------------
+ *
+ * The ARM doesn't have special IO access instructions; all IO is memory
+ * mapped.  Note that these are defined to perform little endian accesses
+ * only.  Their primary purpose is to access PCI and ISA peripherals.
+ *
+ * Note that for a big endian machine, this implies that the following
+ * big endian mode connectivity is in place, as described by numerous
+ * ARM documents:
+ *
+ *    PCI:  D0-D7   D8-D15 D16-D23 D24-D31
+ *    ARM: D24-D31 D16-D23  D8-D15  D0-D7
+ *
+ * The machine specific io.h include defines __io to translate an "IO"
+ * address to a memory address.
+ *
+ * Note that we prevent GCC re-ordering or caching values in expressions
+ * by introducing sequence points into the in*() definitions.  Note that
+ * __raw_* do not guarantee this behaviour.
+ *
+ * The {in,out}[bwl] macros are for emulating x86-style PCI/ISA IO space.
+ */
+#ifdef __io
+#define outb(v,p)                      __raw_writeb(v,__io(p))
+#define outw(v,p)                      __raw_writew(cpu_to_le16(v),__io(p))
+#define outl(v,p)                      __raw_writel(cpu_to_le32(v),__io(p))
+
+#define inb(p) ({ unsigned int __v = __raw_readb(__io(p)); __v; })
+#define inw(p) ({ unsigned int __v = le16_to_cpu(__raw_readw(__io(p))); __v; })
+#define inl(p) ({ unsigned int __v = le32_to_cpu(__raw_readl(__io(p))); __v; })
+
+#define outsb(p,d,l)                   __raw_writesb(__io(p),d,l)
+#define outsw(p,d,l)                   __raw_writesw(__io(p),d,l)
+#define outsl(p,d,l)                   __raw_writesl(__io(p),d,l)
+
+#define insb(p,d,l)                    __raw_readsb(__io(p),d,l)
+#define insw(p,d,l)                    __raw_readsw(__io(p),d,l)
+#define insl(p,d,l)                    __raw_readsl(__io(p),d,l)
+#endif
+
+#define outb_p(val,port)               outb((val),(port))
+#define outw_p(val,port)               outw((val),(port))
+#define outl_p(val,port)               outl((val),(port))
+#define inb_p(port)                    inb((port))
+#define inw_p(port)                    inw((port))
+#define inl_p(port)                    inl((port))
+
+#define outsb_p(port,from,len)         outsb(port,from,len)
+#define outsw_p(port,from,len)         outsw(port,from,len)
+#define outsl_p(port,from,len)         outsl(port,from,len)
+#define insb_p(port,to,len)            insb(port,to,len)
+#define insw_p(port,to,len)            insw(port,to,len)
+#define insl_p(port,to,len)            insl(port,to,len)
+
+/*
+ * ioremap and friends.
+ *
+ * ioremap takes a PCI memory address, as specified in
+ * linux/Documentation/IO-mapping.txt.  If you want a
+ * physical address, use __ioremap instead.
+ */
+extern void * __ioremap(unsigned long offset, size_t size, unsigned long flags);
+extern void __iounmap(void *addr);
+
+/*
+ * Generic ioremap support.
+ *
+ * Define:
+ *  iomem_valid_addr(off,size)
+ *  iomem_to_phys(off)
+ */
+#ifdef iomem_valid_addr
+#define __arch_ioremap(off,sz,nocache)                         \
+ ({                                                            \
+       unsigned long _off = (off), _size = (sz);               \
+       void *_ret = (void *)0;                                 \
+       if (iomem_valid_addr(_off, _size))                      \
+               _ret = __ioremap(iomem_to_phys(_off),_size,0);  \
+       _ret;                                                   \
+ })
+
+#define __arch_iounmap __iounmap
+#endif
+
+#define ioremap(off,sz)                        __arch_ioremap((off),(sz),0)
+#define ioremap_nocache(off,sz)                __arch_ioremap((off),(sz),1)
+#define iounmap(_addr)                 __arch_iounmap(_addr)
+
+/*
+ * DMA-consistent mapping functions.  These allocate/free a region of
+ * uncached, unwrite-buffered mapped memory space for use with DMA
+ * devices.  This is the "generic" version.  The PCI specific version
+ * is in pci.h
+ */
+extern void *consistent_alloc(int gfp, size_t size, dma_addr_t *handle);
+extern void consistent_free(void *vaddr, size_t size, dma_addr_t handle);
+extern void consistent_sync(void *vaddr, size_t size, int rw);
+
+/*
+ * String version of IO memory access ops:
+ */
+extern void _memcpy_fromio(void *, unsigned long, size_t);
+extern void _memcpy_toio(unsigned long, const void *, size_t);
+extern void _memset_io(unsigned long, int, size_t);
+
+extern void __readwrite_bug(const char *fn);
+
+/*
+ * If this architecture has PCI memory IO, then define the read/write
+ * macros.  These should only be used with the cookie passed from
+ * ioremap.
+ */
+#ifdef __mem_pci
+
+#define readb(c) ({ unsigned int __v = __raw_readb(__mem_pci(c)); __v; })
+#define readw(c) ({ unsigned int __v = le16_to_cpu(__raw_readw(__mem_pci(c))); __v; })
+#define readl(c) ({ unsigned int __v = le32_to_cpu(__raw_readl(__mem_pci(c))); __v; })
+
+#define writeb(v,c)            __raw_writeb(v,__mem_pci(c))
+#define writew(v,c)            __raw_writew(cpu_to_le16(v),__mem_pci(c))
+#define writel(v,c)            __raw_writel(cpu_to_le32(v),__mem_pci(c))
+
+#define memset_io(c,v,l)               _memset_io(__mem_pci(c),(v),(l))
+#define memcpy_fromio(a,c,l)           _memcpy_fromio((a),__mem_pci(c),(l))
+#define memcpy_toio(c,a,l)             _memcpy_toio(__mem_pci(c),(a),(l))
+
+#define eth_io_copy_and_sum(s,c,l,b) \
+                               eth_copy_and_sum((s),__mem_pci(c),(l),(b))
+
+static inline int
+check_signature(unsigned long io_addr, const unsigned char *signature,
+               int length)
+{
+       int retval = 0;
+       do {
+               if (readb(io_addr) != *signature)
+                       goto out;
+               io_addr++;
+               signature++;
+               length--;
+       } while (length);
+       retval = 1;
+out:
+       return retval;
+}
+
+#elif !defined(readb)
+
+#define readb(addr)                    (__readwrite_bug("readb"),0)
+#define readw(addr)                    (__readwrite_bug("readw"),0)
+#define readl(addr)                    (__readwrite_bug("readl"),0)
+#define writeb(v,addr)                 __readwrite_bug("writeb")
+#define writew(v,addr)                 __readwrite_bug("writew")
+#define writel(v,addr)                 __readwrite_bug("writel")
+
+#define eth_io_copy_and_sum(a,b,c,d)   __readwrite_bug("eth_io_copy_and_sum")
+
+#define check_signature(io,sig,len)    (0)
+
+#endif /* __mem_pci */
+
+/*
+ * If this architecture has ISA IO, then define the isa_read/isa_write
+ * macros.
+ */
+#ifdef __mem_isa
+
+#define isa_readb(addr)                        __raw_readb(__mem_isa(addr))
+#define isa_readw(addr)                        __raw_readw(__mem_isa(addr))
+#define isa_readl(addr)                        __raw_readl(__mem_isa(addr))
+#define isa_writeb(val,addr)           __raw_writeb(val,__mem_isa(addr))
+#define isa_writew(val,addr)           __raw_writew(val,__mem_isa(addr))
+#define isa_writel(val,addr)           __raw_writel(val,__mem_isa(addr))
+#define isa_memset_io(a,b,c)           _memset_io(__mem_isa(a),(b),(c))
+#define isa_memcpy_fromio(a,b,c)       _memcpy_fromio((a),__mem_isa(b),(c))
+#define isa_memcpy_toio(a,b,c)         _memcpy_toio(__mem_isa((a)),(b),(c))
+
+#define isa_eth_io_copy_and_sum(a,b,c,d) \
+                               eth_copy_and_sum((a),__mem_isa(b),(c),(d))
+
+static inline int
+isa_check_signature(unsigned long io_addr, const unsigned char *signature,
+                   int length)
+{
+       int retval = 0;
+       do {
+               if (isa_readb(io_addr) != *signature)
+                       goto out;
+               io_addr++;
+               signature++;
+               length--;
+       } while (length);
+       retval = 1;
+out:
+       return retval;
+}
+
+#else  /* __mem_isa */
+
+#define isa_readb(addr)                        (__readwrite_bug("isa_readb"),0)
+#define isa_readw(addr)                        (__readwrite_bug("isa_readw"),0)
+#define isa_readl(addr)                        (__readwrite_bug("isa_readl"),0)
+#define isa_writeb(val,addr)           __readwrite_bug("isa_writeb")
+#define isa_writew(val,addr)           __readwrite_bug("isa_writew")
+#define isa_writel(val,addr)           __readwrite_bug("isa_writel")
+#define isa_memset_io(a,b,c)           __readwrite_bug("isa_memset_io")
+#define isa_memcpy_fromio(a,b,c)       __readwrite_bug("isa_memcpy_fromio")
+#define isa_memcpy_toio(a,b,c)         __readwrite_bug("isa_memcpy_toio")
+
+#define isa_eth_io_copy_and_sum(a,b,c,d) \
+                               __readwrite_bug("isa_eth_io_copy_and_sum")
+
+#define isa_check_signature(io,sig,len)        (0)
+
+#endif /* __mem_isa */
+#endif /* __KERNEL__ */
+#endif /* __ASM_ARM_IO_H */
diff --git a/include/asm/memory.h b/include/asm/memory.h
new file mode 100644 (file)
index 0000000..c3b2afd
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ *  linux/include/asm-arm/memory.h
+ *
+ *  Copyright (C) 2000-2002 Russell King
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Note: this file should not be included by non-asm/.h files
+ */
+#ifndef __ASM_ARM_MEMORY_H
+#define __ASM_ARM_MEMORY_H
+
+#if 0  /* XXX###XXX */
+
+#include <linux/config.h>
+#include <asm/arch/memory.h>
+
+/*
+ * PFNs are used to describe any physical page; this means
+ * PFN 0 == physical address 0.
+ *
+ * This is the PFN of the first RAM page in the kernel
+ * direct-mapped view.  We assume this is the first page
+ * of RAM in the mem_map as well.
+ */
+#define PHYS_PFN_OFFSET        (PHYS_OFFSET >> PAGE_SHIFT)
+
+/*
+ * These are *only* valid on the kernel direct mapped RAM memory.
+ */
+static inline unsigned long virt_to_phys(void *x)
+{
+       return __virt_to_phys((unsigned long)(x));
+}
+
+static inline void *phys_to_virt(unsigned long x)
+{
+       return (void *)(__phys_to_virt((unsigned long)(x)));
+}
+
+#define __pa(x)                        __virt_to_phys((unsigned long)(x))
+#define __va(x)                        ((void *)__phys_to_virt((unsigned long)(x)))
+
+/*
+ * Virtual <-> DMA view memory address translations
+ * Again, these are *only* valid on the kernel direct mapped RAM
+ * memory.  Use of these is *depreciated*.
+ */
+#define virt_to_bus(x)         (__virt_to_bus((unsigned long)(x)))
+#define bus_to_virt(x)         ((void *)(__bus_to_virt((unsigned long)(x))))
+
+/*
+ * Conversion between a struct page and a physical address.
+ *
+ * Note: when converting an unknown physical address to a
+ * struct page, the resulting pointer must be validated
+ * using VALID_PAGE().  It must return an invalid struct page
+ * for any physical address not corresponding to a system
+ * RAM address.
+ *
+ *  page_to_pfn(page)  convert a struct page * to a PFN number
+ *  pfn_to_page(pfn)   convert a _valid_ PFN number to struct page *
+ *  pfn_valid(pfn)     indicates whether a PFN number is valid
+ *
+ *  virt_to_page(k)    convert a _valid_ virtual address to struct page *
+ *  virt_addr_valid(k) indicates whether a virtual address is valid
+ */
+#ifndef CONFIG_DISCONTIGMEM
+
+#define page_to_pfn(page)      (((page) - mem_map) + PHYS_PFN_OFFSET)
+#define pfn_to_page(pfn)       ((mem_map + (pfn)) - PHYS_PFN_OFFSET)
+#define pfn_valid(pfn)         ((pfn) >= PHYS_PFN_OFFSET && (pfn) < (PHYS_PFN_OFFSET + max_mapnr))
+
+#define virt_to_page(kaddr)    (pfn_to_page(__pa(kaddr) >> PAGE_SHIFT))
+#define virt_addr_valid(kaddr) ((kaddr) >= PAGE_OFFSET && (kaddr) < (unsigned long)high_memory)
+
+#define PHYS_TO_NID(addr)      (0)
+
+#define VALID_PAGE(page)       ((page - mem_map) < max_mapnr)
+
+#else
+
+/*
+ * This is more complex.  We have a set of mem_map arrays spread
+ * around in memory.
+ */
+#define page_to_pfn(page)                                      \
+       (((page) - page_zone(page)->zone_mem_map)               \
+         + (page_zone(page)->zone_start_paddr >> PAGE_SHIFT))
+
+#define pfn_to_page(pfn)                                       \
+       (PFN_TO_MAPBASE(pfn) + LOCAL_MAP_NR((pfn) << PAGE_SHIFT))
+
+#define pfn_valid(pfn)                                         \
+  ({                                                           \
+       unsigned int node = PFN_TO_NID(pfn);                    \
+       struct pglist_data *nd = NODE_DATA(node);               \
+       ((node < NR_NODES) &&                                   \
+        ((pfn - (nd->node_start_paddr >> PAGE_SHIFT)) < nd->node_size));\
+   })
+
+#define virt_to_page(kaddr)                                    \
+       (ADDR_TO_MAPBASE(kaddr) + LOCAL_MAP_NR(kaddr))
+
+#define virt_addr_valid(kaddr) (KVADDR_TO_NID(kaddr) < NR_NODES)
+
+/*
+ * Common discontigmem stuff.
+ *  PHYS_TO_NID is used by the ARM kernel/setup.c
+ */
+#define PHYS_TO_NID(addr)      PFN_TO_NID((addr) >> PAGE_SHIFT)
+
+/*
+ * 2.4 compatibility
+ *
+ * VALID_PAGE returns a non-zero value if given page pointer is valid.
+ * This assumes all node's mem_maps are stored within the node they
+ * refer to.  This is actually inherently buggy.
+ */
+#define VALID_PAGE(page) \
+({ unsigned int node = KVADDR_TO_NID(page); \
+   ((node < NR_NODES) && \
+     ((unsigned)((page) - NODE_MEM_MAP(node)) < NODE_DATA(node)->node_size)); \
+})
+
+#endif
+
+/*
+ * We should really eliminate virt_to_bus() here - it's depreciated.
+ */
+#define page_to_bus(page)      (virt_to_bus(page_address(page)))
+
+#endif /* XXX###XXX */
+
+#endif /* __ASM_ARM_MEMORY_H */
index 13e9806..efc3052 100644 (file)
@@ -44,6 +44,7 @@ typedef unsigned long long u64;
 /* Dma addresses are 32-bits wide.  */
 
 typedef u32 dma_addr_t;
+typedef unsigned long phys_addr_t;
 
 #endif /* __KERNEL__ */
 
index 8728378..5625417 100644 (file)
 #define CONFIG_OMAP3430                1       /* which is in a 3430 */
 #define CONFIG_OMAP3_BEAGLE    1       /* working with BEAGLE */
 
-#define CONFIG_BEAGLE_REV2      1
+#define CONFIG_BEAGLE_REV2     1
 
 /* Enable the below macro if MMC boot support is required */
 #define CONFIG_MMC     1
 #if defined(CONFIG_MMC)
-       #define CFG_CMD_MMC     1
-       #define CFG_CMD_FAT     1
+       #define CFG_CMD_MMC             1
+       #define CFG_CMD_FAT             1
+       #define CFG_I2C_SPEED           100000
+       #define CFG_I2C_SLAVE           1
+       #define CFG_I2C_BUS             0
+       #define CFG_I2C_BUS_SELECT      1
+       #define CONFIG_DRIVER_OMAP34XX_I2C 1
 #endif
 
 #include <asm/arch/cpu.h>        /* get chip and board defs */
index 44d80c0..70e3683 100644 (file)
 #if defined(CONFIG_MMC)
        #define CFG_CMD_MMC     1
        #define CFG_CMD_FAT     1
+       #define CFG_I2C_SPEED           100000
+       #define CFG_I2C_SLAVE           1
+       #define CFG_I2C_BUS             0
+       #define CFG_I2C_BUS_SELECT      1
+       #define CONFIG_DRIVER_OMAP34XX_I2C 1
 #endif
 
 #include <asm/arch/cpu.h>        /* get chip and board defs */
diff --git a/include/i2c.h b/include/i2c.h
new file mode 100644 (file)
index 0000000..a51c164
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * (C) Copyright 2001
+ * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.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
+ *
+ * The original I2C interface was
+ *   (C) 2000 by Paolo Scaffardi (arsenio@tin.it)
+ *   AIRVENT SAM s.p.a - RIMINI(ITALY)
+ * but has been changed substantially.
+ */
+
+#ifndef _I2C_H_
+#define _I2C_H_
+
+/*
+ * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
+ *
+ * The implementation MUST NOT use static or global variables if the
+ * I2C routines are used to read SDRAM configuration information
+ * because this is done before the memories are initialized. Limited
+ * use of stack-based variables are OK (the initial stack size is
+ * limited).
+ *
+ * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
+ */
+
+/*
+ * Configuration items.
+ */
+#define I2C_RXTX_LEN   128     /* maximum tx/rx buffer length */
+
+#if defined(CONFIG_I2C_MULTI_BUS)
+#define CFG_MAX_I2C_BUS                2
+#define I2C_GET_BUS()          i2c_get_bus_num()
+#define I2C_SET_BUS(a)         i2c_set_bus_num(a)
+#else
+#define CFG_MAX_I2C_BUS                1
+#define I2C_GET_BUS()          0
+#define I2C_SET_BUS(a)
+#endif
+
+/* define the I2C bus number for RTC and DTT if not already done */
+#if !defined(CFG_RTC_BUS_NUM)
+#define CFG_RTC_BUS_NUM                0
+#endif
+#if !defined(CFG_DTT_BUS_NUM)
+#define CFG_DTT_BUS_NUM                0
+#endif
+#if !defined(CFG_SPD_BUS_NUM)
+#define CFG_SPD_BUS_NUM                0
+#endif
+
+/*
+ * Initialization, must be called once on start up, may be called
+ * repeatedly to change the speed and slave addresses.
+ */
+void i2c_init(int speed, int slaveaddr);
+#ifdef CFG_I2C_INIT_BOARD
+void i2c_init_board(void);
+#endif
+
+/*
+ * Probe the given I2C chip address.  Returns 0 if a chip responded,
+ * not 0 on failure.
+ */
+int i2c_probe(uchar chip);
+
+/*
+ * Read/Write interface:
+ *   chip:    I2C chip address, range 0..127
+ *   addr:    Memory (register) address within the chip
+ *   alen:    Number of bytes to use for addr (typically 1, 2 for larger
+ *              memories, 0 for register type devices with only one
+ *              register)
+ *   buffer:  Where to read/write the data
+ *   len:     How many bytes to read/write
+ *
+ *   Returns: 0 on success, not 0 on failure
+ */
+int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len);
+int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len);
+
+/*
+ * Utility routines to read/write registers.
+ */
+uchar i2c_reg_read (uchar chip, uchar reg);
+void  i2c_reg_write(uchar chip, uchar reg, uchar val);
+
+/*
+ * Functions for setting the current I2C bus and its speed
+ */
+
+/*
+ * i2c_set_bus_num:
+ *
+ *  Change the active I2C bus.  Subsequent read/write calls will
+ *  go to this one.
+ *
+ *     bus - bus index, zero based
+ *
+ *     Returns: 0 on success, not 0 on failure
+ *
+ */
+int i2c_set_bus_num(unsigned int bus);
+
+/*
+ * i2c_get_bus_num:
+ *
+ *  Returns index of currently active I2C bus.  Zero-based.
+ */
+
+unsigned int i2c_get_bus_num(void);
+
+/*
+ * i2c_set_bus_speed:
+ *
+ *  Change the speed of the active I2C bus
+ *
+ *     speed - bus speed in Hz
+ *
+ *     Returns: 0 on success, not 0 on failure
+ *
+ */
+int i2c_set_bus_speed(unsigned int);
+
+/*
+ * i2c_get_bus_speed:
+ *
+ *  Returns speed of currently active I2C bus in Hz
+ */
+
+unsigned int i2c_get_bus_speed(void);
+
+#endif /* _I2C_H_ */
index ee74261..19c76fe 100644 (file)
 #define _MMC_H_
 #include <asm/arch/mmc.h>
 
+/* MMC command numbers */
+#define MMC_CMD_GO_IDLE_STATE          0
+#define MMC_CMD_SEND_OP_COND           1
+#define MMC_CMD_ALL_SEND_CID           2
+#define MMC_CMD_SET_RELATIVE_ADDR      3
+#define MMC_CMD_SET_DSR                        4
+#define MMC_CMD_SELECT_CARD            7
+#define MMC_CMD_SEND_CSD               9
+#define MMC_CMD_SEND_CID               10
+#define MMC_CMD_SEND_STATUS            13
+#define MMC_CMD_SET_BLOCKLEN           16
+#define MMC_CMD_READ_SINGLE_BLOCK      17
+#define MMC_CMD_READ_MULTIPLE_BLOCK    18
+#define MMC_CMD_WRITE_BLOCK            24
+#define MMC_CMD_APP_CMD                        55
+
+/* SD Card command numbers */
+#define SD_CMD_SEND_RELATIVE_ADDR      3
+#define SD_CMD_SWITCH                  6
+#define SD_CMD_SEND_IF_COND            8
+
+#define SD_CMD_APP_SET_BUS_WIDTH       6
+#define SD_CMD_APP_SEND_OP_COND                41
+
 int mmc_init(int verbose);
-int mmc_read(unsigned int src, unsigned char *dst, int size);
-int mmc_write(unsigned char *src, unsigned long dst, int size);
-int mmc2info(unsigned int addr);
+int mmc_read(ulong src, uchar *dst, int size);
+int mmc_write(uchar *src, ulong dst, int size);
+int mmc2info(ulong addr);
 
 #endif /* _MMC_H_ */
index 11b8500..92e4615 100644 (file)
 #include <fat.h>
 #include <asm/arch/mem.h>
 
+const char version_string[] =
+       "Texas Instruments X-Loader 1.4.2 (" __DATE__ " - " __TIME__ ")";
+
 #ifdef CFG_PRINTF
 int print_info(void)
 {
-        printf("\n\nTexas Instruments X-Loader 1.41sms\n");
+        printf("\n\n%s\n", version_string);
        return 0;
 }
 #endif
 
+static int init_func_i2c (void)
+{
+       i2c_init (CFG_I2C_SPEED, CFG_I2C_SLAVE);
+       return 0;
+}
+
 typedef int (init_fnc_t) (void);
 
 init_fnc_t *init_sequence[] = {
@@ -53,6 +62,7 @@ init_fnc_t *init_sequence[] = {
        print_info,
 #endif
        nand_init,              /* board specific nand init */
+       init_func_i2c,
        NULL,
 };
 
@@ -74,8 +84,6 @@ void start_armboot (void)
 #ifdef CONFIG_MMC
        /* first try mmc */
        if (mmc_init(1)) {
-               dev_desc = mmc_get_dev(0);
-               fat_register_device(dev_desc, 1);
                size = file_fat_read("u-boot.bin", buf, 0);
                if (size > 0) {
 #ifdef CFG_PRINTF
@@ -83,8 +91,8 @@ void start_armboot (void)
 #endif
                        buf += size;
                }
-       }
 #endif
+       }
 
        if (buf == (uchar *)CFG_LOADADDR) {
                /* if no u-boot on mmc, try onenand or nand, depending upon sysboot */