Lines Matching +full:num +full:- +full:strings

1 // SPDX-License-Identifier: GPL-2.0+
3 * f_uac1.c -- USB Audio Class 1.0 Function (using u_audio API)
8 * on the device - the audio streams are simply sinked to and
34 * DESCRIPTORS ... most are static, but strings and full
39 * We have three interfaces - one AudioControl and two AudioStreaming
42 * USB-OUT -> IT_1 -> OT_2 -> ALSA_Capture
43 * ALSA_Playback -> IT_3 -> OT_4 -> USB-IN
70 /* B.3.2 Class-Specific AC Interface Descriptor */
166 /* B.4.2 Class-Specific AS Interface Descriptor */
208 /* Class-specific AS ISO OUT Endpoint Descriptor */
239 /* Class-specific AS ISO OUT Endpoint Descriptor */
308 .language = 0x0409, /* en-us */
309 .strings = strings_uac1,
324 struct usb_composite_dev *cdev = f->config->cdev; in audio_set_endpoint_req()
325 int value = -EOPNOTSUPP; in audio_set_endpoint_req()
326 u16 ep = le16_to_cpu(ctrl->wIndex); in audio_set_endpoint_req()
327 u16 len = le16_to_cpu(ctrl->wLength); in audio_set_endpoint_req()
328 u16 w_value = le16_to_cpu(ctrl->wValue); in audio_set_endpoint_req()
331 ctrl->bRequest, w_value, len, ep); in audio_set_endpoint_req()
333 switch (ctrl->bRequest) { in audio_set_endpoint_req()
360 struct usb_composite_dev *cdev = f->config->cdev; in audio_get_endpoint_req()
361 int value = -EOPNOTSUPP; in audio_get_endpoint_req()
362 u8 ep = ((le16_to_cpu(ctrl->wIndex) >> 8) & 0xFF); in audio_get_endpoint_req()
363 u16 len = le16_to_cpu(ctrl->wLength); in audio_get_endpoint_req()
364 u16 w_value = le16_to_cpu(ctrl->wValue); in audio_get_endpoint_req()
367 ctrl->bRequest, w_value, len, ep); in audio_get_endpoint_req()
369 switch (ctrl->bRequest) { in audio_get_endpoint_req()
388 struct usb_composite_dev *cdev = f->config->cdev; in f_audio_setup()
389 struct usb_request *req = cdev->req; in f_audio_setup()
390 int value = -EOPNOTSUPP; in f_audio_setup()
391 u16 w_index = le16_to_cpu(ctrl->wIndex); in f_audio_setup()
392 u16 w_value = le16_to_cpu(ctrl->wValue); in f_audio_setup()
393 u16 w_length = le16_to_cpu(ctrl->wLength); in f_audio_setup()
398 switch (ctrl->bRequestType) { in f_audio_setup()
409 ctrl->bRequestType, ctrl->bRequest, in f_audio_setup()
416 ctrl->bRequestType, ctrl->bRequest, in f_audio_setup()
418 req->zero = 0; in f_audio_setup()
419 req->length = value; in f_audio_setup()
420 value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC); in f_audio_setup()
431 struct usb_composite_dev *cdev = f->config->cdev; in f_audio_set_alt()
432 struct usb_gadget *gadget = cdev->gadget; in f_audio_set_alt()
433 struct device *dev = &gadget->dev; in f_audio_set_alt()
440 return -EINVAL; in f_audio_set_alt()
443 if (intf == uac1->ac_intf) { in f_audio_set_alt()
444 /* Control I/f has only 1 AltSetting - 0 */ in f_audio_set_alt()
447 return -EINVAL; in f_audio_set_alt()
452 if (intf == uac1->as_out_intf) { in f_audio_set_alt()
453 uac1->as_out_alt = alt; in f_audio_set_alt()
456 ret = u_audio_start_capture(&uac1->g_audio); in f_audio_set_alt()
458 u_audio_stop_capture(&uac1->g_audio); in f_audio_set_alt()
459 } else if (intf == uac1->as_in_intf) { in f_audio_set_alt()
460 uac1->as_in_alt = alt; in f_audio_set_alt()
463 ret = u_audio_start_playback(&uac1->g_audio); in f_audio_set_alt()
465 u_audio_stop_playback(&uac1->g_audio); in f_audio_set_alt()
468 return -EINVAL; in f_audio_set_alt()
476 struct usb_composite_dev *cdev = f->config->cdev; in f_audio_get_alt()
477 struct usb_gadget *gadget = cdev->gadget; in f_audio_get_alt()
478 struct device *dev = &gadget->dev; in f_audio_get_alt()
481 if (intf == uac1->ac_intf) in f_audio_get_alt()
482 return uac1->ac_alt; in f_audio_get_alt()
483 else if (intf == uac1->as_out_intf) in f_audio_get_alt()
484 return uac1->as_out_alt; in f_audio_get_alt()
485 else if (intf == uac1->as_in_intf) in f_audio_get_alt()
486 return uac1->as_in_alt; in f_audio_get_alt()
491 return -EINVAL; in f_audio_get_alt()
499 uac1->as_out_alt = 0; in f_audio_disable()
500 uac1->as_in_alt = 0; in f_audio_disable()
502 u_audio_stop_capture(&uac1->g_audio); in f_audio_disable()
505 /*-------------------------------------------------------------------------*/
510 struct usb_composite_dev *cdev = c->cdev; in f_audio_bind()
511 struct usb_gadget *gadget = cdev->gadget; in f_audio_bind()
521 audio_opts = container_of(f->fi, struct f_uac1_opts, func_inst); in f_audio_bind()
539 usb_out_it_desc.bNrChannels = num_channels(audio_opts->c_chmask); in f_audio_bind()
540 usb_out_it_desc.wChannelConfig = cpu_to_le16(audio_opts->c_chmask); in f_audio_bind()
541 as_out_type_i_desc.bNrChannels = num_channels(audio_opts->c_chmask); in f_audio_bind()
542 as_out_type_i_desc.bSubframeSize = audio_opts->c_ssize; in f_audio_bind()
543 as_out_type_i_desc.bBitResolution = audio_opts->c_ssize * 8; in f_audio_bind()
544 io_in_it_desc.bNrChannels = num_channels(audio_opts->p_chmask); in f_audio_bind()
545 io_in_it_desc.wChannelConfig = cpu_to_le16(audio_opts->p_chmask); in f_audio_bind()
546 as_in_type_i_desc.bNrChannels = num_channels(audio_opts->p_chmask); in f_audio_bind()
547 as_in_type_i_desc.bSubframeSize = audio_opts->p_ssize; in f_audio_bind()
548 as_in_type_i_desc.bBitResolution = audio_opts->p_ssize * 8; in f_audio_bind()
551 rate = audio_opts->c_srate; in f_audio_bind()
554 rate = audio_opts->p_srate; in f_audio_bind()
558 /* allocate instance-specific interface IDs, and patch descriptors */ in f_audio_bind()
563 uac1->ac_intf = status; in f_audio_bind()
564 uac1->ac_alt = 0; in f_audio_bind()
572 uac1->as_out_intf = status; in f_audio_bind()
573 uac1->as_out_alt = 0; in f_audio_bind()
581 uac1->as_in_intf = status; in f_audio_bind()
582 uac1->as_in_alt = 0; in f_audio_bind()
584 audio->gadget = gadget; in f_audio_bind()
586 status = -ENODEV; in f_audio_bind()
588 /* allocate instance-specific endpoints */ in f_audio_bind()
589 ep = usb_ep_autoconfig(cdev->gadget, &as_out_ep_desc); in f_audio_bind()
592 audio->out_ep = ep; in f_audio_bind()
593 audio->out_ep->desc = &as_out_ep_desc; in f_audio_bind()
595 ep = usb_ep_autoconfig(cdev->gadget, &as_in_ep_desc); in f_audio_bind()
598 audio->in_ep = ep; in f_audio_bind()
599 audio->in_ep->desc = &as_in_ep_desc; in f_audio_bind()
607 audio->out_ep_maxpsize = le16_to_cpu(as_out_ep_desc.wMaxPacketSize); in f_audio_bind()
608 audio->in_ep_maxpsize = le16_to_cpu(as_in_ep_desc.wMaxPacketSize); in f_audio_bind()
609 audio->params.c_chmask = audio_opts->c_chmask; in f_audio_bind()
610 audio->params.c_srate = audio_opts->c_srate; in f_audio_bind()
611 audio->params.c_ssize = audio_opts->c_ssize; in f_audio_bind()
612 audio->params.p_chmask = audio_opts->p_chmask; in f_audio_bind()
613 audio->params.p_srate = audio_opts->p_srate; in f_audio_bind()
614 audio->params.p_ssize = audio_opts->p_ssize; in f_audio_bind()
615 audio->params.req_number = audio_opts->req_number; in f_audio_bind()
629 /*-------------------------------------------------------------------------*/
641 usb_put_function_instance(&opts->func_inst); in f_uac1_attr_release()
656 mutex_lock(&opts->lock); \
657 result = sprintf(page, "%u\n", opts->name); \
658 mutex_unlock(&opts->lock); \
669 u32 num; \
671 mutex_lock(&opts->lock); \
672 if (opts->refcnt) { \
673 ret = -EBUSY; \
677 ret = kstrtou32(page, 0, &num); \
681 opts->name = num; \
685 mutex_unlock(&opts->lock); \
730 return ERR_PTR(-ENOMEM); in f_audio_alloc_inst()
732 mutex_init(&opts->lock); in f_audio_alloc_inst()
733 opts->func_inst.free_func_inst = f_audio_free_inst; in f_audio_alloc_inst()
735 config_group_init_type_name(&opts->func_inst.group, "", in f_audio_alloc_inst()
738 opts->c_chmask = UAC1_DEF_CCHMASK; in f_audio_alloc_inst()
739 opts->c_srate = UAC1_DEF_CSRATE; in f_audio_alloc_inst()
740 opts->c_ssize = UAC1_DEF_CSSIZE; in f_audio_alloc_inst()
741 opts->p_chmask = UAC1_DEF_PCHMASK; in f_audio_alloc_inst()
742 opts->p_srate = UAC1_DEF_PSRATE; in f_audio_alloc_inst()
743 opts->p_ssize = UAC1_DEF_PSSIZE; in f_audio_alloc_inst()
744 opts->req_number = UAC1_DEF_REQ_NUM; in f_audio_alloc_inst()
745 return &opts->func_inst; in f_audio_alloc_inst()
754 opts = container_of(f->fi, struct f_uac1_opts, func_inst); in f_audio_free()
756 mutex_lock(&opts->lock); in f_audio_free()
757 --opts->refcnt; in f_audio_free()
758 mutex_unlock(&opts->lock); in f_audio_free()
768 audio->gadget = NULL; in f_audio_unbind()
779 return ERR_PTR(-ENOMEM); in f_audio_alloc()
782 mutex_lock(&opts->lock); in f_audio_alloc()
783 ++opts->refcnt; in f_audio_alloc()
784 mutex_unlock(&opts->lock); in f_audio_alloc()
786 uac1->g_audio.func.name = "uac1_func"; in f_audio_alloc()
787 uac1->g_audio.func.bind = f_audio_bind; in f_audio_alloc()
788 uac1->g_audio.func.unbind = f_audio_unbind; in f_audio_alloc()
789 uac1->g_audio.func.set_alt = f_audio_set_alt; in f_audio_alloc()
790 uac1->g_audio.func.get_alt = f_audio_get_alt; in f_audio_alloc()
791 uac1->g_audio.func.setup = f_audio_setup; in f_audio_alloc()
792 uac1->g_audio.func.disable = f_audio_disable; in f_audio_alloc()
793 uac1->g_audio.func.free_func = f_audio_free; in f_audio_alloc()
795 return &uac1->g_audio.func; in f_audio_alloc()