diff options
author | harish_kandiga@mentor.com <harish_kandiga@mentor.com> | 2018-04-10 12:30:31 +0530 |
---|---|---|
committer | Ulf Hansson <ulf.hansson@linaro.org> | 2018-05-02 15:08:39 +0200 |
commit | ebc5a1bf4f2afc2f2b348320dcfb45a8c0ac3de5 (patch) | |
tree | a3444f451f815f7e4d05b31c67c5b00e996c85ec /drivers/mmc/core | |
parent | d39b1b2abf9fcae3001b868186faa1ae889aecf5 (diff) | |
download | op-kernel-dev-ebc5a1bf4f2afc2f2b348320dcfb45a8c0ac3de5.zip op-kernel-dev-ebc5a1bf4f2afc2f2b348320dcfb45a8c0ac3de5.tar.gz |
mmc: core: Add a new quirk for limiting clock rate
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>
Diffstat (limited to 'drivers/mmc/core')
-rw-r--r-- | drivers/mmc/core/card.h | 6 | ||||
-rw-r--r-- | drivers/mmc/core/sdio.c | 6 |
2 files changed, 11 insertions, 1 deletions
diff --git a/drivers/mmc/core/card.h b/drivers/mmc/core/card.h index 9c821ee..1170feb 100644 --- a/drivers/mmc/core/card.h +++ b/drivers/mmc/core/card.h @@ -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. */ diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index c599a62..24b510b 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c @@ -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; |