MMC: add weak function to detect MMC/SD card
[kernel/u-boot.git] / drivers / mmc / mmc.c
index 925f863..3679225 100644 (file)
 static struct list_head mmc_devices;
 static int cur_dev_num = -1;
 
+int __board_mmc_getcd(u8 *cd, struct mmc *mmc) {
+       return -1;
+}
+
+int board_mmc_getcd(u8 *cd, struct mmc *mmc)__attribute__((weak,
+       alias("__board_mmc_getcd")));
+
 int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
 {
        return mmc->send_cmd(mmc, cmd, data);
@@ -273,7 +280,15 @@ sd_send_op_cond(struct mmc *mmc)
 
                cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
                cmd.resp_type = MMC_RSP_R3;
-               cmd.cmdarg = mmc->voltages;
+
+               /*
+                * Most cards do not answer if some reserved bits
+                * in the ocr are set. However, Some controller
+                * can set bit 7 (reserved for low voltages), but
+                * how to manage low voltages SD card is not yet
+                * specified.
+                */
+               cmd.cmdarg = mmc->voltages & 0xff8000;
 
                if (mmc->version == SD_VERSION_2)
                        cmd.cmdarg |= OCR_HCS;
@@ -487,8 +502,8 @@ retry_scr:
                return err;
        }
 
-       mmc->scr[0] = scr[0];
-       mmc->scr[1] = scr[1];
+       mmc->scr[0] = __be32_to_cpu(scr[0]);
+       mmc->scr[1] = __be32_to_cpu(scr[1]);
 
        switch ((mmc->scr[0] >> 24) & 0xf) {
                case 0:
@@ -518,7 +533,7 @@ retry_scr:
                        return err;
 
                /* The high-speed function is busy.  Try again */
-               if (!switch_status[7] & SD_HIGHSPEED_BUSY)
+               if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
                        break;
        }
 
@@ -526,7 +541,7 @@ retry_scr:
                mmc->card_caps |= MMC_MODE_4BIT;
 
        /* If high-speed isn't supported, we return */
-       if (!(switch_status[3] & SD_HIGHSPEED_SUPPORTED))
+       if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
                return 0;
 
        err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)&switch_status);
@@ -534,7 +549,7 @@ retry_scr:
        if (err)
                return err;
 
-       if ((switch_status[4] & 0x0f000000) == 0x01000000)
+       if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
                mmc->card_caps |= MMC_MODE_HS;
 
        return 0;
@@ -859,6 +874,9 @@ int mmc_init(struct mmc *mmc)
        if (err)
                return err;
 
+       mmc_set_bus_width(mmc, 1);
+       mmc_set_clock(mmc, 1);
+
        /* Reset the Card */
        err = mmc_go_idle(mmc);
 
@@ -868,10 +886,6 @@ int mmc_init(struct mmc *mmc)
        /* Test for SD version 2 */
        err = mmc_send_if_cond(mmc);
 
-       /* If we got an error other than timeout, we bail */
-       if (err && err != TIMEOUT)
-               return err;
-
        /* Now try to get the SD card's operating condition */
        err = sd_send_op_cond(mmc);