diff options
Diffstat (limited to 'include/linux/usb/phy.h')
| -rw-r--r-- | include/linux/usb/phy.h | 54 | 
1 files changed, 53 insertions, 1 deletions
| diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h index 299245105610..8c6914873a16 100644 --- a/include/linux/usb/phy.h +++ b/include/linux/usb/phy.h @@ -12,6 +12,7 @@  #include <linux/extcon.h>  #include <linux/notifier.h>  #include <linux/usb.h> +#include <uapi/linux/usb/charger.h>  enum usb_phy_interface {  	USBPHY_INTERFACE_MODE_UNKNOWN, @@ -72,6 +73,17 @@ struct usb_phy_io_ops {  	int (*write)(struct usb_phy *x, u32 val, u32 reg);  }; +struct usb_charger_current { +	unsigned int sdp_min; +	unsigned int sdp_max; +	unsigned int dcp_min; +	unsigned int dcp_max; +	unsigned int cdp_min; +	unsigned int cdp_max; +	unsigned int aca_min; +	unsigned int aca_max; +}; +  struct usb_phy {  	struct device		*dev;  	const char		*label; @@ -91,6 +103,13 @@ struct usb_phy {  	struct extcon_dev	*id_edev;  	struct notifier_block	vbus_nb;  	struct notifier_block	id_nb; +	struct notifier_block	type_nb; + +	/* Support USB charger */ +	enum usb_charger_type	chg_type; +	enum usb_charger_state	chg_state; +	struct usb_charger_current	chg_cur; +	struct work_struct		chg_work;  	/* for notification of usb_phy_events */  	struct atomic_notifier_head	notifier; @@ -129,6 +148,12 @@ struct usb_phy {  			enum usb_device_speed speed);  	int	(*notify_disconnect)(struct usb_phy *x,  			enum usb_device_speed speed); + +	/* +	 * Charger detection method can be implemented if you need to +	 * manually detect the charger type. +	 */ +	enum usb_charger_type (*charger_detect)(struct usb_phy *x);  };  /** @@ -219,6 +244,12 @@ extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x);  extern int usb_bind_phy(const char *dev_name, u8 index,  				const char *phy_dev_name);  extern void usb_phy_set_event(struct usb_phy *x, unsigned long event); +extern void usb_phy_set_charger_current(struct usb_phy *usb_phy, +					unsigned int mA); +extern void usb_phy_get_charger_current(struct usb_phy *usb_phy, +					unsigned int *min, unsigned int *max); +extern void usb_phy_set_charger_state(struct usb_phy *usb_phy, +				      enum usb_charger_state state);  #else  static inline struct usb_phy *usb_get_phy(enum usb_phy_type type)  { @@ -270,12 +301,33 @@ static inline int usb_bind_phy(const char *dev_name, u8 index,  static inline void usb_phy_set_event(struct usb_phy *x, unsigned long event)  {  } + +static inline void usb_phy_set_charger_current(struct usb_phy *usb_phy, +					       unsigned int mA) +{ +} + +static inline void usb_phy_get_charger_current(struct usb_phy *usb_phy, +					       unsigned int *min, +					       unsigned int *max) +{ +} + +static inline void usb_phy_set_charger_state(struct usb_phy *usb_phy, +					     enum usb_charger_state state) +{ +}  #endif  static inline int  usb_phy_set_power(struct usb_phy *x, unsigned mA)  { -	if (x && x->set_power) +	if (!x) +		return 0; + +	usb_phy_set_charger_current(x, mA); + +	if (x->set_power)  		return x->set_power(x, mA);  	return 0;  } |