aboutsummaryrefslogtreecommitdiff
path: root/include/linux/usb/otg.h
diff options
context:
space:
mode:
authorMeizu OpenSource <patchwork@meizu.com>2016-08-15 10:19:42 +0800
committerMeizu OpenSource <patchwork@meizu.com>2016-08-15 10:19:42 +0800
commitd2e1446d81725c351dc73a03b397ce043fb18452 (patch)
tree4dbc616b7f92aea39cd697a9084205ddb805e344 /include/linux/usb/otg.h
first commit
Diffstat (limited to 'include/linux/usb/otg.h')
-rw-r--r--include/linux/usb/otg.h136
1 files changed, 136 insertions, 0 deletions
diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h
new file mode 100644
index 000000000..27ad4b2ee
--- /dev/null
+++ b/include/linux/usb/otg.h
@@ -0,0 +1,136 @@
+/* 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/usb/phy.h>
+
+#if defined(CONFIG_USBIF_COMPLIANCE)
+enum usb_otg_event {
+ /* Device is not connected within
+ * TA_WAIT_BCON or not responding.
+ */
+ OTG_EVENT_DEV_CONN_TMOUT,
+ /* B-device returned STALL for
+ * B_HNP_ENABLE feature request.
+ */
+ OTG_EVENT_NO_RESP_FOR_HNP_ENABLE,
+ /* HUB class devices are not
+ * supported.
+ */
+ OTG_EVENT_HUB_NOT_SUPPORTED,
+ /* Device is not supported i.e
+ * not listed in TPL.
+ */
+ OTG_EVENT_DEV_NOT_SUPPORTED,
+ /* HNP failed due to
+ * TA_AIDL_BDIS timeout or
+ * TB_ASE0_BRST timeout
+ */
+ OTG_EVENT_HNP_FAILED,
+ /* B-device did not detect VBUS
+ * within TB_SRP_FAIL time.
+ */
+ OTG_EVENT_NO_RESP_FOR_SRP,
+
+ OTG_EVENT_DEV_OVER_CURRENT,
+ OTG_EVENT_MAX_HUB_TIER_EXCEED,
+};
+#endif
+
+struct usb_otg {
+ u8 default_a;
+
+ struct usb_phy *phy;
+ struct usb_bus *host;
+ struct usb_gadget *gadget;
+
+ /* 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);
+
+#if defined(CONFIG_USBIF_COMPLIANCE)
+ /* send events to user space */
+ int (*send_event)(struct usb_phy_transceiver *otg,
+ enum usb_otg_event event);
+#endif
+};
+
+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) */
+#if defined(CONFIG_USBIF_COMPLIANCE)
+extern int otg_send_event(enum usb_otg_event event);
+#endif
+extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num);
+
+#endif /* __LINUX_USB_OTG_H */