@@ -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+
161175static 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