usb: gadget: udc-core: fix asymmetric calls in remove_driver
[pandora-kernel.git] / drivers / usb / gadget / udc-core.c
index 05ba472..d73ccfe 100644 (file)
@@ -210,10 +210,10 @@ static void usb_gadget_remove_driver(struct usb_udc *udc)
        kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE);
 
        if (udc_is_newstyle(udc)) {
-               usb_gadget_disconnect(udc->gadget);
+               udc->driver->disconnect(udc->gadget);
                udc->driver->unbind(udc->gadget);
+               usb_gadget_disconnect(udc->gadget);
                usb_gadget_udc_stop(udc->gadget, udc->driver);
-
        } else {
                usb_gadget_stop(udc->gadget, udc->driver);
        }
@@ -344,7 +344,7 @@ EXPORT_SYMBOL_GPL(usb_gadget_unregister_driver);
 static ssize_t usb_udc_srp_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t n)
 {
-       struct usb_udc          *udc = dev_get_drvdata(dev);
+       struct usb_udc          *udc = container_of(dev, struct usb_udc, dev);
 
        if (sysfs_streq(buf, "1"))
                usb_gadget_wakeup(udc->gadget);
@@ -356,11 +356,15 @@ static DEVICE_ATTR(srp, S_IWUSR, NULL, usb_udc_srp_store);
 static ssize_t usb_udc_softconn_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t n)
 {
-       struct usb_udc          *udc = dev_get_drvdata(dev);
+       struct usb_udc          *udc = container_of(dev, struct usb_udc, dev);
 
        if (sysfs_streq(buf, "connect")) {
+               if (udc_is_newstyle(udc))
+                       usb_gadget_udc_start(udc->gadget, udc->driver);
                usb_gadget_connect(udc->gadget);
        } else if (sysfs_streq(buf, "disconnect")) {
+               if (udc_is_newstyle(udc))
+                       usb_gadget_udc_stop(udc->gadget, udc->driver);
                usb_gadget_disconnect(udc->gadget);
        } else {
                dev_err(dev, "unsupported command '%s'\n", buf);
@@ -375,25 +379,10 @@ static ssize_t usb_udc_speed_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
        struct usb_udc          *udc = container_of(dev, struct usb_udc, dev);
-       struct usb_gadget       *gadget = udc->gadget;
-
-       switch (gadget->speed) {
-       case USB_SPEED_LOW:
-               return snprintf(buf, PAGE_SIZE, "low-speed\n");
-       case USB_SPEED_FULL:
-               return snprintf(buf, PAGE_SIZE, "full-speed\n");
-       case USB_SPEED_HIGH:
-               return snprintf(buf, PAGE_SIZE, "high-speed\n");
-       case USB_SPEED_WIRELESS:
-               return snprintf(buf, PAGE_SIZE, "wireless\n");
-       case USB_SPEED_SUPER:
-               return snprintf(buf, PAGE_SIZE, "super-speed\n");
-       case USB_SPEED_UNKNOWN: /* FALLTHROUGH */
-       default:
-               return snprintf(buf, PAGE_SIZE, "UNKNOWN\n");
-       }
+       return snprintf(buf, PAGE_SIZE, "%s\n",
+                       usb_speed_string(udc->gadget->speed));
 }
-static DEVICE_ATTR(speed, S_IRUSR, usb_udc_speed_show, NULL);
+static DEVICE_ATTR(speed, S_IRUGO, usb_udc_speed_show, NULL);
 
 #define USB_UDC_ATTR(name)                                     \
 ssize_t usb_udc_##name##_show(struct device *dev,              \
@@ -404,7 +393,7 @@ ssize_t usb_udc_##name##_show(struct device *dev,           \
                                                                \
        return snprintf(buf, PAGE_SIZE, "%d\n", gadget->name);  \
 }                                                              \
-static DEVICE_ATTR(name, S_IRUSR, usb_udc_##name##_show, NULL)
+static DEVICE_ATTR(name, S_IRUGO, usb_udc_##name##_show, NULL)
 
 static USB_UDC_ATTR(is_dualspeed);
 static USB_UDC_ATTR(is_otg);