[PATCH 4/8] usb/dummy_hcd: move selection of speed into probe

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The configuration is static, no need to defer it until ->start callback.
We start as SS and move then to the lowest supported speed by the gadget
driver.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx>
---
 drivers/usb/gadget/dummy_hcd.c |   51 +++++++++++++++++++++++++--------------
 1 files changed, 33 insertions(+), 18 deletions(-)

diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c
index c61d3f3..41d7d36 100644
--- a/drivers/usb/gadget/dummy_hcd.c
+++ b/drivers/usb/gadget/dummy_hcd.c
@@ -807,19 +807,46 @@ 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);
+	}
 	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 +898,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,28 +914,12 @@ 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;
@@ -1009,6 +1020,10 @@ static int dummy_udc_probe (struct platform_device *pdev)
 
 	init_dummy_udc_hw(dum);
 
+	dum->gadget.speed = USB_SPEED_SUPER;
+
+	dummy_udc_udpate_ep0(dum);
+
 	rc = usb_add_gadget_udc(&pdev->dev, &dum->gadget);
 	if (rc < 0)
 		goto err_udc;
-- 
1.7.4.4

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux