|
@@ -235,6 +235,36 @@ static int mmc_get_ext_csd(struct mmc_card *card, u8 **new_ext_csd)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+static void mmc_select_card_type(struct mmc_card *card)
|
|
|
+{
|
|
|
+ struct mmc_host *host = card->host;
|
|
|
+ u8 card_type = card->ext_csd.raw_card_type & EXT_CSD_CARD_TYPE_MASK;
|
|
|
+ unsigned int caps = host->caps, caps2 = host->caps2;
|
|
|
+ unsigned int hs_max_dtr = 0;
|
|
|
+
|
|
|
+ if (card_type & EXT_CSD_CARD_TYPE_26)
|
|
|
+ hs_max_dtr = MMC_HIGH_26_MAX_DTR;
|
|
|
+
|
|
|
+ if (caps & MMC_CAP_MMC_HIGHSPEED &&
|
|
|
+ card_type & EXT_CSD_CARD_TYPE_52)
|
|
|
+ hs_max_dtr = MMC_HIGH_52_MAX_DTR;
|
|
|
+
|
|
|
+ if ((caps & MMC_CAP_1_8V_DDR &&
|
|
|
+ card_type & EXT_CSD_CARD_TYPE_DDR_1_8V) ||
|
|
|
+ (caps & MMC_CAP_1_2V_DDR &&
|
|
|
+ card_type & EXT_CSD_CARD_TYPE_DDR_1_2V))
|
|
|
+ hs_max_dtr = MMC_HIGH_DDR_MAX_DTR;
|
|
|
+
|
|
|
+ if ((caps2 & MMC_CAP2_HS200_1_8V_SDR &&
|
|
|
+ card_type & EXT_CSD_CARD_TYPE_SDR_1_8V) ||
|
|
|
+ (caps2 & MMC_CAP2_HS200_1_2V_SDR &&
|
|
|
+ card_type & EXT_CSD_CARD_TYPE_SDR_1_2V))
|
|
|
+ hs_max_dtr = MMC_HS200_MAX_DTR;
|
|
|
+
|
|
|
+ card->ext_csd.hs_max_dtr = hs_max_dtr;
|
|
|
+ card->ext_csd.card_type = card_type;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Decode extended CSD.
|
|
|
*/
|
|
@@ -284,56 +314,9 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
|
|
|
if (card->ext_csd.sectors > (2u * 1024 * 1024 * 1024) / 512)
|
|
|
mmc_card_set_blockaddr(card);
|
|
|
}
|
|
|
+
|
|
|
card->ext_csd.raw_card_type = ext_csd[EXT_CSD_CARD_TYPE];
|
|
|
- switch (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_MASK) {
|
|
|
- case EXT_CSD_CARD_TYPE_SDR_ALL:
|
|
|
- case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_8V:
|
|
|
- case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_2V:
|
|
|
- case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_52:
|
|
|
- card->ext_csd.hs_max_dtr = 200000000;
|
|
|
- card->ext_csd.card_type = EXT_CSD_CARD_TYPE_SDR_200;
|
|
|
- break;
|
|
|
- case EXT_CSD_CARD_TYPE_SDR_1_2V_ALL:
|
|
|
- case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_8V:
|
|
|
- case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_2V:
|
|
|
- case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_52:
|
|
|
- card->ext_csd.hs_max_dtr = 200000000;
|
|
|
- card->ext_csd.card_type = EXT_CSD_CARD_TYPE_SDR_1_2V;
|
|
|
- break;
|
|
|
- case EXT_CSD_CARD_TYPE_SDR_1_8V_ALL:
|
|
|
- case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_8V:
|
|
|
- case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_2V:
|
|
|
- case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_52:
|
|
|
- card->ext_csd.hs_max_dtr = 200000000;
|
|
|
- card->ext_csd.card_type = EXT_CSD_CARD_TYPE_SDR_1_8V;
|
|
|
- break;
|
|
|
- case EXT_CSD_CARD_TYPE_DDR_52 | EXT_CSD_CARD_TYPE_52 |
|
|
|
- EXT_CSD_CARD_TYPE_26:
|
|
|
- card->ext_csd.hs_max_dtr = 52000000;
|
|
|
- card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_52;
|
|
|
- break;
|
|
|
- case EXT_CSD_CARD_TYPE_DDR_1_2V | EXT_CSD_CARD_TYPE_52 |
|
|
|
- EXT_CSD_CARD_TYPE_26:
|
|
|
- card->ext_csd.hs_max_dtr = 52000000;
|
|
|
- card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_1_2V;
|
|
|
- break;
|
|
|
- case EXT_CSD_CARD_TYPE_DDR_1_8V | EXT_CSD_CARD_TYPE_52 |
|
|
|
- EXT_CSD_CARD_TYPE_26:
|
|
|
- card->ext_csd.hs_max_dtr = 52000000;
|
|
|
- card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_1_8V;
|
|
|
- break;
|
|
|
- case EXT_CSD_CARD_TYPE_52 | EXT_CSD_CARD_TYPE_26:
|
|
|
- card->ext_csd.hs_max_dtr = 52000000;
|
|
|
- break;
|
|
|
- case EXT_CSD_CARD_TYPE_26:
|
|
|
- card->ext_csd.hs_max_dtr = 26000000;
|
|
|
- break;
|
|
|
- default:
|
|
|
- /* MMC v4 spec says this cannot happen */
|
|
|
- pr_warning("%s: card is mmc v4 but doesn't "
|
|
|
- "support any high-speed modes.\n",
|
|
|
- mmc_hostname(card->host));
|
|
|
- }
|
|
|
+ mmc_select_card_type(card);
|
|
|
|
|
|
card->ext_csd.raw_s_a_timeout = ext_csd[EXT_CSD_S_A_TIMEOUT];
|
|
|
card->ext_csd.raw_erase_timeout_mult =
|