Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

harish_kandiga@mentor.com and committed by
Ulf Hansson
ebc5a1bf d39b1b2a

+12 -1
+6
drivers/mmc/core/card.h
··· 149 149 card->quirks &= ~data; 150 150 } 151 151 152 + static inline void __maybe_unused add_limit_rate_quirk(struct mmc_card *card, 153 + int data) 154 + { 155 + card->quirk_max_rate = data; 156 + } 157 + 152 158 /* 153 159 * Quirk add/remove for MMC products. 154 160 */
+5 -1
drivers/mmc/core/sdio.c
··· 444 444 unsigned int bus_speed, timing; 445 445 int err; 446 446 unsigned char speed; 447 + unsigned int max_rate; 447 448 448 449 /* 449 450 * If the host doesn't support any of the UHS-I modes, fallback on ··· 501 500 if (err) 502 501 return err; 503 502 503 + max_rate = min_not_zero(card->quirk_max_rate, 504 + card->sw_caps.uhs_max_dtr); 505 + 504 506 if (bus_speed) { 505 507 mmc_set_timing(card->host, timing); 506 - mmc_set_clock(card->host, card->sw_caps.uhs_max_dtr); 508 + mmc_set_clock(card->host, max_rate); 507 509 } 508 510 509 511 return 0;
+1
include/linux/mmc/card.h
··· 252 252 #define MMC_TYPE_SD_COMBO 3 /* SD combo (IO+mem) card */ 253 253 unsigned int state; /* (our) card state */ 254 254 unsigned int quirks; /* card quirks */ 255 + unsigned int quirk_max_rate; /* max rate set by quirks */ 255 256 #define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */ 256 257 #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */ 257 258 /* for byte mode */