diff options
-rw-r--r-- | drivers/mmc/host/sdhci-of-esdhc.c | 11 | ||||
-rw-r--r-- | drivers/mmc/host/sdhci-pltfm.c | 7 | ||||
-rw-r--r-- | drivers/mmc/host/sdhci.c | 3 | ||||
-rw-r--r-- | drivers/mmc/host/sdhci.h | 1 | ||||
-rw-r--r-- | include/linux/mmc/sdhci.h | 1 |
5 files changed, 23 insertions, 0 deletions
diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c index ae5fcbfa1eef..63d219f57cae 100644 --- a/drivers/mmc/host/sdhci-of-esdhc.c +++ b/drivers/mmc/host/sdhci-of-esdhc.c | |||
@@ -169,6 +169,16 @@ static void esdhc_of_resume(struct sdhci_host *host) | |||
169 | } | 169 | } |
170 | #endif | 170 | #endif |
171 | 171 | ||
172 | static void esdhc_of_platform_init(struct sdhci_host *host) | ||
173 | { | ||
174 | u32 vvn; | ||
175 | |||
176 | vvn = in_be32(host->ioaddr + SDHCI_SLOT_INT_STATUS); | ||
177 | vvn = (vvn & SDHCI_VENDOR_VER_MASK) >> SDHCI_VENDOR_VER_SHIFT; | ||
178 | if (vvn == VENDOR_V_22) | ||
179 | host->quirks2 |= SDHCI_QUIRK2_HOST_NO_CMD23; | ||
180 | } | ||
181 | |||
172 | static struct sdhci_ops sdhci_esdhc_ops = { | 182 | static struct sdhci_ops sdhci_esdhc_ops = { |
173 | .read_l = esdhc_readl, | 183 | .read_l = esdhc_readl, |
174 | .read_w = esdhc_readw, | 184 | .read_w = esdhc_readw, |
@@ -180,6 +190,7 @@ static struct sdhci_ops sdhci_esdhc_ops = { | |||
180 | .enable_dma = esdhc_of_enable_dma, | 190 | .enable_dma = esdhc_of_enable_dma, |
181 | .get_max_clock = esdhc_of_get_max_clock, | 191 | .get_max_clock = esdhc_of_get_max_clock, |
182 | .get_min_clock = esdhc_of_get_min_clock, | 192 | .get_min_clock = esdhc_of_get_min_clock, |
193 | .platform_init = esdhc_of_platform_init, | ||
183 | #ifdef CONFIG_PM | 194 | #ifdef CONFIG_PM |
184 | .platform_suspend = esdhc_of_suspend, | 195 | .platform_suspend = esdhc_of_suspend, |
185 | .platform_resume = esdhc_of_resume, | 196 | .platform_resume = esdhc_of_resume, |
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c index 65551a9709cc..27164457f861 100644 --- a/drivers/mmc/host/sdhci-pltfm.c +++ b/drivers/mmc/host/sdhci-pltfm.c | |||
@@ -150,6 +150,13 @@ struct sdhci_host *sdhci_pltfm_init(struct platform_device *pdev, | |||
150 | goto err_remap; | 150 | goto err_remap; |
151 | } | 151 | } |
152 | 152 | ||
153 | /* | ||
154 | * Some platforms need to probe the controller to be able to | ||
155 | * determine which caps should be used. | ||
156 | */ | ||
157 | if (host->ops && host->ops->platform_init) | ||
158 | host->ops->platform_init(host); | ||
159 | |||
153 | platform_set_drvdata(pdev, host); | 160 | platform_set_drvdata(pdev, host); |
154 | 161 | ||
155 | return host; | 162 | return host; |
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 7922adb42386..f05a37747b3d 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c | |||
@@ -2837,6 +2837,9 @@ int sdhci_add_host(struct sdhci_host *host) | |||
2837 | if (!(host->quirks & SDHCI_QUIRK_FORCE_1_BIT_DATA)) | 2837 | if (!(host->quirks & SDHCI_QUIRK_FORCE_1_BIT_DATA)) |
2838 | mmc->caps |= MMC_CAP_4_BIT_DATA; | 2838 | mmc->caps |= MMC_CAP_4_BIT_DATA; |
2839 | 2839 | ||
2840 | if (host->quirks2 & SDHCI_QUIRK2_HOST_NO_CMD23) | ||
2841 | mmc->caps &= ~MMC_CAP_CMD23; | ||
2842 | |||
2840 | if (caps[0] & SDHCI_CAN_DO_HISPD) | 2843 | if (caps[0] & SDHCI_CAN_DO_HISPD) |
2841 | mmc->caps |= MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED; | 2844 | mmc->caps |= MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED; |
2842 | 2845 | ||
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 97653ea8942b..71a4a7ed46c5 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h | |||
@@ -278,6 +278,7 @@ struct sdhci_ops { | |||
278 | void (*hw_reset)(struct sdhci_host *host); | 278 | void (*hw_reset)(struct sdhci_host *host); |
279 | void (*platform_suspend)(struct sdhci_host *host); | 279 | void (*platform_suspend)(struct sdhci_host *host); |
280 | void (*platform_resume)(struct sdhci_host *host); | 280 | void (*platform_resume)(struct sdhci_host *host); |
281 | void (*platform_init)(struct sdhci_host *host); | ||
281 | }; | 282 | }; |
282 | 283 | ||
283 | #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS | 284 | #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS |
diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h index fa8529a859b8..1edcb4dad8c4 100644 --- a/include/linux/mmc/sdhci.h +++ b/include/linux/mmc/sdhci.h | |||
@@ -91,6 +91,7 @@ struct sdhci_host { | |||
91 | unsigned int quirks2; /* More deviations from spec. */ | 91 | unsigned int quirks2; /* More deviations from spec. */ |
92 | 92 | ||
93 | #define SDHCI_QUIRK2_HOST_OFF_CARD_ON (1<<0) | 93 | #define SDHCI_QUIRK2_HOST_OFF_CARD_ON (1<<0) |
94 | #define SDHCI_QUIRK2_HOST_NO_CMD23 (1<<1) | ||
94 | 95 | ||
95 | int irq; /* Device IRQ */ | 96 | int irq; /* Device IRQ */ |
96 | void __iomem *ioaddr; /* Mapped address */ | 97 | void __iomem *ioaddr; /* Mapped address */ |