xref: /OK3568_Linux_fs/kernel/drivers/usb/gadget/function/f_audio_source.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Gadget Function Driver for USB audio source device
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 2012 Google, Inc.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * This software is licensed under the terms of the GNU General Public
7*4882a593Smuzhiyun  * License version 2, as published by the Free Software Foundation, and
8*4882a593Smuzhiyun  * may be copied, distributed, and modified under those terms.
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful,
11*4882a593Smuzhiyun  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*4882a593Smuzhiyun  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*4882a593Smuzhiyun  * GNU General Public License for more details.
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <linux/device.h>
18*4882a593Smuzhiyun #include <linux/usb/audio.h>
19*4882a593Smuzhiyun #include <linux/wait.h>
20*4882a593Smuzhiyun #include <linux/pm_qos.h>
21*4882a593Smuzhiyun #include <sound/core.h>
22*4882a593Smuzhiyun #include <sound/initval.h>
23*4882a593Smuzhiyun #include <sound/pcm.h>
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #include <linux/usb.h>
26*4882a593Smuzhiyun #include <linux/usb_usual.h>
27*4882a593Smuzhiyun #include <linux/usb/ch9.h>
28*4882a593Smuzhiyun #include <linux/configfs.h>
29*4882a593Smuzhiyun #include <linux/usb/composite.h>
30*4882a593Smuzhiyun #include <linux/module.h>
31*4882a593Smuzhiyun #include <linux/moduleparam.h>
32*4882a593Smuzhiyun #define SAMPLE_RATE 44100
33*4882a593Smuzhiyun #define FRAMES_PER_MSEC (SAMPLE_RATE / 1000)
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #define IN_EP_MAX_PACKET_SIZE 256
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun /* Number of requests to allocate */
38*4882a593Smuzhiyun #define IN_EP_REQ_COUNT 4
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #define AUDIO_AC_INTERFACE	0
41*4882a593Smuzhiyun #define AUDIO_AS_INTERFACE	1
42*4882a593Smuzhiyun #define AUDIO_NUM_INTERFACES	2
43*4882a593Smuzhiyun #define MAX_INST_NAME_LEN     40
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun /* B.3.1  Standard AC Interface Descriptor */
46*4882a593Smuzhiyun static struct usb_interface_descriptor ac_interface_desc = {
47*4882a593Smuzhiyun 	.bLength =		USB_DT_INTERFACE_SIZE,
48*4882a593Smuzhiyun 	.bDescriptorType =	USB_DT_INTERFACE,
49*4882a593Smuzhiyun 	.bNumEndpoints =	0,
50*4882a593Smuzhiyun 	.bInterfaceClass =	USB_CLASS_AUDIO,
51*4882a593Smuzhiyun 	.bInterfaceSubClass =	USB_SUBCLASS_AUDIOCONTROL,
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun DECLARE_UAC_AC_HEADER_DESCRIPTOR(2);
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #define UAC_DT_AC_HEADER_LENGTH	UAC_DT_AC_HEADER_SIZE(AUDIO_NUM_INTERFACES)
57*4882a593Smuzhiyun /* 1 input terminal, 1 output terminal and 1 feature unit */
58*4882a593Smuzhiyun #define UAC_DT_TOTAL_LENGTH (UAC_DT_AC_HEADER_LENGTH \
59*4882a593Smuzhiyun 	+ UAC_DT_INPUT_TERMINAL_SIZE + UAC_DT_OUTPUT_TERMINAL_SIZE \
60*4882a593Smuzhiyun 	+ UAC_DT_FEATURE_UNIT_SIZE(0))
61*4882a593Smuzhiyun /* B.3.2  Class-Specific AC Interface Descriptor */
62*4882a593Smuzhiyun static struct uac1_ac_header_descriptor_2 ac_header_desc = {
63*4882a593Smuzhiyun 	.bLength =		UAC_DT_AC_HEADER_LENGTH,
64*4882a593Smuzhiyun 	.bDescriptorType =	USB_DT_CS_INTERFACE,
65*4882a593Smuzhiyun 	.bDescriptorSubtype =	UAC_HEADER,
66*4882a593Smuzhiyun 	.bcdADC =		__constant_cpu_to_le16(0x0100),
67*4882a593Smuzhiyun 	.wTotalLength =		__constant_cpu_to_le16(UAC_DT_TOTAL_LENGTH),
68*4882a593Smuzhiyun 	.bInCollection =	AUDIO_NUM_INTERFACES,
69*4882a593Smuzhiyun 	.baInterfaceNr = {
70*4882a593Smuzhiyun 		[0] =		AUDIO_AC_INTERFACE,
71*4882a593Smuzhiyun 		[1] =		AUDIO_AS_INTERFACE,
72*4882a593Smuzhiyun 	}
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun #define INPUT_TERMINAL_ID	1
76*4882a593Smuzhiyun static struct uac_input_terminal_descriptor input_terminal_desc = {
77*4882a593Smuzhiyun 	.bLength =		UAC_DT_INPUT_TERMINAL_SIZE,
78*4882a593Smuzhiyun 	.bDescriptorType =	USB_DT_CS_INTERFACE,
79*4882a593Smuzhiyun 	.bDescriptorSubtype =	UAC_INPUT_TERMINAL,
80*4882a593Smuzhiyun 	.bTerminalID =		INPUT_TERMINAL_ID,
81*4882a593Smuzhiyun 	.wTerminalType =	UAC_INPUT_TERMINAL_MICROPHONE,
82*4882a593Smuzhiyun 	.bAssocTerminal =	0,
83*4882a593Smuzhiyun 	.wChannelConfig =	0x3,
84*4882a593Smuzhiyun };
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun DECLARE_UAC_FEATURE_UNIT_DESCRIPTOR(0);
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun #define FEATURE_UNIT_ID		2
89*4882a593Smuzhiyun static struct uac_feature_unit_descriptor_0 feature_unit_desc = {
90*4882a593Smuzhiyun 	.bLength		= UAC_DT_FEATURE_UNIT_SIZE(0),
91*4882a593Smuzhiyun 	.bDescriptorType	= USB_DT_CS_INTERFACE,
92*4882a593Smuzhiyun 	.bDescriptorSubtype	= UAC_FEATURE_UNIT,
93*4882a593Smuzhiyun 	.bUnitID		= FEATURE_UNIT_ID,
94*4882a593Smuzhiyun 	.bSourceID		= INPUT_TERMINAL_ID,
95*4882a593Smuzhiyun 	.bControlSize		= 2,
96*4882a593Smuzhiyun };
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun #define OUTPUT_TERMINAL_ID	3
99*4882a593Smuzhiyun static struct uac1_output_terminal_descriptor output_terminal_desc = {
100*4882a593Smuzhiyun 	.bLength		= UAC_DT_OUTPUT_TERMINAL_SIZE,
101*4882a593Smuzhiyun 	.bDescriptorType	= USB_DT_CS_INTERFACE,
102*4882a593Smuzhiyun 	.bDescriptorSubtype	= UAC_OUTPUT_TERMINAL,
103*4882a593Smuzhiyun 	.bTerminalID		= OUTPUT_TERMINAL_ID,
104*4882a593Smuzhiyun 	.wTerminalType		= UAC_TERMINAL_STREAMING,
105*4882a593Smuzhiyun 	.bAssocTerminal		= FEATURE_UNIT_ID,
106*4882a593Smuzhiyun 	.bSourceID		= FEATURE_UNIT_ID,
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun /* B.4.1  Standard AS Interface Descriptor */
110*4882a593Smuzhiyun static struct usb_interface_descriptor as_interface_alt_0_desc = {
111*4882a593Smuzhiyun 	.bLength =		USB_DT_INTERFACE_SIZE,
112*4882a593Smuzhiyun 	.bDescriptorType =	USB_DT_INTERFACE,
113*4882a593Smuzhiyun 	.bAlternateSetting =	0,
114*4882a593Smuzhiyun 	.bNumEndpoints =	0,
115*4882a593Smuzhiyun 	.bInterfaceClass =	USB_CLASS_AUDIO,
116*4882a593Smuzhiyun 	.bInterfaceSubClass =	USB_SUBCLASS_AUDIOSTREAMING,
117*4882a593Smuzhiyun };
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun static struct usb_interface_descriptor as_interface_alt_1_desc = {
120*4882a593Smuzhiyun 	.bLength =		USB_DT_INTERFACE_SIZE,
121*4882a593Smuzhiyun 	.bDescriptorType =	USB_DT_INTERFACE,
122*4882a593Smuzhiyun 	.bAlternateSetting =	1,
123*4882a593Smuzhiyun 	.bNumEndpoints =	1,
124*4882a593Smuzhiyun 	.bInterfaceClass =	USB_CLASS_AUDIO,
125*4882a593Smuzhiyun 	.bInterfaceSubClass =	USB_SUBCLASS_AUDIOSTREAMING,
126*4882a593Smuzhiyun };
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun /* B.4.2  Class-Specific AS Interface Descriptor */
129*4882a593Smuzhiyun static struct uac1_as_header_descriptor as_header_desc = {
130*4882a593Smuzhiyun 	.bLength =		UAC_DT_AS_HEADER_SIZE,
131*4882a593Smuzhiyun 	.bDescriptorType =	USB_DT_CS_INTERFACE,
132*4882a593Smuzhiyun 	.bDescriptorSubtype =	UAC_AS_GENERAL,
133*4882a593Smuzhiyun 	.bTerminalLink =	INPUT_TERMINAL_ID,
134*4882a593Smuzhiyun 	.bDelay =		1,
135*4882a593Smuzhiyun 	.wFormatTag =		UAC_FORMAT_TYPE_I_PCM,
136*4882a593Smuzhiyun };
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(1);
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun static struct uac_format_type_i_discrete_descriptor_1 as_type_i_desc = {
141*4882a593Smuzhiyun 	.bLength =		UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(1),
142*4882a593Smuzhiyun 	.bDescriptorType =	USB_DT_CS_INTERFACE,
143*4882a593Smuzhiyun 	.bDescriptorSubtype =	UAC_FORMAT_TYPE,
144*4882a593Smuzhiyun 	.bFormatType =		UAC_FORMAT_TYPE_I,
145*4882a593Smuzhiyun 	.bSubframeSize =	2,
146*4882a593Smuzhiyun 	.bBitResolution =	16,
147*4882a593Smuzhiyun 	.bSamFreqType =		1,
148*4882a593Smuzhiyun };
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun /* Standard ISO IN Endpoint Descriptor for highspeed */
151*4882a593Smuzhiyun static struct usb_endpoint_descriptor hs_as_in_ep_desc  = {
152*4882a593Smuzhiyun 	.bLength =		USB_DT_ENDPOINT_AUDIO_SIZE,
153*4882a593Smuzhiyun 	.bDescriptorType =	USB_DT_ENDPOINT,
154*4882a593Smuzhiyun 	.bEndpointAddress =	USB_DIR_IN,
155*4882a593Smuzhiyun 	.bmAttributes =		USB_ENDPOINT_SYNC_SYNC
156*4882a593Smuzhiyun 				| USB_ENDPOINT_XFER_ISOC,
157*4882a593Smuzhiyun 	.wMaxPacketSize =	__constant_cpu_to_le16(IN_EP_MAX_PACKET_SIZE),
158*4882a593Smuzhiyun 	.bInterval =		4, /* poll 1 per millisecond */
159*4882a593Smuzhiyun };
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun /* Standard ISO IN Endpoint Descriptor for highspeed */
162*4882a593Smuzhiyun static struct usb_endpoint_descriptor fs_as_in_ep_desc  = {
163*4882a593Smuzhiyun 	.bLength =		USB_DT_ENDPOINT_AUDIO_SIZE,
164*4882a593Smuzhiyun 	.bDescriptorType =	USB_DT_ENDPOINT,
165*4882a593Smuzhiyun 	.bEndpointAddress =	USB_DIR_IN,
166*4882a593Smuzhiyun 	.bmAttributes =		USB_ENDPOINT_SYNC_SYNC
167*4882a593Smuzhiyun 				| USB_ENDPOINT_XFER_ISOC,
168*4882a593Smuzhiyun 	.wMaxPacketSize =	__constant_cpu_to_le16(IN_EP_MAX_PACKET_SIZE),
169*4882a593Smuzhiyun 	.bInterval =		1, /* poll 1 per millisecond */
170*4882a593Smuzhiyun };
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun /* Class-specific AS ISO OUT Endpoint Descriptor */
173*4882a593Smuzhiyun static struct uac_iso_endpoint_descriptor as_iso_in_desc = {
174*4882a593Smuzhiyun 	.bLength =		UAC_ISO_ENDPOINT_DESC_SIZE,
175*4882a593Smuzhiyun 	.bDescriptorType =	USB_DT_CS_ENDPOINT,
176*4882a593Smuzhiyun 	.bDescriptorSubtype =	UAC_EP_GENERAL,
177*4882a593Smuzhiyun 	.bmAttributes =		1,
178*4882a593Smuzhiyun 	.bLockDelayUnits =	1,
179*4882a593Smuzhiyun 	.wLockDelay =		__constant_cpu_to_le16(1),
180*4882a593Smuzhiyun };
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun static struct usb_descriptor_header *hs_audio_desc[] = {
183*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&ac_interface_desc,
184*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&ac_header_desc,
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&input_terminal_desc,
187*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&output_terminal_desc,
188*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&feature_unit_desc,
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&as_interface_alt_0_desc,
191*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&as_interface_alt_1_desc,
192*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&as_header_desc,
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&as_type_i_desc,
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&hs_as_in_ep_desc,
197*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&as_iso_in_desc,
198*4882a593Smuzhiyun 	NULL,
199*4882a593Smuzhiyun };
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun static struct usb_descriptor_header *fs_audio_desc[] = {
202*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&ac_interface_desc,
203*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&ac_header_desc,
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&input_terminal_desc,
206*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&output_terminal_desc,
207*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&feature_unit_desc,
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&as_interface_alt_0_desc,
210*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&as_interface_alt_1_desc,
211*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&as_header_desc,
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&as_type_i_desc,
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&fs_as_in_ep_desc,
216*4882a593Smuzhiyun 	(struct usb_descriptor_header *)&as_iso_in_desc,
217*4882a593Smuzhiyun 	NULL,
218*4882a593Smuzhiyun };
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun static struct snd_pcm_hardware audio_hw_info = {
221*4882a593Smuzhiyun 	.info =			SNDRV_PCM_INFO_MMAP |
222*4882a593Smuzhiyun 				SNDRV_PCM_INFO_MMAP_VALID |
223*4882a593Smuzhiyun 				SNDRV_PCM_INFO_BATCH |
224*4882a593Smuzhiyun 				SNDRV_PCM_INFO_INTERLEAVED |
225*4882a593Smuzhiyun 				SNDRV_PCM_INFO_BLOCK_TRANSFER,
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	.formats		= SNDRV_PCM_FMTBIT_S16_LE,
228*4882a593Smuzhiyun 	.channels_min		= 2,
229*4882a593Smuzhiyun 	.channels_max		= 2,
230*4882a593Smuzhiyun 	.rate_min		= SAMPLE_RATE,
231*4882a593Smuzhiyun 	.rate_max		= SAMPLE_RATE,
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	.buffer_bytes_max =	1024 * 1024,
234*4882a593Smuzhiyun 	.period_bytes_min =	64,
235*4882a593Smuzhiyun 	.period_bytes_max =	512 * 1024,
236*4882a593Smuzhiyun 	.periods_min =		2,
237*4882a593Smuzhiyun 	.periods_max =		1024,
238*4882a593Smuzhiyun };
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun /*-------------------------------------------------------------------------*/
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun struct audio_source_config {
243*4882a593Smuzhiyun 	int	card;
244*4882a593Smuzhiyun 	int	device;
245*4882a593Smuzhiyun };
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun struct audio_dev {
248*4882a593Smuzhiyun 	struct usb_function		func;
249*4882a593Smuzhiyun 	struct snd_card			*card;
250*4882a593Smuzhiyun 	struct snd_pcm			*pcm;
251*4882a593Smuzhiyun 	struct snd_pcm_substream *substream;
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	struct list_head		idle_reqs;
254*4882a593Smuzhiyun 	struct usb_ep			*in_ep;
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	spinlock_t			lock;
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	/* beginning, end and current position in our buffer */
259*4882a593Smuzhiyun 	void				*buffer_start;
260*4882a593Smuzhiyun 	void				*buffer_end;
261*4882a593Smuzhiyun 	void				*buffer_pos;
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	/* byte size of a "period" */
264*4882a593Smuzhiyun 	unsigned int			period;
265*4882a593Smuzhiyun 	/* bytes sent since last call to snd_pcm_period_elapsed */
266*4882a593Smuzhiyun 	unsigned int			period_offset;
267*4882a593Smuzhiyun 	/* time we started playing */
268*4882a593Smuzhiyun 	ktime_t				start_time;
269*4882a593Smuzhiyun 	/* number of frames sent since start_time */
270*4882a593Smuzhiyun 	s64				frames_sent;
271*4882a593Smuzhiyun 	struct audio_source_config	*config;
272*4882a593Smuzhiyun 	/* for creating and issuing QoS requests */
273*4882a593Smuzhiyun 	struct pm_qos_request pm_qos;
274*4882a593Smuzhiyun };
275*4882a593Smuzhiyun 
func_to_audio(struct usb_function * f)276*4882a593Smuzhiyun static inline struct audio_dev *func_to_audio(struct usb_function *f)
277*4882a593Smuzhiyun {
278*4882a593Smuzhiyun 	return container_of(f, struct audio_dev, func);
279*4882a593Smuzhiyun }
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun /*-------------------------------------------------------------------------*/
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun struct audio_source_instance {
284*4882a593Smuzhiyun 	struct usb_function_instance func_inst;
285*4882a593Smuzhiyun 	const char *name;
286*4882a593Smuzhiyun 	struct audio_source_config *config;
287*4882a593Smuzhiyun 	struct device *audio_device;
288*4882a593Smuzhiyun };
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun static void audio_source_attr_release(struct config_item *item);
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun static struct configfs_item_operations audio_source_item_ops = {
293*4882a593Smuzhiyun 	.release        = audio_source_attr_release,
294*4882a593Smuzhiyun };
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun static struct config_item_type audio_source_func_type = {
297*4882a593Smuzhiyun 	.ct_item_ops    = &audio_source_item_ops,
298*4882a593Smuzhiyun 	.ct_owner       = THIS_MODULE,
299*4882a593Smuzhiyun };
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun static ssize_t audio_source_pcm_show(struct device *dev,
302*4882a593Smuzhiyun 		struct device_attribute *attr, char *buf);
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun static DEVICE_ATTR(pcm, S_IRUGO, audio_source_pcm_show, NULL);
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun static struct device_attribute *audio_source_function_attributes[] = {
307*4882a593Smuzhiyun 	&dev_attr_pcm,
308*4882a593Smuzhiyun 	NULL
309*4882a593Smuzhiyun };
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun /*--------------------------------------------------------------------------*/
312*4882a593Smuzhiyun 
audio_request_new(struct usb_ep * ep,int buffer_size)313*4882a593Smuzhiyun static struct usb_request *audio_request_new(struct usb_ep *ep, int buffer_size)
314*4882a593Smuzhiyun {
315*4882a593Smuzhiyun 	struct usb_request *req = usb_ep_alloc_request(ep, GFP_KERNEL);
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 	if (!req)
318*4882a593Smuzhiyun 		return NULL;
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun 	req->buf = kmalloc(buffer_size, GFP_KERNEL);
321*4882a593Smuzhiyun 	if (!req->buf) {
322*4882a593Smuzhiyun 		usb_ep_free_request(ep, req);
323*4882a593Smuzhiyun 		return NULL;
324*4882a593Smuzhiyun 	}
325*4882a593Smuzhiyun 	req->length = buffer_size;
326*4882a593Smuzhiyun 	return req;
327*4882a593Smuzhiyun }
328*4882a593Smuzhiyun 
audio_request_free(struct usb_request * req,struct usb_ep * ep)329*4882a593Smuzhiyun static void audio_request_free(struct usb_request *req, struct usb_ep *ep)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun 	if (req) {
332*4882a593Smuzhiyun 		kfree(req->buf);
333*4882a593Smuzhiyun 		usb_ep_free_request(ep, req);
334*4882a593Smuzhiyun 	}
335*4882a593Smuzhiyun }
336*4882a593Smuzhiyun 
audio_req_put(struct audio_dev * audio,struct usb_request * req)337*4882a593Smuzhiyun static void audio_req_put(struct audio_dev *audio, struct usb_request *req)
338*4882a593Smuzhiyun {
339*4882a593Smuzhiyun 	unsigned long flags;
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 	spin_lock_irqsave(&audio->lock, flags);
342*4882a593Smuzhiyun 	list_add_tail(&req->list, &audio->idle_reqs);
343*4882a593Smuzhiyun 	spin_unlock_irqrestore(&audio->lock, flags);
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun 
audio_req_get(struct audio_dev * audio)346*4882a593Smuzhiyun static struct usb_request *audio_req_get(struct audio_dev *audio)
347*4882a593Smuzhiyun {
348*4882a593Smuzhiyun 	unsigned long flags;
349*4882a593Smuzhiyun 	struct usb_request *req;
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun 	spin_lock_irqsave(&audio->lock, flags);
352*4882a593Smuzhiyun 	if (list_empty(&audio->idle_reqs)) {
353*4882a593Smuzhiyun 		req = 0;
354*4882a593Smuzhiyun 	} else {
355*4882a593Smuzhiyun 		req = list_first_entry(&audio->idle_reqs, struct usb_request,
356*4882a593Smuzhiyun 				list);
357*4882a593Smuzhiyun 		list_del(&req->list);
358*4882a593Smuzhiyun 	}
359*4882a593Smuzhiyun 	spin_unlock_irqrestore(&audio->lock, flags);
360*4882a593Smuzhiyun 	return req;
361*4882a593Smuzhiyun }
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun /* send the appropriate number of packets to match our bitrate */
audio_send(struct audio_dev * audio)364*4882a593Smuzhiyun static void audio_send(struct audio_dev *audio)
365*4882a593Smuzhiyun {
366*4882a593Smuzhiyun 	struct snd_pcm_runtime *runtime;
367*4882a593Smuzhiyun 	struct usb_request *req;
368*4882a593Smuzhiyun 	int length, length1, length2, ret;
369*4882a593Smuzhiyun 	s64 msecs;
370*4882a593Smuzhiyun 	s64 frames;
371*4882a593Smuzhiyun 	ktime_t now;
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun 	/* audio->substream will be null if we have been closed */
374*4882a593Smuzhiyun 	if (!audio->substream)
375*4882a593Smuzhiyun 		return;
376*4882a593Smuzhiyun 	/* audio->buffer_pos will be null if we have been stopped */
377*4882a593Smuzhiyun 	if (!audio->buffer_pos)
378*4882a593Smuzhiyun 		return;
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun 	runtime = audio->substream->runtime;
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun 	/* compute number of frames to send */
383*4882a593Smuzhiyun 	now = ktime_get();
384*4882a593Smuzhiyun 	msecs = div_s64((ktime_to_ns(now) - ktime_to_ns(audio->start_time)),
385*4882a593Smuzhiyun 			1000000);
386*4882a593Smuzhiyun 	frames = div_s64((msecs * SAMPLE_RATE), 1000);
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 	/* Readjust our frames_sent if we fall too far behind.
389*4882a593Smuzhiyun 	 * If we get too far behind it is better to drop some frames than
390*4882a593Smuzhiyun 	 * to keep sending data too fast in an attempt to catch up.
391*4882a593Smuzhiyun 	 */
392*4882a593Smuzhiyun 	if (frames - audio->frames_sent > 10 * FRAMES_PER_MSEC)
393*4882a593Smuzhiyun 		audio->frames_sent = frames - FRAMES_PER_MSEC;
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun 	frames -= audio->frames_sent;
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun 	/* We need to send something to keep the pipeline going */
398*4882a593Smuzhiyun 	if (frames <= 0)
399*4882a593Smuzhiyun 		frames = FRAMES_PER_MSEC;
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun 	while (frames > 0) {
402*4882a593Smuzhiyun 		req = audio_req_get(audio);
403*4882a593Smuzhiyun 		if (!req)
404*4882a593Smuzhiyun 			break;
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun 		length = frames_to_bytes(runtime, frames);
407*4882a593Smuzhiyun 		if (length > IN_EP_MAX_PACKET_SIZE)
408*4882a593Smuzhiyun 			length = IN_EP_MAX_PACKET_SIZE;
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun 		if (audio->buffer_pos + length > audio->buffer_end)
411*4882a593Smuzhiyun 			length1 = audio->buffer_end - audio->buffer_pos;
412*4882a593Smuzhiyun 		else
413*4882a593Smuzhiyun 			length1 = length;
414*4882a593Smuzhiyun 		memcpy(req->buf, audio->buffer_pos, length1);
415*4882a593Smuzhiyun 		if (length1 < length) {
416*4882a593Smuzhiyun 			/* Wrap around and copy remaining length
417*4882a593Smuzhiyun 			 * at beginning of buffer.
418*4882a593Smuzhiyun 			 */
419*4882a593Smuzhiyun 			length2 = length - length1;
420*4882a593Smuzhiyun 			memcpy(req->buf + length1, audio->buffer_start,
421*4882a593Smuzhiyun 					length2);
422*4882a593Smuzhiyun 			audio->buffer_pos = audio->buffer_start + length2;
423*4882a593Smuzhiyun 		} else {
424*4882a593Smuzhiyun 			audio->buffer_pos += length1;
425*4882a593Smuzhiyun 			if (audio->buffer_pos >= audio->buffer_end)
426*4882a593Smuzhiyun 				audio->buffer_pos = audio->buffer_start;
427*4882a593Smuzhiyun 		}
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun 		req->length = length;
430*4882a593Smuzhiyun 		ret = usb_ep_queue(audio->in_ep, req, GFP_ATOMIC);
431*4882a593Smuzhiyun 		if (ret < 0) {
432*4882a593Smuzhiyun 			pr_err("usb_ep_queue failed ret: %d\n", ret);
433*4882a593Smuzhiyun 			audio_req_put(audio, req);
434*4882a593Smuzhiyun 			break;
435*4882a593Smuzhiyun 		}
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun 		frames -= bytes_to_frames(runtime, length);
438*4882a593Smuzhiyun 		audio->frames_sent += bytes_to_frames(runtime, length);
439*4882a593Smuzhiyun 	}
440*4882a593Smuzhiyun }
441*4882a593Smuzhiyun 
audio_control_complete(struct usb_ep * ep,struct usb_request * req)442*4882a593Smuzhiyun static void audio_control_complete(struct usb_ep *ep, struct usb_request *req)
443*4882a593Smuzhiyun {
444*4882a593Smuzhiyun 	/* nothing to do here */
445*4882a593Smuzhiyun }
446*4882a593Smuzhiyun 
audio_data_complete(struct usb_ep * ep,struct usb_request * req)447*4882a593Smuzhiyun static void audio_data_complete(struct usb_ep *ep, struct usb_request *req)
448*4882a593Smuzhiyun {
449*4882a593Smuzhiyun 	struct audio_dev *audio = req->context;
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun 	pr_debug("audio_data_complete req->status %d req->actual %d\n",
452*4882a593Smuzhiyun 		req->status, req->actual);
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun 	audio_req_put(audio, req);
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun 	if (!audio->buffer_start || req->status)
457*4882a593Smuzhiyun 		return;
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun 	audio->period_offset += req->actual;
460*4882a593Smuzhiyun 	if (audio->period_offset >= audio->period) {
461*4882a593Smuzhiyun 		snd_pcm_period_elapsed(audio->substream);
462*4882a593Smuzhiyun 		audio->period_offset = 0;
463*4882a593Smuzhiyun 	}
464*4882a593Smuzhiyun 	audio_send(audio);
465*4882a593Smuzhiyun }
466*4882a593Smuzhiyun 
audio_set_endpoint_req(struct usb_function * f,const struct usb_ctrlrequest * ctrl)467*4882a593Smuzhiyun static int audio_set_endpoint_req(struct usb_function *f,
468*4882a593Smuzhiyun 		const struct usb_ctrlrequest *ctrl)
469*4882a593Smuzhiyun {
470*4882a593Smuzhiyun 	int value = -EOPNOTSUPP;
471*4882a593Smuzhiyun 	u16 ep = le16_to_cpu(ctrl->wIndex);
472*4882a593Smuzhiyun 	u16 len = le16_to_cpu(ctrl->wLength);
473*4882a593Smuzhiyun 	u16 w_value = le16_to_cpu(ctrl->wValue);
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun 	pr_debug("bRequest 0x%x, w_value 0x%04x, len %d, endpoint %d\n",
476*4882a593Smuzhiyun 			ctrl->bRequest, w_value, len, ep);
477*4882a593Smuzhiyun 
478*4882a593Smuzhiyun 	switch (ctrl->bRequest) {
479*4882a593Smuzhiyun 	case UAC_SET_CUR:
480*4882a593Smuzhiyun 	case UAC_SET_MIN:
481*4882a593Smuzhiyun 	case UAC_SET_MAX:
482*4882a593Smuzhiyun 	case UAC_SET_RES:
483*4882a593Smuzhiyun 		value = len;
484*4882a593Smuzhiyun 		break;
485*4882a593Smuzhiyun 	default:
486*4882a593Smuzhiyun 		break;
487*4882a593Smuzhiyun 	}
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun 	return value;
490*4882a593Smuzhiyun }
491*4882a593Smuzhiyun 
audio_get_endpoint_req(struct usb_function * f,const struct usb_ctrlrequest * ctrl)492*4882a593Smuzhiyun static int audio_get_endpoint_req(struct usb_function *f,
493*4882a593Smuzhiyun 		const struct usb_ctrlrequest *ctrl)
494*4882a593Smuzhiyun {
495*4882a593Smuzhiyun 	struct usb_composite_dev *cdev = f->config->cdev;
496*4882a593Smuzhiyun 	int value = -EOPNOTSUPP;
497*4882a593Smuzhiyun 	u8 ep = ((le16_to_cpu(ctrl->wIndex) >> 8) & 0xFF);
498*4882a593Smuzhiyun 	u16 len = le16_to_cpu(ctrl->wLength);
499*4882a593Smuzhiyun 	u16 w_value = le16_to_cpu(ctrl->wValue);
500*4882a593Smuzhiyun 	u8 *buf = cdev->req->buf;
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun 	pr_debug("bRequest 0x%x, w_value 0x%04x, len %d, endpoint %d\n",
503*4882a593Smuzhiyun 			ctrl->bRequest, w_value, len, ep);
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun 	if (w_value == UAC_EP_CS_ATTR_SAMPLE_RATE << 8) {
506*4882a593Smuzhiyun 		switch (ctrl->bRequest) {
507*4882a593Smuzhiyun 		case UAC_GET_CUR:
508*4882a593Smuzhiyun 		case UAC_GET_MIN:
509*4882a593Smuzhiyun 		case UAC_GET_MAX:
510*4882a593Smuzhiyun 		case UAC_GET_RES:
511*4882a593Smuzhiyun 			/* return our sample rate */
512*4882a593Smuzhiyun 			buf[0] = (u8)SAMPLE_RATE;
513*4882a593Smuzhiyun 			buf[1] = (u8)(SAMPLE_RATE >> 8);
514*4882a593Smuzhiyun 			buf[2] = (u8)(SAMPLE_RATE >> 16);
515*4882a593Smuzhiyun 			value = 3;
516*4882a593Smuzhiyun 			break;
517*4882a593Smuzhiyun 		default:
518*4882a593Smuzhiyun 			break;
519*4882a593Smuzhiyun 		}
520*4882a593Smuzhiyun 	}
521*4882a593Smuzhiyun 
522*4882a593Smuzhiyun 	return value;
523*4882a593Smuzhiyun }
524*4882a593Smuzhiyun 
525*4882a593Smuzhiyun static int
audio_setup(struct usb_function * f,const struct usb_ctrlrequest * ctrl)526*4882a593Smuzhiyun audio_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
527*4882a593Smuzhiyun {
528*4882a593Smuzhiyun 	struct usb_composite_dev *cdev = f->config->cdev;
529*4882a593Smuzhiyun 	struct usb_request *req = cdev->req;
530*4882a593Smuzhiyun 	int value = -EOPNOTSUPP;
531*4882a593Smuzhiyun 	u16 w_index = le16_to_cpu(ctrl->wIndex);
532*4882a593Smuzhiyun 	u16 w_value = le16_to_cpu(ctrl->wValue);
533*4882a593Smuzhiyun 	u16 w_length = le16_to_cpu(ctrl->wLength);
534*4882a593Smuzhiyun 
535*4882a593Smuzhiyun 	/* composite driver infrastructure handles everything; interface
536*4882a593Smuzhiyun 	 * activation uses set_alt().
537*4882a593Smuzhiyun 	 */
538*4882a593Smuzhiyun 	switch (ctrl->bRequestType) {
539*4882a593Smuzhiyun 	case USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_ENDPOINT:
540*4882a593Smuzhiyun 		value = audio_set_endpoint_req(f, ctrl);
541*4882a593Smuzhiyun 		break;
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun 	case USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_ENDPOINT:
544*4882a593Smuzhiyun 		value = audio_get_endpoint_req(f, ctrl);
545*4882a593Smuzhiyun 		break;
546*4882a593Smuzhiyun 	}
547*4882a593Smuzhiyun 
548*4882a593Smuzhiyun 	/* respond with data transfer or status phase? */
549*4882a593Smuzhiyun 	if (value >= 0) {
550*4882a593Smuzhiyun 		pr_debug("audio req%02x.%02x v%04x i%04x l%d\n",
551*4882a593Smuzhiyun 			ctrl->bRequestType, ctrl->bRequest,
552*4882a593Smuzhiyun 			w_value, w_index, w_length);
553*4882a593Smuzhiyun 		req->zero = 0;
554*4882a593Smuzhiyun 		req->length = value;
555*4882a593Smuzhiyun 		req->complete = audio_control_complete;
556*4882a593Smuzhiyun 		value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
557*4882a593Smuzhiyun 		if (value < 0)
558*4882a593Smuzhiyun 			pr_err("audio response on err %d\n", value);
559*4882a593Smuzhiyun 	}
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun 	/* device either stalls (value < 0) or reports success */
562*4882a593Smuzhiyun 	return value;
563*4882a593Smuzhiyun }
564*4882a593Smuzhiyun 
audio_set_alt(struct usb_function * f,unsigned intf,unsigned alt)565*4882a593Smuzhiyun static int audio_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
566*4882a593Smuzhiyun {
567*4882a593Smuzhiyun 	struct audio_dev *audio = func_to_audio(f);
568*4882a593Smuzhiyun 	struct usb_composite_dev *cdev = f->config->cdev;
569*4882a593Smuzhiyun 	int ret;
570*4882a593Smuzhiyun 
571*4882a593Smuzhiyun 	pr_debug("audio_set_alt intf %d, alt %d\n", intf, alt);
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun 	ret = config_ep_by_speed(cdev->gadget, f, audio->in_ep);
574*4882a593Smuzhiyun 	if (ret)
575*4882a593Smuzhiyun 		return ret;
576*4882a593Smuzhiyun 
577*4882a593Smuzhiyun 	usb_ep_enable(audio->in_ep);
578*4882a593Smuzhiyun 	return 0;
579*4882a593Smuzhiyun }
580*4882a593Smuzhiyun 
audio_disable(struct usb_function * f)581*4882a593Smuzhiyun static void audio_disable(struct usb_function *f)
582*4882a593Smuzhiyun {
583*4882a593Smuzhiyun 	struct audio_dev	*audio = func_to_audio(f);
584*4882a593Smuzhiyun 
585*4882a593Smuzhiyun 	pr_debug("audio_disable\n");
586*4882a593Smuzhiyun 	usb_ep_disable(audio->in_ep);
587*4882a593Smuzhiyun }
588*4882a593Smuzhiyun 
audio_free_func(struct usb_function * f)589*4882a593Smuzhiyun static void audio_free_func(struct usb_function *f)
590*4882a593Smuzhiyun {
591*4882a593Smuzhiyun 	/* no-op */
592*4882a593Smuzhiyun }
593*4882a593Smuzhiyun 
594*4882a593Smuzhiyun /*-------------------------------------------------------------------------*/
595*4882a593Smuzhiyun 
audio_build_desc(struct audio_dev * audio)596*4882a593Smuzhiyun static void audio_build_desc(struct audio_dev *audio)
597*4882a593Smuzhiyun {
598*4882a593Smuzhiyun 	u8 *sam_freq;
599*4882a593Smuzhiyun 	int rate;
600*4882a593Smuzhiyun 
601*4882a593Smuzhiyun 	/* Set channel numbers */
602*4882a593Smuzhiyun 	input_terminal_desc.bNrChannels = 2;
603*4882a593Smuzhiyun 	as_type_i_desc.bNrChannels = 2;
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun 	/* Set sample rates */
606*4882a593Smuzhiyun 	rate = SAMPLE_RATE;
607*4882a593Smuzhiyun 	sam_freq = as_type_i_desc.tSamFreq[0];
608*4882a593Smuzhiyun 	memcpy(sam_freq, &rate, 3);
609*4882a593Smuzhiyun }
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun 
612*4882a593Smuzhiyun static int snd_card_setup(struct usb_configuration *c,
613*4882a593Smuzhiyun 	struct audio_source_config *config);
614*4882a593Smuzhiyun static struct audio_source_instance *to_fi_audio_source(
615*4882a593Smuzhiyun 	const struct usb_function_instance *fi);
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun 
618*4882a593Smuzhiyun /* audio function driver setup/binding */
619*4882a593Smuzhiyun static int
audio_bind(struct usb_configuration * c,struct usb_function * f)620*4882a593Smuzhiyun audio_bind(struct usb_configuration *c, struct usb_function *f)
621*4882a593Smuzhiyun {
622*4882a593Smuzhiyun 	struct usb_composite_dev *cdev = c->cdev;
623*4882a593Smuzhiyun 	struct audio_dev *audio = func_to_audio(f);
624*4882a593Smuzhiyun 	int status;
625*4882a593Smuzhiyun 	struct usb_ep *ep;
626*4882a593Smuzhiyun 	struct usb_request *req;
627*4882a593Smuzhiyun 	int i;
628*4882a593Smuzhiyun 	int err;
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun 	if (IS_ENABLED(CONFIG_USB_CONFIGFS)) {
631*4882a593Smuzhiyun 		struct audio_source_instance *fi_audio =
632*4882a593Smuzhiyun 				to_fi_audio_source(f->fi);
633*4882a593Smuzhiyun 		struct audio_source_config *config =
634*4882a593Smuzhiyun 				fi_audio->config;
635*4882a593Smuzhiyun 
636*4882a593Smuzhiyun 		err = snd_card_setup(c, config);
637*4882a593Smuzhiyun 		if (err)
638*4882a593Smuzhiyun 			return err;
639*4882a593Smuzhiyun 	}
640*4882a593Smuzhiyun 
641*4882a593Smuzhiyun 	audio_build_desc(audio);
642*4882a593Smuzhiyun 
643*4882a593Smuzhiyun 	/* allocate instance-specific interface IDs, and patch descriptors */
644*4882a593Smuzhiyun 	status = usb_interface_id(c, f);
645*4882a593Smuzhiyun 	if (status < 0)
646*4882a593Smuzhiyun 		goto fail;
647*4882a593Smuzhiyun 	ac_interface_desc.bInterfaceNumber = status;
648*4882a593Smuzhiyun 
649*4882a593Smuzhiyun 	/* AUDIO_AC_INTERFACE */
650*4882a593Smuzhiyun 	ac_header_desc.baInterfaceNr[0] = status;
651*4882a593Smuzhiyun 
652*4882a593Smuzhiyun 	status = usb_interface_id(c, f);
653*4882a593Smuzhiyun 	if (status < 0)
654*4882a593Smuzhiyun 		goto fail;
655*4882a593Smuzhiyun 	as_interface_alt_0_desc.bInterfaceNumber = status;
656*4882a593Smuzhiyun 	as_interface_alt_1_desc.bInterfaceNumber = status;
657*4882a593Smuzhiyun 
658*4882a593Smuzhiyun 	/* AUDIO_AS_INTERFACE */
659*4882a593Smuzhiyun 	ac_header_desc.baInterfaceNr[1] = status;
660*4882a593Smuzhiyun 
661*4882a593Smuzhiyun 	status = -ENODEV;
662*4882a593Smuzhiyun 
663*4882a593Smuzhiyun 	/* allocate our endpoint */
664*4882a593Smuzhiyun 	ep = usb_ep_autoconfig(cdev->gadget, &fs_as_in_ep_desc);
665*4882a593Smuzhiyun 	if (!ep)
666*4882a593Smuzhiyun 		goto fail;
667*4882a593Smuzhiyun 	audio->in_ep = ep;
668*4882a593Smuzhiyun 	ep->driver_data = audio; /* claim */
669*4882a593Smuzhiyun 
670*4882a593Smuzhiyun 	if (gadget_is_dualspeed(c->cdev->gadget))
671*4882a593Smuzhiyun 		hs_as_in_ep_desc.bEndpointAddress =
672*4882a593Smuzhiyun 			fs_as_in_ep_desc.bEndpointAddress;
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun 	f->fs_descriptors = fs_audio_desc;
675*4882a593Smuzhiyun 	f->hs_descriptors = hs_audio_desc;
676*4882a593Smuzhiyun 
677*4882a593Smuzhiyun 	for (i = 0, status = 0; i < IN_EP_REQ_COUNT && status == 0; i++) {
678*4882a593Smuzhiyun 		req = audio_request_new(ep, IN_EP_MAX_PACKET_SIZE);
679*4882a593Smuzhiyun 		if (req) {
680*4882a593Smuzhiyun 			req->context = audio;
681*4882a593Smuzhiyun 			req->complete = audio_data_complete;
682*4882a593Smuzhiyun 			audio_req_put(audio, req);
683*4882a593Smuzhiyun 		} else
684*4882a593Smuzhiyun 			status = -ENOMEM;
685*4882a593Smuzhiyun 	}
686*4882a593Smuzhiyun 
687*4882a593Smuzhiyun fail:
688*4882a593Smuzhiyun 	return status;
689*4882a593Smuzhiyun }
690*4882a593Smuzhiyun 
691*4882a593Smuzhiyun static void
audio_unbind(struct usb_configuration * c,struct usb_function * f)692*4882a593Smuzhiyun audio_unbind(struct usb_configuration *c, struct usb_function *f)
693*4882a593Smuzhiyun {
694*4882a593Smuzhiyun 	struct audio_dev *audio = func_to_audio(f);
695*4882a593Smuzhiyun 	struct usb_request *req;
696*4882a593Smuzhiyun 
697*4882a593Smuzhiyun 	while ((req = audio_req_get(audio)))
698*4882a593Smuzhiyun 		audio_request_free(req, audio->in_ep);
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun 	snd_card_free_when_closed(audio->card);
701*4882a593Smuzhiyun 	audio->card = NULL;
702*4882a593Smuzhiyun 	audio->pcm = NULL;
703*4882a593Smuzhiyun 	audio->substream = NULL;
704*4882a593Smuzhiyun 	audio->in_ep = NULL;
705*4882a593Smuzhiyun 
706*4882a593Smuzhiyun 	if (IS_ENABLED(CONFIG_USB_CONFIGFS)) {
707*4882a593Smuzhiyun 		struct audio_source_instance *fi_audio =
708*4882a593Smuzhiyun 				to_fi_audio_source(f->fi);
709*4882a593Smuzhiyun 		struct audio_source_config *config =
710*4882a593Smuzhiyun 				fi_audio->config;
711*4882a593Smuzhiyun 
712*4882a593Smuzhiyun 		config->card = -1;
713*4882a593Smuzhiyun 		config->device = -1;
714*4882a593Smuzhiyun 	}
715*4882a593Smuzhiyun }
716*4882a593Smuzhiyun 
audio_pcm_playback_start(struct audio_dev * audio)717*4882a593Smuzhiyun static void audio_pcm_playback_start(struct audio_dev *audio)
718*4882a593Smuzhiyun {
719*4882a593Smuzhiyun 	audio->start_time = ktime_get();
720*4882a593Smuzhiyun 	audio->frames_sent = 0;
721*4882a593Smuzhiyun 	audio_send(audio);
722*4882a593Smuzhiyun }
723*4882a593Smuzhiyun 
audio_pcm_playback_stop(struct audio_dev * audio)724*4882a593Smuzhiyun static void audio_pcm_playback_stop(struct audio_dev *audio)
725*4882a593Smuzhiyun {
726*4882a593Smuzhiyun 	unsigned long flags;
727*4882a593Smuzhiyun 
728*4882a593Smuzhiyun 	spin_lock_irqsave(&audio->lock, flags);
729*4882a593Smuzhiyun 	audio->buffer_start = 0;
730*4882a593Smuzhiyun 	audio->buffer_end = 0;
731*4882a593Smuzhiyun 	audio->buffer_pos = 0;
732*4882a593Smuzhiyun 	spin_unlock_irqrestore(&audio->lock, flags);
733*4882a593Smuzhiyun }
734*4882a593Smuzhiyun 
audio_pcm_open(struct snd_pcm_substream * substream)735*4882a593Smuzhiyun static int audio_pcm_open(struct snd_pcm_substream *substream)
736*4882a593Smuzhiyun {
737*4882a593Smuzhiyun 	struct snd_pcm_runtime *runtime = substream->runtime;
738*4882a593Smuzhiyun 	struct audio_dev *audio = substream->private_data;
739*4882a593Smuzhiyun 
740*4882a593Smuzhiyun 	runtime->private_data = audio;
741*4882a593Smuzhiyun 	runtime->hw = audio_hw_info;
742*4882a593Smuzhiyun 	snd_pcm_limit_hw_rates(runtime);
743*4882a593Smuzhiyun 	runtime->hw.channels_max = 2;
744*4882a593Smuzhiyun 
745*4882a593Smuzhiyun 	audio->substream = substream;
746*4882a593Smuzhiyun 
747*4882a593Smuzhiyun 	/* Add the QoS request and set the latency to 0 */
748*4882a593Smuzhiyun 	cpu_latency_qos_add_request(&audio->pm_qos, 0);
749*4882a593Smuzhiyun 
750*4882a593Smuzhiyun 	return 0;
751*4882a593Smuzhiyun }
752*4882a593Smuzhiyun 
audio_pcm_close(struct snd_pcm_substream * substream)753*4882a593Smuzhiyun static int audio_pcm_close(struct snd_pcm_substream *substream)
754*4882a593Smuzhiyun {
755*4882a593Smuzhiyun 	struct audio_dev *audio = substream->private_data;
756*4882a593Smuzhiyun 	unsigned long flags;
757*4882a593Smuzhiyun 
758*4882a593Smuzhiyun 	spin_lock_irqsave(&audio->lock, flags);
759*4882a593Smuzhiyun 
760*4882a593Smuzhiyun 	/* Remove the QoS request */
761*4882a593Smuzhiyun 	cpu_latency_qos_remove_request(&audio->pm_qos);
762*4882a593Smuzhiyun 
763*4882a593Smuzhiyun 	audio->substream = NULL;
764*4882a593Smuzhiyun 	spin_unlock_irqrestore(&audio->lock, flags);
765*4882a593Smuzhiyun 
766*4882a593Smuzhiyun 	return 0;
767*4882a593Smuzhiyun }
768*4882a593Smuzhiyun 
audio_pcm_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params)769*4882a593Smuzhiyun static int audio_pcm_hw_params(struct snd_pcm_substream *substream,
770*4882a593Smuzhiyun 				struct snd_pcm_hw_params *params)
771*4882a593Smuzhiyun {
772*4882a593Smuzhiyun 	unsigned int channels = params_channels(params);
773*4882a593Smuzhiyun 	unsigned int rate = params_rate(params);
774*4882a593Smuzhiyun 
775*4882a593Smuzhiyun 	if (rate != SAMPLE_RATE)
776*4882a593Smuzhiyun 		return -EINVAL;
777*4882a593Smuzhiyun 	if (channels != 2)
778*4882a593Smuzhiyun 		return -EINVAL;
779*4882a593Smuzhiyun 
780*4882a593Smuzhiyun 	return snd_pcm_lib_alloc_vmalloc_buffer(substream,
781*4882a593Smuzhiyun 		params_buffer_bytes(params));
782*4882a593Smuzhiyun }
783*4882a593Smuzhiyun 
audio_pcm_hw_free(struct snd_pcm_substream * substream)784*4882a593Smuzhiyun static int audio_pcm_hw_free(struct snd_pcm_substream *substream)
785*4882a593Smuzhiyun {
786*4882a593Smuzhiyun 	return snd_pcm_lib_free_vmalloc_buffer(substream);
787*4882a593Smuzhiyun }
788*4882a593Smuzhiyun 
audio_pcm_prepare(struct snd_pcm_substream * substream)789*4882a593Smuzhiyun static int audio_pcm_prepare(struct snd_pcm_substream *substream)
790*4882a593Smuzhiyun {
791*4882a593Smuzhiyun 	struct snd_pcm_runtime *runtime = substream->runtime;
792*4882a593Smuzhiyun 	struct audio_dev *audio = runtime->private_data;
793*4882a593Smuzhiyun 
794*4882a593Smuzhiyun 	audio->period = snd_pcm_lib_period_bytes(substream);
795*4882a593Smuzhiyun 	audio->period_offset = 0;
796*4882a593Smuzhiyun 	audio->buffer_start = runtime->dma_area;
797*4882a593Smuzhiyun 	audio->buffer_end = audio->buffer_start
798*4882a593Smuzhiyun 		+ snd_pcm_lib_buffer_bytes(substream);
799*4882a593Smuzhiyun 	audio->buffer_pos = audio->buffer_start;
800*4882a593Smuzhiyun 
801*4882a593Smuzhiyun 	return 0;
802*4882a593Smuzhiyun }
803*4882a593Smuzhiyun 
audio_pcm_pointer(struct snd_pcm_substream * substream)804*4882a593Smuzhiyun static snd_pcm_uframes_t audio_pcm_pointer(struct snd_pcm_substream *substream)
805*4882a593Smuzhiyun {
806*4882a593Smuzhiyun 	struct snd_pcm_runtime *runtime = substream->runtime;
807*4882a593Smuzhiyun 	struct audio_dev *audio = runtime->private_data;
808*4882a593Smuzhiyun 	ssize_t bytes = audio->buffer_pos - audio->buffer_start;
809*4882a593Smuzhiyun 
810*4882a593Smuzhiyun 	/* return offset of next frame to fill in our buffer */
811*4882a593Smuzhiyun 	return bytes_to_frames(runtime, bytes);
812*4882a593Smuzhiyun }
813*4882a593Smuzhiyun 
audio_pcm_playback_trigger(struct snd_pcm_substream * substream,int cmd)814*4882a593Smuzhiyun static int audio_pcm_playback_trigger(struct snd_pcm_substream *substream,
815*4882a593Smuzhiyun 					int cmd)
816*4882a593Smuzhiyun {
817*4882a593Smuzhiyun 	struct audio_dev *audio = substream->runtime->private_data;
818*4882a593Smuzhiyun 	int ret = 0;
819*4882a593Smuzhiyun 
820*4882a593Smuzhiyun 	switch (cmd) {
821*4882a593Smuzhiyun 	case SNDRV_PCM_TRIGGER_START:
822*4882a593Smuzhiyun 	case SNDRV_PCM_TRIGGER_RESUME:
823*4882a593Smuzhiyun 		audio_pcm_playback_start(audio);
824*4882a593Smuzhiyun 		break;
825*4882a593Smuzhiyun 
826*4882a593Smuzhiyun 	case SNDRV_PCM_TRIGGER_STOP:
827*4882a593Smuzhiyun 	case SNDRV_PCM_TRIGGER_SUSPEND:
828*4882a593Smuzhiyun 		audio_pcm_playback_stop(audio);
829*4882a593Smuzhiyun 		break;
830*4882a593Smuzhiyun 
831*4882a593Smuzhiyun 	default:
832*4882a593Smuzhiyun 		ret = -EINVAL;
833*4882a593Smuzhiyun 	}
834*4882a593Smuzhiyun 
835*4882a593Smuzhiyun 	return ret;
836*4882a593Smuzhiyun }
837*4882a593Smuzhiyun 
838*4882a593Smuzhiyun static struct audio_dev _audio_dev = {
839*4882a593Smuzhiyun 	.func = {
840*4882a593Smuzhiyun 		.name = "audio_source",
841*4882a593Smuzhiyun 		.bind = audio_bind,
842*4882a593Smuzhiyun 		.unbind = audio_unbind,
843*4882a593Smuzhiyun 		.set_alt = audio_set_alt,
844*4882a593Smuzhiyun 		.setup = audio_setup,
845*4882a593Smuzhiyun 		.disable = audio_disable,
846*4882a593Smuzhiyun 		.free_func = audio_free_func,
847*4882a593Smuzhiyun 	},
848*4882a593Smuzhiyun 	.lock = __SPIN_LOCK_UNLOCKED(_audio_dev.lock),
849*4882a593Smuzhiyun 	.idle_reqs = LIST_HEAD_INIT(_audio_dev.idle_reqs),
850*4882a593Smuzhiyun };
851*4882a593Smuzhiyun 
852*4882a593Smuzhiyun static struct snd_pcm_ops audio_playback_ops = {
853*4882a593Smuzhiyun 	.open		= audio_pcm_open,
854*4882a593Smuzhiyun 	.close		= audio_pcm_close,
855*4882a593Smuzhiyun 	.ioctl		= snd_pcm_lib_ioctl,
856*4882a593Smuzhiyun 	.hw_params	= audio_pcm_hw_params,
857*4882a593Smuzhiyun 	.hw_free	= audio_pcm_hw_free,
858*4882a593Smuzhiyun 	.prepare	= audio_pcm_prepare,
859*4882a593Smuzhiyun 	.trigger	= audio_pcm_playback_trigger,
860*4882a593Smuzhiyun 	.pointer	= audio_pcm_pointer,
861*4882a593Smuzhiyun };
862*4882a593Smuzhiyun 
audio_source_bind_config(struct usb_configuration * c,struct audio_source_config * config)863*4882a593Smuzhiyun int audio_source_bind_config(struct usb_configuration *c,
864*4882a593Smuzhiyun 		struct audio_source_config *config)
865*4882a593Smuzhiyun {
866*4882a593Smuzhiyun 	struct audio_dev *audio;
867*4882a593Smuzhiyun 	int err;
868*4882a593Smuzhiyun 
869*4882a593Smuzhiyun 	config->card = -1;
870*4882a593Smuzhiyun 	config->device = -1;
871*4882a593Smuzhiyun 
872*4882a593Smuzhiyun 	audio = &_audio_dev;
873*4882a593Smuzhiyun 
874*4882a593Smuzhiyun 	err = snd_card_setup(c, config);
875*4882a593Smuzhiyun 	if (err)
876*4882a593Smuzhiyun 		return err;
877*4882a593Smuzhiyun 
878*4882a593Smuzhiyun 	err = usb_add_function(c, &audio->func);
879*4882a593Smuzhiyun 	if (err)
880*4882a593Smuzhiyun 		goto add_fail;
881*4882a593Smuzhiyun 
882*4882a593Smuzhiyun 	return 0;
883*4882a593Smuzhiyun 
884*4882a593Smuzhiyun add_fail:
885*4882a593Smuzhiyun 	snd_card_free(audio->card);
886*4882a593Smuzhiyun 	return err;
887*4882a593Smuzhiyun }
888*4882a593Smuzhiyun 
snd_card_setup(struct usb_configuration * c,struct audio_source_config * config)889*4882a593Smuzhiyun static int snd_card_setup(struct usb_configuration *c,
890*4882a593Smuzhiyun 		struct audio_source_config *config)
891*4882a593Smuzhiyun {
892*4882a593Smuzhiyun 	struct audio_dev *audio;
893*4882a593Smuzhiyun 	struct snd_card *card;
894*4882a593Smuzhiyun 	struct snd_pcm *pcm;
895*4882a593Smuzhiyun 	int err;
896*4882a593Smuzhiyun 
897*4882a593Smuzhiyun 	audio = &_audio_dev;
898*4882a593Smuzhiyun 
899*4882a593Smuzhiyun 	err = snd_card_new(&c->cdev->gadget->dev,
900*4882a593Smuzhiyun 			SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
901*4882a593Smuzhiyun 			THIS_MODULE, 0, &card);
902*4882a593Smuzhiyun 	if (err)
903*4882a593Smuzhiyun 		return err;
904*4882a593Smuzhiyun 
905*4882a593Smuzhiyun 	err = snd_pcm_new(card, "USB audio source", 0, 1, 0, &pcm);
906*4882a593Smuzhiyun 	if (err)
907*4882a593Smuzhiyun 		goto pcm_fail;
908*4882a593Smuzhiyun 
909*4882a593Smuzhiyun 	pcm->private_data = audio;
910*4882a593Smuzhiyun 	pcm->info_flags = 0;
911*4882a593Smuzhiyun 	audio->pcm = pcm;
912*4882a593Smuzhiyun 
913*4882a593Smuzhiyun 	strlcpy(pcm->name, "USB gadget audio", sizeof(pcm->name));
914*4882a593Smuzhiyun 
915*4882a593Smuzhiyun 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &audio_playback_ops);
916*4882a593Smuzhiyun 	snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
917*4882a593Smuzhiyun 				NULL, 0, 64 * 1024);
918*4882a593Smuzhiyun 
919*4882a593Smuzhiyun 	strlcpy(card->driver, "audio_source", sizeof(card->driver));
920*4882a593Smuzhiyun 	strlcpy(card->shortname, card->driver, sizeof(card->shortname));
921*4882a593Smuzhiyun 	strlcpy(card->longname, "USB accessory audio source",
922*4882a593Smuzhiyun 		sizeof(card->longname));
923*4882a593Smuzhiyun 
924*4882a593Smuzhiyun 	err = snd_card_register(card);
925*4882a593Smuzhiyun 	if (err)
926*4882a593Smuzhiyun 		goto register_fail;
927*4882a593Smuzhiyun 
928*4882a593Smuzhiyun 	config->card = pcm->card->number;
929*4882a593Smuzhiyun 	config->device = pcm->device;
930*4882a593Smuzhiyun 	audio->card = card;
931*4882a593Smuzhiyun 	return 0;
932*4882a593Smuzhiyun 
933*4882a593Smuzhiyun register_fail:
934*4882a593Smuzhiyun pcm_fail:
935*4882a593Smuzhiyun 	snd_card_free(audio->card);
936*4882a593Smuzhiyun 	return err;
937*4882a593Smuzhiyun }
938*4882a593Smuzhiyun 
to_audio_source_instance(struct config_item * item)939*4882a593Smuzhiyun static struct audio_source_instance *to_audio_source_instance(
940*4882a593Smuzhiyun 					struct config_item *item)
941*4882a593Smuzhiyun {
942*4882a593Smuzhiyun 	return container_of(to_config_group(item), struct audio_source_instance,
943*4882a593Smuzhiyun 		func_inst.group);
944*4882a593Smuzhiyun }
945*4882a593Smuzhiyun 
to_fi_audio_source(const struct usb_function_instance * fi)946*4882a593Smuzhiyun static struct audio_source_instance *to_fi_audio_source(
947*4882a593Smuzhiyun 					const struct usb_function_instance *fi)
948*4882a593Smuzhiyun {
949*4882a593Smuzhiyun 	return container_of(fi, struct audio_source_instance, func_inst);
950*4882a593Smuzhiyun }
951*4882a593Smuzhiyun 
audio_source_attr_release(struct config_item * item)952*4882a593Smuzhiyun static void audio_source_attr_release(struct config_item *item)
953*4882a593Smuzhiyun {
954*4882a593Smuzhiyun 	struct audio_source_instance *fi_audio = to_audio_source_instance(item);
955*4882a593Smuzhiyun 
956*4882a593Smuzhiyun 	usb_put_function_instance(&fi_audio->func_inst);
957*4882a593Smuzhiyun }
958*4882a593Smuzhiyun 
audio_source_set_inst_name(struct usb_function_instance * fi,const char * name)959*4882a593Smuzhiyun static int audio_source_set_inst_name(struct usb_function_instance *fi,
960*4882a593Smuzhiyun 					const char *name)
961*4882a593Smuzhiyun {
962*4882a593Smuzhiyun 	struct audio_source_instance *fi_audio;
963*4882a593Smuzhiyun 	char *ptr;
964*4882a593Smuzhiyun 	int name_len;
965*4882a593Smuzhiyun 
966*4882a593Smuzhiyun 	name_len = strlen(name) + 1;
967*4882a593Smuzhiyun 	if (name_len > MAX_INST_NAME_LEN)
968*4882a593Smuzhiyun 		return -ENAMETOOLONG;
969*4882a593Smuzhiyun 
970*4882a593Smuzhiyun 	ptr = kstrndup(name, name_len, GFP_KERNEL);
971*4882a593Smuzhiyun 	if (!ptr)
972*4882a593Smuzhiyun 		return -ENOMEM;
973*4882a593Smuzhiyun 
974*4882a593Smuzhiyun 	fi_audio = to_fi_audio_source(fi);
975*4882a593Smuzhiyun 	fi_audio->name = ptr;
976*4882a593Smuzhiyun 
977*4882a593Smuzhiyun 	return 0;
978*4882a593Smuzhiyun }
979*4882a593Smuzhiyun 
audio_source_free_inst(struct usb_function_instance * fi)980*4882a593Smuzhiyun static void audio_source_free_inst(struct usb_function_instance *fi)
981*4882a593Smuzhiyun {
982*4882a593Smuzhiyun 	struct audio_source_instance *fi_audio;
983*4882a593Smuzhiyun 
984*4882a593Smuzhiyun 	fi_audio = to_fi_audio_source(fi);
985*4882a593Smuzhiyun 	device_destroy(fi_audio->audio_device->class,
986*4882a593Smuzhiyun 			fi_audio->audio_device->devt);
987*4882a593Smuzhiyun 	kfree(fi_audio->name);
988*4882a593Smuzhiyun 	kfree(fi_audio->config);
989*4882a593Smuzhiyun }
990*4882a593Smuzhiyun 
audio_source_pcm_show(struct device * dev,struct device_attribute * attr,char * buf)991*4882a593Smuzhiyun static ssize_t audio_source_pcm_show(struct device *dev,
992*4882a593Smuzhiyun 		struct device_attribute *attr, char *buf)
993*4882a593Smuzhiyun {
994*4882a593Smuzhiyun 	struct audio_source_instance *fi_audio = dev_get_drvdata(dev);
995*4882a593Smuzhiyun 	struct audio_source_config *config = fi_audio->config;
996*4882a593Smuzhiyun 
997*4882a593Smuzhiyun 	/* print PCM card and device numbers */
998*4882a593Smuzhiyun 	return sprintf(buf, "%d %d\n", config->card, config->device);
999*4882a593Smuzhiyun }
1000*4882a593Smuzhiyun 
1001*4882a593Smuzhiyun struct device *create_function_device(char *name);
1002*4882a593Smuzhiyun 
audio_source_alloc_inst(void)1003*4882a593Smuzhiyun static struct usb_function_instance *audio_source_alloc_inst(void)
1004*4882a593Smuzhiyun {
1005*4882a593Smuzhiyun 	struct audio_source_instance *fi_audio;
1006*4882a593Smuzhiyun 	struct device_attribute **attrs;
1007*4882a593Smuzhiyun 	struct device_attribute *attr;
1008*4882a593Smuzhiyun 	struct device *dev;
1009*4882a593Smuzhiyun 	void *err_ptr;
1010*4882a593Smuzhiyun 	int err = 0;
1011*4882a593Smuzhiyun 
1012*4882a593Smuzhiyun 	fi_audio = kzalloc(sizeof(*fi_audio), GFP_KERNEL);
1013*4882a593Smuzhiyun 	if (!fi_audio)
1014*4882a593Smuzhiyun 		return ERR_PTR(-ENOMEM);
1015*4882a593Smuzhiyun 
1016*4882a593Smuzhiyun 	fi_audio->func_inst.set_inst_name = audio_source_set_inst_name;
1017*4882a593Smuzhiyun 	fi_audio->func_inst.free_func_inst = audio_source_free_inst;
1018*4882a593Smuzhiyun 
1019*4882a593Smuzhiyun 	fi_audio->config = kzalloc(sizeof(struct audio_source_config),
1020*4882a593Smuzhiyun 							GFP_KERNEL);
1021*4882a593Smuzhiyun 	if (!fi_audio->config) {
1022*4882a593Smuzhiyun 		err_ptr = ERR_PTR(-ENOMEM);
1023*4882a593Smuzhiyun 		goto fail_audio;
1024*4882a593Smuzhiyun 	}
1025*4882a593Smuzhiyun 
1026*4882a593Smuzhiyun 	config_group_init_type_name(&fi_audio->func_inst.group, "",
1027*4882a593Smuzhiyun 						&audio_source_func_type);
1028*4882a593Smuzhiyun 	dev = create_function_device("f_audio_source");
1029*4882a593Smuzhiyun 
1030*4882a593Smuzhiyun 	if (IS_ERR(dev)) {
1031*4882a593Smuzhiyun 		err_ptr = dev;
1032*4882a593Smuzhiyun 		goto fail_audio_config;
1033*4882a593Smuzhiyun 	}
1034*4882a593Smuzhiyun 
1035*4882a593Smuzhiyun 	fi_audio->config->card = -1;
1036*4882a593Smuzhiyun 	fi_audio->config->device = -1;
1037*4882a593Smuzhiyun 	fi_audio->audio_device = dev;
1038*4882a593Smuzhiyun 
1039*4882a593Smuzhiyun 	attrs = audio_source_function_attributes;
1040*4882a593Smuzhiyun 	if (attrs) {
1041*4882a593Smuzhiyun 		while ((attr = *attrs++) && !err)
1042*4882a593Smuzhiyun 			err = device_create_file(dev, attr);
1043*4882a593Smuzhiyun 		if (err) {
1044*4882a593Smuzhiyun 			err_ptr = ERR_PTR(-EINVAL);
1045*4882a593Smuzhiyun 			goto fail_device;
1046*4882a593Smuzhiyun 		}
1047*4882a593Smuzhiyun 	}
1048*4882a593Smuzhiyun 
1049*4882a593Smuzhiyun 	dev_set_drvdata(dev, fi_audio);
1050*4882a593Smuzhiyun 	_audio_dev.config = fi_audio->config;
1051*4882a593Smuzhiyun 
1052*4882a593Smuzhiyun 	return  &fi_audio->func_inst;
1053*4882a593Smuzhiyun 
1054*4882a593Smuzhiyun fail_device:
1055*4882a593Smuzhiyun 	device_destroy(dev->class, dev->devt);
1056*4882a593Smuzhiyun fail_audio_config:
1057*4882a593Smuzhiyun 	kfree(fi_audio->config);
1058*4882a593Smuzhiyun fail_audio:
1059*4882a593Smuzhiyun 	kfree(fi_audio);
1060*4882a593Smuzhiyun 	return err_ptr;
1061*4882a593Smuzhiyun 
1062*4882a593Smuzhiyun }
1063*4882a593Smuzhiyun 
audio_source_alloc(struct usb_function_instance * fi)1064*4882a593Smuzhiyun static struct usb_function *audio_source_alloc(struct usb_function_instance *fi)
1065*4882a593Smuzhiyun {
1066*4882a593Smuzhiyun 	return &_audio_dev.func;
1067*4882a593Smuzhiyun }
1068*4882a593Smuzhiyun 
1069*4882a593Smuzhiyun DECLARE_USB_FUNCTION_INIT(audio_source, audio_source_alloc_inst,
1070*4882a593Smuzhiyun 			audio_source_alloc);
1071*4882a593Smuzhiyun MODULE_LICENSE("GPL");
1072