|
@@ -3210,15 +3210,11 @@ int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
|
|
|
struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);
|
|
|
const char *pin = (const char *)kcontrol->private_value;
|
|
|
|
|
|
- mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
|
|
|
-
|
|
|
if (ucontrol->value.integer.value[0])
|
|
|
snd_soc_dapm_enable_pin(&card->dapm, pin);
|
|
|
else
|
|
|
snd_soc_dapm_disable_pin(&card->dapm, pin);
|
|
|
|
|
|
- mutex_unlock(&card->dapm_mutex);
|
|
|
-
|
|
|
snd_soc_dapm_sync(&card->dapm);
|
|
|
return 0;
|
|
|
}
|
|
@@ -3766,6 +3762,26 @@ void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream,
|
|
|
mutex_unlock(&card->dapm_mutex);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * snd_soc_dapm_enable_pin_unlocked - enable pin.
|
|
|
+ * @dapm: DAPM context
|
|
|
+ * @pin: pin name
|
|
|
+ *
|
|
|
+ * Enables input/output pin and its parents or children widgets iff there is
|
|
|
+ * a valid audio route and active audio stream.
|
|
|
+ *
|
|
|
+ * Requires external locking.
|
|
|
+ *
|
|
|
+ * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
|
|
|
+ * do any widget power switching.
|
|
|
+ */
|
|
|
+int snd_soc_dapm_enable_pin_unlocked(struct snd_soc_dapm_context *dapm,
|
|
|
+ const char *pin)
|
|
|
+{
|
|
|
+ return snd_soc_dapm_set_pin(dapm, pin, 1);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin_unlocked);
|
|
|
+
|
|
|
/**
|
|
|
* snd_soc_dapm_enable_pin - enable pin.
|
|
|
* @dapm: DAPM context
|
|
@@ -3773,17 +3789,26 @@ void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream,
|
|
|
*
|
|
|
* Enables input/output pin and its parents or children widgets iff there is
|
|
|
* a valid audio route and active audio stream.
|
|
|
+ *
|
|
|
* NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
|
|
|
* do any widget power switching.
|
|
|
*/
|
|
|
int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, const char *pin)
|
|
|
{
|
|
|
- return snd_soc_dapm_set_pin(dapm, pin, 1);
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
|
|
|
+
|
|
|
+ ret = snd_soc_dapm_set_pin(dapm, pin, 1);
|
|
|
+
|
|
|
+ mutex_unlock(&dapm->card->dapm_mutex);
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin);
|
|
|
|
|
|
/**
|
|
|
- * snd_soc_dapm_force_enable_pin - force a pin to be enabled
|
|
|
+ * snd_soc_dapm_force_enable_pin_unlocked - force a pin to be enabled
|
|
|
* @dapm: DAPM context
|
|
|
* @pin: pin name
|
|
|
*
|
|
@@ -3791,11 +3816,13 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin);
|
|
|
* intended for use with microphone bias supplies used in microphone
|
|
|
* jack detection.
|
|
|
*
|
|
|
+ * Requires external locking.
|
|
|
+ *
|
|
|
* NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
|
|
|
* do any widget power switching.
|
|
|
*/
|
|
|
-int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm,
|
|
|
- const char *pin)
|
|
|
+int snd_soc_dapm_force_enable_pin_unlocked(struct snd_soc_dapm_context *dapm,
|
|
|
+ const char *pin)
|
|
|
{
|
|
|
struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
|
|
|
|
|
@@ -3811,24 +3838,102 @@ int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm,
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
+EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin_unlocked);
|
|
|
+
|
|
|
+/**
|
|
|
+ * snd_soc_dapm_force_enable_pin - force a pin to be enabled
|
|
|
+ * @dapm: DAPM context
|
|
|
+ * @pin: pin name
|
|
|
+ *
|
|
|
+ * Enables input/output pin regardless of any other state. This is
|
|
|
+ * intended for use with microphone bias supplies used in microphone
|
|
|
+ * jack detection.
|
|
|
+ *
|
|
|
+ * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
|
|
|
+ * do any widget power switching.
|
|
|
+ */
|
|
|
+int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm,
|
|
|
+ const char *pin)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
|
|
|
+
|
|
|
+ ret = snd_soc_dapm_force_enable_pin_unlocked(dapm, pin);
|
|
|
+
|
|
|
+ mutex_unlock(&dapm->card->dapm_mutex);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin);
|
|
|
|
|
|
+/**
|
|
|
+ * snd_soc_dapm_disable_pin_unlocked - disable pin.
|
|
|
+ * @dapm: DAPM context
|
|
|
+ * @pin: pin name
|
|
|
+ *
|
|
|
+ * Disables input/output pin and its parents or children widgets.
|
|
|
+ *
|
|
|
+ * Requires external locking.
|
|
|
+ *
|
|
|
+ * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
|
|
|
+ * do any widget power switching.
|
|
|
+ */
|
|
|
+int snd_soc_dapm_disable_pin_unlocked(struct snd_soc_dapm_context *dapm,
|
|
|
+ const char *pin)
|
|
|
+{
|
|
|
+ return snd_soc_dapm_set_pin(dapm, pin, 0);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin_unlocked);
|
|
|
+
|
|
|
/**
|
|
|
* snd_soc_dapm_disable_pin - disable pin.
|
|
|
* @dapm: DAPM context
|
|
|
* @pin: pin name
|
|
|
*
|
|
|
* Disables input/output pin and its parents or children widgets.
|
|
|
+ *
|
|
|
* NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
|
|
|
* do any widget power switching.
|
|
|
*/
|
|
|
int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm,
|
|
|
const char *pin)
|
|
|
{
|
|
|
- return snd_soc_dapm_set_pin(dapm, pin, 0);
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
|
|
|
+
|
|
|
+ ret = snd_soc_dapm_set_pin(dapm, pin, 0);
|
|
|
+
|
|
|
+ mutex_unlock(&dapm->card->dapm_mutex);
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin);
|
|
|
|
|
|
+/**
|
|
|
+ * snd_soc_dapm_nc_pin_unlocked - permanently disable pin.
|
|
|
+ * @dapm: DAPM context
|
|
|
+ * @pin: pin name
|
|
|
+ *
|
|
|
+ * Marks the specified pin as being not connected, disabling it along
|
|
|
+ * any parent or child widgets. At present this is identical to
|
|
|
+ * snd_soc_dapm_disable_pin() but in future it will be extended to do
|
|
|
+ * additional things such as disabling controls which only affect
|
|
|
+ * paths through the pin.
|
|
|
+ *
|
|
|
+ * Requires external locking.
|
|
|
+ *
|
|
|
+ * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
|
|
|
+ * do any widget power switching.
|
|
|
+ */
|
|
|
+int snd_soc_dapm_nc_pin_unlocked(struct snd_soc_dapm_context *dapm,
|
|
|
+ const char *pin)
|
|
|
+{
|
|
|
+ return snd_soc_dapm_set_pin(dapm, pin, 0);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(snd_soc_dapm_nc_pin_unlocked);
|
|
|
+
|
|
|
/**
|
|
|
* snd_soc_dapm_nc_pin - permanently disable pin.
|
|
|
* @dapm: DAPM context
|
|
@@ -3845,7 +3950,15 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin);
|
|
|
*/
|
|
|
int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin)
|
|
|
{
|
|
|
- return snd_soc_dapm_set_pin(dapm, pin, 0);
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
|
|
|
+
|
|
|
+ ret = snd_soc_dapm_set_pin(dapm, pin, 0);
|
|
|
+
|
|
|
+ mutex_unlock(&dapm->card->dapm_mutex);
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(snd_soc_dapm_nc_pin);
|
|
|
|