[PATCH v4 1/3] mmc: dw_mmc: update clock after host reach a stable voltage
From: addy ke <hidden>
Date: 2015-02-19 10:30:52
Also in:
linux-mmc, lkml
Hi, Alim Sorry for late reply. On 2015/2/16 07:28, Alim Akhtar wrote:
Hi Addy, On Sat, Feb 14, 2015 at 11:47 AM, Addy Ke [off-list ref] wrote:quoted
As show in mmc_power_up(), in MMC_POWER_UP state, the voltage isn't stable and we may get 'data busy' which can't be cleaned by resetting all blocks. So we should not send command to update clock in this state. Signed-off-by: Addy Ke <redacted> --- drivers/mmc/host/dw_mmc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 4d2e3c2..3472f9b 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c@@ -1102,7 +1102,8 @@ static void dw_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) drv_data->set_ios(slot->host, ios); /* Slot specific timing and width adjustment */ - dw_mci_setup_bus(slot, false); + if (ios->power_mode != MMC_POWER_UP) + dw_mci_setup_bus(slot, false);This looks a HACK to me. If stabilizing host voltage regulator is the problem, can you try out below patch, and see if this resolve your issue?
I have test by: cd /sys/bus/platform/drivers/dwmmc_rockchip for i in $(seq 1 10000); do echo "========================" $i echo ff0c0000.dwmmc > unbind sleep .5 echo ff0c0000.dwmmc > bind sleep 2 done There is no error. I think this patch can resolve my issue, thank you. Do you send this patch upstream, or can I put it in my patch list?
quoted hunk ↗ jump to hunk
=========== [PATCH] mmc: dw_mmc: Wait for host voltage regulator to be stable Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com> --- drivers/mmc/host/dw_mmc.c | 3 +++ 1 file changed, 3 insertions(+)diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 4d2e3c2..dc10fbb 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c@@ -1202,6 +1202,9 @@ static int dw_mci_switch_voltage(struct mmc_host*mmc, struct mmc_ios *ios) } mci_writel(host, UHS_REG, uhs); + /* wait for 5ms so that host voltage regulator is stable */ + usleep_range(5000, 5500); + return 0; } ===============quoted
if (slot->host->state == STATE_WAITING_CMD11_DONE && ios->clock != 0) slot->host->state = STATE_IDLE; -- 1.8.3.2