OSDN Git Service

mmc: f-sdh30: Add reset control support
authorKunihiko Hayashi <hayashi.kunihiko@socionext.com>
Fri, 11 Nov 2022 08:10:29 +0000 (17:10 +0900)
committerUlf Hansson <ulf.hansson@linaro.org>
Wed, 7 Dec 2022 12:22:36 +0000 (13:22 +0100)
Add reset control support for F_SDH30 controller. This is optional.

Signed-off-by: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
Acked-by: Jassi Brar <jaswinder.singh@linaro.org>
Link: https://lore.kernel.org/r/20221111081033.3813-3-hayashi.kunihiko@socionext.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci_f_sdh30.c

index 3f59779..7f4553b 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/of.h>
 #include <linux/property.h>
 #include <linux/clk.h>
+#include <linux/reset.h>
 
 #include "sdhci-pltfm.h"
 #include "sdhci_f_sdh30.h"
@@ -21,6 +22,7 @@
 struct f_sdhost_priv {
        struct clk *clk_iface;
        struct clk *clk;
+       struct reset_control *rst;
        u32 vendor_hs200;
        struct device *dev;
        bool enable_cmd_dat_delay;
@@ -150,6 +152,16 @@ static int sdhci_f_sdh30_probe(struct platform_device *pdev)
                ret = clk_prepare_enable(priv->clk);
                if (ret)
                        goto err_clk;
+
+               priv->rst = devm_reset_control_get_optional_shared(dev, NULL);
+               if (IS_ERR(priv->rst)) {
+                       ret = PTR_ERR(priv->rst);
+                       goto err_rst;
+               }
+
+               ret = reset_control_deassert(priv->rst);
+               if (ret)
+                       goto err_rst;
        }
 
        /* init vendor specific regs */
@@ -175,6 +187,8 @@ static int sdhci_f_sdh30_probe(struct platform_device *pdev)
        return 0;
 
 err_add_host:
+       reset_control_assert(priv->rst);
+err_rst:
        clk_disable_unprepare(priv->clk);
 err_clk:
        clk_disable_unprepare(priv->clk_iface);
@@ -191,8 +205,9 @@ static int sdhci_f_sdh30_remove(struct platform_device *pdev)
        sdhci_remove_host(host, readl(host->ioaddr + SDHCI_INT_STATUS) ==
                          0xffffffff);
 
-       clk_disable_unprepare(priv->clk_iface);
+       reset_control_assert(priv->rst);
        clk_disable_unprepare(priv->clk);
+       clk_disable_unprepare(priv->clk_iface);
 
        sdhci_free_host(host);
        platform_set_drvdata(pdev, NULL);