diff options
author | Paul Walmsley <paul@pwsan.com> | 2011-10-06 16:50:35 -0400 |
---|---|---|
committer | Chris Ball <cjb@laptop.org> | 2011-10-27 09:11:28 -0400 |
commit | 9b68256cdef75204aa8a4583aa79dd7c081796b3 (patch) | |
tree | 8b0d514421193b11ebfb98e99bde76b81bfb00f5 | |
parent | 2bf22b39823c1d173dda31111a4eb2ce36daaf39 (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.h | 19 | ||||
-rw-r--r-- | drivers/mmc/host/omap_hsmmc.c | 4 |
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 | ||
36 | struct omap_mmc_dev_attr { | 53 | struct 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); |