summaryrefslogtreecommitdiff
path: root/drivers/mmc
diff options
context:
space:
mode:
authorMaxime Ripard <maxime.ripard@bootlin.com>2018-03-08 17:52:52 +0300
committerUlf Hansson <ulf.hansson@linaro.org>2018-03-15 16:43:23 +0300
commitd81819419b2be4eee6643681ce0366856a772ba9 (patch)
treea75528c10251c1cdc83d3b751eed2c82887d5538 /drivers/mmc
parent774c010350a16f44705971e8aff457580628c76e (diff)
downloadlinux-d81819419b2be4eee6643681ce0366856a772ba9.tar.xz
mmc: sunxi: Move the reset deassertion before enabling the clocks
As per Allwinner guidelines, the reset line should be deasserted before turning the clocks on. Implement it in our driver as well. Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/host/sunxi-mmc.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/drivers/mmc/host/sunxi-mmc.c b/drivers/mmc/host/sunxi-mmc.c
index 3601746d37a9..b747d65a7d15 100644
--- a/drivers/mmc/host/sunxi-mmc.c
+++ b/drivers/mmc/host/sunxi-mmc.c
@@ -1170,10 +1170,19 @@ static int sunxi_mmc_enable(struct sunxi_mmc_host *host)
{
int ret;
+ if (!IS_ERR(host->reset)) {
+ ret = reset_control_reset(host->reset);
+ if (ret) {
+ dev_err(host->dev, "Couldn't reset the MMC controller (%d)\n",
+ ret);
+ return ret;
+ }
+ }
+
ret = clk_prepare_enable(host->clk_ahb);
if (ret) {
- dev_err(dev, "Couldn't enable the bus clocks (%d)\n", ret);
- return ret;
+ dev_err(host->dev, "Couldn't enable the bus clocks (%d)\n", ret);
+ goto error_assert_reset;
}
ret = clk_prepare_enable(host->clk_mmc);
@@ -1194,28 +1203,16 @@ static int sunxi_mmc_enable(struct sunxi_mmc_host *host)
goto error_disable_clk_output;
}
- if (!IS_ERR(host->reset)) {
- ret = reset_control_reset(host->reset);
- if (ret) {
- dev_err(dev, "Couldn't reset the MMC controller (%d)\n",
- ret);
- goto error_disable_clk_sample;
- }
- }
-
/*
* Sometimes the controller asserts the irq on boot for some reason,
* make sure the controller is in a sane state before enabling irqs.
*/
ret = sunxi_mmc_reset_host(host);
if (ret)
- goto error_assert_reset;
+ goto error_disable_clk_sample;
return 0;
-error_assert_reset:
- if (!IS_ERR(host->reset))
- reset_control_assert(host->reset);
error_disable_clk_sample:
clk_disable_unprepare(host->clk_sample);
error_disable_clk_output:
@@ -1224,6 +1221,9 @@ error_disable_clk_mmc:
clk_disable_unprepare(host->clk_mmc);
error_disable_clk_ahb:
clk_disable_unprepare(host->clk_ahb);
+error_assert_reset:
+ if (!IS_ERR(host->reset))
+ reset_control_assert(host->reset);
return ret;
}
@@ -1231,13 +1231,13 @@ static void sunxi_mmc_disable(struct sunxi_mmc_host *host)
{
sunxi_mmc_reset_host(host);
- if (!IS_ERR(host->reset))
- reset_control_assert(host->reset);
-
clk_disable_unprepare(host->clk_sample);
clk_disable_unprepare(host->clk_output);
clk_disable_unprepare(host->clk_mmc);
clk_disable_unprepare(host->clk_ahb);
+
+ if (!IS_ERR(host->reset))
+ reset_control_assert(host->reset);
}
static int sunxi_mmc_resource_request(struct sunxi_mmc_host *host,