summaryrefslogtreecommitdiff
path: root/drivers/usb/gadget/dummy_hcd.c
diff options
context:
space:
mode:
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>2011-06-23 16:26:14 +0400
committerGreg Kroah-Hartman <gregkh@suse.de>2011-07-02 01:31:13 +0400
commitb5738413c96126e8191bc506b403cd55950b8f9a (patch)
tree8669df2ce05354618ab426be02aae7a2c69f2d8c /drivers/usb/gadget/dummy_hcd.c
parentf8744d40ca12d54f35c56831040683d52e765bf8 (diff)
downloadlinux-b5738413c96126e8191bc506b403cd55950b8f9a.tar.xz
usb: gadget: dummy_hcd: move selection of speed into ->pullup()
The configuration is static however we only know the speed after we have connected with the other side. 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>
Diffstat (limited to 'drivers/usb/gadget/dummy_hcd.c')
-rw-r--r--drivers/usb/gadget/dummy_hcd.c60
1 files changed, 35 insertions, 25 deletions
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c
index 0ab2f565c12d..f5c0d8f28598 100644
--- a/drivers/usb/gadget/dummy_hcd.c
+++ b/drivers/usb/gadget/dummy_hcd.c
@@ -807,19 +807,52 @@ static int dummy_set_selfpowered (struct usb_gadget *_gadget, int value)
return 0;
}
+static void dummy_udc_udpate_ep0(struct dummy *dum)
+{
+ u32 i;
+
+ if (dum->gadget.speed == USB_SPEED_SUPER) {
+ for (i = 0; i < DUMMY_ENDPOINTS; i++)
+ dum->ep[i].ep.max_streams = 0x10;
+ dum->ep[0].ep.maxpacket = 9;
+ } else {
+ for (i = 0; i < DUMMY_ENDPOINTS; i++)
+ dum->ep[i].ep.max_streams = 0;
+ dum->ep[0].ep.maxpacket = 64;
+ }
+}
+
static int dummy_pullup (struct usb_gadget *_gadget, int value)
{
struct dummy_hcd *dum_hcd;
struct dummy *dum;
unsigned long flags;
+ dum = gadget_dev_to_dummy(&_gadget->dev);
+
+ if (value && dum->driver) {
+ if (mod_data.is_super_speed)
+ dum->gadget.speed = dum->driver->speed;
+ else if (mod_data.is_high_speed)
+ dum->gadget.speed = min_t(u8, USB_SPEED_HIGH,
+ dum->driver->speed);
+ else
+ dum->gadget.speed = USB_SPEED_FULL;
+ dummy_udc_udpate_ep0(dum);
+
+ if (dum->gadget.speed < dum->driver->speed)
+ dev_dbg(udc_dev(dum), "This device can perform faster"
+ " if you connect it to a %s port...\n",
+ (dum->driver->speed == USB_SPEED_SUPER ?
+ "SuperSpeed" : "HighSpeed"));
+ }
dum_hcd = gadget_to_dummy_hcd(_gadget);
- dum = dum_hcd->dum;
spin_lock_irqsave (&dum->lock, flags);
dum->pullup = (value != 0);
set_link_state(dum_hcd);
spin_unlock_irqrestore (&dum->lock, flags);
+
usb_hcd_poll_rh_status(dummy_hcd_to_hcd(dum_hcd));
return 0;
}
@@ -871,7 +904,7 @@ static int dummy_udc_start(struct usb_gadget_driver *driver,
int (*bind)(struct usb_gadget *))
{
struct dummy *dum = &the_controller;
- int retval, i;
+ int retval;
if (!dum)
return -EINVAL;
@@ -887,29 +920,6 @@ static int dummy_udc_start(struct usb_gadget_driver *driver,
dum->devstatus = 0;
- if (mod_data.is_super_speed)
- dum->gadget.speed = driver->speed;
- else if (mod_data.is_high_speed)
- dum->gadget.speed = min_t(u8, USB_SPEED_HIGH, driver->speed);
- else
- dum->gadget.speed = USB_SPEED_FULL;
- if (dum->gadget.speed < driver->speed)
- dev_dbg(udc_dev(dum), "This device can perform faster"
- " if you connect it to a %s port...\n",
- (driver->speed == USB_SPEED_SUPER ?
- "SuperSpeed" : "HighSpeed"));
-
- if (dum->gadget.speed == USB_SPEED_SUPER) {
- for (i = 0; i < DUMMY_ENDPOINTS; i++)
- dum->ep[i].ep.max_streams = 0x10;
- dum->ep[0].ep.maxpacket = 9;
- } else {
- for (i = 0; i < DUMMY_ENDPOINTS; i++)
- dum->ep[i].ep.max_streams = 0;
- dum->ep[0].ep.maxpacket = 64;
- }
-
- driver->driver.bus = NULL;
dum->driver = driver;
dum->gadget.dev.driver = &driver->driver;
dev_dbg (udc_dev(dum), "binding gadget driver '%s'\n",