mmc: core: Add a new quirk for limiting clock rate
authorharish_kandiga@mentor.com <harish_kandiga@mentor.com>
Tue, 10 Apr 2018 07:00:31 +0000 (12:30 +0530)
committerUlf Hansson <ulf.hansson@linaro.org>
Wed, 2 May 2018 13:08:39 +0000 (15:08 +0200)
This patch adds a quirk to limit clock rate which
can be used to reduce the SDIO clock rate for some
chips with broken UHS.

Signed-off-by: Harish Jenny K N <harish_kandiga@mentor.com>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/core/card.h
drivers/mmc/core/sdio.c
include/linux/mmc/card.h

index 9c821ee..1170feb 100644 (file)
@@ -149,6 +149,12 @@ static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data)
        card->quirks &= ~data;
 }
 
+static inline void __maybe_unused add_limit_rate_quirk(struct mmc_card *card,
+                                                      int data)
+{
+       card->quirk_max_rate = data;
+}
+
 /*
  * Quirk add/remove for MMC products.
  */
index c599a62..24b510b 100644 (file)
@@ -444,6 +444,7 @@ static int sdio_set_bus_speed_mode(struct mmc_card *card)
        unsigned int bus_speed, timing;
        int err;
        unsigned char speed;
+       unsigned int max_rate;
 
        /*
         * If the host doesn't support any of the UHS-I modes, fallback on
@@ -500,9 +501,12 @@ static int sdio_set_bus_speed_mode(struct mmc_card *card)
        if (err)
                return err;
 
+       max_rate = min_not_zero(card->quirk_max_rate,
+                               card->sw_caps.uhs_max_dtr);
+
        if (bus_speed) {
                mmc_set_timing(card->host, timing);
-               mmc_set_clock(card->host, card->sw_caps.uhs_max_dtr);
+               mmc_set_clock(card->host, max_rate);
        }
 
        return 0;
index 279b390..5ebc478 100644 (file)
@@ -252,6 +252,7 @@ struct mmc_card {
 #define MMC_TYPE_SD_COMBO      3               /* SD combo (IO+mem) card */
        unsigned int            state;          /* (our) card state */
        unsigned int            quirks;         /* card quirks */
+       unsigned int            quirk_max_rate; /* max rate set by quirks */
 #define MMC_QUIRK_LENIENT_FN0  (1<<0)          /* allow SDIO FN0 writes outside of the VS CCCR range */
 #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1)   /* use func->cur_blksize */
                                                /* for byte mode */