
Before using the PHY framework instead of the USB PHY one, we need to move the OTG state into another place, since it won't be available when USB PHY isn't used. This patch moves the OTG state into the OTG structure, and makes all the needed modifications in the drivers using the OTG state. [ balbi@ti.com : fix build regressions with phy-tahvo.c, musb_dsps.c, phy-isp1301-omap, and chipidea's debug.c ] Acked-by: Kishon Vijay Abraham I <kishon@ti.com> Acked-by: Peter Chen <peter.chen@freescale.com> Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
105 lines
2.2 KiB
C
105 lines
2.2 KiB
C
/* 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>
|
|
|
|
struct usb_otg {
|
|
u8 default_a;
|
|
|
|
struct usb_phy *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 */
|