diff options
Diffstat (limited to 'drivers/usb/gadget/audio.c')
| -rw-r--r-- | drivers/usb/gadget/audio.c | 94 | 
1 files changed, 49 insertions, 45 deletions
diff --git a/drivers/usb/gadget/audio.c b/drivers/usb/gadget/audio.c index 93b999e49ef..231b0efe8fd 100644 --- a/drivers/usb/gadget/audio.c +++ b/drivers/usb/gadget/audio.c @@ -12,29 +12,41 @@  /* #define VERBOSE_DEBUG */  #include <linux/kernel.h> -#include <linux/utsname.h> - -#include "u_audio.h" +#include <linux/module.h> +#include <linux/usb/composite.h> +#include "gadget_chips.h"  #define DRIVER_DESC		"Linux USB Audio Gadget" -#define DRIVER_VERSION		"Dec 18, 2008" +#define DRIVER_VERSION		"Feb 2, 2012" -/*-------------------------------------------------------------------------*/ +USB_GADGET_COMPOSITE_OPTIONS(); -/* - * Kbuild is not very cooperative with respect to linking separately - * compiled library objects into one module.  So for now we won't use - * separate compilation ... ensuring init/exit sections work to shrink - * the runtime footprint, and giving us at least some parts of what - * a "gcc --combine ... part1.c part2.c part3.c ... " build would. - */ -#include "composite.c" -#include "usbstring.c" -#include "config.c" -#include "epautoconf.c" +/* string IDs are assigned dynamically */ + +static struct usb_string strings_dev[] = { +	[USB_GADGET_MANUFACTURER_IDX].s = "", +	[USB_GADGET_PRODUCT_IDX].s = DRIVER_DESC, +	[USB_GADGET_SERIAL_IDX].s = "", +	{  } /* end of list */ +}; + +static struct usb_gadget_strings stringtab_dev = { +	.language = 0x0409,	/* en-us */ +	.strings = strings_dev, +}; -#include "u_audio.c" -#include "f_audio.c" +static struct usb_gadget_strings *audio_strings[] = { +	&stringtab_dev, +	NULL, +}; + +#ifdef CONFIG_GADGET_UAC1 +#include "u_uac1.h" +#include "u_uac1.c" +#include "f_uac1.c" +#else +#include "f_uac2.c" +#endif  /*-------------------------------------------------------------------------*/ @@ -54,9 +66,15 @@ static struct usb_device_descriptor device_desc = {  	.bcdUSB =		__constant_cpu_to_le16(0x200), +#ifdef CONFIG_GADGET_UAC1  	.bDeviceClass =		USB_CLASS_PER_INTERFACE,  	.bDeviceSubClass =	0,  	.bDeviceProtocol =	0, +#else +	.bDeviceClass =		USB_CLASS_MISC, +	.bDeviceSubClass =	0x02, +	.bDeviceProtocol =	0x01, +#endif  	/* .bMaxPacketSize0 = f(hardware) */  	/* Vendor and product id defaults change according to what configs @@ -108,45 +126,27 @@ static struct usb_configuration audio_config_driver = {  	.bConfigurationValue	= 1,  	/* .iConfiguration = DYNAMIC */  	.bmAttributes		= USB_CONFIG_ATT_SELFPOWER, +#ifndef CONFIG_GADGET_UAC1 +	.unbind			= uac2_unbind_config, +#endif  };  /*-------------------------------------------------------------------------*/  static int __init audio_bind(struct usb_composite_dev *cdev)  { -	int			gcnum;  	int			status; -	gcnum = usb_gadget_controller_number(cdev->gadget); -	if (gcnum >= 0) -		device_desc.bcdDevice = cpu_to_le16(0x0300 | gcnum); -	else { -		ERROR(cdev, "controller '%s' not recognized; trying %s\n", -			cdev->gadget->name, -			audio_config_driver.label); -		device_desc.bcdDevice = -			__constant_cpu_to_le16(0x0300 | 0x0099); -	} - -	/* device descriptor strings: manufacturer, product */ -	snprintf(manufacturer, sizeof manufacturer, "%s %s with %s", -		init_utsname()->sysname, init_utsname()->release, -		cdev->gadget->name); -	status = usb_string_id(cdev); -	if (status < 0) -		goto fail; -	strings_dev[STRING_MANUFACTURER_IDX].id = status; -	device_desc.iManufacturer = status; - -	status = usb_string_id(cdev); +	status = usb_string_ids_tab(cdev, strings_dev);  	if (status < 0)  		goto fail; -	strings_dev[STRING_PRODUCT_IDX].id = status; -	device_desc.iProduct = status; +	device_desc.iManufacturer = strings_dev[USB_GADGET_MANUFACTURER_IDX].id; +	device_desc.iProduct = strings_dev[USB_GADGET_PRODUCT_IDX].id;  	status = usb_add_config(cdev, &audio_config_driver, audio_do_config);  	if (status < 0)  		goto fail; +	usb_composite_overwrite_options(cdev, &coverwrite);  	INFO(cdev, "%s, version: %s\n", DRIVER_DESC, DRIVER_VERSION);  	return 0; @@ -157,20 +157,24 @@ fail:  static int __exit audio_unbind(struct usb_composite_dev *cdev)  { +#ifdef CONFIG_GADGET_UAC1  	gaudio_cleanup(); +#endif  	return 0;  } -static struct usb_composite_driver audio_driver = { +static __refdata struct usb_composite_driver audio_driver = {  	.name		= "g_audio",  	.dev		= &device_desc,  	.strings	= audio_strings, +	.max_speed	= USB_SPEED_HIGH, +	.bind		= audio_bind,  	.unbind		= __exit_p(audio_unbind),  };  static int __init init(void)  { -	return usb_composite_probe(&audio_driver, audio_bind); +	return usb_composite_probe(&audio_driver);  }  module_init(init);  | 
