@@ -158,6 +158,20 @@ static void snd_soc_read_signed(struct snd_soc_component *component,
158
158
* signed_val = ret ;
159
159
}
160
160
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
+
161
175
static int soc_mixer_mask (struct soc_mixer_control * mc )
162
176
{
163
177
if (mc -> sign_bit )
@@ -330,26 +344,24 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
330
344
unsigned int val2 = 0 ;
331
345
unsigned int val , val_mask ;
332
346
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
+
335
352
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 ;
340
353
val = (val + min ) & mask ;
341
354
if (invert )
342
355
val = max - val ;
343
356
val_mask = mask << shift ;
344
357
val = val << shift ;
345
358
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
+
348
364
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 ;
353
365
val2 = (val2 + min ) & mask ;
354
366
if (invert )
355
367
val2 = max - val2 ;
@@ -435,19 +447,16 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
435
447
unsigned int shift = mc -> shift ;
436
448
unsigned int rshift = mc -> rshift ;
437
449
unsigned int val , val_mask ;
438
- int max = mc -> max ;
439
450
int min = mc -> min ;
440
451
unsigned int mask = soc_mixer_sx_mask (mc );
441
452
int err = 0 ;
442
453
int ret ;
443
454
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
+
446
459
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 ;
451
460
val_mask = mask << shift ;
452
461
val = (val + min ) & mask ;
453
462
val = val << shift ;
@@ -458,13 +467,14 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
458
467
ret = err ;
459
468
460
469
if (snd_soc_volsw_is_stereo (mc )) {
461
- unsigned int val2 = ucontrol -> value . integer . value [ 1 ] ;
470
+ unsigned int val2 ;
462
471
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 ;
467
476
477
+ val2 = ucontrol -> value .integer .value [1 ];
468
478
val_mask = mask << rshift ;
469
479
val2 = (val2 + min ) & mask ;
470
480
val2 = val2 << rshift ;
@@ -534,15 +544,12 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
534
544
unsigned int mask = soc_mixer_mask (mc );
535
545
unsigned int invert = mc -> invert ;
536
546
unsigned int val , val_mask ;
537
- int err , ret , tmp ;
547
+ int err , ret ;
538
548
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 ;
546
553
547
554
if (invert )
548
555
val = (max - ucontrol -> value .integer .value [0 ]) & mask ;
@@ -557,13 +564,10 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
557
564
ret = err ;
558
565
559
566
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 ;
567
571
568
572
if (invert )
569
573
val = (max - ucontrol -> value .integer .value [1 ]) & mask ;
0 commit comments