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

mmc: sdio: support SDIO UHS cards

This patch adds support for sdio UHS cards per the version 3.0
spec.

UHS mode is only enabled for version 3.0 cards when both the
host and the controller support UHS modes.

1.8v signaling support is removed if both the card and the
host do not support UHS. This is done to maintain
compatibility and some system/card combinations break when
1.8v signaling is enabled when the host does not support UHS.

Signed-off-by: Philip Rakity <prakity@marvell.com>
Signed-off-by: Aaron Lu <Aaron.lu@amd.com>
Reviewed-by: Arindam Nath <arindam.nath@amd.com>
Tested-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: Chris Ball <cjb@laptop.org>

authored by

Philip Rakity and committed by
Chris Ball
a303c531 b70a7fab

+335 -29
+1 -1
drivers/mmc/core/bus.c
··· 305 305 } else { 306 306 printk(KERN_INFO "%s: new %s%s%s card at address %04x\n", 307 307 mmc_hostname(card->host), 308 - mmc_sd_card_uhs(card) ? "ultra high speed " : 308 + mmc_card_uhs(card) ? "ultra high speed " : 309 309 (mmc_card_highspeed(card) ? "high speed " : ""), 310 310 mmc_card_ddr_mode(card) ? "DDR " : "", 311 311 type, card->rca);
+1 -1
drivers/mmc/core/sd.c
··· 960 960 goto free_card; 961 961 962 962 /* Card is an ultra-high-speed card */ 963 - mmc_sd_card_set_uhs(card); 963 + mmc_card_set_uhs(card); 964 964 965 965 /* 966 966 * Since initialization is now complete, enable preset
+304 -25
drivers/mmc/core/sdio.c
··· 102 102 int ret; 103 103 int cccr_vsn; 104 104 unsigned char data; 105 + unsigned char speed; 105 106 106 107 memset(&card->cccr, 0, sizeof(struct sdio_cccr)); 107 108 ··· 141 140 } 142 141 143 142 if (cccr_vsn >= SDIO_CCCR_REV_1_20) { 144 - ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_SPEED, 0, &data); 143 + ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_SPEED, 0, &speed); 145 144 if (ret) 146 145 goto out; 147 146 148 - if (data & SDIO_SPEED_SHS) 149 - card->cccr.high_speed = 1; 147 + card->scr.sda_spec3 = 0; 148 + card->sw_caps.sd3_bus_mode = 0; 149 + card->sw_caps.sd3_drv_type = 0; 150 + if (cccr_vsn >= SDIO_CCCR_REV_3_00) { 151 + card->scr.sda_spec3 = 1; 152 + ret = mmc_io_rw_direct(card, 0, 0, 153 + SDIO_CCCR_UHS, 0, &data); 154 + if (ret) 155 + goto out; 156 + 157 + if (card->host->caps & 158 + (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | 159 + MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 | 160 + MMC_CAP_UHS_DDR50)) { 161 + if (data & SDIO_UHS_DDR50) 162 + card->sw_caps.sd3_bus_mode 163 + |= SD_MODE_UHS_DDR50; 164 + 165 + if (data & SDIO_UHS_SDR50) 166 + card->sw_caps.sd3_bus_mode 167 + |= SD_MODE_UHS_SDR50; 168 + 169 + if (data & SDIO_UHS_SDR104) 170 + card->sw_caps.sd3_bus_mode 171 + |= SD_MODE_UHS_SDR104; 172 + } 173 + 174 + ret = mmc_io_rw_direct(card, 0, 0, 175 + SDIO_CCCR_DRIVE_STRENGTH, 0, &data); 176 + if (ret) 177 + goto out; 178 + 179 + if (data & SDIO_DRIVE_SDTA) 180 + card->sw_caps.sd3_drv_type |= SD_DRIVER_TYPE_A; 181 + if (data & SDIO_DRIVE_SDTC) 182 + card->sw_caps.sd3_drv_type |= SD_DRIVER_TYPE_C; 183 + if (data & SDIO_DRIVE_SDTD) 184 + card->sw_caps.sd3_drv_type |= SD_DRIVER_TYPE_D; 185 + } 186 + 187 + /* if no uhs mode ensure we check for high speed */ 188 + if (!card->sw_caps.sd3_bus_mode) { 189 + if (speed & SDIO_SPEED_SHS) { 190 + card->cccr.high_speed = 1; 191 + card->sw_caps.hs_max_dtr = 50000000; 192 + } else { 193 + card->cccr.high_speed = 0; 194 + card->sw_caps.hs_max_dtr = 25000000; 195 + } 196 + } 150 197 } 151 198 152 199 out: ··· 376 327 return max_dtr; 377 328 } 378 329 330 + static unsigned char host_drive_to_sdio_drive(int host_strength) 331 + { 332 + switch (host_strength) { 333 + case MMC_SET_DRIVER_TYPE_A: 334 + return SDIO_DTSx_SET_TYPE_A; 335 + case MMC_SET_DRIVER_TYPE_B: 336 + return SDIO_DTSx_SET_TYPE_B; 337 + case MMC_SET_DRIVER_TYPE_C: 338 + return SDIO_DTSx_SET_TYPE_C; 339 + case MMC_SET_DRIVER_TYPE_D: 340 + return SDIO_DTSx_SET_TYPE_D; 341 + default: 342 + return SDIO_DTSx_SET_TYPE_B; 343 + } 344 + } 345 + 346 + static void sdio_select_driver_type(struct mmc_card *card) 347 + { 348 + int host_drv_type = SD_DRIVER_TYPE_B; 349 + int card_drv_type = SD_DRIVER_TYPE_B; 350 + int drive_strength; 351 + unsigned char card_strength; 352 + int err; 353 + 354 + /* 355 + * If the host doesn't support any of the Driver Types A,C or D, 356 + * or there is no board specific handler then default Driver 357 + * Type B is used. 358 + */ 359 + if (!(card->host->caps & 360 + (MMC_CAP_DRIVER_TYPE_A | 361 + MMC_CAP_DRIVER_TYPE_C | 362 + MMC_CAP_DRIVER_TYPE_D))) 363 + return; 364 + 365 + if (!card->host->ops->select_drive_strength) 366 + return; 367 + 368 + if (card->host->caps & MMC_CAP_DRIVER_TYPE_A) 369 + host_drv_type |= SD_DRIVER_TYPE_A; 370 + 371 + if (card->host->caps & MMC_CAP_DRIVER_TYPE_C) 372 + host_drv_type |= SD_DRIVER_TYPE_C; 373 + 374 + if (card->host->caps & MMC_CAP_DRIVER_TYPE_D) 375 + host_drv_type |= SD_DRIVER_TYPE_D; 376 + 377 + if (card->sw_caps.sd3_drv_type & SD_DRIVER_TYPE_A) 378 + card_drv_type |= SD_DRIVER_TYPE_A; 379 + 380 + if (card->sw_caps.sd3_drv_type & SD_DRIVER_TYPE_C) 381 + card_drv_type |= SD_DRIVER_TYPE_C; 382 + 383 + if (card->sw_caps.sd3_drv_type & SD_DRIVER_TYPE_D) 384 + card_drv_type |= SD_DRIVER_TYPE_D; 385 + 386 + /* 387 + * The drive strength that the hardware can support 388 + * depends on the board design. Pass the appropriate 389 + * information and let the hardware specific code 390 + * return what is possible given the options 391 + */ 392 + drive_strength = card->host->ops->select_drive_strength( 393 + card->sw_caps.uhs_max_dtr, 394 + host_drv_type, card_drv_type); 395 + 396 + /* if error just use default for drive strength B */ 397 + err = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_DRIVE_STRENGTH, 0, 398 + &card_strength); 399 + if (err) 400 + return; 401 + 402 + card_strength &= ~(SDIO_DRIVE_DTSx_MASK<<SDIO_DRIVE_DTSx_SHIFT); 403 + card_strength |= host_drive_to_sdio_drive(drive_strength); 404 + 405 + err = mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_DRIVE_STRENGTH, 406 + card_strength, NULL); 407 + 408 + /* if error default to drive strength B */ 409 + if (!err) 410 + mmc_set_driver_type(card->host, drive_strength); 411 + } 412 + 413 + 414 + static int sdio_set_bus_speed_mode(struct mmc_card *card) 415 + { 416 + unsigned int bus_speed, timing; 417 + int err; 418 + unsigned char speed; 419 + 420 + /* 421 + * If the host doesn't support any of the UHS-I modes, fallback on 422 + * default speed. 423 + */ 424 + if (!(card->host->caps & (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | 425 + MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 | MMC_CAP_UHS_DDR50))) 426 + return 0; 427 + 428 + bus_speed = SDIO_SPEED_SDR12; 429 + timing = MMC_TIMING_UHS_SDR12; 430 + if ((card->host->caps & MMC_CAP_UHS_SDR104) && 431 + (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR104)) { 432 + bus_speed = SDIO_SPEED_SDR104; 433 + timing = MMC_TIMING_UHS_SDR104; 434 + card->sw_caps.uhs_max_dtr = UHS_SDR104_MAX_DTR; 435 + } else if ((card->host->caps & MMC_CAP_UHS_DDR50) && 436 + (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_DDR50)) { 437 + bus_speed = SDIO_SPEED_DDR50; 438 + timing = MMC_TIMING_UHS_DDR50; 439 + card->sw_caps.uhs_max_dtr = UHS_DDR50_MAX_DTR; 440 + } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | 441 + MMC_CAP_UHS_SDR50)) && (card->sw_caps.sd3_bus_mode & 442 + SD_MODE_UHS_SDR50)) { 443 + bus_speed = SDIO_SPEED_SDR50; 444 + timing = MMC_TIMING_UHS_SDR50; 445 + card->sw_caps.uhs_max_dtr = UHS_SDR50_MAX_DTR; 446 + } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | 447 + MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR25)) && 448 + (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR25)) { 449 + bus_speed = SDIO_SPEED_SDR25; 450 + timing = MMC_TIMING_UHS_SDR25; 451 + card->sw_caps.uhs_max_dtr = UHS_SDR25_MAX_DTR; 452 + } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | 453 + MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR25 | 454 + MMC_CAP_UHS_SDR12)) && (card->sw_caps.sd3_bus_mode & 455 + SD_MODE_UHS_SDR12)) { 456 + bus_speed = SDIO_SPEED_SDR12; 457 + timing = MMC_TIMING_UHS_SDR12; 458 + card->sw_caps.uhs_max_dtr = UHS_SDR12_MAX_DTR; 459 + } 460 + 461 + err = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_SPEED, 0, &speed); 462 + if (err) 463 + return err; 464 + 465 + speed &= ~SDIO_SPEED_BSS_MASK; 466 + speed |= bus_speed; 467 + err = mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_SPEED, speed, NULL); 468 + if (err) 469 + return err; 470 + 471 + if (bus_speed) { 472 + mmc_set_timing(card->host, timing); 473 + mmc_set_clock(card->host, card->sw_caps.uhs_max_dtr); 474 + } 475 + 476 + return 0; 477 + } 478 + 479 + /* 480 + * UHS-I specific initialization procedure 481 + */ 482 + static int mmc_sdio_init_uhs_card(struct mmc_card *card) 483 + { 484 + int err; 485 + 486 + if (!card->scr.sda_spec3) 487 + return 0; 488 + 489 + /* 490 + * Switch to wider bus (if supported). 491 + */ 492 + if (card->host->caps & MMC_CAP_4_BIT_DATA) { 493 + err = sdio_enable_4bit_bus(card); 494 + if (err > 0) { 495 + mmc_set_bus_width(card->host, MMC_BUS_WIDTH_4); 496 + err = 0; 497 + } 498 + } 499 + 500 + /* Set the driver strength for the card */ 501 + sdio_select_driver_type(card); 502 + 503 + /* Set bus speed mode of the card */ 504 + err = sdio_set_bus_speed_mode(card); 505 + if (err) 506 + goto out; 507 + 508 + /* Initialize and start re-tuning timer */ 509 + if (!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning) 510 + err = card->host->ops->execute_tuning(card->host); 511 + 512 + out: 513 + 514 + return err; 515 + } 516 + 379 517 /* 380 518 * Handle the detection and initialisation of a card. 381 519 * ··· 628 392 */ 629 393 if (host->ops->init_card) 630 394 host->ops->init_card(host, card); 395 + 396 + /* 397 + * If the host and card support UHS-I mode request the card 398 + * to switch to 1.8V signaling level. No 1.8v signalling if 399 + * UHS mode is not enabled to maintain compatibilty and some 400 + * systems that claim 1.8v signalling in fact do not support 401 + * it. 402 + */ 403 + if ((ocr & R4_18V_PRESENT) && 404 + (host->caps & 405 + (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | 406 + MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 | 407 + MMC_CAP_UHS_DDR50))) { 408 + err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180, 409 + true); 410 + if (err) { 411 + ocr &= ~R4_18V_PRESENT; 412 + host->ocr &= ~R4_18V_PRESENT; 413 + } 414 + err = 0; 415 + } else { 416 + ocr &= ~R4_18V_PRESENT; 417 + host->ocr &= ~R4_18V_PRESENT; 418 + } 631 419 632 420 /* 633 421 * For native busses: set card RCA and quit open drain mode. ··· 752 492 if (err) 753 493 goto remove; 754 494 755 - /* 756 - * Switch to high-speed (if supported). 757 - */ 758 - err = sdio_enable_hs(card); 759 - if (err > 0) 760 - mmc_sd_go_highspeed(card); 761 - else if (err) 762 - goto remove; 495 + /* Initialization sequence for UHS-I cards */ 496 + /* Only if card supports 1.8v and UHS signaling */ 497 + if ((ocr & R4_18V_PRESENT) && card->sw_caps.sd3_bus_mode) { 498 + err = mmc_sdio_init_uhs_card(card); 499 + if (err) 500 + goto remove; 763 501 764 - /* 765 - * Change to the card's maximum speed. 766 - */ 767 - mmc_set_clock(host, mmc_sdio_get_max_clock(card)); 502 + /* Card is an ultra-high-speed card */ 503 + mmc_card_set_uhs(card); 504 + } else { 505 + /* 506 + * Switch to high-speed (if supported). 507 + */ 508 + err = sdio_enable_hs(card); 509 + if (err > 0) 510 + mmc_sd_go_highspeed(card); 511 + else if (err) 512 + goto remove; 768 513 769 - /* 770 - * Switch to wider bus (if supported). 771 - */ 772 - err = sdio_enable_4bit_bus(card); 773 - if (err > 0) 774 - mmc_set_bus_width(card->host, MMC_BUS_WIDTH_4); 775 - else if (err) 776 - goto remove; 514 + /* 515 + * Change to the card's maximum speed. 516 + */ 517 + mmc_set_clock(host, mmc_sdio_get_max_clock(card)); 777 518 519 + /* 520 + * Switch to wider bus (if supported). 521 + */ 522 + err = sdio_enable_4bit_bus(card); 523 + if (err > 0) 524 + mmc_set_bus_width(card->host, MMC_BUS_WIDTH_4); 525 + else if (err) 526 + goto remove; 527 + } 778 528 finish: 779 529 if (!oldcard) 780 530 host->card = card; ··· 1067 797 * Detect and init the card. 1068 798 */ 1069 799 err = mmc_sdio_init_card(host, host->ocr, NULL, 0); 1070 - if (err) 1071 - goto err; 800 + if (err) { 801 + if (err == -EAGAIN) { 802 + /* 803 + * Retry initialization with S18R set to 0. 804 + */ 805 + host->ocr &= ~R4_18V_PRESENT; 806 + err = mmc_sdio_init_card(host, host->ocr, NULL, 0); 807 + } 808 + if (err) 809 + goto err; 810 + } 1072 811 card = host->card; 1073 812 1074 813 /*
+3 -1
include/linux/mmc/card.h
··· 367 367 #define mmc_card_highspeed(c) ((c)->state & MMC_STATE_HIGHSPEED) 368 368 #define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR) 369 369 #define mmc_card_ddr_mode(c) ((c)->state & MMC_STATE_HIGHSPEED_DDR) 370 - #define mmc_sd_card_uhs(c) ((c)->state & MMC_STATE_ULTRAHIGHSPEED) 370 + #define mmc_card_uhs(c) ((c)->state & MMC_STATE_ULTRAHIGHSPEED) 371 + #define mmc_sd_card_uhs(c) ((c)->state & MMC_STATE_ULTRAHIGHSPEED) 371 372 #define mmc_card_ext_capacity(c) ((c)->state & MMC_CARD_SDXC) 372 373 373 374 #define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) ··· 376 375 #define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED) 377 376 #define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR) 378 377 #define mmc_card_set_ddr_mode(c) ((c)->state |= MMC_STATE_HIGHSPEED_DDR) 378 + #define mmc_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED) 379 379 #define mmc_sd_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED) 380 380 #define mmc_card_set_ext_capacity(c) ((c)->state |= MMC_CARD_SDXC) 381 381
+26 -1
include/linux/mmc/sdio.h
··· 38 38 * [8:0] Byte/block count 39 39 */ 40 40 41 + #define R4_18V_PRESENT (1<<24) 41 42 #define R4_MEMORY_PRESENT (1 << 27) 42 43 43 44 /* ··· 86 85 #define SDIO_SD_REV_1_01 0 /* SD Physical Spec Version 1.01 */ 87 86 #define SDIO_SD_REV_1_10 1 /* SD Physical Spec Version 1.10 */ 88 87 #define SDIO_SD_REV_2_00 2 /* SD Physical Spec Version 2.00 */ 88 + #define SDIO_SD_REV_3_00 3 /* SD Physical Spev Version 3.00 */ 89 89 90 90 #define SDIO_CCCR_IOEx 0x02 91 91 #define SDIO_CCCR_IORx 0x03 ··· 136 134 #define SDIO_CCCR_SPEED 0x13 137 135 138 136 #define SDIO_SPEED_SHS 0x01 /* Supports High-Speed mode */ 139 - #define SDIO_SPEED_EHS 0x02 /* Enable High-Speed mode */ 137 + #define SDIO_SPEED_BSS_SHIFT 1 138 + #define SDIO_SPEED_BSS_MASK (7<<SDIO_SPEED_BSS_SHIFT) 139 + #define SDIO_SPEED_SDR12 (0<<SDIO_SPEED_BSS_SHIFT) 140 + #define SDIO_SPEED_SDR25 (1<<SDIO_SPEED_BSS_SHIFT) 141 + #define SDIO_SPEED_SDR50 (2<<SDIO_SPEED_BSS_SHIFT) 142 + #define SDIO_SPEED_SDR104 (3<<SDIO_SPEED_BSS_SHIFT) 143 + #define SDIO_SPEED_DDR50 (4<<SDIO_SPEED_BSS_SHIFT) 144 + #define SDIO_SPEED_EHS SDIO_SPEED_SDR25 /* Enable High-Speed */ 140 145 146 + #define SDIO_CCCR_UHS 0x14 147 + #define SDIO_UHS_SDR50 0x01 148 + #define SDIO_UHS_SDR104 0x02 149 + #define SDIO_UHS_DDR50 0x04 150 + 151 + #define SDIO_CCCR_DRIVE_STRENGTH 0x15 152 + #define SDIO_SDTx_MASK 0x07 153 + #define SDIO_DRIVE_SDTA (1<<0) 154 + #define SDIO_DRIVE_SDTC (1<<1) 155 + #define SDIO_DRIVE_SDTD (1<<2) 156 + #define SDIO_DRIVE_DTSx_MASK 0x03 157 + #define SDIO_DRIVE_DTSx_SHIFT 4 158 + #define SDIO_DTSx_SET_TYPE_B (0 << SDIO_DRIVE_DTSx_SHIFT) 159 + #define SDIO_DTSx_SET_TYPE_A (1 << SDIO_DRIVE_DTSx_SHIFT) 160 + #define SDIO_DTSx_SET_TYPE_C (2 << SDIO_DRIVE_DTSx_SHIFT) 161 + #define SDIO_DTSx_SET_TYPE_D (3 << SDIO_DRIVE_DTSx_SHIFT) 141 162 /* 142 163 * Function Basic Registers (FBR) 143 164 */