1 /* 2 * audio.c -- Audio gadget driver 3 * 4 * Copyright (C) 2008 Bryan Wu <cooloney@kernel.org> 5 * Copyright (C) 2008 Analog Devices, Inc 6 * 7 * Enter bugs at http://blackfin.uclinux.org/ 8 * 9 * Licensed under the GPL-2 or later. 10 */ 11 12 /* #define VERBOSE_DEBUG */ 13 14 #include <linux/kernel.h> 15 #include <linux/module.h> 16 #include <linux/usb/composite.h> 17 18 #include "gadget_chips.h" 19 #define DRIVER_DESC "Linux USB Audio Gadget" 20 #define DRIVER_VERSION "Feb 2, 2012" 21 22 USB_GADGET_COMPOSITE_OPTIONS(); 23 24 /* string IDs are assigned dynamically */ 25 26 static struct usb_string strings_dev[] = { 27 [USB_GADGET_MANUFACTURER_IDX].s = "", 28 [USB_GADGET_PRODUCT_IDX].s = DRIVER_DESC, 29 [USB_GADGET_SERIAL_IDX].s = "", 30 { } /* end of list */ 31 }; 32 33 static struct usb_gadget_strings stringtab_dev = { 34 .language = 0x0409, /* en-us */ 35 .strings = strings_dev, 36 }; 37 38 static struct usb_gadget_strings *audio_strings[] = { 39 &stringtab_dev, 40 NULL, 41 }; 42 43 #ifdef CONFIG_GADGET_UAC1 44 #include "u_uac1.h" 45 #include "u_uac1.c" 46 #include "f_uac1.c" 47 #else 48 #include "f_uac2.c" 49 #endif 50 51 /*-------------------------------------------------------------------------*/ 52 53 /* DO NOT REUSE THESE IDs with a protocol-incompatible driver!! Ever!! 54 * Instead: allocate your own, using normal USB-IF procedures. 55 */ 56 57 /* Thanks to Linux Foundation for donating this product ID. */ 58 #define AUDIO_VENDOR_NUM 0x1d6b /* Linux Foundation */ 59 #define AUDIO_PRODUCT_NUM 0x0101 /* Linux-USB Audio Gadget */ 60 61 /*-------------------------------------------------------------------------*/ 62 63 static struct usb_device_descriptor device_desc = { 64 .bLength = sizeof device_desc, 65 .bDescriptorType = USB_DT_DEVICE, 66 67 .bcdUSB = __constant_cpu_to_le16(0x200), 68 69 #ifdef CONFIG_GADGET_UAC1 70 .bDeviceClass = USB_CLASS_PER_INTERFACE, 71 .bDeviceSubClass = 0, 72 .bDeviceProtocol = 0, 73 #else 74 .bDeviceClass = USB_CLASS_MISC, 75 .bDeviceSubClass = 0x02, 76 .bDeviceProtocol = 0x01, 77 #endif 78 /* .bMaxPacketSize0 = f(hardware) */ 79 80 /* Vendor and product id defaults change according to what configs 81 * we support. (As does bNumConfigurations.) These values can 82 * also be overridden by module parameters. 83 */ 84 .idVendor = __constant_cpu_to_le16(AUDIO_VENDOR_NUM), 85 .idProduct = __constant_cpu_to_le16(AUDIO_PRODUCT_NUM), 86 /* .bcdDevice = f(hardware) */ 87 /* .iManufacturer = DYNAMIC */ 88 /* .iProduct = DYNAMIC */ 89 /* NO SERIAL NUMBER */ 90 .bNumConfigurations = 1, 91 }; 92 93 static struct usb_otg_descriptor otg_descriptor = { 94 .bLength = sizeof otg_descriptor, 95 .bDescriptorType = USB_DT_OTG, 96 97 /* REVISIT SRP-only hardware is possible, although 98 * it would not be called "OTG" ... 99 */ 100 .bmAttributes = USB_OTG_SRP | USB_OTG_HNP, 101 }; 102 103 static const struct usb_descriptor_header *otg_desc[] = { 104 (struct usb_descriptor_header *) &otg_descriptor, 105 NULL, 106 }; 107 108 /*-------------------------------------------------------------------------*/ 109 110 static int __init audio_do_config(struct usb_configuration *c) 111 { 112 /* FIXME alloc iConfiguration string, set it in c->strings */ 113 114 if (gadget_is_otg(c->cdev->gadget)) { 115 c->descriptors = otg_desc; 116 c->bmAttributes |= USB_CONFIG_ATT_WAKEUP; 117 } 118 119 audio_bind_config(c); 120 121 return 0; 122 } 123 124 static struct usb_configuration audio_config_driver = { 125 .label = DRIVER_DESC, 126 .bConfigurationValue = 1, 127 /* .iConfiguration = DYNAMIC */ 128 .bmAttributes = USB_CONFIG_ATT_SELFPOWER, 129 #ifndef CONFIG_GADGET_UAC1 130 .unbind = uac2_unbind_config, 131 #endif 132 }; 133 134 /*-------------------------------------------------------------------------*/ 135 136 static int __init audio_bind(struct usb_composite_dev *cdev) 137 { 138 int status; 139 140 status = usb_string_ids_tab(cdev, strings_dev); 141 if (status < 0) 142 goto fail; 143 device_desc.iManufacturer = strings_dev[USB_GADGET_MANUFACTURER_IDX].id; 144 device_desc.iProduct = strings_dev[USB_GADGET_PRODUCT_IDX].id; 145 146 status = usb_add_config(cdev, &audio_config_driver, audio_do_config); 147 if (status < 0) 148 goto fail; 149 usb_composite_overwrite_options(cdev, &coverwrite); 150 151 INFO(cdev, "%s, version: %s\n", DRIVER_DESC, DRIVER_VERSION); 152 return 0; 153 154 fail: 155 return status; 156 } 157 158 static int __exit audio_unbind(struct usb_composite_dev *cdev) 159 { 160 #ifdef CONFIG_GADGET_UAC1 161 gaudio_cleanup(); 162 #endif 163 return 0; 164 } 165 166 static __refdata struct usb_composite_driver audio_driver = { 167 .name = "g_audio", 168 .dev = &device_desc, 169 .strings = audio_strings, 170 .max_speed = USB_SPEED_HIGH, 171 .bind = audio_bind, 172 .unbind = __exit_p(audio_unbind), 173 }; 174 175 module_usb_composite_driver(audio_driver); 176 177 MODULE_DESCRIPTION(DRIVER_DESC); 178 MODULE_AUTHOR("Bryan Wu <cooloney@kernel.org>"); 179 MODULE_LICENSE("GPL"); 180 181