
The hcor for i.MX6 is 02184340 and the udc should be 02184140
Signed-off-by: Troy Kisky troy.kisky@boundarydevices.com
--- I don't know if this is a correct fix, please check carefully. --- drivers/usb/gadget/mv_udc.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-)
diff --git a/drivers/usb/gadget/mv_udc.c b/drivers/usb/gadget/mv_udc.c index 7574e31..359b8e1 100644 --- a/drivers/usb/gadget/mv_udc.c +++ b/drivers/usb/gadget/mv_udc.c @@ -110,6 +110,16 @@ static struct mv_drv controller = { }, };
+struct mv_udc *get_mv_udc(void) +{ +#ifdef CONFIG_MXC_USB_PORT + return (struct mv_udc *)((unsigned)controller.ctrl->hcor + - (0x200 * CONFIG_MXC_USB_PORT)); +#else + return (struct mv_udc *)controller.ctrl->hcor; +#endif +} + /** * mv_get_qh() - return queue head for endpoint * @ep_num: Endpoint number @@ -213,7 +223,7 @@ static void mv_ep_free_request(struct usb_ep *ep, struct usb_request *_req) static void ep_enable(int num, int in) { struct ept_queue_head *head; - struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor; + struct mv_udc *udc = get_mv_udc(); unsigned n; head = mv_get_qh(num, in);
@@ -316,7 +326,7 @@ static int mv_ep_queue(struct usb_ep *ep, struct usb_request *req, gfp_t gfp_flags) { struct mv_ep *mv_ep = container_of(ep, struct mv_ep, ep); - struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor; + struct mv_udc *udc = get_mv_udc(); struct ept_queue_item *item; struct ept_queue_head *head; int bit, num, len, in, ret; @@ -389,7 +399,7 @@ static void handle_ep_complete(struct mv_ep *ep) static void handle_setup(void) { struct usb_request *req = &controller.ep[0].req; - struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor; + struct mv_udc *udc = get_mv_udc(); struct ept_queue_head *head; struct usb_ctrlrequest r; int status = 0; @@ -462,7 +472,7 @@ static void stop_activity(void) { int i, num, in; struct ept_queue_head *head; - struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor; + struct mv_udc *udc = get_mv_udc(); writel(readl(&udc->epcomp), &udc->epcomp); writel(readl(&udc->epstat), &udc->epstat); writel(0xffffffff, &udc->epflush); @@ -485,7 +495,7 @@ static void stop_activity(void)
void udc_irq(void) { - struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor; + struct mv_udc *udc = get_mv_udc(); unsigned n = readl(&udc->usbsts); writel(n, &udc->usbsts); int bit, i, num, in; @@ -543,7 +553,7 @@ void udc_irq(void) int usb_gadget_handle_interrupts(void) { u32 value; - struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor; + struct mv_udc *udc = get_mv_udc();
value = readl(&udc->usbsts); if (value) @@ -554,7 +564,7 @@ int usb_gadget_handle_interrupts(void)
static int mv_pullup(struct usb_gadget *gadget, int is_on) { - struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor; + struct mv_udc *udc = get_mv_udc(); if (is_on) { /* RESET */ writel(USBCMD_ITC(MICRO_8FRAME) | USBCMD_RST, &udc->usbcmd); @@ -582,7 +592,7 @@ static int mv_pullup(struct usb_gadget *gadget, int is_on)
void udc_disconnect(void) { - struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor; + struct mv_udc *udc = get_mv_udc(); /* disable pullup */ stop_activity(); writel(USBCMD_FS2, &udc->usbcmd); @@ -694,7 +704,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
ret = mvudc_probe(); if (!ret) { - udc = (struct mv_udc *)controller.ctrl->hcor; + udc = get_mv_udc();
/* select ULPI phy */ writel(PTS(PTS_ENABLE) | PFSC, &udc->portsc);