Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / include / linux / usb / otg.h
diff --git a/kernel/include/linux/usb/otg.h b/kernel/include/linux/usb/otg.h
new file mode 100644 (file)
index 0000000..52661c5
--- /dev/null
@@ -0,0 +1,107 @@
+/* USB OTG (On The Go) defines */
+/*
+ *
+ * These APIs may be used between USB controllers.  USB device drivers
+ * (for either host or peripheral roles) don't use these calls; they
+ * continue to use just usb_device and usb_gadget.
+ */
+
+#ifndef __LINUX_USB_OTG_H
+#define __LINUX_USB_OTG_H
+
+#include <linux/phy/phy.h>
+#include <linux/usb/phy.h>
+
+struct usb_otg {
+       u8                      default_a;
+
+       struct phy              *phy;
+       /* old usb_phy interface */
+       struct usb_phy          *usb_phy;
+       struct usb_bus          *host;
+       struct usb_gadget       *gadget;
+
+       enum usb_otg_state      state;
+
+       /* bind/unbind the host controller */
+       int     (*set_host)(struct usb_otg *otg, struct usb_bus *host);
+
+       /* bind/unbind the peripheral controller */
+       int     (*set_peripheral)(struct usb_otg *otg,
+                                       struct usb_gadget *gadget);
+
+       /* effective for A-peripheral, ignored for B devices */
+       int     (*set_vbus)(struct usb_otg *otg, bool enabled);
+
+       /* for B devices only:  start session with A-Host */
+       int     (*start_srp)(struct usb_otg *otg);
+
+       /* start or continue HNP role switch */
+       int     (*start_hnp)(struct usb_otg *otg);
+
+};
+
+extern const char *usb_otg_state_string(enum usb_otg_state state);
+
+/* Context: can sleep */
+static inline int
+otg_start_hnp(struct usb_otg *otg)
+{
+       if (otg && otg->start_hnp)
+               return otg->start_hnp(otg);
+
+       return -ENOTSUPP;
+}
+
+/* Context: can sleep */
+static inline int
+otg_set_vbus(struct usb_otg *otg, bool enabled)
+{
+       if (otg && otg->set_vbus)
+               return otg->set_vbus(otg, enabled);
+
+       return -ENOTSUPP;
+}
+
+/* for HCDs */
+static inline int
+otg_set_host(struct usb_otg *otg, struct usb_bus *host)
+{
+       if (otg && otg->set_host)
+               return otg->set_host(otg, host);
+
+       return -ENOTSUPP;
+}
+
+/* for usb peripheral controller drivers */
+
+/* Context: can sleep */
+static inline int
+otg_set_peripheral(struct usb_otg *otg, struct usb_gadget *periph)
+{
+       if (otg && otg->set_peripheral)
+               return otg->set_peripheral(otg, periph);
+
+       return -ENOTSUPP;
+}
+
+static inline int
+otg_start_srp(struct usb_otg *otg)
+{
+       if (otg && otg->start_srp)
+               return otg->start_srp(otg);
+
+       return -ENOTSUPP;
+}
+
+/* for OTG controller drivers (and maybe other stuff) */
+extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num);
+
+enum usb_dr_mode {
+       USB_DR_MODE_UNKNOWN,
+       USB_DR_MODE_HOST,
+       USB_DR_MODE_PERIPHERAL,
+       USB_DR_MODE_OTG,
+};
+
+#endif /* __LINUX_USB_OTG_H */