Message ID | 20220604105407.4055294-1-broonie@kernel.org |
---|---|
State | Accepted |
Commit | aa2a4b897132169fbc6d32932644b95875cf9c7f |
Headers | show |
Series | ASoC: ops: Fix boolean/integer detection for simple controls | expand |
On Sat, 4 Jun 2022 11:54:07 +0100, Mark Brown wrote: > The standard snd_soc_info_volsw() detects if a control is a volume control > and needs to be reported as an integer even if it only has two values by > looking for the string " Volume" in the control name. This results in false > positives if the control has a name like "HP Volume Ramp Switch" since any > " Volume" is matched, not just a trailing one. Fix this by making sure that > we only match at the end of the control name. > > [...] Applied to https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next Thanks! [1/1] ASoC: ops: Fix boolean/integer detection for simple controls commit: aa2a4b897132169fbc6d32932644b95875cf9c7f All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted. You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed. If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced. Please add any relevant lists and maintainers to the CCs when replying to this mail. Thanks, Mark
diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c index e11109dcaa50..0267e39de2a8 100644 --- a/sound/soc/soc-ops.c +++ b/sound/soc/soc-ops.c @@ -176,13 +176,21 @@ int snd_soc_info_volsw(struct snd_kcontrol *kcontrol, { struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; + const char *vol_string = NULL; int max; max = uinfo->value.integer.max = mc->max - mc->min; if (mc->platform_max && mc->platform_max < max) max = mc->platform_max; - if (max == 1 && !strstr(kcontrol->id.name, " Volume")) + /* Even two value controls ending in Volume should always be integer */ + if (max == 1) { + vol_string = strstr(kcontrol->id.name, " Volume"); + if (vol_string && strcmp(vol_string, " Volume")) + vol_string = NULL; + } + + if (!vol_string) uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; else uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
The standard snd_soc_info_volsw() detects if a control is a volume control and needs to be reported as an integer even if it only has two values by looking for the string " Volume" in the control name. This results in false positives if the control has a name like "HP Volume Ramp Switch" since any " Volume" is matched, not just a trailing one. Fix this by making sure that we only match at the end of the control name. Signed-off-by: Mark Brown <broonie@kernel.org> --- sound/soc/soc-ops.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)