Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6
[firefly-linux-kernel-4.4.55.git] / include / linux / usb / otg.h
index fef0972c814672ec04f8b3d60b269a2d9ad8f46b..f8302d036a7674e33109bf8fce16d67325d2d17a 100644 (file)
@@ -9,6 +9,8 @@
 #ifndef __LINUX_USB_OTG_H
 #define __LINUX_USB_OTG_H
 
+#include <linux/notifier.h>
+
 /* OTG defines lots of enumeration states before device reset */
 enum usb_otg_state {
        OTG_STATE_UNDEFINED = 0,
@@ -33,6 +35,14 @@ enum usb_otg_state {
        OTG_STATE_A_VBUS_ERR,
 };
 
+enum usb_xceiv_events {
+       USB_EVENT_NONE,         /* no events or cable disconnected */
+       USB_EVENT_VBUS,         /* vbus valid event */
+       USB_EVENT_ID,           /* id was grounded */
+       USB_EVENT_CHARGER,      /* usb dedicated charger */
+       USB_EVENT_ENUMERATED,   /* gadget driver enumerated */
+};
+
 #define USB_OTG_PULLUP_ID              (1 << 0)
 #define USB_OTG_PULLDOWN_DP            (1 << 1)
 #define USB_OTG_PULLDOWN_DM            (1 << 2)
@@ -70,6 +80,9 @@ struct otg_transceiver {
        struct otg_io_access_ops        *io_ops;
        void __iomem                    *io_priv;
 
+       /* for notification of usb_xceiv_events */
+       struct blocking_notifier_head   notifier;
+
        /* to pass extra port status to the root hub */
        u16                     port_status;
        u16                     port_change;
@@ -213,6 +226,18 @@ otg_start_srp(struct otg_transceiver *otg)
        return otg->start_srp(otg);
 }
 
+/* notifiers */
+static inline int
+otg_register_notifier(struct otg_transceiver *otg, struct notifier_block *nb)
+{
+       return blocking_notifier_chain_register(&otg->notifier, nb);
+}
+
+static inline void
+otg_unregister_notifier(struct otg_transceiver *otg, struct notifier_block *nb)
+{
+       blocking_notifier_chain_unregister(&otg->notifier, nb);
+}
 
 /* for OTG controller drivers (and maybe other stuff) */
 extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num);