@@ -126,6 +126,20 @@ static int soc_mixer_reg_to_ctl(struct soc_mixer_control *mc, unsigned int reg_v
126
126
return val & mask ;
127
127
}
128
128
129
+ static unsigned int soc_mixer_ctl_to_reg (struct soc_mixer_control * mc , int val ,
130
+ unsigned int mask , unsigned int shift ,
131
+ int max )
132
+ {
133
+ unsigned int reg_val ;
134
+
135
+ if (mc -> invert )
136
+ val = max - val ;
137
+
138
+ reg_val = val + mc -> min ;
139
+
140
+ return (reg_val & mask ) << shift ;
141
+ }
142
+
129
143
static int soc_mixer_valid_ctl (struct soc_mixer_control * mc , long val , int max )
130
144
{
131
145
if (val < 0 )
@@ -292,43 +306,35 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
292
306
(struct soc_mixer_control * )kcontrol -> private_value ;
293
307
unsigned int reg = mc -> reg ;
294
308
unsigned int reg2 = mc -> rreg ;
295
- unsigned int shift = mc -> shift ;
296
- unsigned int rshift = mc -> rshift ;
297
- int max = mc -> max ;
298
- int min = mc -> min ;
309
+ int max = mc -> max - mc -> min ;
299
310
unsigned int mask = soc_mixer_mask (mc );
300
- unsigned int invert = mc -> invert ;
301
311
int err , ret ;
302
312
bool type_2r = false;
303
313
unsigned int val2 = 0 ;
304
314
unsigned int val , val_mask ;
305
315
306
- ret = soc_mixer_valid_ctl (mc , ucontrol -> value .integer .value [0 ],
307
- mc -> max - mc -> min );
316
+ ret = soc_mixer_valid_ctl (mc , ucontrol -> value .integer .value [0 ], max );
308
317
if (ret )
309
318
return ret ;
310
319
311
- val = ucontrol -> value .integer .value [0 ];
312
- val = (val + min ) & mask ;
313
- if (invert )
314
- val = max - val ;
315
- val_mask = mask << shift ;
316
- val = val << shift ;
320
+ val = soc_mixer_ctl_to_reg (mc , ucontrol -> value .integer .value [0 ],
321
+ mask , mc -> shift , max );
322
+ val_mask = mask << mc -> shift ;
323
+
317
324
if (snd_soc_volsw_is_stereo (mc )) {
318
- ret = soc_mixer_valid_ctl (mc , ucontrol -> value .integer .value [1 ],
319
- mc -> max - mc -> min );
325
+ ret = soc_mixer_valid_ctl (mc , ucontrol -> value .integer .value [1 ], max );
320
326
if (ret )
321
327
return ret ;
322
328
323
- val2 = ucontrol -> value .integer .value [1 ];
324
- val2 = (val2 + min ) & mask ;
325
- if (invert )
326
- val2 = max - val2 ;
327
329
if (reg == reg2 ) {
328
- val_mask |= mask << rshift ;
329
- val |= val2 << rshift ;
330
+ val |= soc_mixer_ctl_to_reg (mc ,
331
+ ucontrol -> value .integer .value [1 ],
332
+ mask , mc -> rshift , max );
333
+ val_mask |= mask << mc -> rshift ;
330
334
} else {
331
- val2 = val2 << shift ;
335
+ val2 = soc_mixer_ctl_to_reg (mc ,
336
+ ucontrol -> value .integer .value [1 ],
337
+ mask , mc -> shift , max );
332
338
type_2r = true;
333
339
}
334
340
}
@@ -404,10 +410,7 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
404
410
(struct soc_mixer_control * )kcontrol -> private_value ;
405
411
unsigned int reg = mc -> reg ;
406
412
unsigned int reg2 = mc -> rreg ;
407
- unsigned int shift = mc -> shift ;
408
- unsigned int rshift = mc -> rshift ;
409
413
unsigned int val , val_mask ;
410
- int min = mc -> min ;
411
414
unsigned int mask = soc_mixer_sx_mask (mc );
412
415
int err = 0 ;
413
416
int ret ;
@@ -416,31 +419,27 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
416
419
if (ret )
417
420
return ret ;
418
421
419
- val = ucontrol -> value .integer .value [0 ];
420
- val_mask = mask << shift ;
421
- val = (val + min ) & mask ;
422
- val = val << shift ;
422
+ val = soc_mixer_ctl_to_reg (mc , ucontrol -> value .integer .value [0 ],
423
+ mask , mc -> shift , mc -> max );
424
+ val_mask = mask << mc -> shift ;
423
425
424
426
err = snd_soc_component_update_bits (component , reg , val_mask , val );
425
427
if (err < 0 )
426
428
return err ;
427
429
ret = err ;
428
430
429
431
if (snd_soc_volsw_is_stereo (mc )) {
430
- unsigned int val2 ;
431
-
432
432
ret = soc_mixer_valid_ctl (mc , ucontrol -> value .integer .value [1 ],
433
433
mc -> max );
434
434
if (ret )
435
435
return ret ;
436
436
437
- val2 = ucontrol -> value .integer .value [1 ];
438
- val_mask = mask << rshift ;
439
- val2 = (val2 + min ) & mask ;
440
- val2 = val2 << rshift ;
437
+ val = soc_mixer_ctl_to_reg (mc , ucontrol -> value .integer .value [1 ],
438
+ mask , mc -> rshift , mc -> max );
439
+ val_mask = mask << mc -> rshift ;
441
440
442
441
err = snd_soc_component_update_bits (component , reg2 , val_mask ,
443
- val2 );
442
+ val );
444
443
445
444
/* Don't discard any error code or drop change flag */
446
445
if (ret == 0 || err < 0 )
@@ -498,25 +497,19 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
498
497
struct snd_soc_component * component = snd_kcontrol_chip (kcontrol );
499
498
unsigned int reg = mc -> reg ;
500
499
unsigned int rreg = mc -> rreg ;
501
- unsigned int shift = mc -> shift ;
502
- int min = mc -> min ;
503
- int max = mc -> max ;
500
+ int max = mc -> max - mc -> min ;
504
501
unsigned int mask = soc_mixer_mask (mc );
505
- unsigned int invert = mc -> invert ;
506
- unsigned int val , val_mask ;
502
+ unsigned int val_mask = mask << mc -> shift ;
503
+ unsigned int val ;
507
504
int err , ret ;
508
505
509
506
ret = soc_mixer_valid_ctl (mc , ucontrol -> value .integer .value [0 ],
510
507
mc -> max - mc -> min );
511
508
if (ret )
512
509
return ret ;
513
510
514
- if (invert )
515
- val = (max - ucontrol -> value .integer .value [0 ]) & mask ;
516
- else
517
- val = ((ucontrol -> value .integer .value [0 ] + min ) & mask );
518
- val_mask = mask << shift ;
519
- val = val << shift ;
511
+ val = soc_mixer_ctl_to_reg (mc , ucontrol -> value .integer .value [0 ],
512
+ mask , mc -> shift , max );
520
513
521
514
err = snd_soc_component_update_bits (component , reg , val_mask , val );
522
515
if (err < 0 )
@@ -525,16 +518,12 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
525
518
526
519
if (snd_soc_volsw_is_stereo (mc )) {
527
520
ret = soc_mixer_valid_ctl (mc , ucontrol -> value .integer .value [1 ],
528
- mc -> max - mc -> min );
521
+ max );
529
522
if (ret )
530
523
return ret ;
531
524
532
- if (invert )
533
- val = (max - ucontrol -> value .integer .value [1 ]) & mask ;
534
- else
535
- val = ((ucontrol -> value .integer .value [1 ] + min ) & mask );
536
- val_mask = mask << shift ;
537
- val = val << shift ;
525
+ val = soc_mixer_ctl_to_reg (mc , ucontrol -> value .integer .value [1 ],
526
+ mask , mc -> shift , max );
538
527
539
528
err = snd_soc_component_update_bits (component , rreg , val_mask ,
540
529
val );
0 commit comments