ASoC: ops: dynamically allocate struct snd_ctl_elem_value
[ Upstream commit 7e10d7242ea8a5947878880b912ffa5806520705 ]
This structure is really too larget to be allocated on the stack:
sound/soc/soc-ops.c:435:5: error: stack frame size (1296) exceeds limit (1280) in 'snd_soc_limit_volume' [-Werror,-Wframe-larger-than]
Change the function to dynamically allocate it instead.
There is probably a better way to do it since only two integer fields
inside of that structure are actually used, but this is the simplest
rework for the moment.
Fixes: 783db6851c18 ("ASoC: ops: Enforce platform maximum on initial value")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Link: https://patch.msgid.link/20250610093057.2643233-1-arnd@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
3f3d9eae27
commit
2e8cf2331d
@@ -618,28 +618,32 @@ EXPORT_SYMBOL_GPL(snd_soc_get_volsw_range);
|
||||
static int snd_soc_clip_to_platform_max(struct snd_kcontrol *kctl)
|
||||
{
|
||||
struct soc_mixer_control *mc = (struct soc_mixer_control *)kctl->private_value;
|
||||
struct snd_ctl_elem_value uctl;
|
||||
struct snd_ctl_elem_value *uctl;
|
||||
int ret;
|
||||
|
||||
if (!mc->platform_max)
|
||||
return 0;
|
||||
|
||||
ret = kctl->get(kctl, &uctl);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
|
||||
if (!uctl)
|
||||
return -ENOMEM;
|
||||
|
||||
if (uctl.value.integer.value[0] > mc->platform_max)
|
||||
uctl.value.integer.value[0] = mc->platform_max;
|
||||
ret = kctl->get(kctl, uctl);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
if (uctl->value.integer.value[0] > mc->platform_max)
|
||||
uctl->value.integer.value[0] = mc->platform_max;
|
||||
|
||||
if (snd_soc_volsw_is_stereo(mc) &&
|
||||
uctl.value.integer.value[1] > mc->platform_max)
|
||||
uctl.value.integer.value[1] = mc->platform_max;
|
||||
uctl->value.integer.value[1] > mc->platform_max)
|
||||
uctl->value.integer.value[1] = mc->platform_max;
|
||||
|
||||
ret = kctl->put(kctl, &uctl);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = kctl->put(kctl, uctl);
|
||||
|
||||
return 0;
|
||||
out:
|
||||
kfree(uctl);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user