Loading drivers/usb/gadget/function/f_uac2.c +167 −30 Original line number Diff line number Diff line Loading @@ -397,6 +397,7 @@ static int uac2_pcm_open(struct snd_pcm_substream *substream) struct audio_dev *audio_dev; struct f_uac2_opts *opts; int p_ssize, c_ssize; int p_sres, c_sres; int p_srate, c_srate; int p_chmask, c_chmask; Loading @@ -404,6 +405,8 @@ static int uac2_pcm_open(struct snd_pcm_substream *substream) opts = container_of(audio_dev->func.fi, struct f_uac2_opts, func_inst); p_ssize = opts->p_ssize; c_ssize = opts->c_ssize; p_sres = opts->p_sres; c_sres = opts->c_sres; p_srate = opts->p_srate; c_srate = opts->c_srate; p_chmask = opts->p_chmask; Loading @@ -412,6 +415,8 @@ static int uac2_pcm_open(struct snd_pcm_substream *substream) runtime->hw = uac2_pcm_hardware; pr_debug("p_srate:%d p_chmask:%d\n", p_srate, p_chmask); pr_debug("c_srate:%d c_chmask:%d\n", c_srate, c_chmask); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { if (audio_dev->as_in_alt == 0) { pr_err("%s: Host is not ready to receive the streaming\n", Loading @@ -420,14 +425,27 @@ static int uac2_pcm_open(struct snd_pcm_substream *substream) } spin_lock_init(&uac2->p_prm.lock); runtime->hw.rate_min = p_srate; switch (p_sres) { case 24: switch (p_ssize) { case 3: runtime->hw.formats = SNDRV_PCM_FMTBIT_S24_3LE; pr_debug("%s:S24_3LE\n", __func__); runtime->hw.formats = SNDRV_PCM_FMTBIT_S24_3LE; break; case 4: default: pr_debug("%s:S24_LE\n", __func__); runtime->hw.formats = SNDRV_PCM_FMTBIT_S24_LE; break; } break; case 32: pr_debug("%s:S32_LE\n", __func__); runtime->hw.formats = SNDRV_PCM_FMTBIT_S32_LE; break; default: pr_debug("%s:S16_LE\n", __func__); runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE; break; } Loading @@ -442,14 +460,27 @@ static int uac2_pcm_open(struct snd_pcm_substream *substream) } spin_lock_init(&uac2->c_prm.lock); runtime->hw.rate_min = c_srate; switch (c_sres) { case 24: switch (c_ssize) { case 3: runtime->hw.formats = SNDRV_PCM_FMTBIT_S24_3LE; pr_debug("%s:S24_3LE\n", __func__); runtime->hw.formats = SNDRV_PCM_FMTBIT_S24_3LE; break; default: pr_debug("%s:S24_LE\n", __func__); runtime->hw.formats = SNDRV_PCM_FMTBIT_S24_LE; break; } break; case 4: case 32: pr_debug("%s:S32_LE\n", __func__); runtime->hw.formats = SNDRV_PCM_FMTBIT_S32_LE; break; default: pr_debug("%s:S16_LE\n", __func__); runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE; break; } Loading Loading @@ -856,7 +887,7 @@ static struct usb_interface_descriptor std_as_out_if0_desc = { #define USB_OUT_TYPE_I_FMT_DESC2(id) usb_out_fmt##id##_desc #define USB_OUT_TYPE_I_FMT_DESC(id) USB_OUT_TYPE_I_FMT_DESC2(id) #define INIT_USB_OUT_ALT_SETTING(id, channels, bitdepth) \ #define INIT_USB_OUT_ALT_SETTING(id, channels, slotsize, bitdepth) \ struct usb_interface_descriptor USB_OUT_STD_ALT_DESC(id) = \ { \ .bLength = UAC2_STD_AS_INTF_SIZE, \ Loading Loading @@ -890,20 +921,24 @@ struct uac2_format_type_i_descriptor USB_OUT_TYPE_I_FMT_DESC(id) = \ .bDescriptorType = USB_DT_CS_INTERFACE, \ .bDescriptorSubtype = UAC_FORMAT_TYPE, \ .bFormatType = UAC_FORMAT_TYPE_I, \ .bSubslotSize = GET_SUBSLOT_SIZE(bitdepth), \ .bSubslotSize = slotsize, \ .bBitResolution = bitdepth, \ } /* Audio Streaming OUT Interface - (MONO, STEREO) X (16, 24) */ INIT_USB_OUT_ALT_SETTING(1, UAC2_MONO, 16); /* Audio Streaming OUT Interface - (MONO, STEREO) X (16(2), 24(3), 24(4)) */ INIT_USB_OUT_ALT_SETTING(1, UAC2_MONO, 2, 16); INIT_USB_OUT_ALT_SETTING(2, UAC2_STEREO, 2, 16); INIT_USB_OUT_ALT_SETTING(2, UAC2_STEREO, 16); INIT_USB_OUT_ALT_SETTING(3, UAC2_MONO, 3, 24); INIT_USB_OUT_ALT_SETTING(3, UAC2_MONO, 24); INIT_USB_OUT_ALT_SETTING(4, UAC2_STEREO, 3, 24); INIT_USB_OUT_ALT_SETTING(4, UAC2_STEREO, 24); INIT_USB_OUT_ALT_SETTING(5, UAC2_MONO, 4, 24); #define MAX_AS_OUT_ALT 4 INIT_USB_OUT_ALT_SETTING(6, UAC2_STEREO, 4, 24); #define MAX_AS_OUT_ALT 6 /* List of non-zero alt settings for Audio Streaming OUT Interface*/ static struct usb_header_descriptor *as_out_alt_setting[][3] = { Loading @@ -918,7 +953,13 @@ static struct usb_header_descriptor *as_out_alt_setting[][3] = { (struct usb_header_descriptor *)&USB_OUT_TYPE_I_FMT_DESC(3)}, {(struct usb_header_descriptor *)&USB_OUT_STD_ALT_DESC(4), (struct usb_header_descriptor *)&USB_OUT_AS_HDR_DESC(4), (struct usb_header_descriptor *)&USB_OUT_TYPE_I_FMT_DESC(4)} (struct usb_header_descriptor *)&USB_OUT_TYPE_I_FMT_DESC(4)}, {(struct usb_header_descriptor *)&USB_OUT_STD_ALT_DESC(5), (struct usb_header_descriptor *)&USB_OUT_AS_HDR_DESC(5), (struct usb_header_descriptor *)&USB_OUT_TYPE_I_FMT_DESC(5)}, {(struct usb_header_descriptor *)&USB_OUT_STD_ALT_DESC(6), (struct usb_header_descriptor *)&USB_OUT_AS_HDR_DESC(6), (struct usb_header_descriptor *)&USB_OUT_TYPE_I_FMT_DESC(6)} }; /* STD AS ISO OUT Endpoint */ Loading Loading @@ -981,7 +1022,7 @@ static struct usb_interface_descriptor std_as_in_if0_desc = { #define USB_IN_TYPE_I_FMT_DESC2(id) usb_in_fmt##id##_desc #define USB_IN_TYPE_I_FMT_DESC(id) USB_IN_TYPE_I_FMT_DESC2(id) #define INIT_USB_IN_ALT_SETTING(id, channels, bitdepth) \ #define INIT_USB_IN_ALT_SETTING(id, channels, slotsize, bitdepth) \ struct usb_interface_descriptor USB_IN_STD_ALT_DESC(id) = \ { \ .bLength = UAC2_STD_AS_INTF_SIZE, \ Loading Loading @@ -1015,20 +1056,24 @@ struct uac2_format_type_i_descriptor USB_IN_TYPE_I_FMT_DESC(id) = \ .bDescriptorType = USB_DT_CS_INTERFACE, \ .bDescriptorSubtype = UAC_FORMAT_TYPE, \ .bFormatType = UAC_FORMAT_TYPE_I, \ .bSubslotSize = GET_SUBSLOT_SIZE(bitdepth), \ .bSubslotSize = slotsize, \ .bBitResolution = bitdepth, \ } /* Audio Streaming IN Interface - (MONO, STEREO) X (16, 24) */ INIT_USB_IN_ALT_SETTING(1, UAC2_MONO, 16); /* Audio Streaming IN Interface - (MONO, STEREO) X (16(2), 24(3), 24(4)) */ INIT_USB_IN_ALT_SETTING(1, UAC2_MONO, 2, 16); INIT_USB_IN_ALT_SETTING(2, UAC2_STEREO, 2, 16); INIT_USB_IN_ALT_SETTING(2, UAC2_STEREO, 16); INIT_USB_IN_ALT_SETTING(3, UAC2_MONO, 3, 24); INIT_USB_IN_ALT_SETTING(3, UAC2_MONO, 24); INIT_USB_IN_ALT_SETTING(4, UAC2_STEREO, 3, 24); INIT_USB_IN_ALT_SETTING(4, UAC2_STEREO, 24); INIT_USB_IN_ALT_SETTING(5, UAC2_MONO, 4, 24); #define MAX_AS_IN_ALT 4 INIT_USB_IN_ALT_SETTING(6, UAC2_STEREO, 4, 24); #define MAX_AS_IN_ALT 6 /* List of non-zero alt settings for Audio Streaming IN Interface */ static struct usb_header_descriptor *as_in_alt_setting[][3] = { Loading @@ -1043,7 +1088,13 @@ static struct usb_header_descriptor *as_in_alt_setting[][3] = { (struct usb_header_descriptor *)&USB_IN_TYPE_I_FMT_DESC(3)}, {(struct usb_header_descriptor *)&USB_IN_STD_ALT_DESC(4), (struct usb_header_descriptor *)&USB_IN_AS_HDR_DESC(4), (struct usb_header_descriptor *)&USB_IN_TYPE_I_FMT_DESC(4)} (struct usb_header_descriptor *)&USB_IN_TYPE_I_FMT_DESC(4)}, {(struct usb_header_descriptor *)&USB_IN_STD_ALT_DESC(5), (struct usb_header_descriptor *)&USB_IN_AS_HDR_DESC(5), (struct usb_header_descriptor *)&USB_IN_TYPE_I_FMT_DESC(5)}, {(struct usb_header_descriptor *)&USB_IN_STD_ALT_DESC(6), (struct usb_header_descriptor *)&USB_IN_AS_HDR_DESC(6), (struct usb_header_descriptor *)&USB_IN_TYPE_I_FMT_DESC(6)} }; /* STD AS ISO IN Endpoint */ Loading Loading @@ -1127,6 +1178,18 @@ static struct usb_descriptor_header *fs_audio_desc[] = { (struct usb_descriptor_header *)&fs_epout_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(5), (struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(5), (struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(5), (struct usb_descriptor_header *)&fs_epout_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(6), (struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(6), (struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(6), (struct usb_descriptor_header *)&fs_epout_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&std_as_in_if0_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(1), Loading @@ -1152,6 +1215,18 @@ static struct usb_descriptor_header *fs_audio_desc[] = { (struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(4), (struct usb_descriptor_header *)&fs_epin_desc, (struct usb_descriptor_header *)&as_iso_in_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(5), (struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(5), (struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(5), (struct usb_descriptor_header *)&fs_epin_desc, (struct usb_descriptor_header *)&as_iso_in_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(6), (struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(6), (struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(6), (struct usb_descriptor_header *)&fs_epin_desc, (struct usb_descriptor_header *)&as_iso_in_desc, NULL, }; Loading Loading @@ -1197,6 +1272,18 @@ static struct usb_descriptor_header *hs_audio_desc[] = { (struct usb_descriptor_header *)&hs_epout_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(5), (struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(5), (struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(5), (struct usb_descriptor_header *)&hs_epout_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(6), (struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(6), (struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(6), (struct usb_descriptor_header *)&hs_epout_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&std_as_in_if0_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(1), Loading @@ -1222,6 +1309,18 @@ static struct usb_descriptor_header *hs_audio_desc[] = { (struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(4), (struct usb_descriptor_header *)&hs_epin_desc, (struct usb_descriptor_header *)&as_iso_in_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(5), (struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(5), (struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(5), (struct usb_descriptor_header *)&hs_epin_desc, (struct usb_descriptor_header *)&as_iso_in_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(6), (struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(6), (struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(6), (struct usb_descriptor_header *)&hs_epin_desc, (struct usb_descriptor_header *)&as_iso_in_desc, NULL, }; Loading Loading @@ -1271,6 +1370,20 @@ static struct usb_descriptor_header *ss_audio_desc[] = { (struct usb_descriptor_header *)&ss_epout_comp_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(5), (struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(5), (struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(5), (struct usb_descriptor_header *)&hs_epout_desc, (struct usb_descriptor_header *)&ss_epout_comp_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(6), (struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(6), (struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(6), (struct usb_descriptor_header *)&hs_epout_desc, (struct usb_descriptor_header *)&ss_epout_comp_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&std_as_in_if0_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(1), Loading Loading @@ -1300,6 +1413,20 @@ static struct usb_descriptor_header *ss_audio_desc[] = { (struct usb_descriptor_header *)&hs_epin_desc, (struct usb_descriptor_header *)&ss_epin_comp_desc, (struct usb_descriptor_header *)&as_iso_in_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(5), (struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(5), (struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(5), (struct usb_descriptor_header *)&hs_epin_desc, (struct usb_descriptor_header *)&ss_epin_comp_desc, (struct usb_descriptor_header *)&as_iso_in_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(6), (struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(6), (struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(6), (struct usb_descriptor_header *)&hs_epin_desc, (struct usb_descriptor_header *)&ss_epin_comp_desc, (struct usb_descriptor_header *)&as_iso_in_desc, NULL, }; Loading Loading @@ -1624,8 +1751,12 @@ afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt) as_out_alt_setting[alt-1][2])->bSubslotSize; opts->c_chmask = ((struct uac2_as_header_descriptor *) as_out_alt_setting[alt-1][1])->bmChannelConfig; pr_debug("%s: values set c_ssize:%u c_chmask:%u\n", __func__, opts->c_ssize, opts->c_chmask); opts->c_sres = ((struct uac2_format_type_i_descriptor *) as_out_alt_setting[alt-1][2])->bBitResolution; pr_debug("%s: values set c_ssize:%u c_sres:%u c_chmask:%u\n", __func__, opts->c_ssize, opts->c_sres, opts->c_chmask); pr_debug("%s: scheduling connect c_uevent_work\n", __func__); queue_delayed_work(agdev->uevent_wq, &agdev->c_work, Loading Loading @@ -1660,8 +1791,12 @@ afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt) as_in_alt_setting[alt-1][2])->bSubslotSize; opts->p_chmask = ((struct uac2_as_header_descriptor *) as_in_alt_setting[alt-1][1])->bmChannelConfig; pr_debug("%s: values set p_ssize:%u p_chmask:%u\n", __func__, opts->p_ssize, opts->p_chmask); opts->p_sres = ((struct uac2_format_type_i_descriptor *) as_in_alt_setting[alt-1][2])->bBitResolution; pr_debug("%s: values set p_ssize:%u p_sres:%u p_chmask:%u\n", __func__, opts->p_ssize, opts->p_sres, opts->p_chmask); pr_debug("%s: scheduling connect p_uevent_work\n", __func__); queue_delayed_work(agdev->uevent_wq, &agdev->p_work, Loading Loading @@ -2095,9 +2230,11 @@ static struct usb_function_instance *afunc_alloc_inst(void) opts->p_chmask = UAC2_DEF_PCHMASK; opts->p_srate = UAC2_DEF_PSRATE; opts->p_ssize = UAC2_DEF_PSSIZE; opts->p_sres = UAC2_DEF_PSBITRES; opts->c_chmask = UAC2_DEF_CCHMASK; opts->c_srate = UAC2_DEF_CSRATE; opts->c_ssize = UAC2_DEF_CSSIZE; opts->c_sres = UAC2_DEF_CSBITRES; return &opts->func_inst; } Loading drivers/usb/gadget/function/u_uac2.h +4 −0 Original line number Diff line number Diff line Loading @@ -21,18 +21,22 @@ #define UAC2_DEF_PCHMASK 0x3 #define UAC2_DEF_PSRATE 48000 #define UAC2_DEF_PSSIZE 2 #define UAC2_DEF_PSBITRES 16 #define UAC2_DEF_CCHMASK 0x3 #define UAC2_DEF_CSRATE 44100 #define UAC2_DEF_CSSIZE 2 #define UAC2_DEF_CSBITRES 16 struct f_uac2_opts { struct usb_function_instance func_inst; int p_chmask; int p_srate; int p_ssize; int p_sres; int c_chmask; int c_srate; int c_ssize; int c_sres; bool bound; struct mutex lock; Loading Loading
drivers/usb/gadget/function/f_uac2.c +167 −30 Original line number Diff line number Diff line Loading @@ -397,6 +397,7 @@ static int uac2_pcm_open(struct snd_pcm_substream *substream) struct audio_dev *audio_dev; struct f_uac2_opts *opts; int p_ssize, c_ssize; int p_sres, c_sres; int p_srate, c_srate; int p_chmask, c_chmask; Loading @@ -404,6 +405,8 @@ static int uac2_pcm_open(struct snd_pcm_substream *substream) opts = container_of(audio_dev->func.fi, struct f_uac2_opts, func_inst); p_ssize = opts->p_ssize; c_ssize = opts->c_ssize; p_sres = opts->p_sres; c_sres = opts->c_sres; p_srate = opts->p_srate; c_srate = opts->c_srate; p_chmask = opts->p_chmask; Loading @@ -412,6 +415,8 @@ static int uac2_pcm_open(struct snd_pcm_substream *substream) runtime->hw = uac2_pcm_hardware; pr_debug("p_srate:%d p_chmask:%d\n", p_srate, p_chmask); pr_debug("c_srate:%d c_chmask:%d\n", c_srate, c_chmask); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { if (audio_dev->as_in_alt == 0) { pr_err("%s: Host is not ready to receive the streaming\n", Loading @@ -420,14 +425,27 @@ static int uac2_pcm_open(struct snd_pcm_substream *substream) } spin_lock_init(&uac2->p_prm.lock); runtime->hw.rate_min = p_srate; switch (p_sres) { case 24: switch (p_ssize) { case 3: runtime->hw.formats = SNDRV_PCM_FMTBIT_S24_3LE; pr_debug("%s:S24_3LE\n", __func__); runtime->hw.formats = SNDRV_PCM_FMTBIT_S24_3LE; break; case 4: default: pr_debug("%s:S24_LE\n", __func__); runtime->hw.formats = SNDRV_PCM_FMTBIT_S24_LE; break; } break; case 32: pr_debug("%s:S32_LE\n", __func__); runtime->hw.formats = SNDRV_PCM_FMTBIT_S32_LE; break; default: pr_debug("%s:S16_LE\n", __func__); runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE; break; } Loading @@ -442,14 +460,27 @@ static int uac2_pcm_open(struct snd_pcm_substream *substream) } spin_lock_init(&uac2->c_prm.lock); runtime->hw.rate_min = c_srate; switch (c_sres) { case 24: switch (c_ssize) { case 3: runtime->hw.formats = SNDRV_PCM_FMTBIT_S24_3LE; pr_debug("%s:S24_3LE\n", __func__); runtime->hw.formats = SNDRV_PCM_FMTBIT_S24_3LE; break; default: pr_debug("%s:S24_LE\n", __func__); runtime->hw.formats = SNDRV_PCM_FMTBIT_S24_LE; break; } break; case 4: case 32: pr_debug("%s:S32_LE\n", __func__); runtime->hw.formats = SNDRV_PCM_FMTBIT_S32_LE; break; default: pr_debug("%s:S16_LE\n", __func__); runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE; break; } Loading Loading @@ -856,7 +887,7 @@ static struct usb_interface_descriptor std_as_out_if0_desc = { #define USB_OUT_TYPE_I_FMT_DESC2(id) usb_out_fmt##id##_desc #define USB_OUT_TYPE_I_FMT_DESC(id) USB_OUT_TYPE_I_FMT_DESC2(id) #define INIT_USB_OUT_ALT_SETTING(id, channels, bitdepth) \ #define INIT_USB_OUT_ALT_SETTING(id, channels, slotsize, bitdepth) \ struct usb_interface_descriptor USB_OUT_STD_ALT_DESC(id) = \ { \ .bLength = UAC2_STD_AS_INTF_SIZE, \ Loading Loading @@ -890,20 +921,24 @@ struct uac2_format_type_i_descriptor USB_OUT_TYPE_I_FMT_DESC(id) = \ .bDescriptorType = USB_DT_CS_INTERFACE, \ .bDescriptorSubtype = UAC_FORMAT_TYPE, \ .bFormatType = UAC_FORMAT_TYPE_I, \ .bSubslotSize = GET_SUBSLOT_SIZE(bitdepth), \ .bSubslotSize = slotsize, \ .bBitResolution = bitdepth, \ } /* Audio Streaming OUT Interface - (MONO, STEREO) X (16, 24) */ INIT_USB_OUT_ALT_SETTING(1, UAC2_MONO, 16); /* Audio Streaming OUT Interface - (MONO, STEREO) X (16(2), 24(3), 24(4)) */ INIT_USB_OUT_ALT_SETTING(1, UAC2_MONO, 2, 16); INIT_USB_OUT_ALT_SETTING(2, UAC2_STEREO, 2, 16); INIT_USB_OUT_ALT_SETTING(2, UAC2_STEREO, 16); INIT_USB_OUT_ALT_SETTING(3, UAC2_MONO, 3, 24); INIT_USB_OUT_ALT_SETTING(3, UAC2_MONO, 24); INIT_USB_OUT_ALT_SETTING(4, UAC2_STEREO, 3, 24); INIT_USB_OUT_ALT_SETTING(4, UAC2_STEREO, 24); INIT_USB_OUT_ALT_SETTING(5, UAC2_MONO, 4, 24); #define MAX_AS_OUT_ALT 4 INIT_USB_OUT_ALT_SETTING(6, UAC2_STEREO, 4, 24); #define MAX_AS_OUT_ALT 6 /* List of non-zero alt settings for Audio Streaming OUT Interface*/ static struct usb_header_descriptor *as_out_alt_setting[][3] = { Loading @@ -918,7 +953,13 @@ static struct usb_header_descriptor *as_out_alt_setting[][3] = { (struct usb_header_descriptor *)&USB_OUT_TYPE_I_FMT_DESC(3)}, {(struct usb_header_descriptor *)&USB_OUT_STD_ALT_DESC(4), (struct usb_header_descriptor *)&USB_OUT_AS_HDR_DESC(4), (struct usb_header_descriptor *)&USB_OUT_TYPE_I_FMT_DESC(4)} (struct usb_header_descriptor *)&USB_OUT_TYPE_I_FMT_DESC(4)}, {(struct usb_header_descriptor *)&USB_OUT_STD_ALT_DESC(5), (struct usb_header_descriptor *)&USB_OUT_AS_HDR_DESC(5), (struct usb_header_descriptor *)&USB_OUT_TYPE_I_FMT_DESC(5)}, {(struct usb_header_descriptor *)&USB_OUT_STD_ALT_DESC(6), (struct usb_header_descriptor *)&USB_OUT_AS_HDR_DESC(6), (struct usb_header_descriptor *)&USB_OUT_TYPE_I_FMT_DESC(6)} }; /* STD AS ISO OUT Endpoint */ Loading Loading @@ -981,7 +1022,7 @@ static struct usb_interface_descriptor std_as_in_if0_desc = { #define USB_IN_TYPE_I_FMT_DESC2(id) usb_in_fmt##id##_desc #define USB_IN_TYPE_I_FMT_DESC(id) USB_IN_TYPE_I_FMT_DESC2(id) #define INIT_USB_IN_ALT_SETTING(id, channels, bitdepth) \ #define INIT_USB_IN_ALT_SETTING(id, channels, slotsize, bitdepth) \ struct usb_interface_descriptor USB_IN_STD_ALT_DESC(id) = \ { \ .bLength = UAC2_STD_AS_INTF_SIZE, \ Loading Loading @@ -1015,20 +1056,24 @@ struct uac2_format_type_i_descriptor USB_IN_TYPE_I_FMT_DESC(id) = \ .bDescriptorType = USB_DT_CS_INTERFACE, \ .bDescriptorSubtype = UAC_FORMAT_TYPE, \ .bFormatType = UAC_FORMAT_TYPE_I, \ .bSubslotSize = GET_SUBSLOT_SIZE(bitdepth), \ .bSubslotSize = slotsize, \ .bBitResolution = bitdepth, \ } /* Audio Streaming IN Interface - (MONO, STEREO) X (16, 24) */ INIT_USB_IN_ALT_SETTING(1, UAC2_MONO, 16); /* Audio Streaming IN Interface - (MONO, STEREO) X (16(2), 24(3), 24(4)) */ INIT_USB_IN_ALT_SETTING(1, UAC2_MONO, 2, 16); INIT_USB_IN_ALT_SETTING(2, UAC2_STEREO, 2, 16); INIT_USB_IN_ALT_SETTING(2, UAC2_STEREO, 16); INIT_USB_IN_ALT_SETTING(3, UAC2_MONO, 3, 24); INIT_USB_IN_ALT_SETTING(3, UAC2_MONO, 24); INIT_USB_IN_ALT_SETTING(4, UAC2_STEREO, 3, 24); INIT_USB_IN_ALT_SETTING(4, UAC2_STEREO, 24); INIT_USB_IN_ALT_SETTING(5, UAC2_MONO, 4, 24); #define MAX_AS_IN_ALT 4 INIT_USB_IN_ALT_SETTING(6, UAC2_STEREO, 4, 24); #define MAX_AS_IN_ALT 6 /* List of non-zero alt settings for Audio Streaming IN Interface */ static struct usb_header_descriptor *as_in_alt_setting[][3] = { Loading @@ -1043,7 +1088,13 @@ static struct usb_header_descriptor *as_in_alt_setting[][3] = { (struct usb_header_descriptor *)&USB_IN_TYPE_I_FMT_DESC(3)}, {(struct usb_header_descriptor *)&USB_IN_STD_ALT_DESC(4), (struct usb_header_descriptor *)&USB_IN_AS_HDR_DESC(4), (struct usb_header_descriptor *)&USB_IN_TYPE_I_FMT_DESC(4)} (struct usb_header_descriptor *)&USB_IN_TYPE_I_FMT_DESC(4)}, {(struct usb_header_descriptor *)&USB_IN_STD_ALT_DESC(5), (struct usb_header_descriptor *)&USB_IN_AS_HDR_DESC(5), (struct usb_header_descriptor *)&USB_IN_TYPE_I_FMT_DESC(5)}, {(struct usb_header_descriptor *)&USB_IN_STD_ALT_DESC(6), (struct usb_header_descriptor *)&USB_IN_AS_HDR_DESC(6), (struct usb_header_descriptor *)&USB_IN_TYPE_I_FMT_DESC(6)} }; /* STD AS ISO IN Endpoint */ Loading Loading @@ -1127,6 +1178,18 @@ static struct usb_descriptor_header *fs_audio_desc[] = { (struct usb_descriptor_header *)&fs_epout_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(5), (struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(5), (struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(5), (struct usb_descriptor_header *)&fs_epout_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(6), (struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(6), (struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(6), (struct usb_descriptor_header *)&fs_epout_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&std_as_in_if0_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(1), Loading @@ -1152,6 +1215,18 @@ static struct usb_descriptor_header *fs_audio_desc[] = { (struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(4), (struct usb_descriptor_header *)&fs_epin_desc, (struct usb_descriptor_header *)&as_iso_in_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(5), (struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(5), (struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(5), (struct usb_descriptor_header *)&fs_epin_desc, (struct usb_descriptor_header *)&as_iso_in_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(6), (struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(6), (struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(6), (struct usb_descriptor_header *)&fs_epin_desc, (struct usb_descriptor_header *)&as_iso_in_desc, NULL, }; Loading Loading @@ -1197,6 +1272,18 @@ static struct usb_descriptor_header *hs_audio_desc[] = { (struct usb_descriptor_header *)&hs_epout_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(5), (struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(5), (struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(5), (struct usb_descriptor_header *)&hs_epout_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(6), (struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(6), (struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(6), (struct usb_descriptor_header *)&hs_epout_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&std_as_in_if0_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(1), Loading @@ -1222,6 +1309,18 @@ static struct usb_descriptor_header *hs_audio_desc[] = { (struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(4), (struct usb_descriptor_header *)&hs_epin_desc, (struct usb_descriptor_header *)&as_iso_in_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(5), (struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(5), (struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(5), (struct usb_descriptor_header *)&hs_epin_desc, (struct usb_descriptor_header *)&as_iso_in_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(6), (struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(6), (struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(6), (struct usb_descriptor_header *)&hs_epin_desc, (struct usb_descriptor_header *)&as_iso_in_desc, NULL, }; Loading Loading @@ -1271,6 +1370,20 @@ static struct usb_descriptor_header *ss_audio_desc[] = { (struct usb_descriptor_header *)&ss_epout_comp_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(5), (struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(5), (struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(5), (struct usb_descriptor_header *)&hs_epout_desc, (struct usb_descriptor_header *)&ss_epout_comp_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(6), (struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(6), (struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(6), (struct usb_descriptor_header *)&hs_epout_desc, (struct usb_descriptor_header *)&ss_epout_comp_desc, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&std_as_in_if0_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(1), Loading Loading @@ -1300,6 +1413,20 @@ static struct usb_descriptor_header *ss_audio_desc[] = { (struct usb_descriptor_header *)&hs_epin_desc, (struct usb_descriptor_header *)&ss_epin_comp_desc, (struct usb_descriptor_header *)&as_iso_in_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(5), (struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(5), (struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(5), (struct usb_descriptor_header *)&hs_epin_desc, (struct usb_descriptor_header *)&ss_epin_comp_desc, (struct usb_descriptor_header *)&as_iso_in_desc, (struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(6), (struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(6), (struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(6), (struct usb_descriptor_header *)&hs_epin_desc, (struct usb_descriptor_header *)&ss_epin_comp_desc, (struct usb_descriptor_header *)&as_iso_in_desc, NULL, }; Loading Loading @@ -1624,8 +1751,12 @@ afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt) as_out_alt_setting[alt-1][2])->bSubslotSize; opts->c_chmask = ((struct uac2_as_header_descriptor *) as_out_alt_setting[alt-1][1])->bmChannelConfig; pr_debug("%s: values set c_ssize:%u c_chmask:%u\n", __func__, opts->c_ssize, opts->c_chmask); opts->c_sres = ((struct uac2_format_type_i_descriptor *) as_out_alt_setting[alt-1][2])->bBitResolution; pr_debug("%s: values set c_ssize:%u c_sres:%u c_chmask:%u\n", __func__, opts->c_ssize, opts->c_sres, opts->c_chmask); pr_debug("%s: scheduling connect c_uevent_work\n", __func__); queue_delayed_work(agdev->uevent_wq, &agdev->c_work, Loading Loading @@ -1660,8 +1791,12 @@ afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt) as_in_alt_setting[alt-1][2])->bSubslotSize; opts->p_chmask = ((struct uac2_as_header_descriptor *) as_in_alt_setting[alt-1][1])->bmChannelConfig; pr_debug("%s: values set p_ssize:%u p_chmask:%u\n", __func__, opts->p_ssize, opts->p_chmask); opts->p_sres = ((struct uac2_format_type_i_descriptor *) as_in_alt_setting[alt-1][2])->bBitResolution; pr_debug("%s: values set p_ssize:%u p_sres:%u p_chmask:%u\n", __func__, opts->p_ssize, opts->p_sres, opts->p_chmask); pr_debug("%s: scheduling connect p_uevent_work\n", __func__); queue_delayed_work(agdev->uevent_wq, &agdev->p_work, Loading Loading @@ -2095,9 +2230,11 @@ static struct usb_function_instance *afunc_alloc_inst(void) opts->p_chmask = UAC2_DEF_PCHMASK; opts->p_srate = UAC2_DEF_PSRATE; opts->p_ssize = UAC2_DEF_PSSIZE; opts->p_sres = UAC2_DEF_PSBITRES; opts->c_chmask = UAC2_DEF_CCHMASK; opts->c_srate = UAC2_DEF_CSRATE; opts->c_ssize = UAC2_DEF_CSSIZE; opts->c_sres = UAC2_DEF_CSBITRES; return &opts->func_inst; } Loading
drivers/usb/gadget/function/u_uac2.h +4 −0 Original line number Diff line number Diff line Loading @@ -21,18 +21,22 @@ #define UAC2_DEF_PCHMASK 0x3 #define UAC2_DEF_PSRATE 48000 #define UAC2_DEF_PSSIZE 2 #define UAC2_DEF_PSBITRES 16 #define UAC2_DEF_CCHMASK 0x3 #define UAC2_DEF_CSRATE 44100 #define UAC2_DEF_CSSIZE 2 #define UAC2_DEF_CSBITRES 16 struct f_uac2_opts { struct usb_function_instance func_inst; int p_chmask; int p_srate; int p_ssize; int p_sres; int c_chmask; int c_srate; int c_ssize; int c_sres; bool bound; struct mutex lock; Loading