hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/usb/gadget/udc/core.c
....@@ -730,11 +730,11 @@
730730 }
731731
732732 ret = gadget->ops->pullup(gadget, 0);
733
- if (!ret) {
733
+ if (!ret)
734734 gadget->connected = 0;
735
- if (gadget->udc->driver)
736
- gadget->udc->driver->disconnect(gadget);
737
- }
735
+
736
+ if (gadget->udc->driver)
737
+ gadget->udc->driver->disconnect(gadget);
738738
739739 out:
740740 trace_usb_gadget_disconnect(gadget, ret);
....@@ -1047,12 +1047,16 @@
10471047
10481048 /* ------------------------------------------------------------------------- */
10491049
1050
-static void usb_udc_connect_control(struct usb_udc *udc)
1050
+static int usb_udc_connect_control(struct usb_udc *udc)
10511051 {
1052
+ int ret;
1053
+
10521054 if (udc->vbus)
1053
- usb_gadget_connect(udc->gadget);
1055
+ ret = usb_gadget_connect(udc->gadget);
10541056 else
1055
- usb_gadget_disconnect(udc->gadget);
1057
+ ret = usb_gadget_disconnect(udc->gadget);
1058
+
1059
+ return ret;
10561060 }
10571061
10581062 /**
....@@ -1507,15 +1511,26 @@
15071511 if (ret)
15081512 goto err1;
15091513 ret = usb_gadget_udc_start(udc);
1510
- if (ret) {
1511
- driver->unbind(udc->gadget);
1512
- goto err1;
1513
- }
1514
+ if (ret)
1515
+ goto err_start;
1516
+
15141517 usb_gadget_enable_async_callbacks(udc);
1515
- usb_udc_connect_control(udc);
1518
+ ret = usb_udc_connect_control(udc);
1519
+ if (ret)
1520
+ goto err_connect_control;
15161521
15171522 kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE);
15181523 return 0;
1524
+
1525
+err_connect_control:
1526
+ usb_gadget_disable_async_callbacks(udc);
1527
+ if (udc->gadget->irq)
1528
+ synchronize_irq(udc->gadget->irq);
1529
+ usb_gadget_udc_stop(udc);
1530
+
1531
+err_start:
1532
+ driver->unbind(udc->gadget);
1533
+
15191534 err1:
15201535 if (ret != -EISNAM)
15211536 dev_err(&udc->dev, "failed to start %s: %d\n",