From 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 13 May 2024 10:30:14 +0000 Subject: [PATCH] modify sin led gpio --- kernel/sound/soc/codecs/rv1106_codec.c | 111 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 88 insertions(+), 23 deletions(-) diff --git a/kernel/sound/soc/codecs/rv1106_codec.c b/kernel/sound/soc/codecs/rv1106_codec.c index f239b33..a835d8c 100644 --- a/kernel/sound/soc/codecs/rv1106_codec.c +++ b/kernel/sound/soc/codecs/rv1106_codec.c @@ -97,6 +97,9 @@ unsigned int mic_mute_l; unsigned int mic_mute_r; + /* DAC Control Manually */ + unsigned int dac_ctrl_manual; + /* For the high pass filter */ unsigned int hpf_cutoff; @@ -182,10 +185,20 @@ struct snd_ctl_elem_value *ucontrol); static int rv1106_codec_main_micbias_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol); +static int rv1106_codec_dac_ctrl_manual_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol); +static int rv1106_codec_dac_ctrl_manual_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol); static const char *offon_text[2] = { [0] = "Off", [1] = "On", +}; + +static const char *noneoffon_text[3] = { + [0] = "None", + [1] = "Off", + [2] = "On", }; static const char *mute_text[2] = { @@ -252,6 +265,11 @@ static const struct soc_enum rv1106_mic_mute_enum_array[] = { SOC_ENUM_SINGLE(0, 0, ARRAY_SIZE(mute_text), mute_text), SOC_ENUM_SINGLE(0, 1, ARRAY_SIZE(mute_text), mute_text), +}; + +/* DAC Control Manually */ +static const struct soc_enum rv1106_dac_pa_ctrl_maunal_enum_array[] = { + SOC_ENUM_SINGLE(0, 0, ARRAY_SIZE(noneoffon_text), noneoffon_text), }; /* ALC AGC Approximate Sample Rate */ @@ -422,6 +440,10 @@ rv1106_codec_hpmix_gain_get, rv1106_codec_hpmix_gain_put, rv1106_codec_dac_hpmix_gain_tlv), + + /* DAC Control Manually */ + SOC_ENUM_EXT("DAC Control Manually", rv1106_dac_pa_ctrl_maunal_enum_array[0], + rv1106_codec_dac_ctrl_manual_get, rv1106_codec_dac_ctrl_manual_put), }; static unsigned int using_adc_lr(enum adc_mode_e adc_mode) @@ -1015,35 +1037,47 @@ return 0; } +static int rv1106_codec_dac_mute(struct rv1106_codec_priv *rv1106, int mute) +{ + if (mute) { + /* Mute DAC HPMIX/LINEOUT */ + regmap_update_bits(rv1106->regmap, + ACODEC_DAC_ANA_CTL1, + ACODEC_DAC_L_LINEOUT_MUTE_MSK, + ACODEC_DAC_L_LINEOUT_MUTE); + regmap_update_bits(rv1106->regmap, + ACODEC_DAC_HPMIX_CTL, + ACODEC_DAC_HPMIX_MUTE_MSK, + ACODEC_DAC_HPMIX_MUTE); + rv1106_codec_pa_ctrl(rv1106, false); + } else { + /* Unmute DAC HPMIX/LINEOUT */ + regmap_update_bits(rv1106->regmap, + ACODEC_DAC_HPMIX_CTL, + ACODEC_DAC_HPMIX_MUTE_MSK, + ACODEC_DAC_HPMIX_WORK); + regmap_update_bits(rv1106->regmap, + ACODEC_DAC_ANA_CTL1, + ACODEC_DAC_L_LINEOUT_MUTE_MSK, + ACODEC_DAC_L_LINEOUT_WORK); + rv1106_codec_pa_ctrl(rv1106, true); + } + + return 0; +} + static int rv1106_mute_stream(struct snd_soc_dai *dai, int mute, int stream) { struct snd_soc_component *component = dai->component; struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); if (stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (mute) { - /* Mute DAC HPMIX/LINEOUT */ - regmap_update_bits(rv1106->regmap, - ACODEC_DAC_ANA_CTL1, - ACODEC_DAC_L_LINEOUT_MUTE_MSK, - ACODEC_DAC_L_LINEOUT_MUTE); - regmap_update_bits(rv1106->regmap, - ACODEC_DAC_HPMIX_CTL, - ACODEC_DAC_HPMIX_MUTE_MSK, - ACODEC_DAC_HPMIX_MUTE); - rv1106_codec_pa_ctrl(rv1106, false); - } else { - /* Unmute DAC HPMIX/LINEOUT */ - regmap_update_bits(rv1106->regmap, - ACODEC_DAC_HPMIX_CTL, - ACODEC_DAC_HPMIX_MUTE_MSK, - ACODEC_DAC_HPMIX_WORK); - regmap_update_bits(rv1106->regmap, - ACODEC_DAC_L_LINEOUT_MUTE_MSK, - ACODEC_DAC_MUTE_MSK, - ACODEC_DAC_L_LINEOUT_WORK); - rv1106_codec_pa_ctrl(rv1106, true); - } + if (rv1106->dac_ctrl_manual == 1) + mute = 1; /* Force DAC control off manually */ + else if (rv1106->dac_ctrl_manual == 2) + mute = 0; /* Force DAC control on manually */ + + rv1106_codec_dac_mute(rv1106, mute); } return 0; @@ -1341,6 +1375,36 @@ } return snd_soc_put_volsw_range(kcontrol, ucontrol); +} + +static int rv1106_codec_dac_ctrl_manual_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); + + ucontrol->value.integer.value[0] = rv1106->dac_ctrl_manual; + + return 0; +} + +static int rv1106_codec_dac_ctrl_manual_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); + + rv1106->dac_ctrl_manual = ucontrol->value.integer.value[0]; + + if (rv1106->dac_ctrl_manual == 0) + return 0; + + if (rv1106->dac_ctrl_manual == 1) + rv1106_codec_dac_mute(rv1106, 1); /* Force DAC control off manually */ + else if (rv1106->dac_ctrl_manual == 2) + rv1106_codec_dac_mute(rv1106, 0); /* Force DAC control on manually */ + + return 0; } static int rv1106_codec_adc_enable(struct rv1106_codec_priv *rv1106) @@ -1774,6 +1838,7 @@ static int rv1106_codec_dapm_controls_prepare(struct rv1106_codec_priv *rv1106) { rv1106->adc_mode = DIFF_ADCL; + rv1106->dac_ctrl_manual = 0; rv1106->hpf_cutoff = 0; rv1106->agc_l = 0; rv1106->agc_r = 0; -- Gitblit v1.6.2