control: ucm: add ioctl to retrieve full card components

The fixed-size components field in SNDRV_CTL_IOCTL_CARD_INFO can be too
small on systems with many audio devices. The kernel [1] will provide a
new ioctl to read the full string while truncating the original in
card_info if it grows too big. Make sure the code falls back to original
if the new ioctl is not supported.

[1]: https://lore.kernel.org/all/20260122111249.67319-1-mstrozek@opensource.cirrus.com/
Signed-off-by: Maciej Strozek <mstrozek@opensource.cirrus.com>
This commit is contained in:
Maciej Strozek 2026-01-22 09:14:17 +00:00
parent 75ed5f05ba
commit d4cf5da490
17 changed files with 180 additions and 5 deletions

View file

@ -89,6 +89,15 @@ static int snd_ctl_ext_card_info(snd_ctl_t *handle, snd_ctl_card_info_t *info)
return 0;
}
static int snd_ctl_ext_card_components(snd_ctl_t *handle, snd_ctl_card_components_t *components)
{
snd_ctl_ext_t *ext = handle->private_data;
memset(components, 0, sizeof(*components));
components->card = ext->card_idx;
return 0;
}
static int snd_ctl_ext_elem_list(snd_ctl_t *handle, snd_ctl_elem_list_t *list)
{
snd_ctl_ext_t *ext = handle->private_data;
@ -469,6 +478,7 @@ static const snd_ctl_ops_t snd_ctl_ext_ops = {
.async = snd_ctl_ext_async,
.subscribe_events = snd_ctl_ext_subscribe_events,
.card_info = snd_ctl_ext_card_info,
.card_components = snd_ctl_ext_card_components,
.element_list = snd_ctl_ext_elem_list,
.element_info = snd_ctl_ext_elem_info,
.element_add = snd_ctl_ext_elem_add,