diff --git a/sound/soc/codecs/rk817_codec.c b/sound/soc/codecs/rk817_codec.c index e8c4d602322a..f662ba54c99a 100644 --- a/sound/soc/codecs/rk817_codec.c +++ b/sound/soc/codecs/rk817_codec.c @@ -79,6 +79,7 @@ struct rk817_codec_priv { bool pdmdata_out_enable; bool use_ext_amplifier; bool adc_for_loopback; + bool resume_path; bool out_l2spk_r2hp; long int playback_path; @@ -511,6 +512,8 @@ static const char * const rk817_call_path_mode[] = { static const char * const rk817_modem_input_mode[] = {"OFF", "ON"}; +static const char * const rk817_binary_mode[] = {"OFF", "ON"}; + static SOC_ENUM_SINGLE_DECL(rk817_playback_path_type, 0, 0, rk817_playback_path_mode); @@ -523,6 +526,9 @@ static SOC_ENUM_SINGLE_DECL(rk817_call_path_type, static SOC_ENUM_SINGLE_DECL(rk817_modem_input_type, 0, 0, rk817_modem_input_mode); +static SOC_ENUM_SINGLE_DECL(rk817_resume_path_type, + 0, 0, rk817_binary_mode); + static int rk817_playback_path_config(struct snd_soc_component *component, long pre_path, long target_path) { @@ -842,12 +848,39 @@ static int rk817_capture_path_put(struct snd_kcontrol *kcontrol, ucontrol->value.integer.value[0]); } +static int rk817_resume_path_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct rk817_codec_priv *rk817 = snd_soc_component_get_drvdata(component); + + DBG("%s : resume_path %ld\n", __func__, rk817->resume_path); + + ucontrol->value.integer.value[0] = rk817->resume_path; + + return 0; +} + +static int rk817_resume_path_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct rk817_codec_priv *rk817 = snd_soc_component_get_drvdata(component); + + rk817->resume_path = ucontrol->value.integer.value[0]; + + return 0; +} + static struct snd_kcontrol_new rk817_snd_path_controls[] = { SOC_ENUM_EXT("Playback Path", rk817_playback_path_type, rk817_playback_path_get, rk817_playback_path_put), SOC_ENUM_EXT("Capture MIC Path", rk817_capture_path_type, rk817_capture_path_get, rk817_capture_path_put), + + SOC_ENUM_EXT("Resume Path", rk817_resume_path_type, + rk817_resume_path_get, rk817_resume_path_put), }; static int rk817_set_dai_sysclk(struct snd_soc_dai *codec_dai, @@ -1152,6 +1185,15 @@ static int rk817_suspend(struct snd_soc_component *component) static int rk817_resume(struct snd_soc_component *component) { + struct rk817_codec_priv *rk817 = snd_soc_component_get_drvdata(component); + + if (rk817->resume_path) { + if (rk817->capture_path != MIC_OFF) + rk817_capture_path_config(component, OFF, rk817->capture_path); + if (rk817->playback_path != OFF) + rk817_playback_path_config(component, OFF, rk817->playback_path); + } + return 0; }