aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Walmsley <paul@pwsan.com>2011-10-06 16:50:35 -0400
committerChris Ball <cjb@laptop.org>2011-10-27 09:11:28 -0400
commit9b68256cdef75204aa8a4583aa79dd7c081796b3 (patch)
tree8b0d514421193b11ebfb98e99bde76b81bfb00f5
parent2bf22b39823c1d173dda31111a4eb2ce36daaf39 (diff)
mmc: omap_hsmmc: if multiblock reads are broken, disable them
When device data indicates that multiple block reads are not supported on a given HSMMC controller instance, log a message to the console, and pass the appropriate MMC capability flag to the MMC core. Signed-off-by: Paul Walmsley <paul@pwsan.com> Cc: Dave Hylands <dhylands@gmail.com> Tested-by: Steve Sakoman <sakoman@gmail.com> Signed-off-by: Chris Ball <cjb@laptop.org>
-rw-r--r--arch/arm/plat-omap/include/plat/mmc.h19
-rw-r--r--drivers/mmc/host/omap_hsmmc.c4
2 files changed, 22 insertions, 1 deletions
diff --git a/arch/arm/plat-omap/include/plat/mmc.h b/arch/arm/plat-omap/include/plat/mmc.h
index c7b874186c27..94cf70afb236 100644
--- a/arch/arm/plat-omap/include/plat/mmc.h
+++ b/arch/arm/plat-omap/include/plat/mmc.h
@@ -31,7 +31,24 @@
31 31
32#define OMAP_MMC_MAX_SLOTS 2 32#define OMAP_MMC_MAX_SLOTS 2
33 33
34#define OMAP_HSMMC_SUPPORTS_DUAL_VOLT BIT(1) 34/*
35 * struct omap_mmc_dev_attr.flags possibilities
36 *
37 * OMAP_HSMMC_SUPPORTS_DUAL_VOLT: Some HSMMC controller instances can
38 * operate with either 1.8Vdc or 3.0Vdc card voltages; this flag
39 * should be set if this is the case. See for example Section 22.5.3
40 * "MMC/SD/SDIO1 Bus Voltage Selection" of the OMAP34xx Multimedia
41 * Device Silicon Revision 3.1.x Revision ZR (July 2011) (SWPU223R).
42 *
43 * OMAP_HSMMC_BROKEN_MULTIBLOCK_READ: Multiple-block read transfers
44 * don't work correctly on some MMC controller instances on some
45 * OMAP3 SoCs; this flag should be set if this is the case. See
46 * for example Advisory 2.1.1.128 "MMC: Multiple Block Read
47 * Operation Issue" in _OMAP3530/3525/3515/3503 Silicon Errata_
48 * Revision F (October 2010) (SPRZ278F).
49 */
50#define OMAP_HSMMC_SUPPORTS_DUAL_VOLT BIT(0)
51#define OMAP_HSMMC_BROKEN_MULTIBLOCK_READ BIT(1)
35 52
36struct omap_mmc_dev_attr { 53struct omap_mmc_dev_attr {
37 u8 flags; 54 u8 flags;
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index bb334be562d7..e8ff12396680 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -1942,6 +1942,10 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
1942 omap_hsmmc_context_save(host); 1942 omap_hsmmc_context_save(host);
1943 1943
1944 mmc->caps |= MMC_CAP_DISABLE; 1944 mmc->caps |= MMC_CAP_DISABLE;
1945 if (host->pdata->controller_flags & OMAP_HSMMC_BROKEN_MULTIBLOCK_READ) {
1946 dev_info(&pdev->dev, "multiblock reads disabled due to 35xx erratum 2.1.1.128; MMC read performance may suffer\n");
1947 mmc->caps2 |= MMC_CAP2_NO_MULTI_READ;
1948 }
1945 1949
1946 pm_runtime_enable(host->dev); 1950 pm_runtime_enable(host->dev);
1947 pm_runtime_get_sync(host->dev); 1951 pm_runtime_get_sync(host->dev);