Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: gadget: f_uac1: Expose all string descriptors through configfs.

This makes all string descriptors configurable for the UAC1 gadget
so the user can configure names of terminals/controls/alt modes.

Signed-off-by: Chris Wulff <chris.wulff@biamp.com>
Link: https://lore.kernel.org/r/CO1PR17MB541911B0C80D21E4B575E48CE1112@CO1PR17MB5419.namprd17.prod.outlook.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Chris Wulff and committed by
Greg Kroah-Hartman
aace0aec 8400291e

+98 -17
+12
Documentation/ABI/testing/configfs-usb-gadget-uac1
··· 30 30 req_number the number of pre-allocated requests 31 31 for both capture and playback 32 32 function_name name of the interface 33 + p_it_name playback input terminal name 34 + p_it_ch_name playback channels name 35 + p_ot_name playback output terminal name 36 + p_fu_name playback functional unit name 37 + p_alt0_name playback alt mode 0 name 38 + p_alt1_name playback alt mode 1 name 39 + c_it_name capture input terminal name 40 + c_it_ch_name capture channels name 41 + c_ot_name capture output terminal name 42 + c_fu_name capture functional unit name 43 + c_alt0_name capture alt mode 0 name 44 + c_alt1_name capture alt mode 1 name 33 45 ===================== =======================================
+12
Documentation/usb/gadget-testing.rst
··· 957 957 req_number the number of pre-allocated requests for both capture 958 958 and playback 959 959 function_name name of the interface 960 + p_it_name playback input terminal name 961 + p_it_ch_name playback channels name 962 + p_ot_name playback output terminal name 963 + p_fu_name playback functional unit name 964 + p_alt0_name playback alt mode 0 name 965 + p_alt1_name playback alt mode 1 name 966 + c_it_name capture input terminal name 967 + c_it_ch_name capture channels name 968 + c_ot_name capture output terminal name 969 + c_fu_name capture functional unit name 970 + c_alt0_name capture alt mode 0 name 971 + c_alt1_name capture alt mode 1 name 960 972 ================ ==================================================== 961 973 962 974 The attributes have sane default values.
+59 -16
drivers/usb/gadget/function/f_uac1.c
··· 377 377 STR_AS_OUT_IF_ALT1, 378 378 STR_AS_IN_IF_ALT0, 379 379 STR_AS_IN_IF_ALT1, 380 + NUM_STR_DESCRIPTORS, 380 381 }; 381 382 382 - static struct usb_string strings_uac1[] = { 383 - /* [STR_AC_IF].s = DYNAMIC, */ 384 - [STR_USB_OUT_IT].s = "Playback Input terminal", 385 - [STR_USB_OUT_IT_CH_NAMES].s = "Playback Channels", 386 - [STR_IO_OUT_OT].s = "Playback Output terminal", 387 - [STR_IO_IN_IT].s = "Capture Input terminal", 388 - [STR_IO_IN_IT_CH_NAMES].s = "Capture Channels", 389 - [STR_USB_IN_OT].s = "Capture Output terminal", 390 - [STR_FU_IN].s = "Capture Volume", 391 - [STR_FU_OUT].s = "Playback Volume", 392 - [STR_AS_OUT_IF_ALT0].s = "Playback Inactive", 393 - [STR_AS_OUT_IF_ALT1].s = "Playback Active", 394 - [STR_AS_IN_IF_ALT0].s = "Capture Inactive", 395 - [STR_AS_IN_IF_ALT1].s = "Capture Active", 396 - { }, 397 - }; 383 + static struct usb_string strings_uac1[NUM_STR_DESCRIPTORS + 1] = {}; 398 384 399 385 static struct usb_gadget_strings str_uac1 = { 400 386 .language = 0x0409, /* en-us */ ··· 1251 1265 1252 1266 strings_uac1[STR_AC_IF].s = audio_opts->function_name; 1253 1267 1268 + strings_uac1[STR_USB_OUT_IT].s = audio_opts->p_it_name; 1269 + strings_uac1[STR_USB_OUT_IT_CH_NAMES].s = audio_opts->p_it_ch_name; 1270 + strings_uac1[STR_IO_OUT_OT].s = audio_opts->p_ot_name; 1271 + strings_uac1[STR_FU_OUT].s = audio_opts->p_fu_name; 1272 + strings_uac1[STR_AS_OUT_IF_ALT0].s = audio_opts->p_alt0_name; 1273 + strings_uac1[STR_AS_OUT_IF_ALT1].s = audio_opts->p_alt1_name; 1274 + 1275 + strings_uac1[STR_IO_IN_IT].s = audio_opts->c_it_name; 1276 + strings_uac1[STR_IO_IN_IT_CH_NAMES].s = audio_opts->c_it_ch_name; 1277 + strings_uac1[STR_USB_IN_OT].s = audio_opts->c_ot_name; 1278 + strings_uac1[STR_FU_IN].s = audio_opts->c_fu_name; 1279 + strings_uac1[STR_AS_IN_IF_ALT0].s = audio_opts->c_alt0_name; 1280 + strings_uac1[STR_AS_IN_IF_ALT1].s = audio_opts->c_alt1_name; 1281 + 1254 1282 us = usb_gstrings_attach(cdev, uac1_strings, ARRAY_SIZE(strings_uac1)); 1255 1283 if (IS_ERR(us)) 1256 1284 return PTR_ERR(us); ··· 1681 1681 UAC1_ATTRIBUTE(s16, c_volume_min); 1682 1682 UAC1_ATTRIBUTE(s16, c_volume_max); 1683 1683 UAC1_ATTRIBUTE(s16, c_volume_res); 1684 + 1684 1685 UAC1_ATTRIBUTE_STRING(function_name); 1686 + 1687 + UAC1_ATTRIBUTE_STRING(p_it_name); 1688 + UAC1_ATTRIBUTE_STRING(p_it_ch_name); 1689 + UAC1_ATTRIBUTE_STRING(p_ot_name); 1690 + UAC1_ATTRIBUTE_STRING(p_fu_name); 1691 + UAC1_ATTRIBUTE_STRING(p_alt0_name); 1692 + UAC1_ATTRIBUTE_STRING(p_alt1_name); 1693 + 1694 + UAC1_ATTRIBUTE_STRING(c_it_name); 1695 + UAC1_ATTRIBUTE_STRING(c_it_ch_name); 1696 + UAC1_ATTRIBUTE_STRING(c_ot_name); 1697 + UAC1_ATTRIBUTE_STRING(c_fu_name); 1698 + UAC1_ATTRIBUTE_STRING(c_alt0_name); 1699 + UAC1_ATTRIBUTE_STRING(c_alt1_name); 1685 1700 1686 1701 static struct configfs_attribute *f_uac1_attrs[] = { 1687 1702 &f_uac1_opts_attr_c_chmask, ··· 1720 1705 &f_uac1_opts_attr_c_volume_res, 1721 1706 1722 1707 &f_uac1_opts_attr_function_name, 1708 + 1709 + &f_uac1_opts_attr_p_it_name, 1710 + &f_uac1_opts_attr_p_it_ch_name, 1711 + &f_uac1_opts_attr_p_ot_name, 1712 + &f_uac1_opts_attr_p_fu_name, 1713 + &f_uac1_opts_attr_p_alt0_name, 1714 + &f_uac1_opts_attr_p_alt1_name, 1715 + 1716 + &f_uac1_opts_attr_c_it_name, 1717 + &f_uac1_opts_attr_c_it_ch_name, 1718 + &f_uac1_opts_attr_c_ot_name, 1719 + &f_uac1_opts_attr_c_fu_name, 1720 + &f_uac1_opts_attr_c_alt0_name, 1721 + &f_uac1_opts_attr_c_alt1_name, 1723 1722 1724 1723 NULL, 1725 1724 }; ··· 1788 1759 opts->req_number = UAC1_DEF_REQ_NUM; 1789 1760 1790 1761 scnprintf(opts->function_name, sizeof(opts->function_name), "AC Interface"); 1762 + 1763 + scnprintf(opts->p_it_name, sizeof(opts->p_it_name), "Playback Input terminal"); 1764 + scnprintf(opts->p_it_ch_name, sizeof(opts->p_it_ch_name), "Playback Channels"); 1765 + scnprintf(opts->p_ot_name, sizeof(opts->p_ot_name), "Playback Output terminal"); 1766 + scnprintf(opts->p_fu_name, sizeof(opts->p_fu_name), "Playback Volume"); 1767 + scnprintf(opts->p_alt0_name, sizeof(opts->p_alt0_name), "Playback Inactive"); 1768 + scnprintf(opts->p_alt1_name, sizeof(opts->p_alt1_name), "Playback Active"); 1769 + 1770 + scnprintf(opts->c_it_name, sizeof(opts->c_it_name), "Capture Input terminal"); 1771 + scnprintf(opts->c_it_ch_name, sizeof(opts->c_it_ch_name), "Capture Channels"); 1772 + scnprintf(opts->c_ot_name, sizeof(opts->c_ot_name), "Capture Output terminal"); 1773 + scnprintf(opts->c_fu_name, sizeof(opts->c_fu_name), "Capture Volume"); 1774 + scnprintf(opts->c_alt0_name, sizeof(opts->c_alt0_name), "Capture Inactive"); 1775 + scnprintf(opts->c_alt1_name, sizeof(opts->c_alt1_name), "Capture Active"); 1791 1776 1792 1777 return &opts->func_inst; 1793 1778 }
+15 -1
drivers/usb/gadget/function/u_uac1.h
··· 52 52 int req_number; 53 53 unsigned bound:1; 54 54 55 - char function_name[32]; 55 + char function_name[USB_MAX_STRING_LEN]; 56 + 57 + char p_it_name[USB_MAX_STRING_LEN]; 58 + char p_it_ch_name[USB_MAX_STRING_LEN]; 59 + char p_ot_name[USB_MAX_STRING_LEN]; 60 + char p_fu_name[USB_MAX_STRING_LEN]; 61 + char p_alt0_name[USB_MAX_STRING_LEN]; 62 + char p_alt1_name[USB_MAX_STRING_LEN]; 63 + 64 + char c_it_name[USB_MAX_STRING_LEN]; 65 + char c_it_ch_name[USB_MAX_STRING_LEN]; 66 + char c_ot_name[USB_MAX_STRING_LEN]; 67 + char c_fu_name[USB_MAX_STRING_LEN]; 68 + char c_alt0_name[USB_MAX_STRING_LEN]; 69 + char c_alt1_name[USB_MAX_STRING_LEN]; 56 70 57 71 struct mutex lock; 58 72 int refcnt;