aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/core/mmc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mmc/core/mmc.c')
-rw-r--r--drivers/mmc/core/mmc.c61
1 files changed, 53 insertions, 8 deletions
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index 506a4e3..1622bbb 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -30,10 +30,12 @@
#else
/* For debugging about ext_csd register value */
#if 0
+#ifndef CONFIG_WIMAX_CMC
#define MMC_CHECK_EXT_CSD
#endif
#endif
#endif
+#endif
/*
* If moviNAND VHX 4.41 device
@@ -216,7 +218,7 @@ static int mmc_decode_csd(struct mmc_card *card)
return 0;
}
-#if defined(MMC_CHECK_EXT_CSD)
+#if defined(MMC_CHECK_EXT_CSD) && !defined(CONFIG_WIMAX_CMC)
/* For debugging about ext_csd register value */
static u8 *ext_csd_backup;
static void mmc_error_ext_csd(struct mmc_card *card, u8 *ext_csd,
@@ -340,7 +342,7 @@ static int mmc_get_ext_csd(struct mmc_card *card, u8 **new_ext_csd)
} else
*new_ext_csd = ext_csd;
-#if defined(MMC_CHECK_EXT_CSD)
+#if defined(MMC_CHECK_EXT_CSD) && !defined(CONFIG_WIMAX_CMC)
/* For debugging about ext_csd register value */
mmc_error_ext_csd(card, ext_csd, 1, 0);
#endif
@@ -369,7 +371,7 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
"version %d\n", mmc_hostname(card->host),
card->ext_csd.raw_ext_csd_structure);
err = -EINVAL;
-#if defined(MMC_CHECK_EXT_CSD)
+#if defined(MMC_CHECK_EXT_CSD) && !defined(CONFIG_WIMAX_CMC)
/* For debugging about ext_csd register value */
mmc_error_ext_csd(card, ext_csd, 0, EXT_CSD_STRUCTURE);
#endif
@@ -386,7 +388,7 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
printk(KERN_ERR "%s: unrecognised EXT_CSD revision %d\n",
mmc_hostname(card->host), card->ext_csd.rev);
err = -EINVAL;
-#if defined(MMC_CHECK_EXT_CSD)
+#if defined(MMC_CHECK_EXT_CSD) && !defined(CONFIG_WIMAX_CMC)
/* For debugging about ext_csd register value */
mmc_error_ext_csd(card, ext_csd, 0, EXT_CSD_REV);
#endif
@@ -409,6 +411,35 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
mmc_card_set_blockaddr(card);
}
card->ext_csd.raw_card_type = ext_csd[EXT_CSD_CARD_TYPE];
+#ifdef CONFIG_WIMAX_CMC
+ switch (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_MASK) {
+ 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 */
+ printk(KERN_WARNING "%s: card is mmc v4 but doesn't "
+ "support any high-speed modes.\n",
+ mmc_hostname(card->host));
+#else
if (card->host->caps2 & MMC_CAP2_HS200) {
switch (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_MASK) {
case EXT_CSD_CARD_TYPE_SDR_ALL:
@@ -507,6 +538,7 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
goto out;
#endif
}
+#endif
}
card->ext_csd.raw_s_a_timeout = ext_csd[EXT_CSD_S_A_TIMEOUT];
@@ -608,12 +640,12 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
card->host->card = card;
movi_ver_check = mmc_start_movi_smart(card);
}
-
+#ifndef CONFIG_WIMAX_CMC
/* enable discard feature if emmc is 4.41+ moviNand */
if ((ext_csd[EXT_CSD_VENDOR_SPECIFIC_FIELD + 0] & 0x1) &&
(card->cid.manfid == 0x15))
card->ext_csd.feature_support |= MMC_DISCARD_FEATURE;
-
+#endif
/* enable PON feature if moviNAND VHX/VMX devices */
if (CHECK_MOVI_PON_SUPPORT) {
if ((movi_ver_check & MMC_MOVI_VER_VHX0) &&
@@ -890,6 +922,7 @@ static int mmc_select_powerclass(struct mmc_card *card,
return err;
}
+#ifndef CONFIG_WIMAX_CMC
/*
* Selects the desired buswidth and switch to the HS200 mode
* if bus width set without error
@@ -962,7 +995,7 @@ static int mmc_select_hs200(struct mmc_card *card)
err:
return err;
}
-
+#endif
/*
* Handle the detection and initialisation of a card.
*
@@ -1076,7 +1109,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
/*
* Fetch and process extended CSD.
*/
-#if defined(MMC_RETRY_READ_EXT_CSD)
+#if defined(MMC_RETRY_READ_EXT_CSD) && !defined(CONFIG_WIMAX_CMC)
{
int i = 0;
for (i = 0 ; i < 3 ; i++) {
@@ -1180,6 +1213,11 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
card->ext_csd.generic_cmd6_time);
if (err && err != -EBADMSG)
goto free_card;
+#ifdef CONFIG_WIMAX_CMC
+ if (!err)
+#else
+ if (!err && (host->caps2 & MMC_CAP2_POWEROFF_NOTIFY))
+#endif
/*
* The err can be -EBADMSG or 0,
* so check for success and update the flag
@@ -1192,13 +1230,20 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
* Activate high speed (if supported)
*/
if (card->ext_csd.hs_max_dtr != 0) {
+#ifndef CONFIG_WIMAX_CMC
err = 0;
if (card->ext_csd.hs_max_dtr > 52000000 &&
host->caps2 & MMC_CAP2_HS200)
err = mmc_select_hs200(card);
else if (host->caps & MMC_CAP_MMC_HIGHSPEED)
+#else
+ err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
+ EXT_CSD_HS_TIMING, 1, card->ext_csd.generic_cmd6_time);
+#endif
+#ifndef CONFIG_WIMAX_CMC
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
EXT_CSD_HS_TIMING, 1, 0);
+#endif
if (err && err != -EBADMSG)
goto free_card;