| From 4f446b287e416f9a668ce417e8ae88520706d1a5 Mon Sep 17 00:00:00 2001 |
| From: Anssi Hannula <anssi.hannula@bitwise.fi> |
| Date: Mon, 13 Feb 2017 13:46:41 +0200 |
| Subject: [PATCH] mmc: core: fix multi-bit bus width without high-speed mode |
| |
| commit 3d4ef329757cfd5e0b23cce97cdeca7e2df89c99 upstream. |
| |
| Commit 577fb13199b1 ("mmc: rework selection of bus speed mode") |
| refactored bus width selection code to mmc_select_bus_width(). |
| |
| However, it also altered the behavior to not call the selection code in |
| non-high-speed modes anymore. |
| |
| This causes 1-bit mode to always be used when the high-speed mode is not |
| enabled, even though 4-bit and 8-bit bus are valid bus widths in the |
| backwards-compatibility (legacy) mode as well (see e.g. 5.3.2 Bus Speed |
| Modes in JEDEC 84-B50). This results in a significant regression in |
| transfer speeds. |
| |
| Fix the code to allow 4-bit and 8-bit widths even without high-speed |
| mode, as before. |
| |
| Tested with a Zynq-7000 PicoZed 7020 board. |
| |
| Fixes: 577fb13199b1 ("mmc: rework selection of bus speed mode") |
| Signed-off-by: Anssi Hannula <anssi.hannula@bitwise.fi> |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c |
| index 6ef1e3c731f8..8bd46a8e9291 100644 |
| --- a/drivers/mmc/core/mmc.c |
| +++ b/drivers/mmc/core/mmc.c |
| @@ -1687,10 +1687,10 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, |
| err = mmc_select_hs400(card); |
| if (err) |
| goto free_card; |
| - } else if (mmc_card_hs(card)) { |
| + } else { |
| /* Select the desired bus width optionally */ |
| err = mmc_select_bus_width(card); |
| - if (err > 0) { |
| + if (err > 0 && mmc_card_hs(card)) { |
| err = mmc_select_hs_ddr(card); |
| if (err) |
| goto free_card; |
| -- |
| 2.12.0 |
| |