mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
mmc: core: fix the decision of HS200/DDR card-type
Current implementation decides the card type exclusively. Even though eMMC device can support both HS200 and DDR mode, card type will be set only for HS200. If the host doesn't support HS200 but has DDR capability, then DDR mode can't be selected. Signed-off-by: Seungwon Jeon <[email protected]> Reviewed-by: Subhash Jadavani <[email protected]> Signed-off-by: Chris Ball <[email protected]>
This commit is contained in:
parent
c0a120a4bc
commit
96cf5f02ae
3 changed files with 36 additions and 109 deletions
|
|
@ -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 =
|
||||
|
|
|
|||
Loading…
Reference in a new issue