STM platforms use the sdhci-pltfm.c driver but, IMO
there are some problems when use the eMMC card.

  --- from sdhci.c file:

1897        if ((host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) &&
1898             mmc_card_is_removable(mmc))
1899                 mmc->caps |= MMC_CAP_NEEDS_POLL;

[snip]

          sdhci_set_card_detection
                |_ if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION)
                              return;

         sdhci_request
                 |_ /* If polling, assume that the card is always present. */

  ---

Passing the SDHCI_QUIRK_BROKEN_CARD_DETECTION as quirk
from my platform, IIUC, that guarantees that the card is actually
considered always present by the HC but the MMC_CAP_NONREMOVABLE is not set.

In fact some sdhci drivers based, to manage eMMC, actually do:

if (pdata-><own_field> == <OWN_PLATF>_PERMANET) {
     host->quirks |= SDHCI_QUIRK_BROKEN_CARD_DETECTION;
     host->mmc->caps = MMC_CAP_NONREMOVABLE;
}

I need to do the same in the sdhci-pltfm for properly and logically use the
eMMC.

Moreover setting the SDHCI_QUIRK_BROKEN_CARD_DETECTION quirk
if we have a board with an eMMC (really plugged on) we skip,
in the sdhci_set_card_detection, the check of the card.
This works but it's logically broken and could create problems
on a board that has no eMMC soldered on the PCB yet.
Hmm, this is a limit case indeed. :-) but somebody followed in
this problem asking support for.

So a new quirk, called SDHCI_QUIRK_NONREMOVABLE_CARD, has been added.

This can be passed from the platform and managed in the sdhci to
directly set MMC_CAP_NONREMOVABLE.

To summarise:

o The meaning of SDHCI_QUIRK_BROKEN_CARD_DETECTION is:
        Card detection is broken but if there is a removal card
        (MMC_CAP_NEEDS_POLL is set) the sdhci considers it
        present. If there is an eMMC do not needs poll and
        the HC consider it as present too (really bad HW).

o The SDHCI_QUIRK_NONREMOVABLE_CARD meaning is:
      we have the eMMC and set the MMC_CAP_NONREMOVABLE caps
      and the sdhci has to verify if it is present otherwise
      can fail.

Signed-off-by: Giuseppe Cavallaro <peppe.cavall...@st.com>
---
 drivers/mmc/host/sdhci.c  |    3 +++
 include/linux/mmc/sdhci.h |    2 ++
 2 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 9e15f41..650ea97 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1894,6 +1894,9 @@ int sdhci_add_host(struct sdhci_host *host)
        if (caps & SDHCI_CAN_DO_HISPD)
                mmc->caps |= MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED;
 
+       if (host->quirks & SDHCI_QUIRK_NONREMOVABLE_CARD)
+               mmc->caps |= MMC_CAP_NONREMOVABLE;
+
        if ((host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) &&
            mmc_card_is_removable(mmc))
                mmc->caps |= MMC_CAP_NEEDS_POLL;
diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h
index 83bd9f7..370258c 100644
--- a/include/linux/mmc/sdhci.h
+++ b/include/linux/mmc/sdhci.h
@@ -85,6 +85,8 @@ struct sdhci_host {
 #define SDHCI_QUIRK_NO_HISPD_BIT                       (1<<29)
 /* Controller treats ADMA descriptors with length 0000h incorrectly */
 #define SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC           (1<<30)
+/* Controller has to treat an eMMC card */
+#define SDHCI_QUIRK_NONREMOVABLE_CARD                  (1<<31)
 
        int irq;                /* Device IRQ */
        void __iomem *ioaddr;   /* Mapped address */
-- 
1.7.4.4

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to