@@ -3441,17 +3441,8 @@ int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol,
3441
3441
}
3442
3442
EXPORT_SYMBOL_GPL (snd_soc_dapm_get_enum_double );
3443
3443
3444
- /**
3445
- * snd_soc_dapm_put_enum_double - dapm enumerated double mixer set callback
3446
- * @kcontrol: mixer control
3447
- * @ucontrol: control element information
3448
- *
3449
- * Callback to set the value of a dapm enumerated double mixer control.
3450
- *
3451
- * Returns 0 for success.
3452
- */
3453
- int snd_soc_dapm_put_enum_double (struct snd_kcontrol * kcontrol ,
3454
- struct snd_ctl_elem_value * ucontrol )
3444
+ static int __snd_soc_dapm_put_enum_double (struct snd_kcontrol * kcontrol ,
3445
+ struct snd_ctl_elem_value * ucontrol , int locked )
3455
3446
{
3456
3447
struct snd_soc_dapm_context * dapm = snd_soc_dapm_kcontrol_dapm (kcontrol );
3457
3448
struct snd_soc_card * card = dapm -> card ;
@@ -3474,7 +3465,9 @@ int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
3474
3465
mask |= e -> mask << e -> shift_r ;
3475
3466
}
3476
3467
3477
- mutex_lock_nested (& card -> dapm_mutex , SND_SOC_DAPM_CLASS_RUNTIME );
3468
+ if (!locked )
3469
+ mutex_lock_nested (& card -> dapm_mutex ,
3470
+ SND_SOC_DAPM_CLASS_RUNTIME );
3478
3471
3479
3472
change = dapm_kcontrol_set_value (kcontrol , val );
3480
3473
@@ -3496,15 +3489,50 @@ int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
3496
3489
card -> update = NULL ;
3497
3490
}
3498
3491
3499
- mutex_unlock (& card -> dapm_mutex );
3492
+ if (!locked )
3493
+ mutex_unlock (& card -> dapm_mutex );
3500
3494
3501
3495
if (ret > 0 )
3502
3496
soc_dpcm_runtime_update (card );
3503
3497
3504
3498
return change ;
3505
3499
}
3500
+
3501
+ /**
3502
+ * snd_soc_dapm_put_enum_double - dapm enumerated double mixer set callback
3503
+ * @kcontrol: mixer control
3504
+ * @ucontrol: control element information
3505
+ *
3506
+ * Callback to set the value of a dapm enumerated double mixer control.
3507
+ *
3508
+ * Returns 0 for success.
3509
+ */
3510
+ int snd_soc_dapm_put_enum_double (struct snd_kcontrol * kcontrol ,
3511
+ struct snd_ctl_elem_value * ucontrol )
3512
+ {
3513
+ return __snd_soc_dapm_put_enum_double (kcontrol , ucontrol , 0 );
3514
+ }
3506
3515
EXPORT_SYMBOL_GPL (snd_soc_dapm_put_enum_double );
3507
3516
3517
+ /**
3518
+ * snd_soc_dapm_put_enum_double_locked - dapm enumerated double mixer set
3519
+ * callback
3520
+ * @kcontrol: mixer control
3521
+ * @ucontrol: control element information
3522
+ *
3523
+ * Callback to set the value of a dapm enumerated double mixer control.
3524
+ * Must acquire dapm_mutex before calling the function.
3525
+ *
3526
+ * Returns 0 for success.
3527
+ */
3528
+ int snd_soc_dapm_put_enum_double_locked (struct snd_kcontrol * kcontrol ,
3529
+ struct snd_ctl_elem_value * ucontrol )
3530
+ {
3531
+ dapm_assert_locked (snd_soc_dapm_kcontrol_dapm (kcontrol ));
3532
+ return __snd_soc_dapm_put_enum_double (kcontrol , ucontrol , 1 );
3533
+ }
3534
+ EXPORT_SYMBOL_GPL (snd_soc_dapm_put_enum_double_locked );
3535
+
3508
3536
/**
3509
3537
* snd_soc_dapm_info_pin_switch - Info for a pin switch
3510
3538
*
0 commit comments