reg |= DWC3_DCFG_DEVADDR(addr);
        dwc3_writel(dwc->regs, DWC3_DCFG, reg);
 
-       if (addr)
+       if (addr) {
                dwc->dev_state = DWC3_ADDRESS_STATE;
-       else
+               usb_gadget_set_state(&dwc->gadget, USB_STATE_ADDRESS);
+       } else {
                dwc->dev_state = DWC3_DEFAULT_STATE;
+               usb_gadget_set_state(&dwc->gadget, USB_STATE_DEFAULT);
+       }
 
        return 0;
 }
                /* if the cfg matches and the cfg is non zero */
                if (cfg && (!ret || (ret == USB_GADGET_DELAYED_STATUS))) {
                        dwc->dev_state = DWC3_CONFIGURED_STATE;
+                       usb_gadget_set_state(&dwc->gadget,
+                                       USB_STATE_CONFIGURED);
+
                        /*
                         * Enable transition to U1/U2 state when
                         * nothing is pending from application.
 
        case DWC3_CONFIGURED_STATE:
                ret = dwc3_ep0_delegate_req(dwc, ctrl);
-               if (!cfg)
+               if (!cfg) {
                        dwc->dev_state = DWC3_ADDRESS_STATE;
+                       usb_gadget_set_state(&dwc->gadget,
+                                       USB_STATE_ADDRESS);
+               }
                break;
        default:
                ret = -EINVAL;
 
        }
 
        /* after reset -> Default State */
-       dwc->dev_state = DWC3_DEFAULT_STATE;
+       usb_gadget_set_state(&dwc->gadget, USB_STATE_DEFAULT);
 
        /* Recent versions support automatic phy suspend and don't need this */
        if (dwc->revision < DWC3_REVISION_194A) {