aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc
diff options
context:
space:
mode:
authorAaron Lu <aaron.lu@amd.com>2012-07-03 02:16:11 -0400
committerChris Ball <cjb@laptop.org>2012-07-22 15:25:47 -0400
commita39ca6ae0a08994a59d017a445939e164bc77fd5 (patch)
treec5e9f493c51f00e3ce6de5cdd5bd4081b8cb2a7f /drivers/mmc
parentb67c6b411dcf17199e1dfdf18da8b1c6caf73e6e (diff)
mmc: core: Simplify and fix for SD switch processing
In mmc_read_switch, just do a one time mode 0 switch command to get the support bits information, no need to do multiple times as the support bits do not change with different arguments. And no need to check current limit support bits, as these bits are fixed according to the signal voltage. If the signal voltage is 1.8V, the support bits would be 0xf and if the signal voltage is 3.3V, the support bits would be 0x01. We will check host's ability to set the current limit. Signed-off-by: Aaron Lu <aaron.lu@amd.com> Signed-off-by: Chris Ball <cjb@laptop.org>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/core/sd.c94
1 files changed, 22 insertions, 72 deletions
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
index 33c6f26c68d0..8460568e5213 100644
--- a/drivers/mmc/core/sd.c
+++ b/drivers/mmc/core/sd.c
@@ -290,8 +290,12 @@ static int mmc_read_switch(struct mmc_card *card)
290 return -ENOMEM; 290 return -ENOMEM;
291 } 291 }
292 292
293 /* Find out the supported Bus Speed Modes. */ 293 /*
294 err = mmc_sd_switch(card, 0, 0, 1, status); 294 * Find out the card's support bits with a mode 0 operation.
295 * The argument does not matter, as the support bits do not
296 * change with the arguments.
297 */
298 err = mmc_sd_switch(card, 0, 0, 0, status);
295 if (err) { 299 if (err) {
296 /* 300 /*
297 * If the host or the card can't do the switch, 301 * If the host or the card can't do the switch,
@@ -312,46 +316,8 @@ static int mmc_read_switch(struct mmc_card *card)
312 316
313 if (card->scr.sda_spec3) { 317 if (card->scr.sda_spec3) {
314 card->sw_caps.sd3_bus_mode = status[13]; 318 card->sw_caps.sd3_bus_mode = status[13];
315 319 /* Driver Strengths supported by the card */
316 /* Find out Driver Strengths supported by the card */
317 err = mmc_sd_switch(card, 0, 2, 1, status);
318 if (err) {
319 /*
320 * If the host or the card can't do the switch,
321 * fail more gracefully.
322 */
323 if (err != -EINVAL && err != -ENOSYS && err != -EFAULT)
324 goto out;
325
326 pr_warning("%s: problem reading "
327 "Driver Strength.\n",
328 mmc_hostname(card->host));
329 err = 0;
330
331 goto out;
332 }
333
334 card->sw_caps.sd3_drv_type = status[9]; 320 card->sw_caps.sd3_drv_type = status[9];
335
336 /* Find out Current Limits supported by the card */
337 err = mmc_sd_switch(card, 0, 3, 1, status);
338 if (err) {
339 /*
340 * If the host or the card can't do the switch,
341 * fail more gracefully.
342 */
343 if (err != -EINVAL && err != -ENOSYS && err != -EFAULT)
344 goto out;
345
346 pr_warning("%s: problem reading "
347 "Current Limit.\n",
348 mmc_hostname(card->host));
349 err = 0;
350
351 goto out;
352 }
353
354 card->sw_caps.sd3_curr_limit = status[7];
355 } 321 }
356 322
357out: 323out:
@@ -560,41 +526,24 @@ static int sd_set_current_limit(struct mmc_card *card, u8 *status)
560 * Current limit switch is only defined for SDR50, SDR104, and DDR50 526 * Current limit switch is only defined for SDR50, SDR104, and DDR50
561 * bus speed modes. For other bus speed modes, we do not change the 527 * bus speed modes. For other bus speed modes, we do not change the
562 * current limit. 528 * current limit.
529 * We only check host's capability here, if we set a limit that is
530 * higher than the card's maximum current, the card will be using its
531 * maximum current, e.g. if the card's maximum current is 300ma, and
532 * when we set current limit to 200ma, the card will draw 200ma, and
533 * when we set current limit to 400/600/800ma, the card will draw its
534 * maximum 300ma from the host.
563 */ 535 */
564 if ((card->sd_bus_speed == UHS_SDR50_BUS_SPEED) || 536 if ((card->sd_bus_speed == UHS_SDR50_BUS_SPEED) ||
565 (card->sd_bus_speed == UHS_SDR104_BUS_SPEED) || 537 (card->sd_bus_speed == UHS_SDR104_BUS_SPEED) ||
566 (card->sd_bus_speed == UHS_DDR50_BUS_SPEED)) { 538 (card->sd_bus_speed == UHS_DDR50_BUS_SPEED)) {
567 if (card->host->caps & MMC_CAP_MAX_CURRENT_800) { 539 if (card->host->caps & MMC_CAP_MAX_CURRENT_800)
568 if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_800) 540 current_limit = SD_SET_CURRENT_LIMIT_800;
569 current_limit = SD_SET_CURRENT_LIMIT_800; 541 else if (card->host->caps & MMC_CAP_MAX_CURRENT_600)
570 else if (card->sw_caps.sd3_curr_limit & 542 current_limit = SD_SET_CURRENT_LIMIT_600;
571 SD_MAX_CURRENT_600) 543 else if (card->host->caps & MMC_CAP_MAX_CURRENT_400)
572 current_limit = SD_SET_CURRENT_LIMIT_600; 544 current_limit = SD_SET_CURRENT_LIMIT_400;
573 else if (card->sw_caps.sd3_curr_limit & 545 else if (card->host->caps & MMC_CAP_MAX_CURRENT_200)
574 SD_MAX_CURRENT_400) 546 current_limit = SD_SET_CURRENT_LIMIT_200;
575 current_limit = SD_SET_CURRENT_LIMIT_400;
576 else if (card->sw_caps.sd3_curr_limit &
577 SD_MAX_CURRENT_200)
578 current_limit = SD_SET_CURRENT_LIMIT_200;
579 } else if (card->host->caps & MMC_CAP_MAX_CURRENT_600) {
580 if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_600)
581 current_limit = SD_SET_CURRENT_LIMIT_600;
582 else if (card->sw_caps.sd3_curr_limit &
583 SD_MAX_CURRENT_400)
584 current_limit = SD_SET_CURRENT_LIMIT_400;
585 else if (card->sw_caps.sd3_curr_limit &
586 SD_MAX_CURRENT_200)
587 current_limit = SD_SET_CURRENT_LIMIT_200;
588 } else if (card->host->caps & MMC_CAP_MAX_CURRENT_400) {
589 if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_400)
590 current_limit = SD_SET_CURRENT_LIMIT_400;
591 else if (card->sw_caps.sd3_curr_limit &
592 SD_MAX_CURRENT_200)
593 current_limit = SD_SET_CURRENT_LIMIT_200;
594 } else if (card->host->caps & MMC_CAP_MAX_CURRENT_200) {
595 if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_200)
596 current_limit = SD_SET_CURRENT_LIMIT_200;
597 }
598 } 547 }
599 548
600 if (current_limit != SD_SET_CURRENT_NO_CHANGE) { 549 if (current_limit != SD_SET_CURRENT_NO_CHANGE) {
@@ -607,6 +556,7 @@ static int sd_set_current_limit(struct mmc_card *card, u8 *status)
607 mmc_hostname(card->host)); 556 mmc_hostname(card->host));
608 557
609 } 558 }
559
610 return 0; 560 return 0;
611} 561}
612 562