summaryrefslogtreecommitdiff
path: root/asoc/codecs/msm_sdw
diff options
context:
space:
mode:
authorXiaojun Sang <xsang@codeaurora.org>2017-09-22 16:50:24 +0800
committerGerrit - the friendly Code Review server <code-review@localhost>2017-11-07 01:36:52 -0800
commit24daae88958aee7848c144f92470c7033075d958 (patch)
tree0d69ba26e72affa99f3576dc186a3fb99e46d36e /asoc/codecs/msm_sdw
parent8b1366a648d53416d16f94dee0c33d4249018f92 (diff)
downloadmsm-extra-24daae88958aee7848c144f92470c7033075d958.tar.gz
ASoC: codecs: add mixer ctls to control boost level
Add new mixer ctls to control max boost state level for speaker protection V3. Change-Id: If967de46955f6dc8692986503daea68ce105f642 Signed-off-by: Xiaojun Sang <xsang@codeaurora.org>
Diffstat (limited to 'asoc/codecs/msm_sdw')
-rw-r--r--asoc/codecs/msm_sdw/msm_sdw_cdc.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/asoc/codecs/msm_sdw/msm_sdw_cdc.c b/asoc/codecs/msm_sdw/msm_sdw_cdc.c
index 05d1d801..5649167e 100644
--- a/asoc/codecs/msm_sdw/msm_sdw_cdc.c
+++ b/asoc/codecs/msm_sdw/msm_sdw_cdc.c
@@ -934,6 +934,66 @@ static int msm_sdw_ear_spkr_pa_gain_put(struct snd_kcontrol *kcontrol,
return 0;
}
+static int msm_sdw_spkr_left_boost_stage_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ u8 bst_state_max = 0;
+ struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
+
+ bst_state_max = snd_soc_read(codec, MSM_SDW_BOOST0_BOOST_CTL);
+ bst_state_max = (bst_state_max & 0x0c) >> 2;
+ ucontrol->value.integer.value[0] = bst_state_max;
+ dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
+ __func__, ucontrol->value.integer.value[0]);
+
+ return 0;
+}
+
+static int msm_sdw_spkr_left_boost_stage_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ u8 bst_state_max;
+ struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
+
+ dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
+ __func__, ucontrol->value.integer.value[0]);
+ bst_state_max = ucontrol->value.integer.value[0] << 2;
+ snd_soc_update_bits(codec, MSM_SDW_BOOST0_BOOST_CTL,
+ 0x0c, bst_state_max);
+
+ return 0;
+}
+
+static int msm_sdw_spkr_right_boost_stage_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ u8 bst_state_max = 0;
+ struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
+
+ bst_state_max = snd_soc_read(codec, MSM_SDW_BOOST1_BOOST_CTL);
+ bst_state_max = (bst_state_max & 0x0c) >> 2;
+ ucontrol->value.integer.value[0] = bst_state_max;
+ dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
+ __func__, ucontrol->value.integer.value[0]);
+
+ return 0;
+}
+
+static int msm_sdw_spkr_right_boost_stage_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ u8 bst_state_max;
+ struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
+
+ dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
+ __func__, ucontrol->value.integer.value[0]);
+ bst_state_max = ucontrol->value.integer.value[0] << 2;
+ snd_soc_update_bits(codec, MSM_SDW_BOOST1_BOOST_CTL,
+ 0x0c, bst_state_max);
+
+ return 0;
+}
+
static int msm_sdw_vi_feed_mixer_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
@@ -1465,8 +1525,15 @@ static const char * const msm_sdw_ear_spkr_pa_gain_text[] = {
"G_4_DB", "G_5_DB", "G_6_DB"
};
+static const char * const msm_sdw_speaker_boost_stage_text[] = {
+ "NO_MAX_STATE", "MAX_STATE_1", "MAX_STATE_2"
+};
+
static SOC_ENUM_SINGLE_EXT_DECL(msm_sdw_ear_spkr_pa_gain_enum,
msm_sdw_ear_spkr_pa_gain_text);
+static SOC_ENUM_SINGLE_EXT_DECL(msm_sdw_spkr_boost_stage_enum,
+ msm_sdw_speaker_boost_stage_text);
+
/* RX4 MIX1 */
static const struct soc_enum rx4_mix1_inp1_chain_enum =
SOC_ENUM_SINGLE(MSM_SDW_TOP_RX7_PATH_INPUT0_MUX,
@@ -1568,6 +1635,14 @@ static const struct snd_kcontrol_new msm_sdw_snd_controls[] = {
SOC_ENUM_EXT("EAR SPKR PA Gain", msm_sdw_ear_spkr_pa_gain_enum,
msm_sdw_ear_spkr_pa_gain_get,
msm_sdw_ear_spkr_pa_gain_put),
+ SOC_ENUM_EXT("SPKR Left Boost Max State",
+ msm_sdw_spkr_boost_stage_enum,
+ msm_sdw_spkr_left_boost_stage_get,
+ msm_sdw_spkr_left_boost_stage_put),
+ SOC_ENUM_EXT("SPKR Right Boost Max State",
+ msm_sdw_spkr_boost_stage_enum,
+ msm_sdw_spkr_right_boost_stage_get,
+ msm_sdw_spkr_right_boost_stage_put),
SOC_SINGLE_SX_TLV("RX4 Digital Volume", MSM_SDW_RX7_RX_VOL_CTL,
0, -84, 40, digital_gain),
SOC_SINGLE_SX_TLV("RX5 Digital Volume", MSM_SDW_RX8_RX_VOL_CTL,