[PATCH 0/2] usb: gadget: uac2: support explicit channel counts

From: Kyle Farrell

Date: Wed Jul 29 2026 - 02:22:51 EST


USB Audio Class 2.0 permits up to 255 channels in an audio channel cluster,
with bNrChannels specified independently of the channel-location bitmap
(bmChannelConfig). A zero channel-location bitmap indicates that the
channels have no predefined spatial positions.

The UAC2 gadget driver currently derives bNrChannels from the number of set
bits in bmChannelConfig. Since the descriptor defines only 27
channel-location bits, this limits playback and capture streams to 27
channels.

This series removes that limitation while preserving existing userspace
behavior. Existing ConfigFS channel-mask configuration continues to work
unchanged, while optional playback and capture channel-count attributes
allow non-spatial channel clusters to be described.

The series is split so that the shared u_audio infrastructure is updated
first without changing behavior, followed by the UAC2 functional change.

Patch 1:
Pass resolved playback and capture channel counts explicitly into
the shared u_audio implementation instead of deriving them from
channel masks.

Patch 2:
Add ConfigFS playback/capture channel-count attributes to the UAC2
function driver and use them when generating descriptors and stream
configuration, allowing counts beyond the 27 predefined channel
locations.

Testing

Testing was performed using a Raspberry Pi Zero 2 W configured as a USB
UAC2 gadget. Streaming and descriptor validation were performed against
both Linux and macOS hosts. Windows hosts were not tested.

UAC1
- Verified playback/capture operation via alsaloop.
- No descriptor or behavioral changes observed.

UAC2
- Verified legacy channel-mask configuration (1-27 channels).
- Verified explicit channel-count mode with 2, 28, 61, 62, 96 channels.
- Verified invalid channel-count/channel-mask combinations are rejected.
- Verified Feature Unit descriptor size limits are enforced.
- Verified descriptors including:
* bNrChannels
* bmChannelConfig
* Feature Unit presence and bLength
* AudioControl wTotalLength
* endpoint wMaxPacketSize
- Verified ALSA-reported playback and capture channel counts.
- Verified streaming using alsaloop.


Kyle Farrell (2):
usb: gadget: u_audio: pass channel counts explicitly
usb: gadget: f_uac2: allow explicit channel counts

.../ABI/testing/configfs-usb-gadget-uac2 | 18 ++++-
Documentation/usb/gadget-testing.rst | 18 ++++-
drivers/usb/gadget/function/f_uac1.c | 2 +
drivers/usb/gadget/function/f_uac2.c | 69 ++++++++++++++-----
drivers/usb/gadget/function/u_audio.c | 32 ++++-----
drivers/usb/gadget/function/u_audio.h | 2 +
drivers/usb/gadget/function/u_uac2.h | 4 ++
7 files changed, 105 insertions(+), 40 deletions(-)


base-commit: 1590cf0329716306e948a8fc29f1d3ee87d3989f
--
2.34.1