Skip to content

Commit eeb76cb

Browse files
charleskeepaxbroonie
authored andcommitted
ASoC: ops: Factor out helper to check valid control values
Most of the put handlers have identical code to verify the value passed in from user-space. Factor this out into a single helper function. Signed-off-by: Charles Keepax <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent c6002c1 commit eeb76cb

File tree

1 file changed

+43
-39
lines changed

1 file changed

+43
-39
lines changed

sound/soc/soc-ops.c

Lines changed: 43 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,20 @@ static void snd_soc_read_signed(struct snd_soc_component *component,
158158
*signed_val = ret;
159159
}
160160

161+
static int soc_mixer_valid_ctl(struct soc_mixer_control *mc, long val, int max)
162+
{
163+
if (val < 0)
164+
return -EINVAL;
165+
166+
if (mc->platform_max && val > mc->platform_max)
167+
return -EINVAL;
168+
169+
if (val > max)
170+
return -EINVAL;
171+
172+
return 0;
173+
}
174+
161175
static int soc_mixer_mask(struct soc_mixer_control *mc)
162176
{
163177
if (mc->sign_bit)
@@ -330,26 +344,24 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
330344
unsigned int val2 = 0;
331345
unsigned int val, val_mask;
332346

333-
if (ucontrol->value.integer.value[0] < 0)
334-
return -EINVAL;
347+
ret = soc_mixer_valid_ctl(mc, ucontrol->value.integer.value[0],
348+
mc->max - mc->min);
349+
if (ret)
350+
return ret;
351+
335352
val = ucontrol->value.integer.value[0];
336-
if (mc->platform_max && val > mc->platform_max)
337-
return -EINVAL;
338-
if (val > max - min)
339-
return -EINVAL;
340353
val = (val + min) & mask;
341354
if (invert)
342355
val = max - val;
343356
val_mask = mask << shift;
344357
val = val << shift;
345358
if (snd_soc_volsw_is_stereo(mc)) {
346-
if (ucontrol->value.integer.value[1] < 0)
347-
return -EINVAL;
359+
ret = soc_mixer_valid_ctl(mc, ucontrol->value.integer.value[1],
360+
mc->max - mc->min);
361+
if (ret)
362+
return ret;
363+
348364
val2 = ucontrol->value.integer.value[1];
349-
if (mc->platform_max && val2 > mc->platform_max)
350-
return -EINVAL;
351-
if (val2 > max - min)
352-
return -EINVAL;
353365
val2 = (val2 + min) & mask;
354366
if (invert)
355367
val2 = max - val2;
@@ -435,19 +447,16 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
435447
unsigned int shift = mc->shift;
436448
unsigned int rshift = mc->rshift;
437449
unsigned int val, val_mask;
438-
int max = mc->max;
439450
int min = mc->min;
440451
unsigned int mask = soc_mixer_sx_mask(mc);
441452
int err = 0;
442453
int ret;
443454

444-
if (ucontrol->value.integer.value[0] < 0)
445-
return -EINVAL;
455+
ret = soc_mixer_valid_ctl(mc, ucontrol->value.integer.value[0], mc->max);
456+
if (ret)
457+
return ret;
458+
446459
val = ucontrol->value.integer.value[0];
447-
if (mc->platform_max && val > mc->platform_max)
448-
return -EINVAL;
449-
if (val > max)
450-
return -EINVAL;
451460
val_mask = mask << shift;
452461
val = (val + min) & mask;
453462
val = val << shift;
@@ -458,13 +467,14 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
458467
ret = err;
459468

460469
if (snd_soc_volsw_is_stereo(mc)) {
461-
unsigned int val2 = ucontrol->value.integer.value[1];
470+
unsigned int val2;
462471

463-
if (mc->platform_max && val2 > mc->platform_max)
464-
return -EINVAL;
465-
if (val2 > max)
466-
return -EINVAL;
472+
ret = soc_mixer_valid_ctl(mc, ucontrol->value.integer.value[1],
473+
mc->max);
474+
if (ret)
475+
return ret;
467476

477+
val2 = ucontrol->value.integer.value[1];
468478
val_mask = mask << rshift;
469479
val2 = (val2 + min) & mask;
470480
val2 = val2 << rshift;
@@ -534,15 +544,12 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
534544
unsigned int mask = soc_mixer_mask(mc);
535545
unsigned int invert = mc->invert;
536546
unsigned int val, val_mask;
537-
int err, ret, tmp;
547+
int err, ret;
538548

539-
tmp = ucontrol->value.integer.value[0];
540-
if (tmp < 0)
541-
return -EINVAL;
542-
if (mc->platform_max && tmp > mc->platform_max)
543-
return -EINVAL;
544-
if (tmp > mc->max - mc->min)
545-
return -EINVAL;
549+
ret = soc_mixer_valid_ctl(mc, ucontrol->value.integer.value[0],
550+
mc->max - mc->min);
551+
if (ret)
552+
return ret;
546553

547554
if (invert)
548555
val = (max - ucontrol->value.integer.value[0]) & mask;
@@ -557,13 +564,10 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
557564
ret = err;
558565

559566
if (snd_soc_volsw_is_stereo(mc)) {
560-
tmp = ucontrol->value.integer.value[1];
561-
if (tmp < 0)
562-
return -EINVAL;
563-
if (mc->platform_max && tmp > mc->platform_max)
564-
return -EINVAL;
565-
if (tmp > mc->max - mc->min)
566-
return -EINVAL;
567+
ret = soc_mixer_valid_ctl(mc, ucontrol->value.integer.value[1],
568+
mc->max - mc->min);
569+
if (ret)
570+
return ret;
567571

568572
if (invert)
569573
val = (max - ucontrol->value.integer.value[1]) & mask;

0 commit comments

Comments
 (0)