mmc: sdhci: only set 200mA support for 1.8v if 200mA is available
authorPhilip Rakity <prakity@marvell.com>
Mon, 28 May 2012 01:36:33 +0000 (18:36 -0700)
committerChris Ball <cjb@laptop.org>
Sat, 21 Jul 2012 04:02:23 +0000 (00:02 -0400)
max_current_caps can return 0 if not available from the sd controller.
If no regulator is present or the regulator specifies a current
less then 200ma, we no longer still set the 200mA caps bit anyway.

Signed-off-by: Philip Rakity <prakity@marvell.com>
Reviewed-by: Aaron Lu <aaron_lu@amd.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/core/sd.c
drivers/mmc/host/sdhci.c
include/linux/mmc/card.h

index b2b43f624b9edd13a8ad4d836ec2229636de2a9c..b0b9e372f5da0569ae7ab8d888c4cd36289f7df6 100644 (file)
@@ -553,13 +553,13 @@ static int sd_set_bus_speed_mode(struct mmc_card *card, u8 *status)
 
 static int sd_set_current_limit(struct mmc_card *card, u8 *status)
 {
-       int current_limit = 0;
+       int current_limit = SD_SET_CURRENT_NO_CHANGE;
        int err;
 
        /*
         * Current limit switch is only defined for SDR50, SDR104, and DDR50
-        * bus speed modes. For other bus speed modes, we set the default
-        * current limit of 200mA.
+        * bus speed modes. For other bus speed modes, we do not change the
+        * current limit.
         */
        if ((card->sd_bus_speed == UHS_SDR50_BUS_SPEED) ||
            (card->sd_bus_speed == UHS_SDR104_BUS_SPEED) ||
@@ -595,17 +595,18 @@ static int sd_set_current_limit(struct mmc_card *card, u8 *status)
                        if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_200)
                                current_limit = SD_SET_CURRENT_LIMIT_200;
                }
-       } else
-               current_limit = SD_SET_CURRENT_LIMIT_200;
+       }
 
-       err = mmc_sd_switch(card, 1, 3, current_limit, status);
-       if (err)
-               return err;
+       if (current_limit != SD_SET_CURRENT_NO_CHANGE) {
+               err = mmc_sd_switch(card, 1, 3, current_limit, status);
+               if (err)
+                       return err;
 
-       if (((status[15] >> 4) & 0x0F) != current_limit)
-               pr_warning("%s: Problem setting current limit!\n",
-                       mmc_hostname(card->host));
+               if (((status[15] >> 4) & 0x0F) != current_limit)
+                       pr_warning("%s: Problem setting current limit!\n",
+                               mmc_hostname(card->host));
 
+       }
        return 0;
 }
 
index a0853d03b3301ebf43811f2ab51eacfec18d8dc1..8f61f8d6e0ca0dc48fd2f8e5fe5cdba85eff7a5e 100644 (file)
@@ -2914,7 +2914,7 @@ int sdhci_add_host(struct sdhci_host *host)
                        mmc->caps |= MMC_CAP_MAX_CURRENT_600;
                else if (max_current_180 >= 400)
                        mmc->caps |= MMC_CAP_MAX_CURRENT_400;
-               else
+               else if (max_current_180 >= 200)
                        mmc->caps |= MMC_CAP_MAX_CURRENT_200;
        }
 
index d76513b5b2631b1daf7b9aa4c4b03f1d52d83d32..111aca5e97f3d1801ace7ed7c009af4165a3869a 100644 (file)
@@ -149,6 +149,7 @@ struct sd_switch_caps {
 #define SD_SET_CURRENT_LIMIT_400       1
 #define SD_SET_CURRENT_LIMIT_600       2
 #define SD_SET_CURRENT_LIMIT_800       3
+#define SD_SET_CURRENT_NO_CHANGE       (-1)
 
 #define SD_MAX_CURRENT_200     (1 << SD_SET_CURRENT_LIMIT_200)
 #define SD_MAX_CURRENT_400     (1 << SD_SET_CURRENT_LIMIT_400)