On 10 April 2018 at 09:00, Harish Jenny K N <harish_kandiga@xxxxxxxxxx> wrote: > 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@xxxxxxxxxx> > --- > drivers/mmc/core/card.h | 6 ++++++ > drivers/mmc/core/sdio.c | 6 +++++- > include/linux/mmc/card.h | 1 + > 3 files changed, 12 insertions(+), 1 deletion(-) > > 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); > } This takes care of limiting the clock rate for SDIO UHS cards. As this currently is the only case you want to cover I am fine with keeping this as is. Anyway, my point is, I think this quirk may also be useful for some high-speed SDIO cards, all SD cards and (e)MMC cards. Although let's skip that for now. > > return 0; > diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h > index 279b390..5ebc478 100644 > --- a/include/linux/mmc/card.h > +++ b/include/linux/mmc/card.h > @@ -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 */ > -- > 1.9.1 > > Thanks, queued for 4.18! Kind regards Uffe -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html