2 * f_audio.c -- USB Audio class function driver
4 * Copyright (C) 2008 Bryan Wu <cooloney@kernel.org>
5 * Copyright (C) 2008 Analog Devices, Inc
7 * Enter bugs at http://blackfin.uclinux.org/
9 * Licensed under the GPL-2 or later.
12 #include <linux/slab.h>
13 #include <linux/kernel.h>
14 #include <linux/module.h>
15 #include <linux/device.h>
16 #include <linux/atomic.h>
20 static int generic_set_cmd(struct usb_audio_control
*con
, u8 cmd
, int value
);
21 static int generic_get_cmd(struct usb_audio_control
*con
, u8 cmd
);
24 * DESCRIPTORS ... most are static, but strings and full
25 * configuration descriptors are built on demand.
29 * We have two interfaces- AudioControl and AudioStreaming
30 * TODO: only supcard playback currently
32 #define F_AUDIO_AC_INTERFACE 0
33 #define F_AUDIO_AS_INTERFACE 1
34 #define F_AUDIO_NUM_INTERFACES 1
36 /* B.3.1 Standard AC Interface Descriptor */
37 static struct usb_interface_descriptor ac_interface_desc
= {
38 .bLength
= USB_DT_INTERFACE_SIZE
,
39 .bDescriptorType
= USB_DT_INTERFACE
,
41 .bInterfaceClass
= USB_CLASS_AUDIO
,
42 .bInterfaceSubClass
= USB_SUBCLASS_AUDIOCONTROL
,
46 * The number of AudioStreaming and MIDIStreaming interfaces
47 * in the Audio Interface Collection
49 DECLARE_UAC_AC_HEADER_DESCRIPTOR(1);
51 #define UAC_DT_AC_HEADER_LENGTH UAC_DT_AC_HEADER_SIZE(F_AUDIO_NUM_INTERFACES)
52 /* 1 input terminal, 1 output terminal and 1 feature unit */
53 #define UAC_DT_TOTAL_LENGTH (UAC_DT_AC_HEADER_LENGTH + UAC_DT_INPUT_TERMINAL_SIZE \
54 + UAC_DT_OUTPUT_TERMINAL_SIZE + UAC_DT_FEATURE_UNIT_SIZE(0))
55 /* B.3.2 Class-Specific AC Interface Descriptor */
56 static struct uac1_ac_header_descriptor_1 ac_header_desc
= {
57 .bLength
= UAC_DT_AC_HEADER_LENGTH
,
58 .bDescriptorType
= USB_DT_CS_INTERFACE
,
59 .bDescriptorSubtype
= UAC_HEADER
,
60 .bcdADC
= __constant_cpu_to_le16(0x0100),
61 .wTotalLength
= __constant_cpu_to_le16(UAC_DT_TOTAL_LENGTH
),
62 .bInCollection
= F_AUDIO_NUM_INTERFACES
,
64 /* Interface number of the first AudioStream interface */
69 #define INPUT_TERMINAL_ID 1
70 static struct uac_input_terminal_descriptor input_terminal_desc
= {
71 .bLength
= UAC_DT_INPUT_TERMINAL_SIZE
,
72 .bDescriptorType
= USB_DT_CS_INTERFACE
,
73 .bDescriptorSubtype
= UAC_INPUT_TERMINAL
,
74 .bTerminalID
= INPUT_TERMINAL_ID
,
75 .wTerminalType
= UAC_TERMINAL_STREAMING
,
77 .wChannelConfig
= 0x3,
80 DECLARE_UAC_FEATURE_UNIT_DESCRIPTOR(0);
82 #define FEATURE_UNIT_ID 2
83 static struct uac_feature_unit_descriptor_0 feature_unit_desc
= {
84 .bLength
= UAC_DT_FEATURE_UNIT_SIZE(0),
85 .bDescriptorType
= USB_DT_CS_INTERFACE
,
86 .bDescriptorSubtype
= UAC_FEATURE_UNIT
,
87 .bUnitID
= FEATURE_UNIT_ID
,
88 .bSourceID
= INPUT_TERMINAL_ID
,
90 .bmaControls
[0] = (UAC_FU_MUTE
| UAC_FU_VOLUME
),
93 static struct usb_audio_control mute_control
= {
94 .list
= LIST_HEAD_INIT(mute_control
.list
),
95 .name
= "Mute Control",
97 /* Todo: add real Mute control code */
98 .set
= generic_set_cmd
,
99 .get
= generic_get_cmd
,
102 static struct usb_audio_control volume_control
= {
103 .list
= LIST_HEAD_INIT(volume_control
.list
),
104 .name
= "Volume Control",
105 .type
= UAC_FU_VOLUME
,
106 /* Todo: add real Volume control code */
107 .set
= generic_set_cmd
,
108 .get
= generic_get_cmd
,
111 static struct usb_audio_control_selector feature_unit
= {
112 .list
= LIST_HEAD_INIT(feature_unit
.list
),
113 .id
= FEATURE_UNIT_ID
,
114 .name
= "Mute & Volume Control",
115 .type
= UAC_FEATURE_UNIT
,
116 .desc
= (struct usb_descriptor_header
*)&feature_unit_desc
,
119 #define OUTPUT_TERMINAL_ID 3
120 static struct uac1_output_terminal_descriptor output_terminal_desc
= {
121 .bLength
= UAC_DT_OUTPUT_TERMINAL_SIZE
,
122 .bDescriptorType
= USB_DT_CS_INTERFACE
,
123 .bDescriptorSubtype
= UAC_OUTPUT_TERMINAL
,
124 .bTerminalID
= OUTPUT_TERMINAL_ID
,
125 .wTerminalType
= UAC_OUTPUT_TERMINAL_SPEAKER
,
126 .bAssocTerminal
= FEATURE_UNIT_ID
,
127 .bSourceID
= FEATURE_UNIT_ID
,
130 /* B.4.1 Standard AS Interface Descriptor */
131 static struct usb_interface_descriptor as_interface_alt_0_desc
= {
132 .bLength
= USB_DT_INTERFACE_SIZE
,
133 .bDescriptorType
= USB_DT_INTERFACE
,
134 .bAlternateSetting
= 0,
136 .bInterfaceClass
= USB_CLASS_AUDIO
,
137 .bInterfaceSubClass
= USB_SUBCLASS_AUDIOSTREAMING
,
140 static struct usb_interface_descriptor as_interface_alt_1_desc
= {
141 .bLength
= USB_DT_INTERFACE_SIZE
,
142 .bDescriptorType
= USB_DT_INTERFACE
,
143 .bAlternateSetting
= 1,
145 .bInterfaceClass
= USB_CLASS_AUDIO
,
146 .bInterfaceSubClass
= USB_SUBCLASS_AUDIOSTREAMING
,
149 /* B.4.2 Class-Specific AS Interface Descriptor */
150 static struct uac1_as_header_descriptor as_header_desc
= {
151 .bLength
= UAC_DT_AS_HEADER_SIZE
,
152 .bDescriptorType
= USB_DT_CS_INTERFACE
,
153 .bDescriptorSubtype
= UAC_AS_GENERAL
,
154 .bTerminalLink
= INPUT_TERMINAL_ID
,
156 .wFormatTag
= UAC_FORMAT_TYPE_I_PCM
,
159 DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(1);
161 static struct uac_format_type_i_discrete_descriptor_1 as_type_i_desc
= {
162 .bLength
= UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(1),
163 .bDescriptorType
= USB_DT_CS_INTERFACE
,
164 .bDescriptorSubtype
= UAC_FORMAT_TYPE
,
165 .bFormatType
= UAC_FORMAT_TYPE_I
,
167 .bBitResolution
= 16,
171 /* Standard ISO OUT Endpoint Descriptor */
172 static struct usb_endpoint_descriptor as_out_ep_desc
= {
173 .bLength
= USB_DT_ENDPOINT_AUDIO_SIZE
,
174 .bDescriptorType
= USB_DT_ENDPOINT
,
175 .bEndpointAddress
= USB_DIR_OUT
,
176 .bmAttributes
= USB_ENDPOINT_SYNC_ADAPTIVE
177 | USB_ENDPOINT_XFER_ISOC
,
178 .wMaxPacketSize
= cpu_to_le16(UAC1_OUT_EP_MAX_PACKET_SIZE
),
182 /* Class-specific AS ISO OUT Endpoint Descriptor */
183 static struct uac_iso_endpoint_descriptor as_iso_out_desc
= {
184 .bLength
= UAC_ISO_ENDPOINT_DESC_SIZE
,
185 .bDescriptorType
= USB_DT_CS_ENDPOINT
,
186 .bDescriptorSubtype
= UAC_EP_GENERAL
,
188 .bLockDelayUnits
= 1,
189 .wLockDelay
= __constant_cpu_to_le16(1),
192 static struct usb_descriptor_header
*f_audio_desc
[] = {
193 (struct usb_descriptor_header
*)&ac_interface_desc
,
194 (struct usb_descriptor_header
*)&ac_header_desc
,
196 (struct usb_descriptor_header
*)&input_terminal_desc
,
197 (struct usb_descriptor_header
*)&output_terminal_desc
,
198 (struct usb_descriptor_header
*)&feature_unit_desc
,
200 (struct usb_descriptor_header
*)&as_interface_alt_0_desc
,
201 (struct usb_descriptor_header
*)&as_interface_alt_1_desc
,
202 (struct usb_descriptor_header
*)&as_header_desc
,
204 (struct usb_descriptor_header
*)&as_type_i_desc
,
206 (struct usb_descriptor_header
*)&as_out_ep_desc
,
207 (struct usb_descriptor_header
*)&as_iso_out_desc
,
214 STR_INPUT_TERMINAL_CH_NAMES
,
221 static struct usb_string strings_uac1
[] = {
222 [STR_AC_IF
].s
= "AC Interface",
223 [STR_INPUT_TERMINAL
].s
= "Input terminal",
224 [STR_INPUT_TERMINAL_CH_NAMES
].s
= "Channels",
225 [STR_FEAT_DESC_0
].s
= "Volume control & mute",
226 [STR_OUTPUT_TERMINAL
].s
= "Output terminal",
227 [STR_AS_IF_ALT0
].s
= "AS Interface",
228 [STR_AS_IF_ALT1
].s
= "AS Interface",
232 static struct usb_gadget_strings str_uac1
= {
233 .language
= 0x0409, /* en-us */
234 .strings
= strings_uac1
,
237 static struct usb_gadget_strings
*uac1_strings
[] = {
243 * This function is an ALSA sound card following USB Audio Class Spec 1.0.
246 /*-------------------------------------------------------------------------*/
250 struct list_head list
;
253 static struct f_audio_buf
*f_audio_buffer_alloc(int buf_size
)
255 struct f_audio_buf
*copy_buf
;
257 copy_buf
= kzalloc(sizeof *copy_buf
, GFP_ATOMIC
);
259 return ERR_PTR(-ENOMEM
);
261 copy_buf
->buf
= kzalloc(buf_size
, GFP_ATOMIC
);
262 if (!copy_buf
->buf
) {
264 return ERR_PTR(-ENOMEM
);
270 static void f_audio_buffer_free(struct f_audio_buf
*audio_buf
)
272 kfree(audio_buf
->buf
);
275 /*-------------------------------------------------------------------------*/
280 /* endpoints handle full and/or high speeds */
281 struct usb_ep
*out_ep
;
284 struct f_audio_buf
*copy_buf
;
285 struct work_struct playback_work
;
286 struct list_head play_queue
;
288 /* Control Set command */
291 struct usb_audio_control
*set_con
;
294 static inline struct f_audio
*func_to_audio(struct usb_function
*f
)
296 return container_of(f
, struct f_audio
, card
.func
);
299 /*-------------------------------------------------------------------------*/
301 static void f_audio_playback_work(struct work_struct
*data
)
303 struct f_audio
*audio
= container_of(data
, struct f_audio
,
305 struct f_audio_buf
*play_buf
;
307 spin_lock_irq(&audio
->lock
);
308 if (list_empty(&audio
->play_queue
)) {
309 spin_unlock_irq(&audio
->lock
);
312 play_buf
= list_first_entry(&audio
->play_queue
,
313 struct f_audio_buf
, list
);
314 list_del(&play_buf
->list
);
315 spin_unlock_irq(&audio
->lock
);
317 u_audio_playback(&audio
->card
, play_buf
->buf
, play_buf
->actual
);
318 f_audio_buffer_free(play_buf
);
321 static int f_audio_out_ep_complete(struct usb_ep
*ep
, struct usb_request
*req
)
323 struct f_audio
*audio
= req
->context
;
324 struct usb_composite_dev
*cdev
= audio
->card
.func
.config
->cdev
;
325 struct f_audio_buf
*copy_buf
= audio
->copy_buf
;
326 struct f_uac1_opts
*opts
;
330 opts
= container_of(audio
->card
.func
.fi
, struct f_uac1_opts
,
332 audio_buf_size
= opts
->audio_buf_size
;
337 /* Copy buffer is full, add it to the play_queue */
338 if (audio_buf_size
- copy_buf
->actual
< req
->actual
) {
339 list_add_tail(©_buf
->list
, &audio
->play_queue
);
340 schedule_work(&audio
->playback_work
);
341 copy_buf
= f_audio_buffer_alloc(audio_buf_size
);
342 if (IS_ERR(copy_buf
))
346 memcpy(copy_buf
->buf
+ copy_buf
->actual
, req
->buf
, req
->actual
);
347 copy_buf
->actual
+= req
->actual
;
348 audio
->copy_buf
= copy_buf
;
350 err
= usb_ep_queue(ep
, req
, GFP_ATOMIC
);
352 ERROR(cdev
, "%s queue req: %d\n", ep
->name
, err
);
358 static void f_audio_complete(struct usb_ep
*ep
, struct usb_request
*req
)
360 struct f_audio
*audio
= req
->context
;
361 int status
= req
->status
;
363 struct usb_ep
*out_ep
= audio
->out_ep
;
367 case 0: /* normal completion? */
369 f_audio_out_ep_complete(ep
, req
);
370 else if (audio
->set_con
) {
371 memcpy(&data
, req
->buf
, req
->length
);
372 audio
->set_con
->set(audio
->set_con
, audio
->set_cmd
,
374 audio
->set_con
= NULL
;
382 static int audio_set_intf_req(struct usb_function
*f
,
383 const struct usb_ctrlrequest
*ctrl
)
385 struct f_audio
*audio
= func_to_audio(f
);
386 struct usb_composite_dev
*cdev
= f
->config
->cdev
;
387 struct usb_request
*req
= cdev
->req
;
388 u8 id
= ((le16_to_cpu(ctrl
->wIndex
) >> 8) & 0xFF);
389 u16 len
= le16_to_cpu(ctrl
->wLength
);
390 u16 w_value
= le16_to_cpu(ctrl
->wValue
);
391 u8 con_sel
= (w_value
>> 8) & 0xFF;
392 u8 cmd
= (ctrl
->bRequest
& 0x0F);
393 struct usb_audio_control_selector
*cs
;
394 struct usb_audio_control
*con
;
396 DBG(cdev
, "bRequest 0x%x, w_value 0x%04x, len %d, entity %d\n",
397 ctrl
->bRequest
, w_value
, len
, id
);
399 list_for_each_entry(cs
, &audio
->cs
, list
) {
401 list_for_each_entry(con
, &cs
->control
, list
) {
402 if (con
->type
== con_sel
) {
403 audio
->set_con
= con
;
411 audio
->set_cmd
= cmd
;
412 req
->context
= audio
;
413 req
->complete
= f_audio_complete
;
418 static int audio_get_intf_req(struct usb_function
*f
,
419 const struct usb_ctrlrequest
*ctrl
)
421 struct f_audio
*audio
= func_to_audio(f
);
422 struct usb_composite_dev
*cdev
= f
->config
->cdev
;
423 struct usb_request
*req
= cdev
->req
;
424 int value
= -EOPNOTSUPP
;
425 u8 id
= ((le16_to_cpu(ctrl
->wIndex
) >> 8) & 0xFF);
426 u16 len
= le16_to_cpu(ctrl
->wLength
);
427 u16 w_value
= le16_to_cpu(ctrl
->wValue
);
428 u8 con_sel
= (w_value
>> 8) & 0xFF;
429 u8 cmd
= (ctrl
->bRequest
& 0x0F);
430 struct usb_audio_control_selector
*cs
;
431 struct usb_audio_control
*con
;
433 DBG(cdev
, "bRequest 0x%x, w_value 0x%04x, len %d, entity %d\n",
434 ctrl
->bRequest
, w_value
, len
, id
);
436 list_for_each_entry(cs
, &audio
->cs
, list
) {
438 list_for_each_entry(con
, &cs
->control
, list
) {
439 if (con
->type
== con_sel
&& con
->get
) {
440 value
= con
->get(con
, cmd
);
448 req
->context
= audio
;
449 req
->complete
= f_audio_complete
;
450 len
= min_t(size_t, sizeof(value
), len
);
451 memcpy(req
->buf
, &value
, len
);
456 static int audio_set_endpoint_req(struct usb_function
*f
,
457 const struct usb_ctrlrequest
*ctrl
)
459 struct usb_composite_dev
*cdev
= f
->config
->cdev
;
460 int value
= -EOPNOTSUPP
;
461 u16 ep
= le16_to_cpu(ctrl
->wIndex
);
462 u16 len
= le16_to_cpu(ctrl
->wLength
);
463 u16 w_value
= le16_to_cpu(ctrl
->wValue
);
465 DBG(cdev
, "bRequest 0x%x, w_value 0x%04x, len %d, endpoint %d\n",
466 ctrl
->bRequest
, w_value
, len
, ep
);
468 switch (ctrl
->bRequest
) {
492 static int audio_get_endpoint_req(struct usb_function
*f
,
493 const struct usb_ctrlrequest
*ctrl
)
495 struct usb_composite_dev
*cdev
= f
->config
->cdev
;
496 int value
= -EOPNOTSUPP
;
497 u8 ep
= ((le16_to_cpu(ctrl
->wIndex
) >> 8) & 0xFF);
498 u16 len
= le16_to_cpu(ctrl
->wLength
);
499 u16 w_value
= le16_to_cpu(ctrl
->wValue
);
501 DBG(cdev
, "bRequest 0x%x, w_value 0x%04x, len %d, endpoint %d\n",
502 ctrl
->bRequest
, w_value
, len
, ep
);
504 switch (ctrl
->bRequest
) {
521 f_audio_setup(struct usb_function
*f
, const struct usb_ctrlrequest
*ctrl
)
523 struct usb_composite_dev
*cdev
= f
->config
->cdev
;
524 struct usb_request
*req
= cdev
->req
;
525 int value
= -EOPNOTSUPP
;
526 u16 w_index
= le16_to_cpu(ctrl
->wIndex
);
527 u16 w_value
= le16_to_cpu(ctrl
->wValue
);
528 u16 w_length
= le16_to_cpu(ctrl
->wLength
);
530 /* composite driver infrastructure handles everything; interface
531 * activation uses set_alt().
533 switch (ctrl
->bRequestType
) {
534 case USB_DIR_OUT
| USB_TYPE_CLASS
| USB_RECIP_INTERFACE
:
535 value
= audio_set_intf_req(f
, ctrl
);
538 case USB_DIR_IN
| USB_TYPE_CLASS
| USB_RECIP_INTERFACE
:
539 value
= audio_get_intf_req(f
, ctrl
);
542 case USB_DIR_OUT
| USB_TYPE_CLASS
| USB_RECIP_ENDPOINT
:
543 value
= audio_set_endpoint_req(f
, ctrl
);
546 case USB_DIR_IN
| USB_TYPE_CLASS
| USB_RECIP_ENDPOINT
:
547 value
= audio_get_endpoint_req(f
, ctrl
);
551 ERROR(cdev
, "invalid control req%02x.%02x v%04x i%04x l%d\n",
552 ctrl
->bRequestType
, ctrl
->bRequest
,
553 w_value
, w_index
, w_length
);
556 /* respond with data transfer or status phase? */
558 DBG(cdev
, "audio req%02x.%02x v%04x i%04x l%d\n",
559 ctrl
->bRequestType
, ctrl
->bRequest
,
560 w_value
, w_index
, w_length
);
563 value
= usb_ep_queue(cdev
->gadget
->ep0
, req
, GFP_ATOMIC
);
565 ERROR(cdev
, "audio response on err %d\n", value
);
568 /* device either stalls (value < 0) or reports success */
572 static int f_audio_set_alt(struct usb_function
*f
, unsigned intf
, unsigned alt
)
574 struct f_audio
*audio
= func_to_audio(f
);
575 struct usb_composite_dev
*cdev
= f
->config
->cdev
;
576 struct usb_ep
*out_ep
= audio
->out_ep
;
577 struct usb_request
*req
;
578 struct f_uac1_opts
*opts
;
579 int req_buf_size
, req_count
, audio_buf_size
;
582 DBG(cdev
, "intf %d, alt %d\n", intf
, alt
);
584 opts
= container_of(f
->fi
, struct f_uac1_opts
, func_inst
);
585 req_buf_size
= opts
->req_buf_size
;
586 req_count
= opts
->req_count
;
587 audio_buf_size
= opts
->audio_buf_size
;
591 err
= config_ep_by_speed(cdev
->gadget
, f
, out_ep
);
595 usb_ep_enable(out_ep
);
596 audio
->copy_buf
= f_audio_buffer_alloc(audio_buf_size
);
597 if (IS_ERR(audio
->copy_buf
))
601 * allocate a bunch of read buffers
602 * and queue them all at once.
604 for (i
= 0; i
< req_count
&& err
== 0; i
++) {
605 req
= usb_ep_alloc_request(out_ep
, GFP_ATOMIC
);
607 req
->buf
= kzalloc(req_buf_size
,
610 req
->length
= req_buf_size
;
611 req
->context
= audio
;
614 err
= usb_ep_queue(out_ep
,
618 "%s queue req: %d\n",
627 struct f_audio_buf
*copy_buf
= audio
->copy_buf
;
629 list_add_tail(©_buf
->list
,
631 schedule_work(&audio
->playback_work
);
639 static void f_audio_disable(struct usb_function
*f
)
644 /*-------------------------------------------------------------------------*/
646 static void f_audio_build_desc(struct f_audio
*audio
)
648 struct gaudio
*card
= &audio
->card
;
652 /* Set channel numbers */
653 input_terminal_desc
.bNrChannels
= u_audio_get_playback_channels(card
);
654 as_type_i_desc
.bNrChannels
= u_audio_get_playback_channels(card
);
656 /* Set sample rates */
657 rate
= u_audio_get_playback_rate(card
);
658 sam_freq
= as_type_i_desc
.tSamFreq
[0];
659 memcpy(sam_freq
, &rate
, 3);
661 /* Todo: Set Sample bits and other parameters */
666 /* audio function driver setup/binding */
668 f_audio_bind(struct usb_configuration
*c
, struct usb_function
*f
)
670 struct usb_composite_dev
*cdev
= c
->cdev
;
671 struct f_audio
*audio
= func_to_audio(f
);
672 struct usb_string
*us
;
674 struct usb_ep
*ep
= NULL
;
675 struct f_uac1_opts
*audio_opts
;
677 audio_opts
= container_of(f
->fi
, struct f_uac1_opts
, func_inst
);
678 audio
->card
.gadget
= c
->cdev
->gadget
;
679 /* set up ASLA audio devices */
680 if (!audio_opts
->bound
) {
681 status
= gaudio_setup(&audio
->card
);
684 audio_opts
->bound
= true;
686 us
= usb_gstrings_attach(cdev
, uac1_strings
, ARRAY_SIZE(strings_uac1
));
689 ac_interface_desc
.iInterface
= us
[STR_AC_IF
].id
;
690 input_terminal_desc
.iTerminal
= us
[STR_INPUT_TERMINAL
].id
;
691 input_terminal_desc
.iChannelNames
= us
[STR_INPUT_TERMINAL_CH_NAMES
].id
;
692 feature_unit_desc
.iFeature
= us
[STR_FEAT_DESC_0
].id
;
693 output_terminal_desc
.iTerminal
= us
[STR_OUTPUT_TERMINAL
].id
;
694 as_interface_alt_0_desc
.iInterface
= us
[STR_AS_IF_ALT0
].id
;
695 as_interface_alt_1_desc
.iInterface
= us
[STR_AS_IF_ALT1
].id
;
698 f_audio_build_desc(audio
);
700 /* allocate instance-specific interface IDs, and patch descriptors */
701 status
= usb_interface_id(c
, f
);
704 ac_interface_desc
.bInterfaceNumber
= status
;
706 status
= usb_interface_id(c
, f
);
709 as_interface_alt_0_desc
.bInterfaceNumber
= status
;
710 as_interface_alt_1_desc
.bInterfaceNumber
= status
;
714 /* allocate instance-specific endpoints */
715 ep
= usb_ep_autoconfig(cdev
->gadget
, &as_out_ep_desc
);
719 audio
->out_ep
->desc
= &as_out_ep_desc
;
723 /* copy descriptors, and track endpoint copies */
724 status
= usb_assign_descriptors(f
, f_audio_desc
, f_audio_desc
, NULL
,
731 gaudio_cleanup(&audio
->card
);
735 /*-------------------------------------------------------------------------*/
737 static int generic_set_cmd(struct usb_audio_control
*con
, u8 cmd
, int value
)
739 con
->data
[cmd
] = value
;
744 static int generic_get_cmd(struct usb_audio_control
*con
, u8 cmd
)
746 return con
->data
[cmd
];
749 /* Todo: add more control selecotor dynamically */
750 static int control_selector_init(struct f_audio
*audio
)
752 INIT_LIST_HEAD(&audio
->cs
);
753 list_add(&feature_unit
.list
, &audio
->cs
);
755 INIT_LIST_HEAD(&feature_unit
.control
);
756 list_add(&mute_control
.list
, &feature_unit
.control
);
757 list_add(&volume_control
.list
, &feature_unit
.control
);
759 volume_control
.data
[UAC__CUR
] = 0xffc0;
760 volume_control
.data
[UAC__MIN
] = 0xe3a0;
761 volume_control
.data
[UAC__MAX
] = 0xfff0;
762 volume_control
.data
[UAC__RES
] = 0x0030;
767 static inline struct f_uac1_opts
*to_f_uac1_opts(struct config_item
*item
)
769 return container_of(to_config_group(item
), struct f_uac1_opts
,
773 static void f_uac1_attr_release(struct config_item
*item
)
775 struct f_uac1_opts
*opts
= to_f_uac1_opts(item
);
777 usb_put_function_instance(&opts
->func_inst
);
780 static struct configfs_item_operations f_uac1_item_ops
= {
781 .release
= f_uac1_attr_release
,
784 #define UAC1_INT_ATTRIBUTE(name) \
785 static ssize_t f_uac1_opts_##name##_show(struct config_item *item, \
788 struct f_uac1_opts *opts = to_f_uac1_opts(item); \
791 mutex_lock(&opts->lock); \
792 result = sprintf(page, "%u\n", opts->name); \
793 mutex_unlock(&opts->lock); \
798 static ssize_t f_uac1_opts_##name##_store(struct config_item *item, \
799 const char *page, size_t len) \
801 struct f_uac1_opts *opts = to_f_uac1_opts(item); \
805 mutex_lock(&opts->lock); \
806 if (opts->refcnt) { \
811 ret = kstrtou32(page, 0, &num); \
819 mutex_unlock(&opts->lock); \
823 CONFIGFS_ATTR(f_uac1_opts_, name)
825 UAC1_INT_ATTRIBUTE(req_buf_size
);
826 UAC1_INT_ATTRIBUTE(req_count
);
827 UAC1_INT_ATTRIBUTE(audio_buf_size
);
829 #define UAC1_STR_ATTRIBUTE(name) \
830 static ssize_t f_uac1_opts_##name##_show(struct config_item *item, \
833 struct f_uac1_opts *opts = to_f_uac1_opts(item); \
836 mutex_lock(&opts->lock); \
837 result = sprintf(page, "%s\n", opts->name); \
838 mutex_unlock(&opts->lock); \
843 static ssize_t f_uac1_opts_##name##_store(struct config_item *item, \
844 const char *page, size_t len) \
846 struct f_uac1_opts *opts = to_f_uac1_opts(item); \
850 mutex_lock(&opts->lock); \
854 tmp = kstrndup(page, len, GFP_KERNEL); \
859 if (opts->name##_alloc) \
861 opts->name##_alloc = true; \
866 mutex_unlock(&opts->lock); \
870 CONFIGFS_ATTR(f_uac1_opts_, name)
872 UAC1_STR_ATTRIBUTE(fn_play
);
873 UAC1_STR_ATTRIBUTE(fn_cap
);
874 UAC1_STR_ATTRIBUTE(fn_cntl
);
876 static struct configfs_attribute
*f_uac1_attrs
[] = {
877 &f_uac1_opts_attr_req_buf_size
,
878 &f_uac1_opts_attr_req_count
,
879 &f_uac1_opts_attr_audio_buf_size
,
880 &f_uac1_opts_attr_fn_play
,
881 &f_uac1_opts_attr_fn_cap
,
882 &f_uac1_opts_attr_fn_cntl
,
886 static struct config_item_type f_uac1_func_type
= {
887 .ct_item_ops
= &f_uac1_item_ops
,
888 .ct_attrs
= f_uac1_attrs
,
889 .ct_owner
= THIS_MODULE
,
892 static void f_audio_free_inst(struct usb_function_instance
*f
)
894 struct f_uac1_opts
*opts
;
896 opts
= container_of(f
, struct f_uac1_opts
, func_inst
);
897 if (opts
->fn_play_alloc
)
898 kfree(opts
->fn_play
);
899 if (opts
->fn_cap_alloc
)
901 if (opts
->fn_cntl_alloc
)
902 kfree(opts
->fn_cntl
);
906 static struct usb_function_instance
*f_audio_alloc_inst(void)
908 struct f_uac1_opts
*opts
;
910 opts
= kzalloc(sizeof(*opts
), GFP_KERNEL
);
912 return ERR_PTR(-ENOMEM
);
914 mutex_init(&opts
->lock
);
915 opts
->func_inst
.free_func_inst
= f_audio_free_inst
;
917 config_group_init_type_name(&opts
->func_inst
.group
, "",
920 opts
->req_buf_size
= UAC1_OUT_EP_MAX_PACKET_SIZE
;
921 opts
->req_count
= UAC1_REQ_COUNT
;
922 opts
->audio_buf_size
= UAC1_AUDIO_BUF_SIZE
;
923 opts
->fn_play
= FILE_PCM_PLAYBACK
;
924 opts
->fn_cap
= FILE_PCM_CAPTURE
;
925 opts
->fn_cntl
= FILE_CONTROL
;
926 return &opts
->func_inst
;
929 static void f_audio_free(struct usb_function
*f
)
931 struct f_audio
*audio
= func_to_audio(f
);
932 struct f_uac1_opts
*opts
;
934 gaudio_cleanup(&audio
->card
);
935 opts
= container_of(f
->fi
, struct f_uac1_opts
, func_inst
);
937 mutex_lock(&opts
->lock
);
939 mutex_unlock(&opts
->lock
);
942 static void f_audio_unbind(struct usb_configuration
*c
, struct usb_function
*f
)
944 usb_free_all_descriptors(f
);
947 static struct usb_function
*f_audio_alloc(struct usb_function_instance
*fi
)
949 struct f_audio
*audio
;
950 struct f_uac1_opts
*opts
;
952 /* allocate and initialize one new instance */
953 audio
= kzalloc(sizeof(*audio
), GFP_KERNEL
);
955 return ERR_PTR(-ENOMEM
);
957 audio
->card
.func
.name
= "g_audio";
959 opts
= container_of(fi
, struct f_uac1_opts
, func_inst
);
960 mutex_lock(&opts
->lock
);
962 mutex_unlock(&opts
->lock
);
963 INIT_LIST_HEAD(&audio
->play_queue
);
964 spin_lock_init(&audio
->lock
);
966 audio
->card
.func
.bind
= f_audio_bind
;
967 audio
->card
.func
.unbind
= f_audio_unbind
;
968 audio
->card
.func
.set_alt
= f_audio_set_alt
;
969 audio
->card
.func
.setup
= f_audio_setup
;
970 audio
->card
.func
.disable
= f_audio_disable
;
971 audio
->card
.func
.free_func
= f_audio_free
;
973 control_selector_init(audio
);
975 INIT_WORK(&audio
->playback_work
, f_audio_playback_work
);
977 return &audio
->card
.func
;
980 DECLARE_USB_FUNCTION_INIT(uac1
, f_audio_alloc_inst
, f_audio_alloc
);
981 MODULE_LICENSE("GPL");
982 MODULE_AUTHOR("Bryan Wu");