#include <linux/platform_data/syscon.h>
 #include <linux/platform_device.h>
 #include <linux/regmap.h>
+#include <linux/reset.h>
 #include <linux/mfd/syscon.h>
 #include <linux/slab.h>
 
 struct syscon {
        struct device_node *np;
        struct regmap *regmap;
+       struct reset_control *reset;
        struct list_head list;
 };
 
        .reg_stride = 4,
 };
 
-static struct syscon *of_syscon_register(struct device_node *np, bool check_clk)
+static struct syscon *of_syscon_register(struct device_node *np, bool check_res)
 {
        struct clk *clk;
        struct syscon *syscon;
        int ret;
        struct regmap_config syscon_config = syscon_regmap_config;
        struct resource res;
+       struct reset_control *reset;
 
        syscon = kzalloc(sizeof(*syscon), GFP_KERNEL);
        if (!syscon)
                goto err_regmap;
        }
 
-       if (check_clk) {
+       if (check_res) {
                clk = of_clk_get(np, 0);
                if (IS_ERR(clk)) {
                        ret = PTR_ERR(clk);
                } else {
                        ret = regmap_mmio_attach_clk(regmap, clk);
                        if (ret)
-                               goto err_attach;
+                               goto err_attach_clk;
                }
+
+               reset = of_reset_control_get_optional_exclusive(np, NULL);
+               if (IS_ERR(reset)) {
+                       ret = PTR_ERR(reset);
+                       goto err_attach_clk;
+               }
+
+               ret = reset_control_deassert(reset);
+               if (ret)
+                       goto err_reset;
        }
 
        syscon->regmap = regmap;
 
        return syscon;
 
-err_attach:
+err_reset:
+       reset_control_put(reset);
+err_attach_clk:
        if (!IS_ERR(clk))
                clk_put(clk);
 err_clk:
 }
 
 static struct regmap *device_node_get_regmap(struct device_node *np,
-                                            bool check_clk)
+                                            bool check_res)
 {
        struct syscon *entry, *syscon = NULL;
 
        spin_unlock(&syscon_list_slock);
 
        if (!syscon)
-               syscon = of_syscon_register(np, check_clk);
+               syscon = of_syscon_register(np, check_res);
 
        if (IS_ERR(syscon))
                return ERR_CAST(syscon);