mfd: syscon: Add optional clock support
authorFabrice Gasnier <fabrice.gasnier@st.com>
Wed, 12 Dec 2018 08:48:14 +0000 (09:48 +0100)
committerLee Jones <lee.jones@linaro.org>
Tue, 14 May 2019 07:13:25 +0000 (08:13 +0100)
Some system control registers need to be clocked, so the registers can
be accessed. Add an optional clock and attach it to regmap.

Signed-off-by: Fabrice Gasnier <fabrice.gasnier@st.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
drivers/mfd/syscon.c

index 0ecdffb3d96728ba89fb7dc34f57483364784fe7..f6922a0f8058af3f563a4a720e7cfec2d98f55af 100644 (file)
@@ -12,6 +12,7 @@
  * (at your option) any later version.
  */
 
+#include <linux/clk.h>
 #include <linux/err.h>
 #include <linux/hwspinlock.h>
 #include <linux/io.h>
@@ -45,6 +46,7 @@ static const struct regmap_config syscon_regmap_config = {
 
 static struct syscon *of_syscon_register(struct device_node *np)
 {
+       struct clk *clk;
        struct syscon *syscon;
        struct regmap *regmap;
        void __iomem *base;
@@ -119,6 +121,18 @@ static struct syscon *of_syscon_register(struct device_node *np)
                goto err_regmap;
        }
 
+       clk = of_clk_get(np, 0);
+       if (IS_ERR(clk)) {
+               ret = PTR_ERR(clk);
+               /* clock is optional */
+               if (ret != -ENOENT)
+                       goto err_clk;
+       } else {
+               ret = regmap_mmio_attach_clk(regmap, clk);
+               if (ret)
+                       goto err_attach;
+       }
+
        syscon->regmap = regmap;
        syscon->np = np;
 
@@ -128,6 +142,11 @@ static struct syscon *of_syscon_register(struct device_node *np)
 
        return syscon;
 
+err_attach:
+       if (!IS_ERR(clk))
+               clk_put(clk);
+err_clk:
+       regmap_exit(regmap);
 err_regmap:
        iounmap(base);
 err_map: