usb: core: add phy notify connect and disconnect
[sfrench/cifs-2.6.git] / drivers / usb / core / hub.c
index ffd7c99e24a3624fba07e8277866a5526c6695eb..6f99557fa4baec940f64239b81473b0df8eddf46 100644 (file)
@@ -37,6 +37,7 @@
 #include <asm/byteorder.h>
 
 #include "hub.h"
+#include "phy.h"
 #include "otg_productlist.h"
 
 #define USB_VENDOR_GENESYS_LOGIC               0x05e3
@@ -634,6 +635,34 @@ static int hub_ext_port_status(struct usb_hub *hub, int port1, int type,
                ret = 0;
        }
        mutex_unlock(&hub->status_mutex);
+
+       /*
+        * There is no need to lock status_mutex here, because status_mutex
+        * protects hub->status, and the phy driver only checks the port
+        * status without changing the status.
+        */
+       if (!ret) {
+               struct usb_device *hdev = hub->hdev;
+
+               /*
+                * Only roothub will be notified of connection changes,
+                * since the USB PHY only cares about changes at the next
+                * level.
+                */
+               if (is_root_hub(hdev)) {
+                       struct usb_hcd *hcd = bus_to_hcd(hdev->bus);
+                       bool connect;
+                       bool connect_change;
+
+                       connect_change = *change & USB_PORT_STAT_C_CONNECTION;
+                       connect = *status & USB_PORT_STAT_CONNECTION;
+                       if (connect_change && connect)
+                               usb_phy_roothub_notify_connect(hcd->phy_roothub, port1 - 1);
+                       else if (connect_change)
+                               usb_phy_roothub_notify_disconnect(hcd->phy_roothub, port1 - 1);
+               }
+       }
+
        return ret;
 }