This is necessary to support the sun6i-a31.

Signed-off-by: Hans de Goede <hdego...@redhat.com>
---
 drivers/mmc/host/sunxi-mmc.c | 19 +++++++++++++++++++
 drivers/mmc/host/sunxi-mmc.h |  1 +
 2 files changed, 20 insertions(+)

diff --git a/drivers/mmc/host/sunxi-mmc.c b/drivers/mmc/host/sunxi-mmc.c
index a16abd2..6b864165 100644
--- a/drivers/mmc/host/sunxi-mmc.c
+++ b/drivers/mmc/host/sunxi-mmc.c
@@ -31,6 +31,7 @@
 #include <linux/dma-mapping.h>
 #include <linux/slab.h>
 #include <linux/regulator/consumer.h>
+#include <linux/reset.h>
 
 #include <linux/of_address.h>
 #include <linux/of_gpio.h>
@@ -64,6 +65,16 @@ static int sunxi_mmc_init_host(struct mmc_host *mmc)
                return ret;
        }
 
+       if (smc_host->reset) {
+               ret = reset_control_deassert(smc_host->reset);
+               if (ret) {
+                       dev_err(mmc_dev(smc_host->mmc), "reset err %d\n", ret);
+                       clk_disable_unprepare(smc_host->clk_ahb);
+                       clk_disable_unprepare(smc_host->clk_mod);
+                       return ret;
+               }
+       }
+
        /* reset controller */
        rval = mci_readl(smc_host, REG_GCTRL) | SDXC_HARDWARE_RESET;
        mci_writel(smc_host, REG_GCTRL, rval);
@@ -85,6 +96,10 @@ static int sunxi_mmc_init_host(struct mmc_host *mmc)
 static void sunxi_mmc_exit_host(struct sunxi_mmc_host *smc_host)
 {
        mci_writel(smc_host, REG_GCTRL, SDXC_HARDWARE_RESET);
+
+       if (smc_host->reset)
+               reset_control_assert(smc_host->reset);
+
        clk_disable_unprepare(smc_host->clk_ahb);
        clk_disable_unprepare(smc_host->clk_mod);
 }
@@ -738,6 +753,10 @@ static int sunxi_mmc_resource_request(struct 
sunxi_mmc_host *host,
                return PTR_ERR(host->clk_mod);
        }
 
+       host->reset = devm_reset_control_get(&pdev->dev, "reset");
+       if (IS_ERR(host->reset))
+               host->reset = NULL; /* Having a reset controller is optional */
+
        /* Make sure the controller is in a sane state before enabling irqs */
        ret = sunxi_mmc_init_host(host->mmc);
        if (ret)
diff --git a/drivers/mmc/host/sunxi-mmc.h b/drivers/mmc/host/sunxi-mmc.h
index 84bab99..792af8c 100644
--- a/drivers/mmc/host/sunxi-mmc.h
+++ b/drivers/mmc/host/sunxi-mmc.h
@@ -186,6 +186,7 @@ struct sunxi_idma_des {
 struct sunxi_mmc_host {
        struct mmc_host *mmc;
        struct regulator *vmmc;
+       struct reset_control *reset;
 
        /* IO mapping base */
        void __iomem *reg_base;
-- 
1.9.0

-- 
You received this message because you are subscribed to the Google Groups 
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to