|
@@ -329,6 +329,7 @@ static int mmc_read_switch(struct mmc_card *card)
|
|
|
card->sw_caps.sd3_bus_mode = status[13];
|
|
|
/* Driver Strengths supported by the card */
|
|
|
card->sw_caps.sd3_drv_type = status[9];
|
|
|
+ card->sw_caps.sd3_curr_limit = status[7] | status[6] << 8;
|
|
|
}
|
|
|
|
|
|
out:
|
|
@@ -545,14 +546,25 @@ static int sd_set_current_limit(struct mmc_card *card, u8 *status)
|
|
|
* when we set current limit to 200ma, the card will draw 200ma, and
|
|
|
* when we set current limit to 400/600/800ma, the card will draw its
|
|
|
* maximum 300ma from the host.
|
|
|
+ *
|
|
|
+ * The above is incorrect: if we try to set a current limit that is
|
|
|
+ * not supported by the card, the card can rightfully error out the
|
|
|
+ * attempt, and remain at the default current limit. This results
|
|
|
+ * in a 300mA card being limited to 200mA even though the host
|
|
|
+ * supports 800mA. Failures seen with SanDisk 8GB UHS cards with
|
|
|
+ * an iMX6 host. --rmk
|
|
|
*/
|
|
|
- if (max_current >= 800)
|
|
|
+ if (max_current >= 800 &&
|
|
|
+ card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_800)
|
|
|
current_limit = SD_SET_CURRENT_LIMIT_800;
|
|
|
- else if (max_current >= 600)
|
|
|
+ else if (max_current >= 600 &&
|
|
|
+ card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_600)
|
|
|
current_limit = SD_SET_CURRENT_LIMIT_600;
|
|
|
- else if (max_current >= 400)
|
|
|
+ else if (max_current >= 400 &&
|
|
|
+ card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_400)
|
|
|
current_limit = SD_SET_CURRENT_LIMIT_400;
|
|
|
- else if (max_current >= 200)
|
|
|
+ else if (max_current >= 200 &&
|
|
|
+ card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_200)
|
|
|
current_limit = SD_SET_CURRENT_LIMIT_200;
|
|
|
|
|
|
if (current_limit != SD_SET_CURRENT_NO_CHANGE) {
|
|
@@ -626,9 +638,9 @@ static int mmc_sd_init_uhs_card(struct mmc_card *card)
|
|
|
* SDR104 mode SD-cards. Note that tuning is mandatory for SDR104.
|
|
|
*/
|
|
|
if (!mmc_host_is_spi(card->host) &&
|
|
|
- (card->sd_bus_speed == UHS_SDR50_BUS_SPEED ||
|
|
|
- card->sd_bus_speed == UHS_DDR50_BUS_SPEED ||
|
|
|
- card->sd_bus_speed == UHS_SDR104_BUS_SPEED)) {
|
|
|
+ (card->host->ios.timing == MMC_TIMING_UHS_SDR50 ||
|
|
|
+ card->host->ios.timing == MMC_TIMING_UHS_DDR50 ||
|
|
|
+ card->host->ios.timing == MMC_TIMING_UHS_SDR104)) {
|
|
|
err = mmc_execute_tuning(card);
|
|
|
|
|
|
/*
|
|
@@ -638,7 +650,7 @@ static int mmc_sd_init_uhs_card(struct mmc_card *card)
|
|
|
* difference between v3.00 and 3.01 spec means that CMD19
|
|
|
* tuning is also available for DDR50 mode.
|
|
|
*/
|
|
|
- if (err && card->sd_bus_speed == UHS_DDR50_BUS_SPEED) {
|
|
|
+ if (err && card->host->ios.timing == MMC_TIMING_UHS_DDR50) {
|
|
|
pr_warn("%s: ddr50 tuning failed\n",
|
|
|
mmc_hostname(card->host));
|
|
|
err = 0;
|