mirror of https://gitee.com/openkylin/linux.git
Merge remote-tracking branch 'asoc/fix/dapm' into asoc-linus
This commit is contained in:
commit
45d39cbf00
|
@ -222,27 +222,19 @@ static void arizona_extcon_pulse_micbias(struct arizona_extcon_info *info)
|
|||
struct snd_soc_dapm_context *dapm = arizona->dapm;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&dapm->card->dapm_mutex);
|
||||
|
||||
ret = snd_soc_dapm_force_enable_pin(dapm, widget);
|
||||
if (ret != 0)
|
||||
dev_warn(arizona->dev, "Failed to enable %s: %d\n",
|
||||
widget, ret);
|
||||
|
||||
mutex_unlock(&dapm->card->dapm_mutex);
|
||||
|
||||
snd_soc_dapm_sync(dapm);
|
||||
|
||||
if (!arizona->pdata.micd_force_micbias) {
|
||||
mutex_lock(&dapm->card->dapm_mutex);
|
||||
|
||||
ret = snd_soc_dapm_disable_pin(arizona->dapm, widget);
|
||||
if (ret != 0)
|
||||
dev_warn(arizona->dev, "Failed to disable %s: %d\n",
|
||||
widget, ret);
|
||||
|
||||
mutex_unlock(&dapm->card->dapm_mutex);
|
||||
|
||||
snd_soc_dapm_sync(dapm);
|
||||
}
|
||||
}
|
||||
|
@ -304,16 +296,12 @@ static void arizona_stop_mic(struct arizona_extcon_info *info)
|
|||
ARIZONA_MICD_ENA, 0,
|
||||
&change);
|
||||
|
||||
mutex_lock(&dapm->card->dapm_mutex);
|
||||
|
||||
ret = snd_soc_dapm_disable_pin(dapm, widget);
|
||||
if (ret != 0)
|
||||
dev_warn(arizona->dev,
|
||||
"Failed to disable %s: %d\n",
|
||||
widget, ret);
|
||||
|
||||
mutex_unlock(&dapm->card->dapm_mutex);
|
||||
|
||||
snd_soc_dapm_sync(dapm);
|
||||
|
||||
if (info->micd_reva) {
|
||||
|
|
|
@ -37,7 +37,6 @@ static void arizona_haptics_work(struct work_struct *work)
|
|||
struct arizona_haptics,
|
||||
work);
|
||||
struct arizona *arizona = haptics->arizona;
|
||||
struct mutex *dapm_mutex = &arizona->dapm->card->dapm_mutex;
|
||||
int ret;
|
||||
|
||||
if (!haptics->arizona->dapm) {
|
||||
|
@ -67,13 +66,10 @@ static void arizona_haptics_work(struct work_struct *work)
|
|||
return;
|
||||
}
|
||||
|
||||
mutex_lock_nested(dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
|
||||
|
||||
ret = snd_soc_dapm_enable_pin(arizona->dapm, "HAPTICS");
|
||||
if (ret != 0) {
|
||||
dev_err(arizona->dev, "Failed to start HAPTICS: %d\n",
|
||||
ret);
|
||||
mutex_unlock(dapm_mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -81,21 +77,14 @@ static void arizona_haptics_work(struct work_struct *work)
|
|||
if (ret != 0) {
|
||||
dev_err(arizona->dev, "Failed to sync DAPM: %d\n",
|
||||
ret);
|
||||
mutex_unlock(dapm_mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
mutex_unlock(dapm_mutex);
|
||||
|
||||
} else {
|
||||
/* This disable sequence will be a noop if already enabled */
|
||||
mutex_lock_nested(dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
|
||||
|
||||
ret = snd_soc_dapm_disable_pin(arizona->dapm, "HAPTICS");
|
||||
if (ret != 0) {
|
||||
dev_err(arizona->dev, "Failed to disable HAPTICS: %d\n",
|
||||
ret);
|
||||
mutex_unlock(dapm_mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -103,12 +92,9 @@ static void arizona_haptics_work(struct work_struct *work)
|
|||
if (ret != 0) {
|
||||
dev_err(arizona->dev, "Failed to sync DAPM: %d\n",
|
||||
ret);
|
||||
mutex_unlock(dapm_mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
mutex_unlock(dapm_mutex);
|
||||
|
||||
ret = regmap_update_bits(arizona->regmap,
|
||||
ARIZONA_HAPTICS_CONTROL_1,
|
||||
ARIZONA_HAP_CTRL_MASK,
|
||||
|
@ -155,16 +141,11 @@ static int arizona_haptics_play(struct input_dev *input, void *data,
|
|||
static void arizona_haptics_close(struct input_dev *input)
|
||||
{
|
||||
struct arizona_haptics *haptics = input_get_drvdata(input);
|
||||
struct mutex *dapm_mutex = &haptics->arizona->dapm->card->dapm_mutex;
|
||||
|
||||
cancel_work_sync(&haptics->work);
|
||||
|
||||
mutex_lock_nested(dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
|
||||
|
||||
if (haptics->arizona->dapm)
|
||||
snd_soc_dapm_disable_pin(haptics->arizona->dapm, "HAPTICS");
|
||||
|
||||
mutex_unlock(dapm_mutex);
|
||||
}
|
||||
|
||||
static int arizona_haptics_probe(struct platform_device *pdev)
|
||||
|
|
|
@ -449,14 +449,22 @@ void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm,
|
|||
/* dapm audio pin control and status */
|
||||
int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin);
|
||||
int snd_soc_dapm_enable_pin_unlocked(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin);
|
||||
int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin);
|
||||
int snd_soc_dapm_disable_pin_unlocked(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin);
|
||||
int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin);
|
||||
int snd_soc_dapm_nc_pin_unlocked(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin);
|
||||
int snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin);
|
||||
int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm);
|
||||
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);
|
||||
int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin);
|
||||
void snd_soc_dapm_auto_nc_codec_pins(struct snd_soc_codec *codec);
|
||||
|
|
|
@ -1218,7 +1218,7 @@ int dapm_regulator_event(struct snd_soc_dapm_widget *w,
|
|||
ret = regulator_allow_bypass(w->regulator, false);
|
||||
if (ret != 0)
|
||||
dev_warn(w->dapm->dev,
|
||||
"ASoC: Failed to bypass %s: %d\n",
|
||||
"ASoC: Failed to unbypass %s: %d\n",
|
||||
w->name, ret);
|
||||
}
|
||||
|
||||
|
@ -1228,7 +1228,7 @@ int dapm_regulator_event(struct snd_soc_dapm_widget *w,
|
|||
ret = regulator_allow_bypass(w->regulator, true);
|
||||
if (ret != 0)
|
||||
dev_warn(w->dapm->dev,
|
||||
"ASoC: Failed to unbypass %s: %d\n",
|
||||
"ASoC: Failed to bypass %s: %d\n",
|
||||
w->name, ret);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -3248,7 +3244,7 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
|
|||
ret = regulator_allow_bypass(w->regulator, true);
|
||||
if (ret != 0)
|
||||
dev_warn(w->dapm->dev,
|
||||
"ASoC: Failed to unbypass %s: %d\n",
|
||||
"ASoC: Failed to bypass %s: %d\n",
|
||||
w->name, ret);
|
||||
}
|
||||
break;
|
||||
|
@ -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,15 +3789,57 @@ 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_unlocked - 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.
|
||||
*
|
||||
* 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_unlocked(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
|
||||
|
||||
if (!w) {
|
||||
dev_err(dapm->dev, "ASoC: unknown pin %s\n", pin);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dev_dbg(w->dapm->dev, "ASoC: force enable pin %s\n", pin);
|
||||
w->connected = 1;
|
||||
w->force = 1;
|
||||
dapm_mark_dirty(w, "force enable");
|
||||
|
||||
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
|
||||
|
@ -3797,38 +3855,85 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin);
|
|||
int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
|
||||
int ret;
|
||||
|
||||
if (!w) {
|
||||
dev_err(dapm->dev, "ASoC: unknown pin %s\n", pin);
|
||||
return -EINVAL;
|
||||
}
|
||||
mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
|
||||
|
||||
dev_dbg(w->dapm->dev, "ASoC: force enable pin %s\n", pin);
|
||||
w->connected = 1;
|
||||
w->force = 1;
|
||||
dapm_mark_dirty(w, "force enable");
|
||||
ret = snd_soc_dapm_force_enable_pin_unlocked(dapm, pin);
|
||||
|
||||
return 0;
|
||||
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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue