]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/mmc/pxa_mmc.c
Merge branch 'master' of git://git.denx.de/u-boot-net
[karo-tx-uboot.git] / drivers / mmc / pxa_mmc.c
index 87769033bbcee9db4ea855fde11091da1dd3ee7f..80c4445034eff59327adb4ec85ebb2cc10c366fb 100644 (file)
@@ -27,6 +27,7 @@
 #include <asm/errno.h>
 #include <asm/arch/hardware.h>
 #include <part.h>
+#include <asm/io.h>
 
 #include "pxa_mmc.h"
 
@@ -54,23 +55,25 @@ mmc_cmd(ushort cmd, ushort argh, ushort argl, ushort cmdat)
 /****************************************************/
 {
        static uint32_t resp[4], a, b, c;
-       ulong status;
+       uint32_t status;
        int i;
 
        debug("mmc_cmd %u 0x%04x 0x%04x 0x%04x\n", cmd, argh, argl,
              cmdat | wide);
-       MMC_STRPCL = MMC_STRPCL_STOP_CLK;
-       MMC_I_MASK = ~MMC_I_MASK_CLK_IS_OFF;
-       while (!(MMC_I_REG & MMC_I_REG_CLK_IS_OFF)) ;
-       MMC_CMD = cmd;
-       MMC_ARGH = argh;
-       MMC_ARGL = argl;
-       MMC_CMDAT = cmdat | wide;
-       MMC_I_MASK = ~MMC_I_MASK_END_CMD_RES;
-       MMC_STRPCL = MMC_STRPCL_START_CLK;
-       while (!(MMC_I_REG & MMC_I_REG_END_CMD_RES)) ;
-
-       status = MMC_STAT;
+       writel(MMC_STRPCL_STOP_CLK, MMC_STRPCL);
+       writel(~MMC_I_MASK_CLK_IS_OFF, MMC_I_MASK);
+       while (!(readl(MMC_I_REG) & MMC_I_REG_CLK_IS_OFF))
+               ;
+       writel(cmd, MMC_CMD);
+       writel(argh, MMC_ARGH);
+       writel(argl, MMC_ARGL);
+       writel(cmdat | wide, MMC_CMDAT);
+       writel(~MMC_I_MASK_END_CMD_RES, MMC_I_MASK);
+       writel(MMC_STRPCL_START_CLK, MMC_STRPCL);
+       while (!(readl(MMC_I_REG) & MMC_I_REG_END_CMD_RES))
+               ;
+
+       status = readl(MMC_STAT);
        debug("MMC status 0x%08x\n", status);
        if (status & MMC_STAT_TIME_OUT_RESPONSE) {
                return 0;
@@ -80,10 +83,10 @@ mmc_cmd(ushort cmd, ushort argh, ushort argl, ushort cmdat)
         * Did I mention this is Sick.  We always need to
         * discard the upper 8 bits of the first 16-bit word.
         */
-       a = (MMC_RES & 0xffff);
+       a = (readl(MMC_RES) & 0xffff);
        for (i = 0; i < 4; i++) {
-               b = (MMC_RES & 0xffff);
-               c = (MMC_RES & 0xffff);
+               b = (readl(MMC_RES) & 0xffff);
+               c = (readl(MMC_RES) & 0xffff);
                resp[i] = (a << 24) | (b << 8) | (c >> 8);
                a = c;
                debug("MMC resp[%d] = %#08x\n", i, resp[i]);
@@ -94,7 +97,7 @@ mmc_cmd(ushort cmd, ushort argh, ushort argl, ushort cmdat)
 
 int
 /****************************************************/
-mmc_block_read(uchar * dst, ulong src, ulong len)
+mmc_block_read(uchar * dst, uint32_t src, int len)
 /****************************************************/
 {
        ushort argh, argl;
@@ -104,7 +107,7 @@ mmc_block_read(uchar * dst, ulong src, ulong len)
                return 0;
        }
 
-       debug("mmc_block_rd dst %lx src %lx len %d\n", (ulong) dst, src, len);
+       debug("mmc_block_rd dst %p src %08x len %d\n", dst, src, len);
 
        argh = len >> 16;
        argl = len & 0xffff;
@@ -115,37 +118,38 @@ mmc_block_read(uchar * dst, ulong src, ulong len)
        /* send read command */
        argh = src >> 16;
        argl = src & 0xffff;
-       MMC_STRPCL = MMC_STRPCL_STOP_CLK;
-       MMC_RDTO = 0xffff;
-       MMC_NOB = 1;
-       MMC_BLKLEN = len;
+       writel(MMC_STRPCL_STOP_CLK, MMC_STRPCL);
+       writel(0xffff, MMC_RDTO);
+       writel(1, MMC_NOB);
+       writel(len, MMC_BLKLEN);
        mmc_cmd(MMC_CMD_READ_SINGLE_BLOCK, argh, argl,
                MMC_CMDAT_R1 | MMC_CMDAT_READ | MMC_CMDAT_BLOCK |
                MMC_CMDAT_DATA_EN);
 
-       MMC_I_MASK = ~MMC_I_MASK_RXFIFO_RD_REQ;
+       writel(~MMC_I_MASK_RXFIFO_RD_REQ, MMC_I_MASK);
        while (len) {
-               if (MMC_I_REG & MMC_I_REG_RXFIFO_RD_REQ) {
-#if defined(CONFIG_PXA27X) || defined(CONFIG_CPU_MONAHANS)
+               if (readl(MMC_I_REG) & MMC_I_REG_RXFIFO_RD_REQ) {
+#if defined(CONFIG_CPU_PXA27X) || defined(CONFIG_CPU_MONAHANS)
                        int i;
                        for (i = min(len, 32); i; i--) {
-                               *dst++ = *((volatile uchar *)&MMC_RXFIFO);
+                               *dst++ = readb(MMC_RXFIFO);
                                len--;
                        }
 #else
-                       *dst++ = MMC_RXFIFO;
+                       *dst++ = readb(MMC_RXFIFO);
                        len--;
 #endif
                }
-               status = MMC_STAT;
+               status = readl(MMC_STAT);
                if (status & MMC_STAT_ERRORS) {
                        printf("MMC_STAT error %lx\n", status);
                        return -1;
                }
        }
-       MMC_I_MASK = ~MMC_I_MASK_DATA_TRAN_DONE;
-       while (!(MMC_I_REG & MMC_I_REG_DATA_TRAN_DONE)) ;
-       status = MMC_STAT;
+       writel(~MMC_I_MASK_DATA_TRAN_DONE, MMC_I_MASK);
+       while (!(readl(MMC_I_REG) & MMC_I_REG_DATA_TRAN_DONE))
+               ;
+       status = readl(MMC_STAT);
        if (status & MMC_STAT_ERRORS) {
                printf("MMC_STAT error %lx\n", status);
                return -1;
@@ -176,37 +180,39 @@ mmc_block_write(ulong dst, uchar * src, int len)
        /* send write command */
        argh = dst >> 16;
        argl = dst & 0xffff;
-       MMC_STRPCL = MMC_STRPCL_STOP_CLK;
-       MMC_NOB = 1;
-       MMC_BLKLEN = len;
+       writel(MMC_STRPCL_STOP_CLK, MMC_STRPCL);
+       writel(1, MMC_NOB);
+       writel(len, MMC_BLKLEN);
        mmc_cmd(MMC_CMD_WRITE_SINGLE_BLOCK, argh, argl,
                MMC_CMDAT_R1 | MMC_CMDAT_WRITE | MMC_CMDAT_BLOCK |
                MMC_CMDAT_DATA_EN);
 
-       MMC_I_MASK = ~MMC_I_MASK_TXFIFO_WR_REQ;
+       writel(~MMC_I_MASK_TXFIFO_WR_REQ, MMC_I_MASK);
        while (len) {
-               if (MMC_I_REG & MMC_I_REG_TXFIFO_WR_REQ) {
+               if (readl(MMC_I_REG) & MMC_I_REG_TXFIFO_WR_REQ) {
                        int i, bytes = min(32, len);
 
                        for (i = 0; i < bytes; i++) {
-                               MMC_TXFIFO = *src++;
+                               writel(*src++, MMC_TXFIFO);
                        }
                        if (bytes < 32) {
-                               MMC_PRTBUF = MMC_PRTBUF_BUF_PART_FULL;
+                               writel(MMC_PRTBUF_BUF_PART_FULL, MMC_PRTBUF);
                        }
                        len -= bytes;
                }
-               status = MMC_STAT;
+               status = readl(MMC_STAT);
                if (status & MMC_STAT_ERRORS) {
                        printf("MMC_STAT error %lx\n", status);
                        return -1;
                }
        }
-       MMC_I_MASK = ~MMC_I_MASK_DATA_TRAN_DONE;
-       while (!(MMC_I_REG & MMC_I_REG_DATA_TRAN_DONE)) ;
-       MMC_I_MASK = ~MMC_I_MASK_PRG_DONE;
-       while (!(MMC_I_REG & MMC_I_REG_PRG_DONE)) ;
-       status = MMC_STAT;
+       writel(~MMC_I_MASK_DATA_TRAN_DONE, MMC_I_MASK);
+       while (!(readl(MMC_I_REG) & MMC_I_REG_DATA_TRAN_DONE))
+               ;
+       writel(~MMC_I_MASK_PRG_DONE, MMC_I_MASK);
+       while (!(readl(MMC_I_REG) & MMC_I_REG_PRG_DONE))
+               ;
+       status = readl(MMC_STAT);
        if (status & MMC_STAT_ERRORS) {
                printf("MMC_STAT error %lx\n", status);
                return -1;
@@ -292,7 +298,7 @@ pxa_mmc_read(long src, uchar * dst, int size)
 
 int
 /****************************************************/
-pxa_mmc_write(uchar * src, ulong dst, int size)
+pxa_mmc_write(uchar * src, uint32_t dst, int size)
 /****************************************************/
 {
        ulong end, part_start, part_end, part_len, aligned_start, aligned_end;
@@ -319,14 +325,14 @@ pxa_mmc_write(uchar * src, ulong dst, int size)
 
        /* all block aligned accesses */
        debug
-           ("src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
-            src, (ulong) dst, end, part_start, part_end, aligned_start,
+           ("src %p dst %08x end %lx pstart %lx pend %lx astart %lx aend %lx\n",
+            src, dst, end, part_start, part_end, aligned_start,
             aligned_end);
        if (part_start) {
                part_len = mmc_block_size - part_start;
                debug
-                   ("ps src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
-                    (ulong) src, dst, end, part_start, part_end, aligned_start,
+                   ("ps src %p dst %08x end %lx pstart %lx pend %lx astart %lx aend %lx\n",
+                    src, dst, end, part_start, part_end, aligned_start,
                     aligned_end);
                if ((mmc_block_read(mmc_buf, aligned_start, mmc_block_size)) <
                    0) {
@@ -341,26 +347,26 @@ pxa_mmc_write(uchar * src, ulong dst, int size)
                src += part_len;
        }
        debug
-           ("src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
-            src, (ulong) dst, end, part_start, part_end, aligned_start,
+           ("src %p dst %08x end %lx pstart %lx pend %lx astart %lx aend %lx\n",
+            src, dst, end, part_start, part_end, aligned_start,
             aligned_end);
        for (; dst < aligned_end; src += mmc_block_size, dst += mmc_block_size) {
                debug
-                   ("al src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
-                    src, (ulong) dst, end, part_start, part_end, aligned_start,
+                   ("al src %p dst %08x end %lx pstart %lx pend %lx astart %lx aend %lx\n",
+                    src, dst, end, part_start, part_end, aligned_start,
                     aligned_end);
                if ((mmc_block_write(dst, (uchar *) src, mmc_block_size)) < 0) {
                        return -1;
                }
        }
        debug
-           ("src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
-            src, (ulong) dst, end, part_start, part_end, aligned_start,
+           ("src %p dst %08x end %lx pstart %lx pend %lx astart %lx aend %lx\n",
+            src, dst, end, part_start, part_end, aligned_start,
             aligned_end);
        if (part_end && dst < end) {
                debug
-                   ("pe src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
-                    src, (ulong) dst, end, part_start, part_end, aligned_start,
+                   ("pe src %p dst %08x end %lx pstart %lx pend %lx astart %lx aend %lx\n",
+                    src, dst, end, part_start, part_end, aligned_start,
                     aligned_end);
                if ((mmc_block_read(mmc_buf, aligned_end, mmc_block_size)) < 0) {
                        return -1;
@@ -554,18 +560,14 @@ mmc_legacy_init(int verbose)
        /* Reset device interface type */
        mmc_dev.if_type = IF_TYPE_UNKNOWN;
 
-#if defined (CONFIG_LUBBOCK) || (defined (CONFIG_GUMSTIX) && !defined(CONFIG_PXA27X))
-       set_GPIO_mode(GPIO6_MMCCLK_MD);
-       set_GPIO_mode(GPIO8_MMCCS0_MD);
-#endif
 #ifdef CONFIG_CPU_MONAHANS     /* pxa3xx */
-       CKENA |= CKENA_12_MMC0 | CKENA_13_MMC1;
+       writel(readl(CKENA) | CKENA_12_MMC0 | CKENA_13_MMC1, CKENA);
 #else  /* pxa2xx */
-       CKEN |= CKEN12_MMC;     /* enable MMC unit clock */
+       writel(readl(CKEN) | CKEN12_MMC, CKEN); /* enable MMC unit clock */
 #endif
-       MMC_CLKRT = MMC_CLKRT_0_3125MHZ;
-       MMC_RESTO = MMC_RES_TO_MAX;
-       MMC_SPI = MMC_SPI_DISABLE;
+       writel(MMC_CLKRT_0_3125MHZ, MMC_CLKRT);
+       writel(MMC_RES_TO_MAX, MMC_RESTO);
+       writel(MMC_SPI_DISABLE, MMC_SPI);
 
        /* reset */
        mmc_cmd(MMC_CMD_GO_IDLE_STATE, 0, 0, MMC_CMDAT_INIT | MMC_CMDAT_R0);
@@ -624,10 +626,10 @@ mmc_legacy_init(int verbose)
                mmc_decode_cid(cid_resp);
        }
 
-       MMC_CLKRT = 0;          /* 20 MHz */
+       writel(0, MMC_CLKRT);           /* 20 MHz */
        resp = mmc_cmd(MMC_CMD_SELECT_CARD, rca, 0, MMC_CMDAT_R1);
 
-#if defined(CONFIG_PXA27X) || defined(CONFIG_CPU_MONAHANS)
+#if defined(CONFIG_CPU_PXA27X) || defined(CONFIG_CPU_MONAHANS)
        if (IF_TYPE_SD == mmc_dev.if_type) {
                resp = mmc_cmd(MMC_CMD_APP_CMD, rca, 0, MMC_CMDAT_R1);
                resp = mmc_cmd(SD_CMD_APP_SET_BUS_WIDTH, 0, 2, MMC_CMDAT_R1);