diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/usb/gadget/mv_udc.c | 41 | 
1 files changed, 23 insertions, 18 deletions
| diff --git a/drivers/usb/gadget/mv_udc.c b/drivers/usb/gadget/mv_udc.c index 8dd776b26..6d69d6d56 100644 --- a/drivers/usb/gadget/mv_udc.c +++ b/drivers/usb/gadget/mv_udc.c @@ -118,7 +118,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 = controller.udc; +	struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;  	unsigned n;  	head = epts + 2*num + in; @@ -154,7 +154,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 = controller.udc; +	struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;  	struct ept_queue_item *item;  	struct ept_queue_head *head;  	unsigned phys; @@ -220,7 +220,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 = controller.udc; +	struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;  	struct ept_queue_head *head;  	struct usb_ctrlrequest r;  	int status = 0; @@ -293,7 +293,7 @@ static void stop_activity(void)  {  	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); @@ -315,7 +315,7 @@ static void stop_activity(void)  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; @@ -373,7 +373,7 @@ void udc_irq(void)  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) @@ -384,7 +384,7 @@ int usb_gadget_handle_interrupts(void)  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); @@ -412,7 +412,7 @@ static int mv_pullup(struct usb_gadget *gadget, int is_on)  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); @@ -427,7 +427,6 @@ static int mvudc_probe(void)  	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++) { @@ -469,9 +468,8 @@ static int mvudc_probe(void)  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 @@ -481,15 +479,22 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)  		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; |