Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <tgih.jun@samsung.com>
Reviewed-by: Subhash Jadavani <subhashj@codeaurora.org>
Signed-off-by: Chris Ball <cjb@laptop.org>

authored by

Seungwon Jeon and committed by
Chris Ball
96cf5f02 c0a120a4

+36 -109
+32 -49
drivers/mmc/core/mmc.c
··· 235 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 269 * Decode extended CSD. 240 270 */ ··· 314 284 if (card->ext_csd.sectors > (2u * 1024 * 1024 * 1024) / 512) 315 285 mmc_card_set_blockaddr(card); 316 286 } 287 + 317 288 card->ext_csd.raw_card_type = ext_csd[EXT_CSD_CARD_TYPE]; 318 - switch (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_MASK) { 319 - case EXT_CSD_CARD_TYPE_SDR_ALL: 320 - case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_8V: 321 - case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_2V: 322 - case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_52: 323 - card->ext_csd.hs_max_dtr = 200000000; 324 - card->ext_csd.card_type = EXT_CSD_CARD_TYPE_SDR_200; 325 - break; 326 - case EXT_CSD_CARD_TYPE_SDR_1_2V_ALL: 327 - case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_8V: 328 - case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_2V: 329 - case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_52: 330 - card->ext_csd.hs_max_dtr = 200000000; 331 - card->ext_csd.card_type = EXT_CSD_CARD_TYPE_SDR_1_2V; 332 - break; 333 - case EXT_CSD_CARD_TYPE_SDR_1_8V_ALL: 334 - case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_8V: 335 - case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_2V: 336 - case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_52: 337 - card->ext_csd.hs_max_dtr = 200000000; 338 - card->ext_csd.card_type = EXT_CSD_CARD_TYPE_SDR_1_8V; 339 - break; 340 - case EXT_CSD_CARD_TYPE_DDR_52 | EXT_CSD_CARD_TYPE_52 | 341 - EXT_CSD_CARD_TYPE_26: 342 - card->ext_csd.hs_max_dtr = 52000000; 343 - card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_52; 344 - break; 345 - case EXT_CSD_CARD_TYPE_DDR_1_2V | EXT_CSD_CARD_TYPE_52 | 346 - EXT_CSD_CARD_TYPE_26: 347 - card->ext_csd.hs_max_dtr = 52000000; 348 - card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_1_2V; 349 - break; 350 - case EXT_CSD_CARD_TYPE_DDR_1_8V | EXT_CSD_CARD_TYPE_52 | 351 - EXT_CSD_CARD_TYPE_26: 352 - card->ext_csd.hs_max_dtr = 52000000; 353 - card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_1_8V; 354 - break; 355 - case EXT_CSD_CARD_TYPE_52 | EXT_CSD_CARD_TYPE_26: 356 - card->ext_csd.hs_max_dtr = 52000000; 357 - break; 358 - case EXT_CSD_CARD_TYPE_26: 359 - card->ext_csd.hs_max_dtr = 26000000; 360 - break; 361 - default: 362 - /* MMC v4 spec says this cannot happen */ 363 - pr_warning("%s: card is mmc v4 but doesn't " 364 - "support any high-speed modes.\n", 365 - mmc_hostname(card->host)); 366 - } 289 + mmc_select_card_type(card); 367 290 368 291 card->ext_csd.raw_s_a_timeout = ext_csd[EXT_CSD_S_A_TIMEOUT]; 369 292 card->ext_csd.raw_erase_timeout_mult =
+4
include/linux/mmc/card.h
··· 58 58 unsigned int generic_cmd6_time; /* Units: 10ms */ 59 59 unsigned int power_off_longtime; /* Units: ms */ 60 60 unsigned int hs_max_dtr; 61 + #define MMC_HIGH_26_MAX_DTR 26000000 62 + #define MMC_HIGH_52_MAX_DTR 52000000 63 + #define MMC_HIGH_DDR_MAX_DTR 52000000 64 + #define MMC_HS200_MAX_DTR 200000000 61 65 unsigned int sectors; 62 66 unsigned int card_type; 63 67 unsigned int hc_erase_size; /* In sectors */
-60
include/linux/mmc/mmc.h
··· 354 354 #define EXT_CSD_CARD_TYPE_SDR_1_2V (1<<5) /* Card can run at 200MHz */ 355 355 /* SDR mode @1.2V I/O */ 356 356 357 - #define EXT_CSD_CARD_TYPE_SDR_200 (EXT_CSD_CARD_TYPE_SDR_1_8V | \ 358 - EXT_CSD_CARD_TYPE_SDR_1_2V) 359 - 360 - #define EXT_CSD_CARD_TYPE_SDR_ALL (EXT_CSD_CARD_TYPE_SDR_200 | \ 361 - EXT_CSD_CARD_TYPE_52 | \ 362 - EXT_CSD_CARD_TYPE_26) 363 - 364 - #define EXT_CSD_CARD_TYPE_SDR_1_2V_ALL (EXT_CSD_CARD_TYPE_SDR_1_2V | \ 365 - EXT_CSD_CARD_TYPE_52 | \ 366 - EXT_CSD_CARD_TYPE_26) 367 - 368 - #define EXT_CSD_CARD_TYPE_SDR_1_8V_ALL (EXT_CSD_CARD_TYPE_SDR_1_8V | \ 369 - EXT_CSD_CARD_TYPE_52 | \ 370 - EXT_CSD_CARD_TYPE_26) 371 - 372 - #define EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_8V (EXT_CSD_CARD_TYPE_SDR_1_2V | \ 373 - EXT_CSD_CARD_TYPE_DDR_1_8V | \ 374 - EXT_CSD_CARD_TYPE_52 | \ 375 - EXT_CSD_CARD_TYPE_26) 376 - 377 - #define EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_8V (EXT_CSD_CARD_TYPE_SDR_1_8V | \ 378 - EXT_CSD_CARD_TYPE_DDR_1_8V | \ 379 - EXT_CSD_CARD_TYPE_52 | \ 380 - EXT_CSD_CARD_TYPE_26) 381 - 382 - #define EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_2V (EXT_CSD_CARD_TYPE_SDR_1_2V | \ 383 - EXT_CSD_CARD_TYPE_DDR_1_2V | \ 384 - EXT_CSD_CARD_TYPE_52 | \ 385 - EXT_CSD_CARD_TYPE_26) 386 - 387 - #define EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_2V (EXT_CSD_CARD_TYPE_SDR_1_8V | \ 388 - EXT_CSD_CARD_TYPE_DDR_1_2V | \ 389 - EXT_CSD_CARD_TYPE_52 | \ 390 - EXT_CSD_CARD_TYPE_26) 391 - 392 - #define EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_52 (EXT_CSD_CARD_TYPE_SDR_1_2V | \ 393 - EXT_CSD_CARD_TYPE_DDR_52 | \ 394 - EXT_CSD_CARD_TYPE_52 | \ 395 - EXT_CSD_CARD_TYPE_26) 396 - 397 - #define EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_52 (EXT_CSD_CARD_TYPE_SDR_1_8V | \ 398 - EXT_CSD_CARD_TYPE_DDR_52 | \ 399 - EXT_CSD_CARD_TYPE_52 | \ 400 - EXT_CSD_CARD_TYPE_26) 401 - 402 - #define EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_8V (EXT_CSD_CARD_TYPE_SDR_200 | \ 403 - EXT_CSD_CARD_TYPE_DDR_1_8V | \ 404 - EXT_CSD_CARD_TYPE_52 | \ 405 - EXT_CSD_CARD_TYPE_26) 406 - 407 - #define EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_2V (EXT_CSD_CARD_TYPE_SDR_200 | \ 408 - EXT_CSD_CARD_TYPE_DDR_1_2V | \ 409 - EXT_CSD_CARD_TYPE_52 | \ 410 - EXT_CSD_CARD_TYPE_26) 411 - 412 - #define EXT_CSD_CARD_TYPE_SDR_ALL_DDR_52 (EXT_CSD_CARD_TYPE_SDR_200 | \ 413 - EXT_CSD_CARD_TYPE_DDR_52 | \ 414 - EXT_CSD_CARD_TYPE_52 | \ 415 - EXT_CSD_CARD_TYPE_26) 416 - 417 357 #define EXT_CSD_BUS_WIDTH_1 0 /* Card is in 1 bit mode */ 418 358 #define EXT_CSD_BUS_WIDTH_4 1 /* Card is in 4 bit mode */ 419 359 #define EXT_CSD_BUS_WIDTH_8 2 /* Card is in 8 bit mode */