diff options
Diffstat (limited to 'drivers/usb/gadget/config.c')
| -rw-r--r-- | drivers/usb/gadget/config.c | 71 | 
1 files changed, 38 insertions, 33 deletions
diff --git a/drivers/usb/gadget/config.c b/drivers/usb/gadget/config.c index 09084fd646a..34e12fc52c2 100644 --- a/drivers/usb/gadget/config.c +++ b/drivers/usb/gadget/config.c @@ -7,27 +7,19 @@   * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   */  #include <linux/errno.h>  #include <linux/slab.h>  #include <linux/kernel.h> +#include <linux/module.h>  #include <linux/list.h>  #include <linux/string.h>  #include <linux/device.h>  #include <linux/usb/ch9.h>  #include <linux/usb/gadget.h> - +#include <linux/usb/composite.h>  /**   * usb_descriptor_fillbuf - fill buffer with descriptors @@ -62,7 +54,7 @@ usb_descriptor_fillbuf(void *buf, unsigned buflen,  	}  	return dest - (u8 *)buf;  } - +EXPORT_SYMBOL_GPL(usb_descriptor_fillbuf);  /**   * usb_gadget_config_buf - builts a complete configuration descriptor @@ -115,6 +107,7 @@ int usb_gadget_config_buf(  	cp->bmAttributes |= USB_CONFIG_ATT_ONE;  	return len;  } +EXPORT_SYMBOL_GPL(usb_gadget_config_buf);  /**   * usb_copy_descriptors - copy a vector of USB descriptors @@ -164,29 +157,41 @@ usb_copy_descriptors(struct usb_descriptor_header **src)  	return ret;  } +EXPORT_SYMBOL_GPL(usb_copy_descriptors); -/** - * usb_find_endpoint - find a copy of an endpoint descriptor - * @src: original vector of descriptors - * @copy: copy of @src - * @match: endpoint descriptor found in @src - * - * This returns the copy of the @match descriptor made for @copy.  Its - * intended use is to help remembering the endpoint descriptor to use - * when enabling a given endpoint. - */ -struct usb_endpoint_descriptor * -usb_find_endpoint( -	struct usb_descriptor_header **src, -	struct usb_descriptor_header **copy, -	struct usb_endpoint_descriptor *match -) +int usb_assign_descriptors(struct usb_function *f, +		struct usb_descriptor_header **fs, +		struct usb_descriptor_header **hs, +		struct usb_descriptor_header **ss)  { -	while (*src) { -		if (*src == (void *) match) -			return (void *)*copy; -		src++; -		copy++; +	struct usb_gadget *g = f->config->cdev->gadget; + +	if (fs) { +		f->fs_descriptors = usb_copy_descriptors(fs); +		if (!f->fs_descriptors) +			goto err; +	} +	if (hs && gadget_is_dualspeed(g)) { +		f->hs_descriptors = usb_copy_descriptors(hs); +		if (!f->hs_descriptors) +			goto err;  	} -	return NULL; +	if (ss && gadget_is_superspeed(g)) { +		f->ss_descriptors = usb_copy_descriptors(ss); +		if (!f->ss_descriptors) +			goto err; +	} +	return 0; +err: +	usb_free_all_descriptors(f); +	return -ENOMEM; +} +EXPORT_SYMBOL_GPL(usb_assign_descriptors); + +void usb_free_all_descriptors(struct usb_function *f) +{ +	usb_free_descriptors(f->fs_descriptors); +	usb_free_descriptors(f->hs_descriptors); +	usb_free_descriptors(f->ss_descriptors);  } +EXPORT_SYMBOL_GPL(usb_free_all_descriptors);  | 
