diff options
Diffstat (limited to 'drivers/mmc/core')
-rw-r--r-- | drivers/mmc/core/mmc.c | 81 |
1 files changed, 32 insertions, 49 deletions
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 54df5adc0413..0477769a8841 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c | |||
@@ -235,6 +235,36 @@ static int mmc_get_ext_csd(struct mmc_card *card, u8 **new_ext_csd) | |||
235 | return err; | 235 | return err; |
236 | } | 236 | } |
237 | 237 | ||
238 | static void mmc_select_card_type(struct mmc_card *card) | ||
239 | { | ||
240 | struct mmc_host *host = card->host; | ||
241 | u8 card_type = card->ext_csd.raw_card_type & EXT_CSD_CARD_TYPE_MASK; | ||
242 | unsigned int caps = host->caps, caps2 = host->caps2; | ||
243 | unsigned int hs_max_dtr = 0; | ||
244 | |||
245 | if (card_type & EXT_CSD_CARD_TYPE_26) | ||
246 | hs_max_dtr = MMC_HIGH_26_MAX_DTR; | ||
247 | |||
248 | if (caps & MMC_CAP_MMC_HIGHSPEED && | ||
249 | card_type & EXT_CSD_CARD_TYPE_52) | ||
250 | hs_max_dtr = MMC_HIGH_52_MAX_DTR; | ||
251 | |||
252 | if ((caps & MMC_CAP_1_8V_DDR && | ||
253 | card_type & EXT_CSD_CARD_TYPE_DDR_1_8V) || | ||
254 | (caps & MMC_CAP_1_2V_DDR && | ||
255 | card_type & EXT_CSD_CARD_TYPE_DDR_1_2V)) | ||
256 | hs_max_dtr = MMC_HIGH_DDR_MAX_DTR; | ||
257 | |||
258 | if ((caps2 & MMC_CAP2_HS200_1_8V_SDR && | ||
259 | card_type & EXT_CSD_CARD_TYPE_SDR_1_8V) || | ||
260 | (caps2 & MMC_CAP2_HS200_1_2V_SDR && | ||
261 | card_type & EXT_CSD_CARD_TYPE_SDR_1_2V)) | ||
262 | hs_max_dtr = MMC_HS200_MAX_DTR; | ||
263 | |||
264 | card->ext_csd.hs_max_dtr = hs_max_dtr; | ||
265 | card->ext_csd.card_type = card_type; | ||
266 | } | ||
267 | |||
238 | /* | 268 | /* |
239 | * Decode extended CSD. | 269 | * Decode extended CSD. |
240 | */ | 270 | */ |
@@ -284,56 +314,9 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) | |||
284 | if (card->ext_csd.sectors > (2u * 1024 * 1024 * 1024) / 512) | 314 | if (card->ext_csd.sectors > (2u * 1024 * 1024 * 1024) / 512) |
285 | mmc_card_set_blockaddr(card); | 315 | mmc_card_set_blockaddr(card); |
286 | } | 316 | } |
317 | |||
287 | card->ext_csd.raw_card_type = ext_csd[EXT_CSD_CARD_TYPE]; | 318 | card->ext_csd.raw_card_type = ext_csd[EXT_CSD_CARD_TYPE]; |
288 | switch (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_MASK) { | 319 | mmc_select_card_type(card); |
289 | case EXT_CSD_CARD_TYPE_SDR_ALL: | ||
290 | case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_8V: | ||
291 | case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_2V: | ||
292 | case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_52: | ||
293 | card->ext_csd.hs_max_dtr = 200000000; | ||
294 | card->ext_csd.card_type = EXT_CSD_CARD_TYPE_SDR_200; | ||
295 | break; | ||
296 | case EXT_CSD_CARD_TYPE_SDR_1_2V_ALL: | ||
297 | case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_8V: | ||
298 | case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_2V: | ||
299 | case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_52: | ||
300 | card->ext_csd.hs_max_dtr = 200000000; | ||
301 | card->ext_csd.card_type = EXT_CSD_CARD_TYPE_SDR_1_2V; | ||
302 | break; | ||
303 | case EXT_CSD_CARD_TYPE_SDR_1_8V_ALL: | ||
304 | case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_8V: | ||
305 | case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_2V: | ||
306 | case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_52: | ||
307 | card->ext_csd.hs_max_dtr = 200000000; | ||
308 | card->ext_csd.card_type = EXT_CSD_CARD_TYPE_SDR_1_8V; | ||
309 | break; | ||
310 | case EXT_CSD_CARD_TYPE_DDR_52 | EXT_CSD_CARD_TYPE_52 | | ||
311 | EXT_CSD_CARD_TYPE_26: | ||
312 | card->ext_csd.hs_max_dtr = 52000000; | ||
313 | card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_52; | ||
314 | break; | ||
315 | case EXT_CSD_CARD_TYPE_DDR_1_2V | EXT_CSD_CARD_TYPE_52 | | ||
316 | EXT_CSD_CARD_TYPE_26: | ||
317 | card->ext_csd.hs_max_dtr = 52000000; | ||
318 | card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_1_2V; | ||
319 | break; | ||
320 | case EXT_CSD_CARD_TYPE_DDR_1_8V | EXT_CSD_CARD_TYPE_52 | | ||
321 | EXT_CSD_CARD_TYPE_26: | ||
322 | card->ext_csd.hs_max_dtr = 52000000; | ||
323 | card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_1_8V; | ||
324 | break; | ||
325 | case EXT_CSD_CARD_TYPE_52 | EXT_CSD_CARD_TYPE_26: | ||
326 | card->ext_csd.hs_max_dtr = 52000000; | ||
327 | break; | ||
328 | case EXT_CSD_CARD_TYPE_26: | ||
329 | card->ext_csd.hs_max_dtr = 26000000; | ||
330 | break; | ||
331 | default: | ||
332 | /* MMC v4 spec says this cannot happen */ | ||
333 | pr_warning("%s: card is mmc v4 but doesn't " | ||
334 | "support any high-speed modes.\n", | ||
335 | mmc_hostname(card->host)); | ||
336 | } | ||
337 | 320 | ||
338 | card->ext_csd.raw_s_a_timeout = ext_csd[EXT_CSD_S_A_TIMEOUT]; | 321 | card->ext_csd.raw_s_a_timeout = ext_csd[EXT_CSD_S_A_TIMEOUT]; |
339 | card->ext_csd.raw_erase_timeout_mult = | 322 | card->ext_csd.raw_erase_timeout_mult = |