#include <linux/of.h>
 #include <linux/platform_device.h>
 #include <linux/dma-mapping.h>
+#include <linux/of_gpio.h>
 #include <linux/of_platform.h>
 #include <linux/pm_runtime.h>
 #include <linux/reset.h>
 {
        struct device           *dev = priv_data->dev;
        struct reset_control    *crst, *hibrst, *apbrst;
+       struct gpio_desc        *reset_gpio;
        struct phy              *usb3_phy;
        int                     ret = 0;
        u32                     reg;
        }
 
 skip_usb3_phy:
+       /* ulpi reset via gpio-modepin or gpio-framework driver */
+       reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
+       if (IS_ERR(reset_gpio)) {
+               return dev_err_probe(dev, PTR_ERR(reset_gpio),
+                                    "Failed to request reset GPIO\n");
+       }
+
+       if (reset_gpio) {
+               /* Toggle ulpi to reset the phy. */
+               gpiod_set_value_cansleep(reset_gpio, 1);
+               usleep_range(5000, 10000);
+               gpiod_set_value_cansleep(reset_gpio, 0);
+               usleep_range(5000, 10000);
+       }
+
        /*
         * This routes the USB DMA traffic to go through FPD path instead
         * of reaching DDR directly. This traffic routing is needed to