diff options
author | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2011-06-23 14:26:12 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-07-01 14:31:12 -0700 |
commit | 0fb5759952e934dd5ff25fd79f45cb5d69c8d2d1 (patch) | |
tree | f6aeb60ebfda7a28083580038384d8710a84ae46 | |
parent | 765f5b830e547229bb752e7b232ee83e2b3d49d5 (diff) | |
download | op-kernel-dev-0fb5759952e934dd5ff25fd79f45cb5d69c8d2d1.zip op-kernel-dev-0fb5759952e934dd5ff25fd79f45cb5d69c8d2d1.tar.gz |
usb: gadget: dummy_hcd: move ep initialisation HW setup
This is only required to be done once. There is no counter part to this
in ->stop() so there is no need to re-do it next time. While here also
init the max_stream size to 0 on SS speed.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/usb/gadget/dummy_hcd.c | 56 |
1 files changed, 33 insertions, 23 deletions
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c index 1916360..3144092 100644 --- a/drivers/usb/gadget/dummy_hcd.c +++ b/drivers/usb/gadget/dummy_hcd.c @@ -887,25 +887,6 @@ static int dummy_udc_start(struct usb_gadget_driver *driver, dum->devstatus = 0; - INIT_LIST_HEAD (&dum->gadget.ep_list); - for (i = 0; i < DUMMY_ENDPOINTS; i++) { - struct dummy_ep *ep = &dum->ep [i]; - - if (!ep_name [i]) - break; - ep->ep.name = ep_name [i]; - ep->ep.ops = &dummy_ep_ops; - list_add_tail (&ep->ep.ep_list, &dum->gadget.ep_list); - ep->halted = ep->wedged = ep->already_seen = - ep->setup_stage = 0; - ep->ep.maxpacket = ~0; - ep->last_io = jiffies; - ep->gadget = &dum->gadget; - ep->desc = NULL; - INIT_LIST_HEAD (&ep->queue); - } - - dum->gadget.ep0 = &dum->ep [0].ep; if (mod_data.is_super_speed) dum->gadget.speed = driver->speed; else if (mod_data.is_high_speed) @@ -922,8 +903,11 @@ static int dummy_udc_start(struct usb_gadget_driver *driver, for (i = 0; i < DUMMY_ENDPOINTS; i++) dum->ep[i].ep.max_streams = 0x10; dum->ep[0].ep.maxpacket = 9; - } else + } else { + for (i = 0; i < DUMMY_ENDPOINTS; i++) + dum->ep[i].ep.max_streams = 0; dum->ep[0].ep.maxpacket = 64; + } if (dum->gadget.speed == USB_SPEED_SUPER) dum->gadget.is_otg = @@ -932,9 +916,6 @@ static int dummy_udc_start(struct usb_gadget_driver *driver, dum->gadget.is_otg = (dummy_hcd_to_hcd(dum->hs_hcd)->self.otg_port != 0); - list_del_init (&dum->ep [0].ep.ep_list); - INIT_LIST_HEAD(&dum->fifo_req.queue); - driver->driver.bus = NULL; dum->driver = driver; dum->gadget.dev.driver = &driver->driver; @@ -984,6 +965,33 @@ dummy_gadget_release (struct device *dev) return; } +static void init_dummy_udc_hw(struct dummy *dum) +{ + int i; + + INIT_LIST_HEAD(&dum->gadget.ep_list); + for (i = 0; i < DUMMY_ENDPOINTS; i++) { + struct dummy_ep *ep = &dum->ep[i]; + + if (!ep_name[i]) + break; + ep->ep.name = ep_name[i]; + ep->ep.ops = &dummy_ep_ops; + list_add_tail(&ep->ep.ep_list, &dum->gadget.ep_list); + ep->halted = ep->wedged = ep->already_seen = + ep->setup_stage = 0; + ep->ep.maxpacket = ~0; + ep->last_io = jiffies; + ep->gadget = &dum->gadget; + ep->desc = NULL; + INIT_LIST_HEAD(&ep->queue); + } + + dum->gadget.ep0 = &dum->ep[0].ep; + list_del_init(&dum->ep[0].ep.ep_list); + INIT_LIST_HEAD(&dum->fifo_req.queue); +} + static int dummy_udc_probe (struct platform_device *pdev) { struct dummy *dum = &the_controller; @@ -1002,6 +1010,8 @@ static int dummy_udc_probe (struct platform_device *pdev) return rc; } + init_dummy_udc_hw(dum); + rc = usb_add_gadget_udc(&pdev->dev, &dum->gadget); if (rc < 0) goto err_udc; |