|
@@ -434,13 +434,24 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
|
|
* Activate wide bus (if supported).
|
|
* Activate wide bus (if supported).
|
|
*/
|
|
*/
|
|
if ((card->csd.mmca_vsn >= CSD_SPEC_VER_4) &&
|
|
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,
|
|
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)
|
|
if (err)
|
|
goto free_card;
|
|
goto free_card;
|
|
|
|
|
|
- mmc_set_bus_width(card->host, MMC_BUS_WIDTH_4);
|
|
|
|
|
|
+ mmc_set_bus_width(card->host, bus_width);
|
|
}
|
|
}
|
|
|
|
|
|
if (!oldcard)
|
|
if (!oldcard)
|
|
@@ -624,4 +635,3 @@ err:
|
|
|
|
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
-
|
|
|