Patch "mmc: sdhci-of-at91: force card detect value for non removable devices" has been added to the 4.9-stable tree
Subsystems (5)
This is a note to let you know that I've just added the patch titled
mmc: sdhci-of-at91: force card detect value for non removable devices
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mmc-sdhci-of-at91-force-card-detect-value-for-non-removable-devices.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
7a1e3f143176e8ebdb2f5a9b3b47abc18b879d90Mon Sep 17 00:00:00 2001
From: Ludovic Desroches <[email protected]>
Date: Wed, 26 Jul 2017 16:02:46 +0200
Subject: mmc: sdhci-of-at91: force card detect value for non removable devices
From: Ludovic Desroches <[email protected]>
commit 7a1e3f143176e8ebdb2f5a9b3b47abc18b879d90 upstream.
When the device is non removable, the card detect signal is often used for another purpose i.e. muxed to another SoC peripheral or used as a GPIO. It could lead to wrong behaviors depending the default value of this signal if not muxed to the SDHCI controller.
--- drivers/mmc/host/sdhci-of-at91.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-)
drivers/mmc/host/sdhci-of-at91.c +34 -1
@@ -31,6 +31,7 @@#define SDMMC_MC1R 0x204#define SDMMC_MC1R_DDR BIT(3) +#define SDMMC_MC1R_FCD BIT(7)#define SDMMC_CACR 0x230#define SDMMC_CACR_CAPWREN BIT(0)#define SDMMC_CACR_KEY (0x46 << 8)
@@ -43,6 +44,15 @@ struct sdhci_at91_priv {struct clk *mainck; }; +static void sdhci_at91_set_force_card_detect (struct sdhci_host *host) +{ +u8 mc1r; + + mc1r =readb (host->ioaddr +SDMMC_MC1R ); + mc1r |=SDMMC_MC1R_FCD ; +writeb (mc1r, host->ioaddr +SDMMC_MC1R ); +} +static void sdhci_at91_set_clock (struct sdhci_host *host,unsigned int clock) {u16 clk;
@@ -112,10 +122,18 @@ void sdhci_at91_set_uhs_signaling(structsdhci_set_uhs_signaling (host, timing); } +static void sdhci_at91_reset (struct sdhci_host *host,u8 mask) +{ +sdhci_reset (host, mask); + +if (host->mmc->caps &MMC_CAP_NONREMOVABLE ) +sdhci_at91_set_force_card_detect (host); +} +static const struct sdhci_ops sdhci_at91_sama5d2_ops = { .set_clock = sdhci_at91_set_clock, .set_bus_width = sdhci_set_bus_width, - .reset = sdhci_reset, + .reset = sdhci_at91_reset, .set_uhs_signaling = sdhci_at91_set_uhs_signaling, .set_power = sdhci_at91_set_power, };
@@ -322,6 +340,21 @@ static int sdhci_at91_probe(struct platf host->quirks &= ~SDHCI_QUIRK_BROKEN_CARD_DETECTION ; } +/* +* If the device attached to the MMC bus is not removable, it is safer +* to set the Force Card Detect bit. People often don't connect the +* card detect signal and use this pin for another purpose. If the card +* detect pin is not muxed to SDHCI controller, a default value is +* used. This value can be different from a SoC revision to another +* one. Problems come when this default value is not card present. To +* avoid this case, if the device is non removable then the card +* detection procedure using the SDMCC_CD signal is bypassed. +* This bit is reset when a software reset for all command is performed +* so we need to implement our own reset function to set back this bit. +*/ +if (host->mmc->caps &MMC_CAP_NONREMOVABLE ) +sdhci_at91_set_force_card_detect (host); +pm_runtime_put_autosuspend (&pdev->dev);return 0 ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/mmc-sdhci-of-at91-force-card-detect-value-for-non-removable-devices.patch