diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/platform_data/dwc3-omap.h | 4 | ||||
| -rw-r--r-- | include/linux/platform_data/mv_usb.h | 2 | ||||
| -rw-r--r-- | include/linux/usb/ch9.h | 9 | ||||
| -rw-r--r-- | include/linux/usb/composite.h | 3 | ||||
| -rw-r--r-- | include/linux/usb/dwc3-omap.h | 6 | ||||
| -rw-r--r-- | include/linux/usb/gadget.h | 11 | ||||
| -rw-r--r-- | include/linux/usb/gadget_configfs.h | 110 | ||||
| -rw-r--r-- | include/linux/usb/musb-ux500.h | 31 | ||||
| -rw-r--r-- | include/linux/usb/nop-usb-xceiv.h | 5 | ||||
| -rw-r--r-- | include/linux/usb/otg.h | 9 | ||||
| -rw-r--r-- | include/linux/usb/phy.h | 33 | ||||
| -rw-r--r-- | include/linux/usb/renesas_usbhs.h | 6 | 
12 files changed, 203 insertions, 26 deletions
diff --git a/include/linux/platform_data/dwc3-omap.h b/include/linux/platform_data/dwc3-omap.h index ada401244e0..1d36ca874cc 100644 --- a/include/linux/platform_data/dwc3-omap.h +++ b/include/linux/platform_data/dwc3-omap.h @@ -41,7 +41,3 @@ enum dwc3_omap_utmi_mode {  	DWC3_OMAP_UTMI_MODE_HW,  	DWC3_OMAP_UTMI_MODE_SW,  }; - -struct dwc3_omap_data { -	enum dwc3_omap_utmi_mode	utmi_mode; -}; diff --git a/include/linux/platform_data/mv_usb.h b/include/linux/platform_data/mv_usb.h index 944b01dd103..98b7925f1a2 100644 --- a/include/linux/platform_data/mv_usb.h +++ b/include/linux/platform_data/mv_usb.h @@ -34,8 +34,6 @@ struct mv_usb_addon_irq {  };  struct mv_usb_platform_data { -	unsigned int		clknum; -	char			**clkname;  	struct mv_usb_addon_irq	*id;	/* Only valid for OTG. ID pin change*/  	struct mv_usb_addon_irq	*vbus;	/* valid for OTG/UDC. VBUS change*/ diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h index 9c210f2283d..27603bcbb9b 100644 --- a/include/linux/usb/ch9.h +++ b/include/linux/usb/ch9.h @@ -43,4 +43,13 @@   */  extern const char *usb_speed_string(enum usb_device_speed speed); + +/** + * usb_state_string - Returns human readable name for the state. + * @state: The state to return a human-readable name for. If it's not + *	any of the states devices in usb_device_state_string enum, + *	the string UNKNOWN will be returned. + */ +extern const char *usb_state_string(enum usb_device_state state); +  #endif /* __LINUX_USB_CH9_H */ diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h index 8860594d636..5e61589fc16 100644 --- a/include/linux/usb/composite.h +++ b/include/linux/usb/composite.h @@ -39,6 +39,7 @@  #include <linux/usb/ch9.h>  #include <linux/usb/gadget.h>  #include <linux/log2.h> +#include <linux/configfs.h>  /*   * USB function drivers should return USB_GADGET_DELAYED_STATUS if they @@ -464,6 +465,8 @@ struct usb_function_driver {  };  struct usb_function_instance { +	struct config_group group; +	struct list_head cfs_list;  	struct usb_function_driver *fd;  	void (*free_func_inst)(struct usb_function_instance *inst);  }; diff --git a/include/linux/usb/dwc3-omap.h b/include/linux/usb/dwc3-omap.h index 51eae14477f..5615f4d8272 100644 --- a/include/linux/usb/dwc3-omap.h +++ b/include/linux/usb/dwc3-omap.h @@ -19,11 +19,11 @@ enum omap_dwc3_vbus_id_status {  };  #if (defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_DWC3_MODULE)) -extern void dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status); +extern int dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status);  #else -static inline void dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status) +static inline int dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status)  { -	return; +	return -ENODEV;  }  #endif diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index 2e297e80d59..c454a88abf2 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h @@ -482,6 +482,7 @@ struct usb_gadget_ops {   * @speed: Speed of current connection to USB host.   * @max_speed: Maximal speed the UDC can handle.  UDC must support this   *      and all slower speeds. + * @state: the state we are now (attached, suspended, configured, etc)   * @sg_supported: true if we can handle scatter-gather   * @is_otg: True if the USB device port uses a Mini-AB jack, so that the   *	gadget driver must provide a USB OTG descriptor. @@ -525,6 +526,7 @@ struct usb_gadget {  	struct list_head		ep_list;	/* of usb_ep */  	enum usb_device_speed		speed;  	enum usb_device_speed		max_speed; +	enum usb_device_state		state;  	unsigned			sg_supported:1;  	unsigned			is_otg:1;  	unsigned			is_a_peripheral:1; @@ -872,6 +874,8 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver);   */  int usb_gadget_unregister_driver(struct usb_gadget_driver *driver); +extern int usb_add_gadget_udc_release(struct device *parent, +		struct usb_gadget *gadget, void (*release)(struct device *dev));  extern int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget);  extern void usb_del_gadget_udc(struct usb_gadget *gadget);  extern int udc_attach_driver(const char *name, @@ -959,6 +963,13 @@ extern void usb_gadget_unmap_request(struct usb_gadget *gadget,  /*-------------------------------------------------------------------------*/ +/* utility to set gadget state properly */ + +extern void usb_gadget_set_state(struct usb_gadget *gadget, +		enum usb_device_state state); + +/*-------------------------------------------------------------------------*/ +  /* utility wrapping a simple endpoint selection policy */  extern struct usb_ep *usb_ep_autoconfig(struct usb_gadget *, diff --git a/include/linux/usb/gadget_configfs.h b/include/linux/usb/gadget_configfs.h new file mode 100644 index 00000000000..d74c0ae989d --- /dev/null +++ b/include/linux/usb/gadget_configfs.h @@ -0,0 +1,110 @@ +#ifndef __GADGET_CONFIGFS__ +#define __GADGET_CONFIGFS__ + +#include <linux/configfs.h> + +int check_user_usb_string(const char *name, +		struct usb_gadget_strings *stringtab_dev); + +#define GS_STRINGS_W(__struct, __name)	\ +	static ssize_t __struct##_##__name##_store(struct __struct *gs, \ +		const char *page, size_t len)		\ +{							\ +	int ret;					\ +							\ +	ret = usb_string_copy(page, &gs->__name);	\ +	if (ret)					\ +		return ret;				\ +	return len;					\ +} + +#define GS_STRINGS_R(__struct, __name)	\ +	static ssize_t __struct##_##__name##_show(struct __struct *gs, \ +			char *page)	\ +{	\ +	return sprintf(page, "%s\n", gs->__name ?: "");	\ +} + +#define GS_STRING_ITEM_ATTR(struct_name, name)	\ +	static struct struct_name##_attribute struct_name##_##name = \ +		__CONFIGFS_ATTR(name,  S_IRUGO | S_IWUSR,		\ +				struct_name##_##name##_show,		\ +				struct_name##_##name##_store) + +#define GS_STRINGS_RW(struct_name, _name)	\ +	GS_STRINGS_R(struct_name, _name)	\ +	GS_STRINGS_W(struct_name, _name)	\ +	GS_STRING_ITEM_ATTR(struct_name, _name) + +#define USB_CONFIG_STRING_RW_OPS(struct_in)				\ +	CONFIGFS_ATTR_OPS(struct_in);					\ +									\ +static struct configfs_item_operations struct_in##_langid_item_ops = {	\ +	.release                = struct_in##_attr_release,		\ +	.show_attribute         = struct_in##_attr_show,		\ +	.store_attribute        = struct_in##_attr_store,		\ +};									\ +									\ +static struct config_item_type struct_in##_langid_type = {		\ +	.ct_item_ops	= &struct_in##_langid_item_ops,			\ +	.ct_attrs	= struct_in##_langid_attrs,			\ +	.ct_owner	= THIS_MODULE,					\ +} + +#define USB_CONFIG_STRINGS_LANG(struct_in, struct_member)	\ +	static struct config_group *struct_in##_strings_make(		\ +			struct config_group *group,			\ +			const char *name)				\ +	{								\ +	struct struct_member *gi;					\ +	struct struct_in *gs;						\ +	struct struct_in *new;						\ +	int langs = 0;							\ +	int ret;							\ +									\ +	new = kzalloc(sizeof(*new), GFP_KERNEL);			\ +	if (!new)							\ +		return ERR_PTR(-ENOMEM);				\ +									\ +	ret = check_user_usb_string(name, &new->stringtab_dev);		\ +	if (ret)							\ +		goto err;						\ +	config_group_init_type_name(&new->group, name,			\ +			&struct_in##_langid_type);			\ +									\ +	gi = container_of(group, struct struct_member, strings_group);	\ +	ret = -EEXIST;							\ +	list_for_each_entry(gs, &gi->string_list, list) {		\ +		if (gs->stringtab_dev.language == new->stringtab_dev.language) \ +			goto err;					\ +		langs++;						\ +	}								\ +	ret = -EOVERFLOW;						\ +	if (langs >= MAX_USB_STRING_LANGS)				\ +		goto err;						\ +									\ +	list_add_tail(&new->list, &gi->string_list);			\ +	return &new->group;						\ +err:									\ +	kfree(new);							\ +	return ERR_PTR(ret);						\ +}									\ +									\ +static void struct_in##_strings_drop(					\ +		struct config_group *group,				\ +		struct config_item *item)				\ +{									\ +	config_item_put(item);						\ +}									\ +									\ +static struct configfs_group_operations struct_in##_strings_ops = {	\ +	.make_group     = &struct_in##_strings_make,			\ +	.drop_item      = &struct_in##_strings_drop,			\ +};									\ +									\ +static struct config_item_type struct_in##_strings_type = {		\ +	.ct_group_ops   = &struct_in##_strings_ops,			\ +	.ct_owner       = THIS_MODULE,					\ +} + +#endif diff --git a/include/linux/usb/musb-ux500.h b/include/linux/usb/musb-ux500.h new file mode 100644 index 00000000000..1e2c7130f6e --- /dev/null +++ b/include/linux/usb/musb-ux500.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2013 ST-Ericsson AB + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ + +#ifndef __MUSB_UX500_H__ +#define __MUSB_UX500_H__ + +enum ux500_musb_vbus_id_status { +	UX500_MUSB_NONE = 0, +	UX500_MUSB_VBUS, +	UX500_MUSB_ID, +	UX500_MUSB_CHARGER, +	UX500_MUSB_ENUMERATED, +	UX500_MUSB_RIDA, +	UX500_MUSB_RIDB, +	UX500_MUSB_RIDC, +	UX500_MUSB_PREPARE, +	UX500_MUSB_CLEAN, +}; + +#endif	/* __MUSB_UX500_H__ */ diff --git a/include/linux/usb/nop-usb-xceiv.h b/include/linux/usb/nop-usb-xceiv.h index 28884c71741..148d35171aa 100644 --- a/include/linux/usb/nop-usb-xceiv.h +++ b/include/linux/usb/nop-usb-xceiv.h @@ -5,6 +5,11 @@  struct nop_usb_xceiv_platform_data {  	enum usb_phy_type type; +	unsigned long clk_rate; + +	/* if set fails with -EPROBE_DEFER if can't get regulator */ +	unsigned int needs_vcc:1; +	unsigned int needs_reset:1;  };  #if defined(CONFIG_NOP_USB_XCEIV) || (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE)) diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h index e8a5fe87c6b..291e01ba32e 100644 --- a/include/linux/usb/otg.h +++ b/include/linux/usb/otg.h @@ -36,14 +36,7 @@ struct usb_otg {  }; -#ifdef CONFIG_USB_OTG_UTILS -extern const char *otg_state_string(enum usb_otg_state state); -#else -static inline const char *otg_state_string(enum usb_otg_state state) -{ -	return NULL; -} -#endif +extern const char *usb_otg_state_string(enum usb_otg_state state);  /* Context: can sleep */  static inline int diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h index 15847cbdb51..6b5978f5763 100644 --- a/include/linux/usb/phy.h +++ b/include/linux/usb/phy.h @@ -91,6 +91,9 @@ struct usb_phy {  	int	(*init)(struct usb_phy *x);  	void	(*shutdown)(struct usb_phy *x); +	/* enable/disable VBUS */ +	int	(*set_vbus)(struct usb_phy *x, int on); +  	/* effective for B devices, ignored for A-peripheral */  	int	(*set_power)(struct usb_phy *x,  				unsigned mA); @@ -160,8 +163,26 @@ usb_phy_shutdown(struct usb_phy *x)  		x->shutdown(x);  } +static inline int +usb_phy_vbus_on(struct usb_phy *x) +{ +	if (!x->set_vbus) +		return 0; + +	return x->set_vbus(x, true); +} + +static inline int +usb_phy_vbus_off(struct usb_phy *x) +{ +	if (!x->set_vbus) +		return 0; + +	return x->set_vbus(x, false); +} +  /* for usb host and peripheral controller drivers */ -#ifdef CONFIG_USB_OTG_UTILS +#if IS_ENABLED(CONFIG_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); @@ -176,29 +197,29 @@ extern int usb_bind_phy(const char *dev_name, u8 index,  #else  static inline struct usb_phy *usb_get_phy(enum usb_phy_type type)  { -	return NULL; +	return ERR_PTR(-ENXIO);  }  static inline struct usb_phy *devm_usb_get_phy(struct device *dev,  	enum usb_phy_type type)  { -	return NULL; +	return ERR_PTR(-ENXIO);  }  static inline struct usb_phy *usb_get_phy_dev(struct device *dev, u8 index)  { -	return NULL; +	return ERR_PTR(-ENXIO);  }  static inline struct usb_phy *devm_usb_get_phy_dev(struct device *dev, u8 index)  { -	return NULL; +	return ERR_PTR(-ENXIO);  }  static inline struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev,  	const char *phandle, u8 index)  { -	return NULL; +	return ERR_PTR(-ENXIO);  }  static inline void usb_put_phy(struct usb_phy *x) diff --git a/include/linux/usb/renesas_usbhs.h b/include/linux/usb/renesas_usbhs.h index c5d36c65c33..e452ba6ec6b 100644 --- a/include/linux/usb/renesas_usbhs.h +++ b/include/linux/usb/renesas_usbhs.h @@ -62,14 +62,14 @@ struct renesas_usbhs_platform_callback {  	 * Hardware exit function for platform.  	 * it is called when driver was removed  	 */ -	void (*hardware_exit)(struct platform_device *pdev); +	int (*hardware_exit)(struct platform_device *pdev);  	/*  	 * option:  	 *  	 * for board specific clock control  	 */ -	void (*power_ctrl)(struct platform_device *pdev, +	int (*power_ctrl)(struct platform_device *pdev,  			   void __iomem *base, int enable);  	/* @@ -77,7 +77,7 @@ struct renesas_usbhs_platform_callback {  	 *  	 * Phy reset for platform  	 */ -	void (*phy_reset)(struct platform_device *pdev); +	int (*phy_reset)(struct platform_device *pdev);  	/*  	 * get USB ID function  |