.. | .. |
---|
730 | 730 | } |
---|
731 | 731 | |
---|
732 | 732 | ret = gadget->ops->pullup(gadget, 0); |
---|
733 | | - if (!ret) { |
---|
| 733 | + if (!ret) |
---|
734 | 734 | 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); |
---|
738 | 738 | |
---|
739 | 739 | out: |
---|
740 | 740 | trace_usb_gadget_disconnect(gadget, ret); |
---|
.. | .. |
---|
1047 | 1047 | |
---|
1048 | 1048 | /* ------------------------------------------------------------------------- */ |
---|
1049 | 1049 | |
---|
1050 | | -static void usb_udc_connect_control(struct usb_udc *udc) |
---|
| 1050 | +static int usb_udc_connect_control(struct usb_udc *udc) |
---|
1051 | 1051 | { |
---|
| 1052 | + int ret; |
---|
| 1053 | + |
---|
1052 | 1054 | if (udc->vbus) |
---|
1053 | | - usb_gadget_connect(udc->gadget); |
---|
| 1055 | + ret = usb_gadget_connect(udc->gadget); |
---|
1054 | 1056 | else |
---|
1055 | | - usb_gadget_disconnect(udc->gadget); |
---|
| 1057 | + ret = usb_gadget_disconnect(udc->gadget); |
---|
| 1058 | + |
---|
| 1059 | + return ret; |
---|
1056 | 1060 | } |
---|
1057 | 1061 | |
---|
1058 | 1062 | /** |
---|
.. | .. |
---|
1507 | 1511 | if (ret) |
---|
1508 | 1512 | goto err1; |
---|
1509 | 1513 | 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 | + |
---|
1514 | 1517 | 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; |
---|
1516 | 1521 | |
---|
1517 | 1522 | kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE); |
---|
1518 | 1523 | 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 | + |
---|
1519 | 1534 | err1: |
---|
1520 | 1535 | if (ret != -EISNAM) |
---|
1521 | 1536 | dev_err(&udc->dev, "failed to start %s: %d\n", |
---|