aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Miao <eric.miao@linaro.org>2012-01-09 13:08:14 +0800
committerEric Miao <eric.miao@linaro.org>2012-01-09 20:42:55 +0800
commit2bb75d3fe1b99da89cb4d921841e2e99c7ad0055 (patch)
treef7b28192c82ce1b7c29e644549a8a16ca6db13b9
parentd514e4a6158e2ebfad3ccfa26607fad5b98909b9 (diff)
downloadlinux-linaro-topic/lt-3.2-imx6-sdhc.tar.gz
mmc: sdhci-esdhc-imx: support of 1.8V is board specifictopic/lt-3.2-imx6-sdhc
Signed-off-by: Eric Miao <eric.miao@linaro.org>
-rw-r--r--arch/arm/plat-mxc/include/mach/esdhc.h2
-rw-r--r--drivers/mmc/core/sd.c7
-rw-r--r--drivers/mmc/host/sdhci-esdhc-imx.c14
-rw-r--r--include/linux/mmc/host.h6
4 files changed, 25 insertions, 4 deletions
diff --git a/arch/arm/plat-mxc/include/mach/esdhc.h b/arch/arm/plat-mxc/include/mach/esdhc.h
index aaf97481f41..4ab603e25b8 100644
--- a/arch/arm/plat-mxc/include/mach/esdhc.h
+++ b/arch/arm/plat-mxc/include/mach/esdhc.h
@@ -32,6 +32,7 @@ enum cd_types {
* @cd_gpio: gpio for card_detect interrupt
* @wp_type: type of write_protect method (see wp_types enum above)
* @cd_type: type of card_detect method (see cd_types enum above)
+ * @vdd_180: 1.8V VDD supported
*/
struct esdhc_platform_data {
@@ -39,5 +40,6 @@ struct esdhc_platform_data {
unsigned int cd_gpio;
enum wp_types wp_type;
enum cd_types cd_type;
+ int vdd_180;
};
#endif /* __ASM_ARCH_IMX_ESDHC_H */
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
index f2a05ea40f2..d426b0eb45f 100644
--- a/drivers/mmc/core/sd.c
+++ b/drivers/mmc/core/sd.c
@@ -740,11 +740,10 @@ int mmc_sd_get_cid(struct mmc_host *host, u32 ocr, u32 *cid, u32 *rocr)
ocr |= SD_OCR_CCS;
/*
- * If the host supports one of UHS-I modes, request the card
- * to switch to 1.8V signaling level.
+ * If the host supports one of UHS-I modes, and support 1.8V VDD,
+ * request the card to switch to 1.8V signaling level.
*/
- if (host->caps & (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 |
- MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 | MMC_CAP_UHS_DDR50))
+ if ((host->caps & (MMC_CAP_UHS)) && (host->ocr_avail_sd & MMC_VDD_165_195))
ocr |= SD_OCR_S18R;
/* If the host can supply more than 150mA, XPC should be set to 1. */
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
index 7f6d6250679..4a2a9f674b4 100644
--- a/drivers/mmc/host/sdhci-esdhc-imx.c
+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -1,4 +1,5 @@
/*
+#define MMC_CAP_UHS (
* Freescale eSDHC i.MX controller driver for the platform bus.
*
* derived from the OF-version.
@@ -77,6 +78,7 @@ enum imx_esdhc_type {
struct pltfm_imx_data {
int flags;
u32 scratchpad;
+ int can_vdd_180; /* support 1.8V? */
enum imx_esdhc_type devtype;
struct esdhc_platform_data boarddata;
};
@@ -462,6 +464,8 @@ sdhci_esdhc_imx_probe_dt(struct platform_device *pdev,
if (gpio_is_valid(boarddata->wp_gpio))
boarddata->wp_type = ESDHC_WP_GPIO;
+ if (of_get_property(np, "support-vdd-180", NULL))
+ boarddata->vdd_180 = 1;
return 0;
}
#else
@@ -566,6 +570,16 @@ static int __devinit sdhci_esdhc_imx_probe(struct platform_device *pdev)
boarddata->wp_gpio = -EINVAL;
}
+ /* The imx6q uSDHC capabilities will always claim to support 1.8V
+ * while this is board specific, should be initialized properly
+ */
+ if (is_imx6q_usdhc(imx_data)) {
+ host->quirks |= SDHCI_QUIRK_MISSING_CAPS;
+ host->caps = readl(host->ioaddr + SDHCI_CAPABILITIES);
+ if (!boarddata->vdd_180)
+ host->caps &= ~SDHCI_CAN_VDD_180;
+ }
+
/* card_detect */
if (boarddata->cd_type != ESDHC_CD_GPIO)
boarddata->cd_gpio = -EINVAL;
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index a3ac9c48e5d..56b13b2dc81 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -236,6 +236,12 @@ struct mmc_host {
#define MMC_CAP_CMD23 (1 << 30) /* CMD23 supported. */
#define MMC_CAP_HW_RESET (1 << 31) /* Hardware reset */
+#define MMC_CAP_UHS (MMC_CAP_UHS_SDR12 |\
+ MMC_CAP_UHS_SDR25 |\
+ MMC_CAP_UHS_SDR50 |\
+ MMC_CAP_UHS_SDR104 |\
+ MMC_CAP_UHS_DDR50)
+
unsigned int caps2; /* More host capabilities */
#define MMC_CAP2_BOOTPART_NOACC (1 << 0) /* Boot partition no access */