|
@@ -329,6 +329,7 @@ static int mmc_read_switch(struct mmc_card *card)
|
|
card->sw_caps.sd3_bus_mode = status[13];
|
|
card->sw_caps.sd3_bus_mode = status[13];
|
|
/* Driver Strengths supported by the card */
|
|
/* Driver Strengths supported by the card */
|
|
card->sw_caps.sd3_drv_type = status[9];
|
|
card->sw_caps.sd3_drv_type = status[9];
|
|
|
|
+ card->sw_caps.sd3_curr_limit = status[7] | status[6] << 8;
|
|
}
|
|
}
|
|
|
|
|
|
out:
|
|
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 200ma, the card will draw 200ma, and
|
|
* when we set current limit to 400/600/800ma, the card will draw its
|
|
* when we set current limit to 400/600/800ma, the card will draw its
|
|
* maximum 300ma from the host.
|
|
* 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;
|
|
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;
|
|
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;
|
|
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;
|
|
current_limit = SD_SET_CURRENT_LIMIT_200;
|
|
|
|
|
|
if (current_limit != SD_SET_CURRENT_NO_CHANGE) {
|
|
if (current_limit != SD_SET_CURRENT_NO_CHANGE) {
|