static void ep_enable(int num, int in)
 {
        struct ept_queue_head *head;
-       struct mv_udc *udc = controller.udc;
+       struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;
        unsigned n;
        head = epts + 2*num + in;
 
                struct usb_request *req, gfp_t gfp_flags)
 {
        struct mv_ep *mv_ep = container_of(ep, struct mv_ep, ep);
-       struct mv_udc *udc = controller.udc;
+       struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;
        struct ept_queue_item *item;
        struct ept_queue_head *head;
        unsigned phys;
 static void handle_setup(void)
 {
        struct usb_request *req = &controller.ep[0].req;
-       struct mv_udc *udc = controller.udc;
+       struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;
        struct ept_queue_head *head;
        struct usb_ctrlrequest r;
        int status = 0;
 {
        int i, num, in;
        struct ept_queue_head *head;
-       struct mv_udc *udc = controller.udc;
+       struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;
        writel(readl(&udc->epcomp), &udc->epcomp);
        writel(readl(&udc->epstat), &udc->epstat);
        writel(0xffffffff, &udc->epflush);
 
 void udc_irq(void)
 {
-       struct mv_udc *udc = controller.udc;
+       struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;
        unsigned n = readl(&udc->usbsts);
        writel(n, &udc->usbsts);
        int bit, i, num, in;
 int usb_gadget_handle_interrupts(void)
 {
        u32 value;
-       struct mv_udc *udc = controller.udc;
+       struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;
 
        value = readl(&udc->usbsts);
        if (value)
 
 static int mv_pullup(struct usb_gadget *gadget, int is_on)
 {
-       struct mv_udc *udc = controller.udc;
+       struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;
        if (is_on) {
                /* RESET */
                writel(USBCMD_ITC(MICRO_8FRAME) | USBCMD_RST, &udc->usbcmd);
 
 void udc_disconnect(void)
 {
-       struct mv_udc *udc = controller.udc;
+       struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;
        /* disable pullup */
        stop_activity();
        writel(USBCMD_FS2, &udc->usbcmd);
        int i;
 
        controller.gadget.ops = &mv_udc_ops;
-       controller.udc = (struct mv_udc *)CONFIG_USB_REG_BASE;
        epts = memalign(PAGE_SIZE, QH_MAXNUM * sizeof(struct ept_queue_head));
        memset(epts, 0, QH_MAXNUM * sizeof(struct ept_queue_head));
        for (i = 0; i < 2 * NUM_ENDPOINTS; i++) {
 
 int usb_gadget_register_driver(struct usb_gadget_driver *driver)
 {
-       struct mv_udc *udc = controller.udc;
-       int             retval;
-       void *ctrl;
+       struct mv_udc *udc;
+       int ret;
 
        if (!driver
                        || driver->speed < USB_SPEED_FULL
                return -EINVAL;
        }
 
-       if (!mvudc_probe()) {
-               usb_lowlevel_init(0, &ctrl);
+       ret = usb_lowlevel_init(0, (void **)&controller.ctrl);
+       if (ret)
+               return ret;
+
+       ret = mvudc_probe();
+       if (!ret) {
+               udc = (struct mv_udc *)controller.ctrl->hcor;
+
                /* select ULPI phy */
                writel(PTS(PTS_ENABLE) | PFSC, &udc->portsc);
        }
-       retval = driver->bind(&controller.gadget);
-       if (retval) {
-               DBG("driver->bind() returned %d\n", retval);
-               return retval;
+
+       ret = driver->bind(&controller.gadget);
+       if (ret) {
+               DBG("driver->bind() returned %d\n", ret);
+               return ret;
        }
        controller.driver = driver;
 
 
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
 
+#include "../../drivers/usb/host/ehci.h"
+
 #define NUM_ENDPOINTS          6
 
 /* Endpoint parameters */
 #define EP0_MAX_PACKET_SIZE    64
 
 struct mv_udc {
-       u32 pad0[80];
 #define MICRO_8FRAME   0x8
 #define USBCMD_ITC(x)  ((((x) > 0xff) ? 0xff : x) << 16)
 #define USBCMD_FS2     (1 << 15)
 struct mv_drv {
        struct usb_gadget               gadget;
        struct usb_gadget_driver        *driver;
-       struct mv_udc                   *udc;
+       struct ehci_ctrl                *ctrl;
        struct mv_ep                    ep[NUM_ENDPOINTS];
 };
 
 #define INFO_BUFFER_ERROR      (1 << 5)
 #define INFO_TX_ERROR          (1 << 3)
 
-extern int usb_lowlevel_init(int index, void **controller);
 #endif /* __MV_UDC_H__ */