Once usb-acpi has set the port's connect type the usb_device's
->removable attribute can be set in the standard location
set_usb_port_removable().

This also changes behavior in the case where the firmware says that the
port connect type is unknown.  In that case just use the default setting
determined from the hub descriptor.

Suggested-by: Alan Stern <[email protected]>
Signed-off-by: Dan Williams <[email protected]>
---
 drivers/usb/core/hub.c      |   22 +++++++++++++++++-----
 drivers/usb/core/usb-acpi.c |   30 +++++-------------------------
 2 files changed, 22 insertions(+), 30 deletions(-)

diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 6014a790441f..e5742b888ac8 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -2277,6 +2277,22 @@ static void set_usb_port_removable(struct usb_device 
*udev)
                udev->removable = USB_DEVICE_REMOVABLE;
        else
                udev->removable = USB_DEVICE_FIXED;
+
+       /*
+        * Platform firmware may have populated an alternative value for
+        * removable.  If the parent port has a known connect_type use
+        * that instead.
+        */
+       switch (hub->ports[udev->portnum - 1]->connect_type) {
+       case USB_PORT_CONNECT_TYPE_HOT_PLUG:
+               udev->removable = USB_DEVICE_REMOVABLE;
+               break;
+       case USB_PORT_CONNECT_TYPE_HARD_WIRED:
+               udev->removable = USB_DEVICE_FIXED;
+               break;
+       default: /* use what was set above */
+               break;
+       }
 }
 
 /**
@@ -2346,11 +2362,7 @@ int usb_new_device(struct usb_device *udev)
 
        device_enable_async_suspend(&udev->dev);
 
-       /*
-        * check whether the hub marks this port as non-removable. Do it
-        * now so that platform-specific data can override it in
-        * device_add()
-        */
+       /* check whether the hub or firmware marks this port as non-removable */
        if (udev->parent)
                set_usb_port_removable(udev);
 
diff --git a/drivers/usb/core/usb-acpi.c b/drivers/usb/core/usb-acpi.c
index f91ef0220066..76987ba68445 100644
--- a/drivers/usb/core/usb-acpi.c
+++ b/drivers/usb/core/usb-acpi.c
@@ -138,6 +138,7 @@ static struct acpi_device *usb_acpi_find_companion(struct 
device *dev)
 {
        int port1;
        struct usb_device *udev;
+       struct acpi_device *adev;
        acpi_handle *parent_handle;
 
        /*
@@ -155,36 +156,15 @@ static struct acpi_device *usb_acpi_find_companion(struct 
device *dev)
         */
        if (is_usb_device(dev)) {
                udev = to_usb_device(dev);
-               port1 = udev->portnum;
-               if (udev->parent) {
-                       struct usb_hub *hub;
-
-                       hub = usb_hub_to_struct_hub(udev->parent);
-                       /*
-                        * According usb port's connect type to set usb device's
-                        * removability.
-                        */
-                       switch (hub->ports[port1 - 1]->connect_type) {
-                       case USB_PORT_CONNECT_TYPE_HOT_PLUG:
-                               udev->removable = USB_DEVICE_REMOVABLE;
-                               break;
-                       case USB_PORT_CONNECT_TYPE_HARD_WIRED:
-                               udev->removable = USB_DEVICE_FIXED;
-                               break;
-                       default:
-                               udev->removable = USB_DEVICE_REMOVABLE_UNKNOWN;
-                               break;
-                       }
-
+               if (udev->parent)
                        return NULL;
-               }
 
                /* root hub's parent is the usb hcd. */
-               return acpi_find_child_device(ACPI_COMPANION(dev->parent),
-                               port1, false);
+               port1 = udev->portnum;
+               adev = ACPI_COMPANION(dev->parent);
+               return acpi_find_child_device(adev, port1, false);
        } else if (is_usb_port(dev)) {
                struct usb_port *port_dev = to_usb_port(dev);
-               struct acpi_device *adev = NULL;
 
                /* Get the struct usb_device point of port's hub */
                udev = to_usb_device(dev->parent->parent);

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

Reply via email to