From: T Karthik Reddy Date: Wed, 5 Jun 2019 18:40:56 +0000 (+0530) Subject: mmc: sdhci: Implement SDHCI card detect X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4d41f637b49af5be4fc7fedcc7c3c45662a51262;p=thirdparty%2Fu-boot.git mmc: sdhci: Implement SDHCI card detect Card detect function implemented for SDHCI framework. Signed-off-by: T Karthik Reddy Signed-off-by: Michal Simek --- diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c index cdeba914f95..e13f47c2c65 100644 --- a/drivers/mmc/sdhci.c +++ b/drivers/mmc/sdhci.c @@ -12,6 +12,7 @@ #include #include #include +#include #if defined(CONFIG_FIXED_SDHCI_ALIGNED_BUFFER) void *aligned_buffer = (void *)CONFIG_FIXED_SDHCI_ALIGNED_BUFFER; @@ -542,9 +543,40 @@ int sdhci_probe(struct udevice *dev) return sdhci_init(mmc); } +int sdhci_get_cd(struct udevice *dev) +{ + struct mmc *mmc = mmc_get_mmc_dev(dev); + struct sdhci_host *host = mmc->priv; + int value; + + /* If nonremovable, assume that the card is always present. */ + if (host->host_caps & MMC_CAP_NONREMOVABLE) + return 1; + /* If polling, assume that the card is always present. */ + if (host->host_caps & MMC_CAP_NEEDS_POLL) + return 1; + +#if CONFIG_IS_ENABLED(DM_GPIO) + value = dm_gpio_get_value(&host->cd_gpio); + if (value >= 0) { + if (host->host_caps & MMC_CAP_CD_ACTIVE_HIGH) + return !value; + else + return value; + } +#endif + value = !!(sdhci_readl(host, SDHCI_PRESENT_STATE) & + SDHCI_CARD_DETECT_PIN_LEVEL); + if (host->host_caps & MMC_CAP_CD_ACTIVE_HIGH) + return !value; + else + return value; +} + const struct dm_mmc_ops sdhci_ops = { .send_cmd = sdhci_send_command, .set_ios = sdhci_set_ios, + .get_cd = sdhci_get_cd, #ifdef MMC_SUPPORTS_TUNING .execute_tuning = sdhci_execute_tuning, #endif diff --git a/include/sdhci.h b/include/sdhci.h index bef37df982e..6393dee56e0 100644 --- a/include/sdhci.h +++ b/include/sdhci.h @@ -227,6 +227,13 @@ #define SDHCI_QUIRK_USE_WIDE8 (1 << 8) #define SDHCI_QUIRK_NO_1_8_V (1 << 9) +/* + * mmc host capabilities + */ +#define MMC_CAP_NONREMOVABLE BIT(8) +#define MMC_CAP_NEEDS_POLL BIT(9) +#define MMC_CAP_CD_ACTIVE_HIGH BIT(10) + /* to make gcc happy */ struct sdhci_host;