summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorMarek Vasut <marex@denx.de>2013-07-10 03:16:39 +0200
committerMarek Vasut <marex@denx.de>2013-07-29 23:01:32 +0200
commitb5cd45bfad3a25db25b40cfda9e7db80e5ee65f7 (patch)
tree48d1db192ec581c709eca2c9b1bece5afab41dfd /drivers
parent5804b8859a3317d3deb1e6adafc2a2604d276f1c (diff)
usb: mv_udc: Implement better QH accessor
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@denx.de> Cc: Fabio Estevam <fabio.estevam@freescale.com> Cc: Lei Wen <leiwen@marvell.com> Cc: Otavio Salvador <otavio@ossystems.com.br> Cc: Stefano Babic <sbabic@denx.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/gadget/mv_udc.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/usb/gadget/mv_udc.c b/drivers/usb/gadget/mv_udc.c
index 1ead2f2459..04787be7e0 100644
--- a/drivers/usb/gadget/mv_udc.c
+++ b/drivers/usb/gadget/mv_udc.c
@@ -110,6 +110,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)
{
@@ -127,7 +140,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)
@@ -169,7 +182,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;
@@ -233,7 +246,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));
@@ -314,7 +327,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;
}
}
@@ -397,7 +410,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);