mmc: Accept EXT_CSD rev 1.3 since it is backwards compatible with 1.2
[pandora-kernel.git] / drivers / mmc / core / mmc.c
index fdd7c76..06084db 100644 (file)
@@ -208,7 +208,7 @@ static int mmc_read_ext_csd(struct mmc_card *card)
        }
 
        ext_csd_struct = ext_csd[EXT_CSD_REV];
-       if (ext_csd_struct > 2) {
+       if (ext_csd_struct > 3) {
                printk(KERN_ERR "%s: unrecognised EXT_CSD structure "
                        "version %d\n", mmc_hostname(card->host),
                        ext_csd_struct);
@@ -434,13 +434,24 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
         * Activate wide bus (if supported).
         */
        if ((card->csd.mmca_vsn >= CSD_SPEC_VER_4) &&
-               (host->caps & MMC_CAP_4_BIT_DATA)) {
+           (host->caps & (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA))) {
+               unsigned ext_csd_bit, bus_width;
+
+               if (host->caps & MMC_CAP_8_BIT_DATA) {
+                       ext_csd_bit = EXT_CSD_BUS_WIDTH_8;
+                       bus_width = MMC_BUS_WIDTH_8;
+               } else {
+                       ext_csd_bit = EXT_CSD_BUS_WIDTH_4;
+                       bus_width = MMC_BUS_WIDTH_4;
+               }
+
                err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
-                       EXT_CSD_BUS_WIDTH, EXT_CSD_BUS_WIDTH_4);
+                                EXT_CSD_BUS_WIDTH, ext_csd_bit);
+
                if (err)
                        goto free_card;
 
-               mmc_set_bus_width(card->host, MMC_BUS_WIDTH_4);
+               mmc_set_bus_width(card->host, bus_width);
        }
 
        if (!oldcard)
@@ -624,4 +635,3 @@ err:
 
        return err;
 }
-