Merge tag 'kgdb-5.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/danielt...
[linux-2.6-microblaze.git] / drivers / mfd / syscon.c
index 0ecdffb..f6922a0 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: