const char *name = np->name;
        const char *parent_name;
        struct regmap *regmap;
+       struct device_node *parent_np;
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        const char *name = np->name;
        const char *parent_name;
        struct regmap *regmap;
+       struct device_node *parent_np;
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        const char *name = np->name;
        const char *parent_name;
        struct regmap *regmap;
+       struct device_node *parent_np;
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        struct clk_hw *hw;
        unsigned int num_parents;
        const char *parent_names[GENERATED_SOURCE_MAX];
-       struct device_node *gcknp;
+       struct device_node *gcknp, *parent_np;
        struct clk_range range = CLK_RANGE(0, 0);
        struct regmap *regmap;
 
        if (!num || num > PERIPHERAL_MAX)
                return;
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        const char *name = np->name;
        const char *parent_name;
        struct regmap *regmap;
+       struct device_node *parent_np;
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        const char *parent_name;
        struct regmap *regmap;
        bool bypass;
+       struct device_node *parent_np;
 
        of_property_read_string(np, "clock-output-names", &name);
        bypass = of_property_read_bool(np, "atmel,osc-bypass");
        parent_name = of_clk_get_parent_name(np, 0);
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        u32 accuracy = 0;
        const char *name = np->name;
        struct regmap *regmap;
+       struct device_node *parent_np;
 
        of_property_read_string(np, "clock-output-names", &name);
        of_property_read_u32(np, "clock-frequency", &frequency);
        of_property_read_u32(np, "clock-accuracy", &accuracy);
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        const char *parent_name;
        const char *name = np->name;
        struct regmap *regmap;
+       struct device_node *parent_np;
 
        parent_name = of_clk_get_parent_name(np, 0);
        of_property_read_string(np, "clock-output-names", &name);
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        unsigned int num_parents;
        const char *name = np->name;
        struct regmap *regmap;
+       struct device_node *parent_np;
 
        num_parents = of_clk_get_parent_count(np);
        if (num_parents == 0 || num_parents > 2)
                return;
 
        of_clk_parent_fill(np, parent_names, num_parents);
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        const char *name = np->name;
        struct clk_master_characteristics *characteristics;
        struct regmap *regmap;
+       struct device_node *parent_np;
 
        num_parents = of_clk_get_parent_count(np);
        if (num_parents == 0 || num_parents > MASTER_SOURCE_MAX)
        if (!characteristics)
                return;
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        const char *name;
        struct device_node *periphclknp;
        struct regmap *regmap;
+       struct device_node *parent_np;
 
        parent_name = of_clk_get_parent_name(np, 0);
        if (!parent_name)
        if (!num || num > PERIPHERAL_MAX)
                return;
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        struct regmap *regmap;
        const char *parent_name;
        const char *name = np->name;
+       struct device_node *parent_np;
        struct clk_pll_characteristics *characteristics;
 
        if (of_property_read_u32(np, "reg", &id))
 
        of_property_read_string(np, "clock-output-names", &name);
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        const char *parent_name;
        const char *name = np->name;
        struct regmap *regmap;
+       struct device_node *parent_np;
 
        parent_name = of_clk_get_parent_name(np, 0);
 
        of_property_read_string(np, "clock-output-names", &name);
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        unsigned int num_parents;
        const char *parent_names[PROG_SOURCE_MAX];
        const char *name;
-       struct device_node *progclknp;
+       struct device_node *progclknp, *parent_np;
        struct regmap *regmap;
 
        num_parents = of_clk_get_parent_count(np);
        if (!num || num > (PROG_ID_MAX + 1))
                return;
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        unsigned int num_parents;
        const char *name = np->name;
        struct regmap *regmap;
+       struct device_node *parent_np;
 
        num_parents = of_clk_get_parent_count(np);
        if (num_parents != 2)
                return;
 
        of_clk_parent_fill(np, parent_names, num_parents);
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        const char *parent_names[SMD_SOURCE_MAX];
        const char *name = np->name;
        struct regmap *regmap;
+       struct device_node *parent_np;
 
        num_parents = of_clk_get_parent_count(np);
        if (num_parents == 0 || num_parents > SMD_SOURCE_MAX)
 
        of_property_read_string(np, "clock-output-names", &name);
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        u32 id;
        struct clk_hw *hw;
        const char *name;
-       struct device_node *sysclknp;
+       struct device_node *sysclknp, *parent_np;
        const char *parent_name;
        struct regmap *regmap;
 
        if (num > (SYSTEM_MAX_ID + 1))
                return;
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        const char *parent_names[USB_SOURCE_MAX];
        const char *name = np->name;
        struct regmap *regmap;
+       struct device_node *parent_np;
 
        num_parents = of_clk_get_parent_count(np);
        if (num_parents == 0 || num_parents > USB_SOURCE_MAX)
 
        of_property_read_string(np, "clock-output-names", &name);
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        const char *parent_name;
        const char *name = np->name;
        struct regmap *regmap;
+       struct device_node *parent_np;
 
        parent_name = of_clk_get_parent_name(np, 0);
        if (!parent_name)
 
        of_property_read_string(np, "clock-output-names", &name);
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
 
        const char *name = np->name;
        u32 divisors[4] = {0, 0, 0, 0};
        struct regmap *regmap;
+       struct device_node *parent_np;
 
        parent_name = of_clk_get_parent_name(np, 0);
        if (!parent_name)
 
        of_property_read_string(np, "clock-output-names", &name);
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap))
                return;
        hw = at91rm9200_clk_register_usb(regmap, name, parent_name, divisors);
        const char *parent_name;
        const char *name = np->name;
        struct regmap *regmap_pmc, *regmap_sfr;
+       struct device_node *parent_np;
 
        parent_name = of_clk_get_parent_name(np, 0);
 
        of_property_read_string(np, "clock-output-names", &name);
 
-       regmap_pmc = syscon_node_to_regmap(of_get_parent(np));
+       parent_np = of_get_parent(np);
+       regmap_pmc = syscon_node_to_regmap(parent_np);
+       of_node_put(parent_np);
        if (IS_ERR(regmap_pmc))
                return;