.bDescriptorSubtype = UAC_INPUT_TERMINAL,
        /* .bTerminalID = DYNAMIC */
-       .wTerminalType = cpu_to_le16(UAC_INPUT_TERMINAL_MICROPHONE),
+       /* .wTerminalType = DYNAMIC */
        .bAssocTerminal = 0,
        /* .bCSourceID = DYNAMIC */
        .iChannelNames = 0,
 
        .bDescriptorSubtype = UAC_OUTPUT_TERMINAL,
        /* .bTerminalID = DYNAMIC */
-       .wTerminalType = cpu_to_le16(UAC_OUTPUT_TERMINAL_SPEAKER),
+       /* .wTerminalType = DYNAMIC */
        .bAssocTerminal = 0,
        /* .bSourceID = DYNAMIC */
        /* .bCSourceID = DYNAMIC */
                iad_desc.bInterfaceCount++;
        }
 
+       io_in_it_desc.wTerminalType = cpu_to_le16(opts->c_terminal_type);
+       io_out_ot_desc.wTerminalType = cpu_to_le16(opts->p_terminal_type);
+
        setup_headers(opts, fs_audio_desc, USB_SPEED_FULL);
        setup_headers(opts, hs_audio_desc, USB_SPEED_HIGH);
        setup_headers(opts, ss_audio_desc, USB_SPEED_SUPER);
 UAC2_ATTRIBUTE(u32, fb_max);
 UAC2_ATTRIBUTE_STRING(function_name);
 
+UAC2_ATTRIBUTE(s16, p_terminal_type);
+UAC2_ATTRIBUTE(s16, c_terminal_type);
+
 static struct configfs_attribute *f_uac2_attrs[] = {
        &f_uac2_opts_attr_p_chmask,
        &f_uac2_opts_attr_p_srate,
 
        &f_uac2_opts_attr_function_name,
 
+       &f_uac2_opts_attr_p_terminal_type,
+       &f_uac2_opts_attr_c_terminal_type,
+
        NULL,
 };
 
 
        snprintf(opts->function_name, sizeof(opts->function_name), "Source/Sink");
 
+       opts->p_terminal_type = UAC2_DEF_P_TERM_TYPE;
+       opts->c_terminal_type = UAC2_DEF_C_TERM_TYPE;
+
        return &opts->func_inst;
 }