[U-Boot] [PATCH 13/17] usb: mv_udc: Implement better QH accessor

Marek Vasut marex at denx.de
Wed Jul 10 03:16:39 CEST 2013


The code for retrieving QH for particular endpoint is hard to understand,
moreover it's duplicated all over the driver. Move the code into single
nice and documented function.

Signed-off-by: Marek Vasut <marex at denx.de>
Cc: Fabio Estevam <fabio.estevam at freescale.com>
Cc: Lei Wen <leiwen at marvell.com>
Cc: Otavio Salvador <otavio at ossystems.com.br>
Cc: Stefano Babic <sbabic at denx.de>
---
 drivers/usb/gadget/mv_udc.c |   23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/drivers/usb/gadget/mv_udc.c b/drivers/usb/gadget/mv_udc.c
index 2076717..68ad9f1 100644
--- a/drivers/usb/gadget/mv_udc.c
+++ b/drivers/usb/gadget/mv_udc.c
@@ -126,6 +126,19 @@ static struct mv_drv controller = {
 	},
 };
 
+/**
+ * mv_get_qh() - return queue head for endpoint
+ * @ep_num:	Endpoint number
+ * @dir_in:	Direction of the endpoint (IN = 1, OUT = 0)
+ *
+ * This function returns the QH associated with particular endpoint
+ * and it's direction.
+ */
+static struct ept_queue_head *mv_get_qh(int ep_num, int dir_in)
+{
+	return &controller.epts[(ep_num * 2) + dir_in];
+}
+
 static struct usb_request *
 mv_ep_alloc_request(struct usb_ep *ep, unsigned int gfp_flags)
 {
@@ -143,7 +156,7 @@ static void ep_enable(int num, int in)
 	struct ept_queue_head *head;
 	struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;
 	unsigned n;
-	head = controller.epts + 2*num + in;
+	head = mv_get_qh(num, in);
 
 	n = readl(&udc->epctrl[num]);
 	if (in)
@@ -185,7 +198,7 @@ static int mv_ep_queue(struct usb_ep *ep,
 	num = mv_ep->desc->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
 	in = (mv_ep->desc->bEndpointAddress & USB_DIR_IN) != 0;
 	item = controller.items[2 * num + in];
-	head = controller.epts + 2 * num + in;
+	head = mv_get_qh(num, in);
 	phys = (unsigned)req->buf;
 	len = req->length;
 
@@ -249,7 +262,7 @@ static void handle_setup(void)
 	int status = 0;
 	int num, in, _num, _in, i;
 	char *buf;
-	head = controller.epts + 2 * 0 + 0;
+	head = mv_get_qh(0, 0);	/* EP0 OUT */
 
 	flush_cache((unsigned long)head, sizeof(struct ept_queue_head));
 	memcpy(&r, head->setup_data, sizeof(struct usb_ctrlrequest));
@@ -330,7 +343,7 @@ static void stop_activity(void)
 				& USB_ENDPOINT_NUMBER_MASK;
 			in = (controller.ep[i].desc->bEndpointAddress
 				& USB_DIR_IN) != 0;
-			head = controller.epts + (num * 2) + (in);
+			head = mv_get_qh(num, in);
 			head->info = INFO_ACTIVE;
 		}
 	}
@@ -413,7 +426,7 @@ static int mv_pullup(struct usb_gadget *gadget, int is_on)
 		writel(USBCMD_ITC(MICRO_8FRAME) | USBCMD_RST, &udc->usbcmd);
 		udelay(200);
 
-		writel((unsigned) controller.epts, &udc->epinitaddr);
+		writel((unsigned)controller.epts, &udc->epinitaddr);
 
 		/* select DEVICE mode */
 		writel(USBMODE_DEVICE, &udc->usbmode);
-- 
1.7.10.4



More information about the U-Boot mailing list