Commit ebc5a1bf authored by harish_kandiga@mentor.com's avatar harish_kandiga@mentor.com Committed by Ulf Hansson

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: default avatarHarish Jenny K N <harish_kandiga@mentor.com>
Reviewed-by: default avatarShawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent d39b1b2a
...@@ -149,6 +149,12 @@ static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data) ...@@ -149,6 +149,12 @@ static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data)
card->quirks &= ~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. * Quirk add/remove for MMC products.
*/ */
......
...@@ -444,6 +444,7 @@ static int sdio_set_bus_speed_mode(struct mmc_card *card) ...@@ -444,6 +444,7 @@ static int sdio_set_bus_speed_mode(struct mmc_card *card)
unsigned int bus_speed, timing; unsigned int bus_speed, timing;
int err; int err;
unsigned char speed; unsigned char speed;
unsigned int max_rate;
/* /*
* If the host doesn't support any of the UHS-I modes, fallback on * 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) ...@@ -500,9 +501,12 @@ static int sdio_set_bus_speed_mode(struct mmc_card *card)
if (err) if (err)
return err; return err;
max_rate = min_not_zero(card->quirk_max_rate,
card->sw_caps.uhs_max_dtr);
if (bus_speed) { if (bus_speed) {
mmc_set_timing(card->host, timing); 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; return 0;
......
...@@ -252,6 +252,7 @@ struct mmc_card { ...@@ -252,6 +252,7 @@ struct mmc_card {
#define MMC_TYPE_SD_COMBO 3 /* SD combo (IO+mem) card */ #define MMC_TYPE_SD_COMBO 3 /* SD combo (IO+mem) card */
unsigned int state; /* (our) card state */ unsigned int state; /* (our) card state */
unsigned int quirks; /* card quirks */ 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_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 */ #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */
/* for byte mode */ /* for byte mode */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment