diff options
Diffstat (limited to 'include/linux/usb/otg.h')
| -rw-r--r-- | include/linux/usb/otg.h | 67 | 
1 files changed, 62 insertions, 5 deletions
diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h index 38ab3f46346..45824be0a2f 100644 --- a/include/linux/usb/otg.h +++ b/include/linux/usb/otg.h @@ -43,6 +43,13 @@ enum usb_phy_events {  	USB_EVENT_ENUMERATED,   /* gadget driver enumerated */  }; +/* associate a type with PHY */ +enum usb_phy_type { +	USB_PHY_TYPE_UNDEFINED, +	USB_PHY_TYPE_USB2, +	USB_PHY_TYPE_USB3, +}; +  struct usb_phy;  /* for transceivers connected thru an ULPI interface, the user must @@ -89,6 +96,7 @@ struct usb_phy {  	const char		*label;  	unsigned int		 flags; +	enum usb_phy_type	type;  	enum usb_otg_state	state;  	enum usb_phy_events	last_event; @@ -105,6 +113,9 @@ struct usb_phy {  	u16			port_status;  	u16			port_change; +	/* to support controllers that have multiple transceivers */ +	struct list_head	head; +  	/* initialize/shutdown the OTG controller */  	int	(*init)(struct usb_phy *x);  	void	(*shutdown)(struct usb_phy *x); @@ -117,11 +128,15 @@ struct usb_phy {  	int	(*set_suspend)(struct usb_phy *x,  				int suspend); +	/* notify phy connect status change */ +	int	(*notify_connect)(struct usb_phy *x, int port); +	int	(*notify_disconnect)(struct usb_phy *x, int port);  };  /* for board-specific init logic */ -extern int usb_set_transceiver(struct usb_phy *); +extern int usb_add_phy(struct usb_phy *, enum usb_phy_type type); +extern void usb_remove_phy(struct usb_phy *);  #if defined(CONFIG_NOP_USB_XCEIV) || (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE))  /* sometimes transceivers are accessed only through e.g. ULPI */ @@ -172,16 +187,29 @@ usb_phy_shutdown(struct usb_phy *x)  /* for usb host and peripheral controller drivers */  #ifdef CONFIG_USB_OTG_UTILS -extern struct usb_phy *usb_get_transceiver(void); -extern void usb_put_transceiver(struct usb_phy *); +extern struct usb_phy *usb_get_phy(enum usb_phy_type type); +extern struct usb_phy *devm_usb_get_phy(struct device *dev, +	enum usb_phy_type type); +extern void usb_put_phy(struct usb_phy *); +extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x);  extern const char *otg_state_string(enum usb_otg_state state);  #else -static inline struct usb_phy *usb_get_transceiver(void) +static inline struct usb_phy *usb_get_phy(enum usb_phy_type type) +{ +	return NULL; +} + +static inline struct usb_phy *devm_usb_get_phy(struct device *dev, +	enum usb_phy_type type)  {  	return NULL;  } -static inline void usb_put_transceiver(struct usb_phy *x) +static inline void usb_put_phy(struct usb_phy *x) +{ +} + +static inline void devm_usb_put_phy(struct device *dev, struct usb_phy *x)  {  } @@ -252,6 +280,24 @@ usb_phy_set_suspend(struct usb_phy *x, int suspend)  }  static inline int +usb_phy_notify_connect(struct usb_phy *x, int port) +{ +	if (x->notify_connect) +		return x->notify_connect(x, port); +	else +		return 0; +} + +static inline int +usb_phy_notify_disconnect(struct usb_phy *x, int port) +{ +	if (x->notify_disconnect) +		return x->notify_disconnect(x, port); +	else +		return 0; +} + +static inline int  otg_start_srp(struct usb_otg *otg)  {  	if (otg && otg->start_srp) @@ -276,4 +322,15 @@ usb_unregister_notifier(struct usb_phy *x, struct notifier_block *nb)  /* for OTG controller drivers (and maybe other stuff) */  extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num); +static inline const char *usb_phy_type_string(enum usb_phy_type type) +{ +	switch (type) { +	case USB_PHY_TYPE_USB2: +		return "USB2 PHY"; +	case USB_PHY_TYPE_USB3: +		return "USB3 PHY"; +	default: +		return "UNKNOWN PHY TYPE"; +	} +}  #endif /* __LINUX_USB_OTG_H */  |