return 0;
 }
 
+static int sunxi_musb_recover(struct musb *musb)
+{
+       struct sunxi_glue *glue = dev_get_drvdata(musb->controller->parent);
+
+       /*
+        * Schedule a phy_set_mode with the current glue->phy_mode value,
+        * this will force end the current session.
+        */
+       set_bit(SUNXI_MUSB_FL_PHY_MODE_PEND, &glue->flags);
+       schedule_work(&glue->work);
+
+       return 0;
+}
+
 /*
  * sunxi musb register layout
  * 0x00 - 0x17 fifo regs, 1 long per fifo
        .dma_init       = sunxi_musb_dma_controller_create,
        .dma_exit       = sunxi_musb_dma_controller_destroy,
        .set_mode       = sunxi_musb_set_mode,
+       .recover        = sunxi_musb_recover,
        .set_vbus       = sunxi_musb_set_vbus,
        .pre_root_reset_end = sunxi_musb_pre_root_reset_end,
        .post_root_reset_end = sunxi_musb_post_root_reset_end,