blob: 52661c5da69012a3da3aa75d76a69ee45e6e92f0 [file] [log] [blame]
Greg Kroah-Hartman41dceed2008-01-30 15:21:33 -08001/* USB OTG (On The Go) defines */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
Robert P. J. Daydda43a02008-03-07 13:45:32 -05003 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07004 * These APIs may be used between USB controllers. USB device drivers
5 * (for either host or peripheral roles) don't use these calls; they
6 * continue to use just usb_device and usb_gadget.
7 */
8
Robert P. J. Daydda43a02008-03-07 13:45:32 -05009#ifndef __LINUX_USB_OTG_H
10#define __LINUX_USB_OTG_H
Linus Torvalds1da177e2005-04-16 15:20:36 -070011
Antoine Tenart48bcc182014-10-30 18:41:15 +010012#include <linux/phy/phy.h>
Venu Byravarasude4217d2012-09-04 14:25:58 +053013#include <linux/usb/phy.h>
Felipe Balbie9a20172009-12-17 13:01:36 +020014
Heikki Krogerus7a8a3a92012-02-13 13:24:04 +020015struct usb_otg {
16 u8 default_a;
17
Antoine Tenart48bcc182014-10-30 18:41:15 +010018 struct phy *phy;
19 /* old usb_phy interface */
Antoine Tenart19c1eac2014-10-30 18:41:14 +010020 struct usb_phy *usb_phy;
Heikki Krogerus7a8a3a92012-02-13 13:24:04 +020021 struct usb_bus *host;
22 struct usb_gadget *gadget;
23
Antoine Tenarte47d9252014-10-30 18:41:13 +010024 enum usb_otg_state state;
25
Heikki Krogerus7a8a3a92012-02-13 13:24:04 +020026 /* bind/unbind the host controller */
27 int (*set_host)(struct usb_otg *otg, struct usb_bus *host);
28
29 /* bind/unbind the peripheral controller */
30 int (*set_peripheral)(struct usb_otg *otg,
31 struct usb_gadget *gadget);
32
33 /* effective for A-peripheral, ignored for B devices */
34 int (*set_vbus)(struct usb_otg *otg, bool enabled);
35
36 /* for B devices only: start session with A-Host */
37 int (*start_srp)(struct usb_otg *otg);
38
39 /* start or continue HNP role switch */
40 int (*start_hnp)(struct usb_otg *otg);
41
42};
43
Felipe Balbi42c0bf12013-03-07 10:39:57 +020044extern const char *usb_otg_state_string(enum usb_otg_state state);
Linus Torvalds1da177e2005-04-16 15:20:36 -070045
Robert Jarzmikc2344f12009-01-24 23:54:31 -080046/* Context: can sleep */
Linus Torvalds1da177e2005-04-16 15:20:36 -070047static inline int
Heikki Krogerus6e13c652012-02-13 13:24:20 +020048otg_start_hnp(struct usb_otg *otg)
Linus Torvalds1da177e2005-04-16 15:20:36 -070049{
Heikki Krogerus6e13c652012-02-13 13:24:20 +020050 if (otg && otg->start_hnp)
51 return otg->start_hnp(otg);
Heikki Krogerus7a8a3a92012-02-13 13:24:04 +020052
Heikki Krogerus136ced82012-02-13 13:24:19 +020053 return -ENOTSUPP;
Linus Torvalds1da177e2005-04-16 15:20:36 -070054}
55
Daniel Mack91c8a5a2009-10-15 17:09:34 +030056/* Context: can sleep */
57static inline int
Heikki Krogerus6e13c652012-02-13 13:24:20 +020058otg_set_vbus(struct usb_otg *otg, bool enabled)
Daniel Mack91c8a5a2009-10-15 17:09:34 +030059{
Heikki Krogerus6e13c652012-02-13 13:24:20 +020060 if (otg && otg->set_vbus)
61 return otg->set_vbus(otg, enabled);
Heikki Krogerus7a8a3a92012-02-13 13:24:04 +020062
Heikki Krogerus136ced82012-02-13 13:24:19 +020063 return -ENOTSUPP;
Daniel Mack91c8a5a2009-10-15 17:09:34 +030064}
Linus Torvalds1da177e2005-04-16 15:20:36 -070065
66/* for HCDs */
67static inline int
Heikki Krogerus6e13c652012-02-13 13:24:20 +020068otg_set_host(struct usb_otg *otg, struct usb_bus *host)
Linus Torvalds1da177e2005-04-16 15:20:36 -070069{
Heikki Krogerus6e13c652012-02-13 13:24:20 +020070 if (otg && otg->set_host)
71 return otg->set_host(otg, host);
Heikki Krogerus7a8a3a92012-02-13 13:24:04 +020072
Heikki Krogerus136ced82012-02-13 13:24:19 +020073 return -ENOTSUPP;
Linus Torvalds1da177e2005-04-16 15:20:36 -070074}
75
Linus Torvalds1da177e2005-04-16 15:20:36 -070076/* for usb peripheral controller drivers */
Robert Jarzmikc2344f12009-01-24 23:54:31 -080077
78/* Context: can sleep */
Linus Torvalds1da177e2005-04-16 15:20:36 -070079static inline int
Heikki Krogerus6e13c652012-02-13 13:24:20 +020080otg_set_peripheral(struct usb_otg *otg, struct usb_gadget *periph)
Linus Torvalds1da177e2005-04-16 15:20:36 -070081{
Heikki Krogerus6e13c652012-02-13 13:24:20 +020082 if (otg && otg->set_peripheral)
83 return otg->set_peripheral(otg, periph);
Heikki Krogerus7a8a3a92012-02-13 13:24:04 +020084
Heikki Krogerus136ced82012-02-13 13:24:19 +020085 return -ENOTSUPP;
Linus Torvalds1da177e2005-04-16 15:20:36 -070086}
87
88static inline int
Heikki Krogerus6e13c652012-02-13 13:24:20 +020089otg_start_srp(struct usb_otg *otg)
Linus Torvalds1da177e2005-04-16 15:20:36 -070090{
Heikki Krogerus6e13c652012-02-13 13:24:20 +020091 if (otg && otg->start_srp)
92 return otg->start_srp(otg);
Heikki Krogerus7a8a3a92012-02-13 13:24:04 +020093
Heikki Krogerus136ced82012-02-13 13:24:19 +020094 return -ENOTSUPP;
Linus Torvalds1da177e2005-04-16 15:20:36 -070095}
96
Linus Torvalds1da177e2005-04-16 15:20:36 -070097/* for OTG controller drivers (and maybe other stuff) */
98extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num);
Robert P. J. Daydda43a02008-03-07 13:45:32 -050099
Michael Grzeschik1c9af652013-06-13 17:59:55 +0300100enum usb_dr_mode {
101 USB_DR_MODE_UNKNOWN,
102 USB_DR_MODE_HOST,
103 USB_DR_MODE_PERIPHERAL,
104 USB_DR_MODE_OTG,
105};
106
Robert P. J. Daydda43a02008-03-07 13:45:32 -0500107#endif /* __LINUX_USB_OTG_H */