]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/mmc/mmc.c
Merge branch 'master' of git://git.denx.de/u-boot-video
[karo-tx-uboot.git] / drivers / mmc / mmc.c
index 98e5af3ec97b888ad715d23f65d69ca624ca9a23..a60cfe1cb0d181be890bc2a8a2de9d209b3e99b3 100644 (file)
@@ -151,7 +151,6 @@ int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
 
        printf("CMD_SEND:%d\n", cmd->cmdidx);
        printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg);
-       printf("\t\tFLAG\t\t\t %d\n", cmd->flags);
        ret = mmc->send_cmd(mmc, cmd, data);
        switch (cmd->resp_type) {
                case MMC_RSP_NONE:
@@ -213,7 +212,6 @@ int mmc_send_status(struct mmc *mmc, int timeout)
        cmd.resp_type = MMC_RSP_R1;
        if (!mmc_host_is_spi(mmc))
                cmd.cmdarg = mmc->rca << 16;
-       cmd.flags = 0;
 
        do {
                err = mmc_send_cmd(mmc, &cmd, NULL);
@@ -238,7 +236,7 @@ int mmc_send_status(struct mmc *mmc, int timeout)
        status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9;
        printf("CURR STATE:%d\n", status);
 #endif
-       if (!timeout) {
+       if (timeout <= 0) {
                printf("Timeout waiting card ready\n");
                return TIMEOUT;
        }
@@ -253,7 +251,6 @@ int mmc_set_blocklen(struct mmc *mmc, int len)
        cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
        cmd.resp_type = MMC_RSP_R1;
        cmd.cmdarg = len;
-       cmd.flags = 0;
 
        return mmc_send_cmd(mmc, &cmd, NULL);
 }
@@ -299,7 +296,6 @@ static ulong mmc_erase_t(struct mmc *mmc, ulong start, lbaint_t blkcnt)
        cmd.cmdidx = start_cmd;
        cmd.cmdarg = start;
        cmd.resp_type = MMC_RSP_R1;
-       cmd.flags = 0;
 
        err = mmc_send_cmd(mmc, &cmd, NULL);
        if (err)
@@ -333,6 +329,7 @@ mmc_berase(int dev_num, unsigned long start, lbaint_t blkcnt)
        int err = 0;
        struct mmc *mmc = find_mmc_device(dev_num);
        lbaint_t blk = 0, blk_r = 0;
+       int timeout = 1000;
 
        if (!mmc)
                return -1;
@@ -352,6 +349,10 @@ mmc_berase(int dev_num, unsigned long start, lbaint_t blkcnt)
                        break;
 
                blk += blk_r;
+
+               /* Waiting for the ready status */
+               if (mmc_send_status(mmc, timeout))
+                       return 0;
        }
 
        return blk;
@@ -381,7 +382,6 @@ mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)
                cmd.cmdarg = start * mmc->write_bl_len;
 
        cmd.resp_type = MMC_RSP_R1;
-       cmd.flags = 0;
 
        data.src = src;
        data.blocks = blkcnt;
@@ -400,7 +400,6 @@ mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)
                cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
                cmd.cmdarg = 0;
                cmd.resp_type = MMC_RSP_R1b;
-               cmd.flags = 0;
                if (mmc_send_cmd(mmc, &cmd, NULL)) {
                        printf("mmc fail to send stop cmd\n");
                        return 0;
@@ -454,7 +453,6 @@ int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, lbaint_t blkcnt)
                cmd.cmdarg = start * mmc->read_bl_len;
 
        cmd.resp_type = MMC_RSP_R1;
-       cmd.flags = 0;
 
        data.dest = dst;
        data.blocks = blkcnt;
@@ -468,7 +466,6 @@ int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, lbaint_t blkcnt)
                cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
                cmd.cmdarg = 0;
                cmd.resp_type = MMC_RSP_R1b;
-               cmd.flags = 0;
                if (mmc_send_cmd(mmc, &cmd, NULL)) {
                        printf("mmc fail to send stop cmd\n");
                        return 0;
@@ -520,7 +517,6 @@ int mmc_go_idle(struct mmc* mmc)
        cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
        cmd.cmdarg = 0;
        cmd.resp_type = MMC_RSP_NONE;
-       cmd.flags = 0;
 
        err = mmc_send_cmd(mmc, &cmd, NULL);
 
@@ -543,7 +539,6 @@ sd_send_op_cond(struct mmc *mmc)
                cmd.cmdidx = MMC_CMD_APP_CMD;
                cmd.resp_type = MMC_RSP_R1;
                cmd.cmdarg = 0;
-               cmd.flags = 0;
 
                err = mmc_send_cmd(mmc, &cmd, NULL);
 
@@ -584,7 +579,6 @@ sd_send_op_cond(struct mmc *mmc)
                cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
                cmd.resp_type = MMC_RSP_R3;
                cmd.cmdarg = 0;
-               cmd.flags = 0;
 
                err = mmc_send_cmd(mmc, &cmd, NULL);
 
@@ -613,7 +607,6 @@ int mmc_send_op_cond(struct mmc *mmc)
        cmd.cmdidx = MMC_CMD_SEND_OP_COND;
        cmd.resp_type = MMC_RSP_R3;
        cmd.cmdarg = 0;
-       cmd.flags = 0;
 
        err = mmc_send_cmd(mmc, &cmd, NULL);
 
@@ -633,8 +626,6 @@ int mmc_send_op_cond(struct mmc *mmc)
                if (mmc->host_caps & MMC_MODE_HC)
                        cmd.cmdarg |= OCR_HCS;
 
-               cmd.flags = 0;
-
                err = mmc_send_cmd(mmc, &cmd, NULL);
 
                if (err)
@@ -650,7 +641,6 @@ int mmc_send_op_cond(struct mmc *mmc)
                cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
                cmd.resp_type = MMC_RSP_R3;
                cmd.cmdarg = 0;
-               cmd.flags = 0;
 
                err = mmc_send_cmd(mmc, &cmd, NULL);
 
@@ -668,7 +658,7 @@ int mmc_send_op_cond(struct mmc *mmc)
 }
 
 
-int mmc_send_ext_csd(struct mmc *mmc, char *ext_csd)
+int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
 {
        struct mmc_cmd cmd;
        struct mmc_data data;
@@ -678,9 +668,8 @@ int mmc_send_ext_csd(struct mmc *mmc, char *ext_csd)
        cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
        cmd.resp_type = MMC_RSP_R1;
        cmd.cmdarg = 0;
-       cmd.flags = 0;
 
-       data.dest = ext_csd;
+       data.dest = (char *)ext_csd;
        data.blocks = 1;
        data.blocksize = 512;
        data.flags = MMC_DATA_READ;
@@ -702,7 +691,6 @@ int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
        cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
                                 (index << 16) |
                                 (value << 8);
-       cmd.flags = 0;
 
        ret = mmc_send_cmd(mmc, &cmd, NULL);
 
@@ -716,7 +704,7 @@ int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
 
 int mmc_change_freq(struct mmc *mmc)
 {
-       ALLOC_CACHE_ALIGN_BUFFER(char, ext_csd, 512);
+       ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, 512);
        char cardtype;
        int err;
 
@@ -795,7 +783,6 @@ int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
        cmd.cmdarg = (mode << 31) | 0xffffff;
        cmd.cmdarg &= ~(0xf << (group * 4));
        cmd.cmdarg |= value << (group * 4);
-       cmd.flags = 0;
 
        data.dest = (char *)resp;
        data.blocksize = 64;
@@ -824,7 +811,6 @@ int sd_change_freq(struct mmc *mmc)
        cmd.cmdidx = MMC_CMD_APP_CMD;
        cmd.resp_type = MMC_RSP_R1;
        cmd.cmdarg = mmc->rca << 16;
-       cmd.flags = 0;
 
        err = mmc_send_cmd(mmc, &cmd, NULL);
 
@@ -834,7 +820,6 @@ int sd_change_freq(struct mmc *mmc)
        cmd.cmdidx = SD_CMD_APP_SEND_SCR;
        cmd.resp_type = MMC_RSP_R1;
        cmd.cmdarg = 0;
-       cmd.flags = 0;
 
        timeout = 3;
 
@@ -978,8 +963,8 @@ int mmc_startup(struct mmc *mmc)
        uint mult, freq;
        u64 cmult, csize, capacity;
        struct mmc_cmd cmd;
-       ALLOC_CACHE_ALIGN_BUFFER(char, ext_csd, 512);
-       ALLOC_CACHE_ALIGN_BUFFER(char, test_csd, 512);
+       ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, 512);
+       ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, 512);
        int timeout = 1000;
 
 #ifdef CONFIG_MMC_SPI_CRC_ON
@@ -987,7 +972,6 @@ int mmc_startup(struct mmc *mmc)
                cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
                cmd.resp_type = MMC_RSP_R1;
                cmd.cmdarg = 1;
-               cmd.flags = 0;
                err = mmc_send_cmd(mmc, &cmd, NULL);
 
                if (err)
@@ -1000,7 +984,6 @@ int mmc_startup(struct mmc *mmc)
                MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
        cmd.resp_type = MMC_RSP_R2;
        cmd.cmdarg = 0;
-       cmd.flags = 0;
 
        err = mmc_send_cmd(mmc, &cmd, NULL);
 
@@ -1018,7 +1001,6 @@ int mmc_startup(struct mmc *mmc)
                cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
                cmd.cmdarg = mmc->rca << 16;
                cmd.resp_type = MMC_RSP_R6;
-               cmd.flags = 0;
 
                err = mmc_send_cmd(mmc, &cmd, NULL);
 
@@ -1033,7 +1015,6 @@ int mmc_startup(struct mmc *mmc)
        cmd.cmdidx = MMC_CMD_SEND_CSD;
        cmd.resp_type = MMC_RSP_R2;
        cmd.cmdarg = mmc->rca << 16;
-       cmd.flags = 0;
 
        err = mmc_send_cmd(mmc, &cmd, NULL);
 
@@ -1110,7 +1091,6 @@ int mmc_startup(struct mmc *mmc)
                cmd.cmdidx = MMC_CMD_SELECT_CARD;
                cmd.resp_type = MMC_RSP_R1;
                cmd.cmdarg = mmc->rca << 16;
-               cmd.flags = 0;
                err = mmc_send_cmd(mmc, &cmd, NULL);
 
                if (err)
@@ -1157,7 +1137,8 @@ int mmc_startup(struct mmc *mmc)
                }
 
                /* store the partition info of emmc */
-               if (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT)
+               if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
+                   ext_csd[EXT_CSD_BOOT_MULT])
                        mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
        }
 
@@ -1177,7 +1158,6 @@ int mmc_startup(struct mmc *mmc)
                        cmd.cmdidx = MMC_CMD_APP_CMD;
                        cmd.resp_type = MMC_RSP_R1;
                        cmd.cmdarg = mmc->rca << 16;
-                       cmd.flags = 0;
 
                        err = mmc_send_cmd(mmc, &cmd, NULL);
                        if (err)
@@ -1186,7 +1166,6 @@ int mmc_startup(struct mmc *mmc)
                        cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
                        cmd.resp_type = MMC_RSP_R1;
                        cmd.cmdarg = 2;
-                       cmd.flags = 0;
                        err = mmc_send_cmd(mmc, &cmd, NULL);
                        if (err)
                                return err;
@@ -1254,7 +1233,9 @@ int mmc_startup(struct mmc *mmc)
                        (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff);
        sprintf(mmc->block_dev.revision, "%d.%d", mmc->cid[2] >> 28,
                        (mmc->cid[2] >> 24) & 0xf);
+#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
        init_part(&mmc->block_dev);
+#endif
 
        return 0;
 }
@@ -1268,7 +1249,6 @@ int mmc_send_if_cond(struct mmc *mmc)
        /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
        cmd.cmdarg = ((mmc->voltages & 0xff8000) != 0) << 8 | 0xaa;
        cmd.resp_type = MMC_RSP_R7;
-       cmd.flags = 0;
 
        err = mmc_send_cmd(mmc, &cmd, NULL);
 
@@ -1306,10 +1286,9 @@ int mmc_register(struct mmc *mmc)
 block_dev_desc_t *mmc_get_dev(int dev)
 {
        struct mmc *mmc = find_mmc_device(dev);
-       if (!mmc)
+       if (!mmc || mmc_init(mmc))
                return NULL;
 
-       mmc_init(mmc);
        return &mmc->block_dev;
 }
 #endif