return &(of_data->ctrl[id]);
 }
 
+static void samsung_banks_of_node_put(struct samsung_pinctrl_drv_data *d)
+{
+       struct samsung_pin_bank *bank;
+       unsigned int i;
+
+       bank = d->pin_banks;
+       for (i = 0; i < d->nr_banks; ++i, ++bank)
+               of_node_put(bank->of_node);
+}
+
 /* retrieve the soc specific data */
 static const struct samsung_pin_ctrl *
 samsung_pinctrl_get_soc_data(struct samsung_pinctrl_drv_data *d,
        if (ctrl->retention_data) {
                drvdata->retention_ctrl = ctrl->retention_data->init(drvdata,
                                                          ctrl->retention_data);
-               if (IS_ERR(drvdata->retention_ctrl))
-                       return PTR_ERR(drvdata->retention_ctrl);
+               if (IS_ERR(drvdata->retention_ctrl)) {
+                       ret = PTR_ERR(drvdata->retention_ctrl);
+                       goto err_put_banks;
+               }
        }
 
        ret = samsung_pinctrl_register(pdev, drvdata);
        if (ret)
-               return ret;
+               goto err_put_banks;
 
        ret = samsung_gpiolib_register(pdev, drvdata);
-       if (ret) {
-               samsung_pinctrl_unregister(pdev, drvdata);
-               return ret;
-       }
+       if (ret)
+               goto err_unregister;
 
        if (ctrl->eint_gpio_init)
                ctrl->eint_gpio_init(drvdata);
        platform_set_drvdata(pdev, drvdata);
 
        return 0;
+
+err_unregister:
+       samsung_pinctrl_unregister(pdev, drvdata);
+err_put_banks:
+       samsung_banks_of_node_put(drvdata);
+       return ret;
 }
 
 /*