提交 d8181941 编写于 作者: M Maxime Ripard 提交者: Ulf Hansson

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: NMaxime Ripard <maxime.ripard@bootlin.com>
Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
上级 774c0103
...@@ -1170,10 +1170,19 @@ static int sunxi_mmc_enable(struct sunxi_mmc_host *host) ...@@ -1170,10 +1170,19 @@ static int sunxi_mmc_enable(struct sunxi_mmc_host *host)
{ {
int ret; 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); ret = clk_prepare_enable(host->clk_ahb);
if (ret) { if (ret) {
dev_err(dev, "Couldn't enable the bus clocks (%d)\n", ret); dev_err(host->dev, "Couldn't enable the bus clocks (%d)\n", ret);
return ret; goto error_assert_reset;
} }
ret = clk_prepare_enable(host->clk_mmc); ret = clk_prepare_enable(host->clk_mmc);
...@@ -1194,28 +1203,16 @@ static int sunxi_mmc_enable(struct sunxi_mmc_host *host) ...@@ -1194,28 +1203,16 @@ static int sunxi_mmc_enable(struct sunxi_mmc_host *host)
goto error_disable_clk_output; 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, * Sometimes the controller asserts the irq on boot for some reason,
* make sure the controller is in a sane state before enabling irqs. * make sure the controller is in a sane state before enabling irqs.
*/ */
ret = sunxi_mmc_reset_host(host); ret = sunxi_mmc_reset_host(host);
if (ret) if (ret)
goto error_assert_reset; goto error_disable_clk_sample;
return 0; return 0;
error_assert_reset:
if (!IS_ERR(host->reset))
reset_control_assert(host->reset);
error_disable_clk_sample: error_disable_clk_sample:
clk_disable_unprepare(host->clk_sample); clk_disable_unprepare(host->clk_sample);
error_disable_clk_output: error_disable_clk_output:
...@@ -1224,6 +1221,9 @@ static int sunxi_mmc_enable(struct sunxi_mmc_host *host) ...@@ -1224,6 +1221,9 @@ static int sunxi_mmc_enable(struct sunxi_mmc_host *host)
clk_disable_unprepare(host->clk_mmc); clk_disable_unprepare(host->clk_mmc);
error_disable_clk_ahb: error_disable_clk_ahb:
clk_disable_unprepare(host->clk_ahb); clk_disable_unprepare(host->clk_ahb);
error_assert_reset:
if (!IS_ERR(host->reset))
reset_control_assert(host->reset);
return ret; return ret;
} }
...@@ -1231,13 +1231,13 @@ static void sunxi_mmc_disable(struct sunxi_mmc_host *host) ...@@ -1231,13 +1231,13 @@ static void sunxi_mmc_disable(struct sunxi_mmc_host *host)
{ {
sunxi_mmc_reset_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_sample);
clk_disable_unprepare(host->clk_output); clk_disable_unprepare(host->clk_output);
clk_disable_unprepare(host->clk_mmc); clk_disable_unprepare(host->clk_mmc);
clk_disable_unprepare(host->clk_ahb); 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, static int sunxi_mmc_resource_request(struct sunxi_mmc_host *host,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册