Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit db993500 authored by Pierre Tardy's avatar Pierre Tardy Committed by Chris Ball
Browse files

mmc: add MMC_QUIRK_BROKEN_CLK_GATING



Some sdio card are not following sdio standard, and do not work
when the sdio bus's clock is gated.

To keep functionnality for all legacy driver, we turn this quirk on
for every sdio card.
Drivers needs to disable the quirk manually when someone verifies that
their supported card works with clock gating.

Signed-off-by: default avatarPierre Tardy <tardyp@gmail.com>
Acked-by: default avatarOhad Ben-Cohen <ohad@wizery.com>
Signed-off-by: default avatarChris Ball <cjb@laptop.org>
parent 57f0adc7
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -160,10 +160,7 @@ static bool mmc_host_may_gate_card(struct mmc_card *card)
	 * gate the clock, because there is somebody out there that may still
	 * be using it.
	 */
	if (mmc_card_sdio(card))
		return false;

	return true;
	return !(card->quirks & MMC_QUIRK_BROKEN_CLK_GATING);
}

/**
+13 −0
Original line number Diff line number Diff line
@@ -40,7 +40,20 @@ static void __maybe_unused remove_quirk(struct mmc_card *card, int data)
	card->quirks &= ~data;
}

/*
 * This hook just adds a quirk for all sdio devices
 */
static void add_quirk_for_sdio_devices(struct mmc_card *card, int data)
{
	if (mmc_card_sdio(card))
		card->quirks |= data;
}

static const struct mmc_fixup mmc_fixup_methods[] = {
	/* by default sdio devices are considered CLK_GATING broken */
	/* good cards will be whitelisted as they are tested */
	{ SDIO_ANY_ID, SDIO_ANY_ID,
		add_quirk_for_sdio_devices, MMC_QUIRK_BROKEN_CLK_GATING }
	{ 0 }
};

+1 −0
Original line number Diff line number Diff line
@@ -124,6 +124,7 @@ struct mmc_card {
						/* for byte mode */
#define MMC_QUIRK_NONSTD_SDIO	(1<<2)		/* non-standard SDIO card attached */
						/* (missing CIA registers) */
#define MMC_QUIRK_BROKEN_CLK_GATING (1<<3)	/* clock gating the sdio bus will make card fail */

	unsigned int		erase_size;	/* erase size in sectors */
 	unsigned int		erase_shift;	/* if erase unit is power 2 */