return pdata;
 }
 
+static void dwapb_assert_reset(void *data)
+{
+       struct dwapb_gpio *gpio = data;
+
+       reset_control_assert(gpio->rst);
+}
+
+static int dwapb_get_reset(struct dwapb_gpio *gpio)
+{
+       int err;
+
+       gpio->rst = devm_reset_control_get_optional_shared(gpio->dev, NULL);
+       if (IS_ERR(gpio->rst)) {
+               dev_err(gpio->dev, "Cannot get reset descriptor\n");
+               return PTR_ERR(gpio->rst);
+       }
+
+       err = reset_control_deassert(gpio->rst);
+       if (err) {
+               dev_err(gpio->dev, "Cannot deassert reset lane\n");
+               return err;
+       }
+
+       return devm_add_action_or_reset(gpio->dev, dwapb_assert_reset, gpio);
+}
+
 static const struct of_device_id dwapb_of_match[] = {
        { .compatible = "snps,dw-apb-gpio", .data = (void *)0},
        { .compatible = "apm,xgene-gpio-v2", .data = (void *)GPIO_REG_OFFSET_V2},
        gpio->dev = &pdev->dev;
        gpio->nr_ports = pdata->nports;
 
-       gpio->rst = devm_reset_control_get_optional_shared(dev, NULL);
-       if (IS_ERR(gpio->rst))
-               return PTR_ERR(gpio->rst);
-
-       reset_control_deassert(gpio->rst);
+       err = dwapb_get_reset(gpio);
+       if (err)
+               return err;
 
        gpio->ports = devm_kcalloc(&pdev->dev, gpio->nr_ports,
                                   sizeof(*gpio->ports), GFP_KERNEL);
        struct dwapb_gpio *gpio = platform_get_drvdata(pdev);
 
        dwapb_gpio_unregister(gpio);
-       reset_control_assert(gpio->rst);
        clk_bulk_disable_unprepare(DWAPB_NR_CLOCKS, gpio->clks);
 
        return 0;