summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorMikko Sarmanne <mikko.sarmanne@symbio.com>2011-01-17 10:39:29 +0200
committerUlf Hansson <ulf.hansson@stericsson.com>2011-09-19 15:14:43 +0200
commitc68929479e61fb22985d90007cf2534290814597 (patch)
treeb022894851480487de73d22f97eef129a4682ef4 /sound
parente18c76def240b72b532df8d53493913d0fcac14e (diff)
Update AB8500 ASoC mixer controls
Updates the naming of several AB8500 ALSA SoC mixer controls and adds new ones to support vibra functionality. Support is added for both PCM and PWM vibra modes. ST-Ericsson ID: WP271430 and WP271431 Change-Id: If87fc88bbbb4d27dedd17db3652b35fdb59d97cc Signed-off-by: Mikko Sarmanne <mikko.sarmanne@symbio.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/12882 Reviewed-by: Ola LILJA2 <ola.o.lilja@stericsson.com> Tested-by: Josefin LOFSTEDT <josefin.lofstedt@stericsson.com>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/codecs/ab8500.c321
-rw-r--r--sound/soc/codecs/ab8500.h42
2 files changed, 213 insertions, 150 deletions
diff --git a/sound/soc/codecs/ab8500.c b/sound/soc/codecs/ab8500.c
index f9ae047fe99..ecec5a461f9 100644
--- a/sound/soc/codecs/ab8500.c
+++ b/sound/soc/codecs/ab8500.c
@@ -374,44 +374,51 @@ static const struct snd_kcontrol_new dapm_anc_ear_mute[] = {
REG_DIGMULTCONF1_ANCSEL, 1, NORMAL),
};
-/* Handsfree left channel selector control */
-static const char *enum_ihfl_sel[] = {"DA 3", "ANC"};
+/* Earpiece source selector control */
+static const char *enum_ear_source[] = {"Headset Left", "IHF Left"};
+
+static SOC_ENUM_SINGLE_DECL(dapm_enum_ear_source, REG_DMICFILTCONF,
+ REG_DMICFILTCONF_DA3TOEAR, enum_ear_source);
+
+static const struct snd_kcontrol_new dapm_ear_source[] = {
+ SOC_DAPM_ENUM("Earpiece Source", dapm_enum_ear_source),
+};
+
+/* IHF / ANC selector control */
+static const char *enum_ihfx_sel[] = {"Audio Path", "ANC"};
static SOC_ENUM_SINGLE_DECL(dapm_enum_ihfl_sel, REG_DIGMULTCONF2,
- REG_DIGMULTCONF2_HFLSEL, enum_ihfl_sel);
+ REG_DIGMULTCONF2_HFLSEL, enum_ihfx_sel);
static const struct snd_kcontrol_new dapm_ihfl_select[] = {
- SOC_DAPM_ENUM("Handsfree Left Select", dapm_enum_ihfl_sel),
+ SOC_DAPM_ENUM("IHF Left Source", dapm_enum_ihfl_sel),
};
-/* Handsfree right channel selector control */
-static const char *enum_ihfr_sel[] = {"DA 4", "ANC"};
-
static SOC_ENUM_SINGLE_DECL(dapm_enum_ihfr_sel, REG_DIGMULTCONF2,
- REG_DIGMULTCONF2_HFRSEL, enum_ihfr_sel);
+ REG_DIGMULTCONF2_HFRSEL, enum_ihfx_sel);
static const struct snd_kcontrol_new dapm_ihfr_select[] = {
- SOC_DAPM_ENUM("Handsfree Right Select", dapm_enum_ihfr_sel),
+ SOC_DAPM_ENUM("IHF Right Source", dapm_enum_ihfr_sel),
};
-/* Mic 1A/1B selector control */
+/* Mic 1A or 1B selector control */
static const char *enum_mic1ab_sel[] = {"Mic 1A", "Mic 1B"};
static SOC_ENUM_SINGLE_DECL(dapm_enum_mic1ab_sel, REG_ANACONF3,
REG_ANACONF3_MIC1SEL, enum_mic1ab_sel);
static const struct snd_kcontrol_new dapm_mic1ab_select[] = {
- SOC_DAPM_ENUM("Mic 1A/1B Select", dapm_enum_mic1ab_sel),
+ SOC_DAPM_ENUM("Mic 1A or 1B Select", dapm_enum_mic1ab_sel),
};
-/* Mic 2 / LineIn Right selector control */
+/* Mic 2 or LineIn Right selector control */
static const char *enum_mic2lr_sel[] = {"Mic 2", "LineIn Right"};
static SOC_ENUM_SINGLE_DECL(dapm_enum_mic2lr_sel, REG_ANACONF3,
REG_ANACONF3_LINRSEL, enum_mic2lr_sel);
static const struct snd_kcontrol_new dapm_mic2lr_select[] = {
- SOC_DAPM_ENUM("Mic 2 / LINR Select", dapm_enum_mic2lr_sel),
+ SOC_DAPM_ENUM("Mic 2 or LINR Select", dapm_enum_mic2lr_sel),
};
/* AD1 selector control */
@@ -435,7 +442,7 @@ static const struct snd_kcontrol_new dapm_ad2_select[] = {
};
/* AD3 selector control */
-static const char *enum_ad3_sel[] = {"Mic 1A/1B", "DMic 3"};
+static const char *enum_ad3_sel[] = {"Mic 1", "DMic 3"};
static SOC_ENUM_SINGLE_DECL(dapm_enum_ad3_sel, REG_DIGMULTCONF1,
REG_DIGMULTCONF1_AD3SEL, enum_ad3_sel);
@@ -455,7 +462,7 @@ static const struct snd_kcontrol_new dapm_ad5_select[] = {
};
/* AD6 selector control */
-static const char *enum_ad6_sel[] = {"Mic 1A/1B", "DMic 6"};
+static const char *enum_ad6_sel[] = {"Mic 1", "DMic 6"};
static SOC_ENUM_SINGLE_DECL(dapm_enum_ad6_sel, REG_DIGMULTCONF1,
REG_DIGMULTCONF1_AD6SEL, enum_ad6_sel);
@@ -465,35 +472,62 @@ static const struct snd_kcontrol_new dapm_ad6_select[] = {
};
/* ANC input selector control */
-static const char *enum_anc_in_sel[] = {"AD 6", "AD 5"};
+static const char *enum_anc_in_sel[] = {"Mic 1 / DMic 6", "Mic 2 / DMic 5"};
static SOC_ENUM_SINGLE_DECL(dapm_enum_anc_in_sel, REG_DMICFILTCONF,
REG_DMICFILTCONF_ANCINSEL, enum_anc_in_sel);
static const struct snd_kcontrol_new dapm_anc_in_select[] = {
- SOC_DAPM_ENUM("ANC Input Select", dapm_enum_anc_in_sel),
+ SOC_DAPM_ENUM("ANC Source", dapm_enum_anc_in_sel),
+};
+
+/* ANC enable control */
+static const char *enum_anc_dis_ena[] = {"Disabled", "Enabled"};
+
+static SOC_ENUM_SINGLE_DECL(dapm_enum_anc_enable, REG_ANCCONF1,
+ REG_ANCCONF1_ENANC, enum_anc_dis_ena);
+
+static const struct snd_kcontrol_new dapm_anc_enable[] = {
+ SOC_DAPM_ENUM("ANC", dapm_enum_anc_enable),
};
-/* STFIR1 input selector control */
+/* Sidetone left input selector control */
static const char *enum_stfir1_in_sel[] = {
- "LineIn Left", "LineIn Right", "Mic 1A/1B", "Headset Left"};
+ "LineIn Left", "LineIn Right", "Mic 1", "Headset Left"};
static SOC_ENUM_SINGLE_DECL(dapm_enum_stfir1_in_sel, REG_DIGMULTCONF2,
REG_DIGMULTCONF2_FIRSID1SEL, enum_stfir1_in_sel);
static const struct snd_kcontrol_new dapm_stfir1_in_select[] = {
- SOC_DAPM_ENUM("STFIR1 Input Select", dapm_enum_stfir1_in_sel),
+ SOC_DAPM_ENUM("Sidetone Left Source", dapm_enum_stfir1_in_sel),
};
-/* STFIR2 input selector control */
+/* Sidetone right input selector control */
static const char *enum_stfir2_in_sel[] = {
- "LineIn Right", "Mic 1A/1B", "DMic 4", "Headset Right"};
+ "LineIn Right", "Mic 1", "DMic 4", "Headset Right"};
static SOC_ENUM_SINGLE_DECL(dapm_enum_stfir2_in_sel, REG_DIGMULTCONF2,
REG_DIGMULTCONF2_FIRSID2SEL, enum_stfir2_in_sel);
static const struct snd_kcontrol_new dapm_stfir2_in_select[] = {
- SOC_DAPM_ENUM("STFIR2 Input Select", dapm_enum_stfir2_in_sel),
+ SOC_DAPM_ENUM("Sidetone Right Source", dapm_enum_stfir2_in_sel),
+};
+
+/* Vibra path selector control */
+static const char *enum_pwm2vibx[] = {"Audio Path", "PWM Generator"};
+
+static SOC_ENUM_SINGLE_DECL(dapm_enum_pwm2vib1, REG_PWMGENCONF1,
+ REG_PWMGENCONF1_PWMTOVIB1, enum_pwm2vibx);
+
+static const struct snd_kcontrol_new dapm_pwm2vib1[] = {
+ SOC_DAPM_ENUM("Vibra 1 Controller", dapm_enum_pwm2vib1),
+};
+
+static SOC_ENUM_SINGLE_DECL(dapm_enum_pwm2vib2, REG_PWMGENCONF1,
+ REG_PWMGENCONF1_PWMTOVIB2, enum_pwm2vibx);
+
+static const struct snd_kcontrol_new dapm_pwm2vib2[] = {
+ SOC_DAPM_ENUM("Vibra 2 Controller", dapm_enum_pwm2vib2),
};
static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
@@ -539,6 +573,9 @@ static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
/* Earpiece path */
+ SND_SOC_DAPM_MUX("Earpiece Source Playback Route",
+ SND_SOC_NOPM, 0, 0, dapm_ear_source),
+
SND_SOC_DAPM_MIXER("EAR DAC", REG_DAPATHCONF,
REG_DAPATHCONF_ENDACEAR, 0, NULL, 0),
@@ -562,15 +599,13 @@ static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
SND_SOC_DAPM_MIXER("DA4 Channel Gain", REG_DAPATHENA,
REG_DAPATHENA_ENDA4, 0, NULL, 0),
- SND_SOC_DAPM_MUX("Handsfree Left Select Playback Route",
+ SND_SOC_DAPM_MUX("IHF Left Source Playback Route",
SND_SOC_NOPM, 0, 0, dapm_ihfl_select),
- SND_SOC_DAPM_MUX("Handsfree Right Select Playback Route",
+ SND_SOC_DAPM_MUX("IHF Right Source Playback Route",
SND_SOC_NOPM, 0, 0, dapm_ihfr_select),
- SND_SOC_DAPM_SWITCH("Handsfree Left",
- SND_SOC_NOPM, 0, 0, dapm_ihfl_mute),
- SND_SOC_DAPM_SWITCH("Handsfree Right",
- SND_SOC_NOPM, 0, 0, dapm_ihfr_mute),
+ SND_SOC_DAPM_SWITCH("IHF Left", SND_SOC_NOPM, 0, 0, dapm_ihfl_mute),
+ SND_SOC_DAPM_SWITCH("IHF Right", SND_SOC_NOPM, 0, 0, dapm_ihfr_mute),
SND_SOC_DAPM_MIXER("IHFL DAC", REG_DAPATHCONF,
REG_DAPATHCONF_ENDACHFL, 0, NULL, 0),
@@ -601,7 +636,13 @@ static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
SND_SOC_DAPM_MIXER("VIB2 DAC", REG_DAPATHCONF,
REG_DAPATHCONF_ENDACVIB2, 0, NULL, 0),
- /* XXX PWM Gen */
+ SND_SOC_DAPM_INPUT("PWMGEN1"),
+ SND_SOC_DAPM_INPUT("PWMGEN2"),
+
+ SND_SOC_DAPM_MUX("Vibra 1 Controller Playback Route",
+ SND_SOC_NOPM, 0, 0, dapm_pwm2vib1),
+ SND_SOC_DAPM_MUX("Vibra 2 Controller Playback Route",
+ SND_SOC_NOPM, 0, 0, dapm_pwm2vib2),
SND_SOC_DAPM_MIXER("VIB1 Enable", REG_ANACONF4,
REG_ANACONF4_ENVIB1, 0, NULL, 0),
@@ -629,7 +670,7 @@ static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
SND_SOC_DAPM_MIXER("MIC2 Enable", REG_ANACONF2,
REG_ANACONF2_ENMIC2, 0, NULL, 0),
- SND_SOC_DAPM_MUX("Mic 2 / LINR Select Capture Route",
+ SND_SOC_DAPM_MUX("Mic 2 or LINR Select Capture Route",
SND_SOC_NOPM, 0, 0, dapm_mic2lr_select),
SND_SOC_DAPM_MIXER("LINL ADC", REG_ANACONF3,
@@ -659,7 +700,7 @@ static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
SND_SOC_DAPM_INPUT("MIC1A"),
SND_SOC_DAPM_INPUT("MIC1B"),
- SND_SOC_DAPM_MUX("Mic 1A/1B Select Capture Route",
+ SND_SOC_DAPM_MUX("Mic 1A or 1B Select Capture Route",
SND_SOC_NOPM, 0, 0, dapm_mic1ab_select),
SND_SOC_DAPM_SWITCH("Mic 1", SND_SOC_NOPM, 0, 0, dapm_mic1_mute),
@@ -692,9 +733,9 @@ static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
SND_SOC_DAPM_MIXER("AD6 Channel Gain", SND_SOC_NOPM, 0, 0, NULL, 0),
SND_SOC_DAPM_MIXER("AD57 Enable", REG_ADPATHENA,
- REG_ADPATHENA_ENAD57, 0, NULL, 0),
+ REG_ADPATHENA_ENAD5768, 0, NULL, 0),
SND_SOC_DAPM_MIXER("AD68 Enable", REG_ADPATHENA,
- REG_ADPATHENA_ENAD57, 0, NULL, 0),
+ REG_ADPATHENA_ENAD5768, 0, NULL, 0),
SND_SOC_DAPM_AIF_OUT("AD_OUT57", "ab8500_0c", 0, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_AIF_OUT("AD_OUT68", "ab8500_0c", 0, SND_SOC_NOPM, 0, 0),
@@ -738,10 +779,11 @@ static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
/* Acoustical Noise Cancellation path */
- SND_SOC_DAPM_MUX("ANC Input Select Playback Route",
+ SND_SOC_DAPM_MUX("ANC Source Playback Route",
SND_SOC_NOPM, 0, 0, dapm_anc_in_select),
- SND_SOC_DAPM_MIXER("ANC Control", SND_SOC_NOPM, 0, 0, NULL, 0),
+ SND_SOC_DAPM_MUX("ANC Playback Switch",
+ SND_SOC_NOPM, 0, 0, dapm_anc_enable),
SND_SOC_DAPM_SWITCH("ANC to Earpiece",
SND_SOC_NOPM, 0, 0, dapm_anc_ear_mute),
@@ -749,9 +791,9 @@ static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
/* Sidetone Filter path */
- SND_SOC_DAPM_MUX("STFIR1 Input Select Playback Route",
+ SND_SOC_DAPM_MUX("Sidetone Left Source Playback Route",
SND_SOC_NOPM, 0, 0, dapm_stfir1_in_select),
- SND_SOC_DAPM_MUX("STFIR2 Input Select Playback Route",
+ SND_SOC_DAPM_MUX("Sidetone Right Source Playback Route",
SND_SOC_NOPM, 0, 0, dapm_stfir2_in_select),
SND_SOC_DAPM_MIXER("STFIR1 Control", SND_SOC_NOPM, 0, 0, NULL, 0),
@@ -791,7 +833,10 @@ static const struct snd_soc_dapm_route intercon[] = {
/* Earpiece path */
- {"EAR DAC", NULL, "HSL Digital Gain"},
+ {"Earpiece Source Playback Route", "Headset Left", "HSL Digital Gain"},
+ {"Earpiece Source Playback Route", "IHF Left", "IHF Left"},
+
+ {"EAR DAC", NULL, "Earpiece Source Playback Route"},
{"Earpiece", "Playback Switch", "EAR DAC"},
@@ -805,16 +850,14 @@ static const struct snd_soc_dapm_route intercon[] = {
{"DA3 Channel Gain", NULL, "DA_IN3"},
{"DA4 Channel Gain", NULL, "DA_IN4"},
- {"Handsfree Left Select Playback Route", "DA 3", "DA3 Channel Gain"},
- {"Handsfree Right Select Playback Route", "DA 4", "DA4 Channel Gain"},
+ {"IHF Left Source Playback Route", "Audio Path", "DA3 Channel Gain"},
+ {"IHF Right Source Playback Route", "Audio Path", "DA4 Channel Gain"},
- {"Handsfree Left", "Playback Switch",
- "Handsfree Left Select Playback Route"},
- {"Handsfree Right", "Playback Switch",
- "Handsfree Right Select Playback Route"},
+ {"IHF Left", "Playback Switch", "IHF Left Source Playback Route"},
+ {"IHF Right", "Playback Switch", "IHF Right Source Playback Route"},
- {"IHFL DAC", NULL, "Handsfree Left"},
- {"IHFR DAC", NULL, "Handsfree Right"},
+ {"IHFL DAC", NULL, "IHF Left"},
+ {"IHFR DAC", NULL, "IHF Right"},
{"IHFL Enable", NULL, "IHFL DAC"},
{"IHFR Enable", NULL, "IHFR DAC"},
@@ -831,8 +874,13 @@ static const struct snd_soc_dapm_route intercon[] = {
{"VIB1 DAC", NULL, "DA5 Channel Gain"},
{"VIB2 DAC", NULL, "DA6 Channel Gain"},
- {"VIB1 Enable", NULL, "VIB1 DAC"},
- {"VIB2 Enable", NULL, "VIB2 DAC"},
+ {"Vibra 1 Controller Playback Route", "Audio Path", "VIB1 DAC"},
+ {"Vibra 2 Controller Playback Route", "Audio Path", "VIB2 DAC"},
+ {"Vibra 1 Controller Playback Route", "PWM Generator", "PWMGEN1"},
+ {"Vibra 2 Controller Playback Route", "PWM Generator", "PWMGEN2"},
+
+ {"VIB1 Enable", NULL, "Vibra 1 Controller Playback Route"},
+ {"VIB2 Enable", NULL, "Vibra 2 Controller Playback Route"},
{"VIB1", NULL, "VIB1 Enable"},
{"VIB2", NULL, "VIB2 Enable"},
@@ -848,11 +896,11 @@ static const struct snd_soc_dapm_route intercon[] = {
{"LINR Enable", NULL, "LineIn Right"},
{"MIC2 Enable", NULL, "Mic 2"},
- {"Mic 2 / LINR Select Capture Route", "LineIn Right", "LINR Enable"},
- {"Mic 2 / LINR Select Capture Route", "Mic 2", "MIC2 Enable"},
+ {"Mic 2 or LINR Select Capture Route", "LineIn Right", "LINR Enable"},
+ {"Mic 2 or LINR Select Capture Route", "Mic 2", "MIC2 Enable"},
{"LINL ADC", NULL, "LINL Enable"},
- {"LINR ADC", NULL, "Mic 2 / LINR Select Capture Route"},
+ {"LINR ADC", NULL, "Mic 2 or LINR Select Capture Route"},
{"AD 1 Select Capture Route", "LineIn Left", "LINL ADC"},
{"AD 2 Select Capture Route", "LineIn Right", "LINR ADC"},
@@ -869,16 +917,16 @@ static const struct snd_soc_dapm_route intercon[] = {
/* Microphone 1 path */
- {"Mic 1A/1B Select Capture Route", "Mic 1A", "MIC1A"},
- {"Mic 1A/1B Select Capture Route", "Mic 1B", "MIC1B"},
+ {"Mic 1A or 1B Select Capture Route", "Mic 1A", "MIC1A"},
+ {"Mic 1A or 1B Select Capture Route", "Mic 1B", "MIC1B"},
- {"Mic 1", "Capture Switch", "Mic 1A/1B Select Capture Route"},
+ {"Mic 1", "Capture Switch", "Mic 1A or 1B Select Capture Route"},
{"MIC1 Enable", NULL, "Mic 1"},
{"MIC1 ADC", NULL, "MIC1 Enable"},
- {"AD 3 Select Capture Route", "Mic 1A/1B", "MIC1 ADC"},
+ {"AD 3 Select Capture Route", "Mic 1", "MIC1 ADC"},
{"AD3 Channel Gain", NULL, "AD 3 Select Capture Route"},
@@ -890,7 +938,7 @@ static const struct snd_soc_dapm_route intercon[] = {
/* HD Capture path */
{"AD 5 Select Capture Route", "Mic 2", "LINR ADC"},
- {"AD 6 Select Capture Route", "Mic 1A/1B", "MIC1 ADC"},
+ {"AD 6 Select Capture Route", "Mic 1", "MIC1 ADC"},
{"AD5 Channel Gain", NULL, "AD 5 Select Capture Route"},
{"AD6 Channel Gain", NULL, "AD 6 Select Capture Route"},
@@ -944,31 +992,31 @@ static const struct snd_soc_dapm_route intercon[] = {
/* Acoustical Noise Cancellation path */
- {"ANC Input Select Playback Route", "AD 5", "AD5 Channel Gain"},
- {"ANC Input Select Playback Route", "AD 6", "AD6 Channel Gain"},
+ {"ANC Source Playback Route", "Mic 2 / DMic 5", "AD5 Channel Gain"},
+ {"ANC Source Playback Route", "Mic 1 / DMic 6", "AD6 Channel Gain"},
- {"ANC Control", NULL, "ANC Input Select Playback Route"},
+ {"ANC Playback Switch", "Enabled", "ANC Source Playback Route"},
- {"Handsfree Left Select Playback Route", "ANC", "ANC Control"},
- {"Handsfree Right Select Playback Route", "ANC", "ANC Control"},
- {"ANC to Earpiece", "Playback Switch", "ANC Control"},
+ {"IHF Left Source Playback Route", "ANC", "ANC Playback Switch"},
+ {"IHF Right Source Playback Route", "ANC", "ANC Playback Switch"},
+ {"ANC to Earpiece", "Playback Switch", "ANC Playback Switch"},
{"HSL Digital Gain", NULL, "ANC to Earpiece"},
/* Sidetone Filter path */
- {"STFIR1 Input Select Playback Route", "LineIn Left", "AD1 Enable"},
- {"STFIR1 Input Select Playback Route", "LineIn Right", "AD2 Enable"},
- {"STFIR1 Input Select Playback Route", "Mic 1A/1B", "AD3 Enable"},
- {"STFIR1 Input Select Playback Route", "Headset Left", "DA_IN1"},
- {"STFIR2 Input Select Playback Route", "LineIn Right", "AD2 Enable"},
- {"STFIR2 Input Select Playback Route", "Mic 1A/1B", "AD3 Enable"},
- {"STFIR2 Input Select Playback Route", "DMic 4", "AD4 Enable"},
- {"STFIR2 Input Select Playback Route", "Headset Right", "DA_IN2"},
+ {"Sidetone Left Source Playback Route", "LineIn Left", "AD1 Enable"},
+ {"Sidetone Left Source Playback Route", "LineIn Right", "AD2 Enable"},
+ {"Sidetone Left Source Playback Route", "Mic 1", "AD3 Enable"},
+ {"Sidetone Left Source Playback Route", "Headset Left", "DA_IN1"},
+ {"Sidetone Right Source Playback Route", "LineIn Right", "AD2 Enable"},
+ {"Sidetone Right Source Playback Route", "Mic 1", "AD3 Enable"},
+ {"Sidetone Right Source Playback Route", "DMic 4", "AD4 Enable"},
+ {"Sidetone Right Source Playback Route", "Headset Right", "DA_IN2"},
- {"STFIR1 Control", NULL, "STFIR1 Input Select Playback Route"},
- {"STFIR2 Control", NULL, "STFIR2 Input Select Playback Route"},
+ {"STFIR1 Control", NULL, "Sidetone Left Source Playback Route"},
+ {"STFIR2 Control", NULL, "Sidetone Right Source Playback Route"},
{"STFIR1 Gain", NULL, "STFIR1 Control"},
{"STFIR2 Gain", NULL, "STFIR2 Control"},
@@ -1011,12 +1059,14 @@ static SOC_ENUM_SINGLE_DECL(soc_enum_hshpen,
REG_ANACONF1, REG_ANACONF1_HSHPEN, enum_dis_ena);
static SOC_ENUM_SINGLE_DECL(soc_enum_hslowpow,
REG_ANACONF1, REG_ANACONF1_HSLOWPOW, enum_dis_ena);
+static SOC_ENUM_SINGLE_DECL(soc_enum_daclowpow1,
+ REG_ANACONF1, REG_ANACONF1_DACLOWPOW1, enum_dis_ena);
static SOC_ENUM_SINGLE_DECL(soc_enum_daclowpow0,
REG_ANACONF1, REG_ANACONF1_DACLOWPOW0, enum_dis_ena);
-static SOC_ENUM_SINGLE_DECL(soc_enum_daclowpow1,
- REG_ANACONF1, REG_ANACONF1_DACLOWPOW1, enum_ena_dis);
-static SOC_ENUM_SINGLE_DECL(soc_enum_earlowpow,
- REG_ANACONF1, REG_ANACONF1_EARLOWPOW, enum_dis_ena);
+static SOC_ENUM_SINGLE_DECL(soc_enum_eardaclowpow,
+ REG_ANACONF1, REG_ANACONF1_EARDACLOWPOW, enum_dis_ena);
+static SOC_ENUM_SINGLE_DECL(soc_enum_eardrvlowpow,
+ REG_ANACONF1, REG_ANACONF1_EARDRVLOWPOW, enum_dis_ena);
static const char *enum_earselcm[] = {"0.95V", "1.10V", "1.27V", "1.58V"};
static SOC_ENUM_SINGLE_DECL(soc_enum_earselcm,
@@ -1079,7 +1129,7 @@ static SOC_ENUM_DOUBLE_DECL(soc_enum_dmic34sinc, REG_DMICFILTCONF,
static SOC_ENUM_DOUBLE_DECL(soc_enum_dmic56sinc, REG_DMICFILTCONF,
REG_DMICFILTCONF_DMIC5SINC3, REG_DMICFILTCONF_DMIC6SINC3, enum_sinc53);
-static const char *enum_da2hslr[] = {"Sidetone", "Headset"};
+static const char *enum_da2hslr[] = {"Sidetone", "Audio Path"};
static SOC_ENUM_DOUBLE_DECL(soc_enum_da2hslr, REG_DIGMULTCONF1,
REG_DIGMULTCONF1_DATOHSLEN, REG_DIGMULTCONF1_DATOHSREN, enum_da2hslr);
@@ -1091,13 +1141,25 @@ static const char *enum_fadespeed[] = {"1ms", "4ms", "8ms", "16ms"};
static SOC_ENUM_SINGLE_DECL(soc_enum_fadespeed,
REG_HSRDIGGAIN, REG_HSRDIGGAIN_FADESPEED, enum_fadespeed);
+/* XXX move to DAPM */
+static SOC_ENUM_SINGLE_DECL(soc_enum_enfirsids,
+ REG_SIDFIRCONF, REG_SIDFIRCONF_ENFIRSIDS, enum_dis_ena);
+static SOC_ENUM_SINGLE_DECL(soc_enum_parlhf,
+ REG_CLASSDCONF1, REG_CLASSDCONF1_PARLHF, enum_dis_ena);
+static SOC_ENUM_SINGLE_DECL(soc_enum_parlvib,
+ REG_CLASSDCONF1, REG_CLASSDCONF1_PARLVIB, enum_dis_ena);
+
static struct snd_kcontrol_new ab8500_snd_controls[] = {
SOC_ENUM("Headset High Pass Playback Switch", soc_enum_hshpen),
SOC_ENUM("Headset Low Power Playback Switch", soc_enum_hslowpow),
- SOC_ENUM("Headset DAC Low Power Playback Switch", soc_enum_daclowpow0),
- SOC_ENUM("Headset DAC RTZ Func Playback Switch", soc_enum_daclowpow1),
- SOC_ENUM("Ear Low Power Playback Switch", soc_enum_earlowpow),
- SOC_ENUM("Ear Nominal Common Mode Playback Switch", soc_enum_earselcm),
+ SOC_ENUM("Headset DAC Low Power Playback Switch", soc_enum_daclowpow1),
+ SOC_ENUM("Headset DAC Drv Low Power Playback Switch",
+ soc_enum_daclowpow0),
+ SOC_ENUM("Earpiece DAC Low Power Playback Switch",
+ soc_enum_eardaclowpow),
+ SOC_ENUM("Earpiece DAC Drv Low Power Playback Switch",
+ soc_enum_eardrvlowpow),
+ SOC_ENUM("Earpiece Common Mode Playback Switch", soc_enum_earselcm),
SOC_ENUM("Headset Fade Speed Playback Switch", soc_enum_hsfadspeed),
@@ -1111,21 +1173,21 @@ static struct snd_kcontrol_new ab8500_snd_controls[] = {
SOC_ENUM("LineIn Mode Capture Switch", soc_enum_ad12voice),
SOC_ENUM("Mic Mode Capture Switch", soc_enum_ad34voice),
- SOC_ENUM("Headset/Ear Mode Playback Switch", soc_enum_da12voice),
- SOC_ENUM("Handsfree Mode Playback Switch", soc_enum_da34voice),
- SOC_ENUM("Vibrator Mode Playback Switch", soc_enum_da56voice),
+ SOC_ENUM("Headset Mode Playback Switch", soc_enum_da12voice),
+ SOC_ENUM("IHF Mode Playback Switch", soc_enum_da34voice),
+ SOC_ENUM("Vibra Mode Playback Switch", soc_enum_da56voice),
- SOC_ENUM("DA 1-2 and 3-4 Swap Playback Switch", soc_enum_swapda12_34),
+ SOC_ENUM("IHF and Headset Swap Playback Switch", soc_enum_swapda12_34),
- SOC_ENUM("Handsfree Low EMI Mode Playback Switch", soc_enum_hflrswap),
- SOC_ENUM("Vibrator Low EMI Mode Playback Switch", soc_enum_vib12swap),
+ SOC_ENUM("IHF Low EMI Mode Playback Switch", soc_enum_hflrswap),
+ SOC_ENUM("Vibra Low EMI Mode Playback Switch", soc_enum_vib12swap),
- SOC_ENUM("Handsfree FIR Bypass Playback Switch", soc_enum_fir01byp),
- SOC_ENUM("Vibrator FIR Bypass Playback Switch", soc_enum_fir23byp),
+ SOC_ENUM("IHF FIR Bypass Playback Switch", soc_enum_fir01byp),
+ SOC_ENUM("Vibra FIR Bypass Playback Switch", soc_enum_fir23byp),
/* XXX Cannot be changed on the fly with digital channel enabled. */
- SOC_ENUM("Handsfree High Volume Playback Switch", soc_enum_highvol01),
- SOC_ENUM("Vibrator High Volume Playback Switch", soc_enum_highvol23),
+ SOC_ENUM("IHF High Volume Playback Switch", soc_enum_highvol01),
+ SOC_ENUM("Vibra High Volume Playback Switch", soc_enum_highvol23),
SOC_SINGLE("ClassD High Pass Gain Playback Volume",
REG_CLASSDCONF3, REG_CLASSDCONF3_DITHHPGAIN,
@@ -1134,18 +1196,31 @@ static struct snd_kcontrol_new ab8500_snd_controls[] = {
REG_CLASSDCONF3, REG_CLASSDCONF3_DITHWGAIN,
REG_CLASSDCONF3_DITHWGAIN_MAX, NORMAL),
- SOC_ENUM("DMic 1-2 Filter Capture Switch", soc_enum_dmic12sinc),
- SOC_ENUM("DMic 3-4 Filter Capture Switch", soc_enum_dmic34sinc),
- SOC_ENUM("DMic 5-6 Filter Capture Switch", soc_enum_dmic56sinc),
+ SOC_ENUM("LineIn Filter Capture Switch", soc_enum_dmic12sinc),
+ SOC_ENUM("Mic Filter Capture Switch", soc_enum_dmic34sinc),
+ SOC_ENUM("HD Mic Filter Capture Switch", soc_enum_dmic56sinc),
- /* Whether DA_IN 1-2 are guided to sidetone filters' inputs. */
- SOC_ENUM("DA_IN Select Playback Route", soc_enum_da2hslr),
+ SOC_ENUM("Headset Source Playback Route", soc_enum_da2hslr),
/* XXX Cannot be changed on the fly with digital channel enabled. */
- SOC_ENUM("Headset/Ear Filter Playback Switch", soc_enum_hsesinc),
+ SOC_ENUM("Headset Filter Playback Switch", soc_enum_hsesinc),
SOC_ENUM("Digital Gain Fade Speed Switch", soc_enum_fadespeed),
+ SOC_DOUBLE_R("Vibra PWM Duty Cycle N Playback Volume",
+ REG_PWMGENCONF3, REG_PWMGENCONF5,
+ REG_PWMGENCONFX_PWMVIBXDUTCYC,
+ REG_PWMGENCONFX_PWMVIBXDUTCYC_MAX, NORMAL),
+ SOC_DOUBLE_R("Vibra PWM Duty Cycle P Playback Volume",
+ REG_PWMGENCONF2, REG_PWMGENCONF4,
+ REG_PWMGENCONFX_PWMVIBXDUTCYC,
+ REG_PWMGENCONFX_PWMVIBXDUTCYC_MAX, NORMAL),
+
+ /* XXX move to DAPM */
+ SOC_ENUM("Sidetone Playback Switch", soc_enum_enfirsids),
+ SOC_ENUM("IHF L and R Bridge Playback Route", soc_enum_parlhf),
+ SOC_ENUM("Vibra 1 and 2 Bridge Playback Route", soc_enum_parlvib),
+
/* Digital gains for AD side */
SOC_DOUBLE_R_TLV("LineIn Master Gain Capture Volume",
@@ -1163,10 +1238,10 @@ static struct snd_kcontrol_new ab8500_snd_controls[] = {
SOC_DOUBLE_R_TLV("Headset Master Gain Playback Volume",
REG_DADIGGAIN1, REG_DADIGGAIN2,
0, REG_DADIGGAINX_DAXGAIN_MAX, INVERT, dax_dig_gain_tlv),
- SOC_DOUBLE_R_TLV("Handsfree Master Gain Playback Volume",
+ SOC_DOUBLE_R_TLV("IHF Master Gain Playback Volume",
REG_DADIGGAIN3, REG_DADIGGAIN4,
0, REG_DADIGGAINX_DAXGAIN_MAX, INVERT, dax_dig_gain_tlv),
- SOC_DOUBLE_R_TLV("Vibrator Master Gain Playback Volume",
+ SOC_DOUBLE_R_TLV("Vibra Master Gain Playback Volume",
REG_DADIGGAIN5, REG_DADIGGAIN6,
0, REG_DADIGGAINX_DAXGAIN_MAX, INVERT, dax_dig_gain_tlv),
SOC_DOUBLE_R_TLV("Analog Loopback Gain Playback Volume",
@@ -1180,6 +1255,7 @@ static struct snd_kcontrol_new ab8500_snd_controls[] = {
0, REG_SIDFIRGAINX_FIRSIDXGAIN_MAX, INVERT, stfir_dig_gain_tlv),
/* Analog gains */
+
SOC_DOUBLE_TLV("Headset Gain Playback Volume",
REG_ANAGAIN3,
REG_ANAGAIN3_HSLGAIN, REG_ANAGAIN3_HSRGAIN,
@@ -1451,46 +1527,23 @@ static int ab8500_set_dai_tdm_slot(struct snd_soc_dai *dai,
BMASK(REG_DIGIFCONF1_IF0BITCLKOS1),
data);
- /* Mask to clear RX TDM slots reception for DA path*/
- clear_mask = BMASK(REG_DASLOTCONFX_SLTODAX4) |
- BMASK(REG_DASLOTCONFX_SLTODAX3) |
- BMASK(REG_DASLOTCONFX_SLTODAX2) |
- BMASK(REG_DASLOTCONFX_SLTODAX1) |
- BMASK(REG_DASLOTCONFX_SLTODAX0);
-
/* XXX Make slot configuration as a control */
- /* DA_IN1 receives slot 9 */
- ab8500_update_audio_reg(codec, REG_DASLOTCONF1,
- clear_mask,
- BMASK(REG_DASLOTCONFX_SLTODAX3) |
- BMASK(REG_DASLOTCONFX_SLTODAX0));
-
- /* DA_IN2 receives slot 11 */
- ab8500_update_audio_reg(codec, REG_DASLOTCONF2,
- clear_mask,
- BMASK(REG_DASLOTCONFX_SLTODAX3) |
- BMASK(REG_DASLOTCONFX_SLTODAX1) |
- BMASK(REG_DASLOTCONFX_SLTODAX0));
-
- /* DA_IN3 receives slot 9 */
- ab8500_update_audio_reg(codec, REG_DASLOTCONF3,
- clear_mask,
- BMASK(REG_DASLOTCONFX_SLTODAX3) |
- BMASK(REG_DASLOTCONFX_SLTODAX0));
-
- /* DA_IN4 receives slot 11 */
- ab8500_update_audio_reg(codec, REG_DASLOTCONF4,
- clear_mask,
- BMASK(REG_DASLOTCONFX_SLTODAX3) |
- BMASK(REG_DASLOTCONFX_SLTODAX1) |
- BMASK(REG_DASLOTCONFX_SLTODAX0));
+ clear_mask = REG_DASLOTCONFX_SLTODAX_MASK;
+
+ /* DA_IN1/3/5 receives slot 9, DA_IN2/4/6 receives slot 11 */
+ ab8500_update_audio_reg(codec, REG_DASLOTCONF1, clear_mask, 9);
+ ab8500_update_audio_reg(codec, REG_DASLOTCONF2, clear_mask, 11);
+ ab8500_update_audio_reg(codec, REG_DASLOTCONF3, clear_mask, 9);
+ ab8500_update_audio_reg(codec, REG_DASLOTCONF4, clear_mask, 11);
+ ab8500_update_audio_reg(codec, REG_DASLOTCONF5, clear_mask, 9);
+ ab8500_update_audio_reg(codec, REG_DASLOTCONF6, clear_mask, 11);
/* AD_OUT3 transmits slots 0 & 1 */
ab8500_update_audio_reg(codec, REG_ADSLOTSEL1,
REG_MASK_ALL,
- BMASK(REG_ADSLOTSEL_ODDX_1) |
- BMASK(REG_ADSLOTSEL_EVENX_1));
+ BMASK(REG_ADSLOTSELX_ODDX_1) |
+ BMASK(REG_ADSLOTSELX_EVENX_1));
return 0;
}
diff --git a/sound/soc/codecs/ab8500.h b/sound/soc/codecs/ab8500.h
index 5273b8b9156..415d73a87a5 100644
--- a/sound/soc/codecs/ab8500.h
+++ b/sound/soc/codecs/ab8500.h
@@ -155,8 +155,7 @@ extern struct snd_soc_codec_driver soc_codec_dev_ab8500;
/* REG_ADPATHENA */
#define REG_ADPATHENA_ENAD12 7
#define REG_ADPATHENA_ENAD34 5
-#define REG_ADPATHENA_ENAD57 3
-#define REG_ADPATHENA_ENAD68 2
+#define REG_ADPATHENA_ENAD5768 3
/* REG_DAPATHENA */
#define REG_DAPATHENA_ENDA1 7
@@ -170,9 +169,10 @@ extern struct snd_soc_codec_driver soc_codec_dev_ab8500;
#define REG_ANACONF1_HSLOWPOW 7
#define REG_ANACONF1_DACLOWPOW1 6
#define REG_ANACONF1_DACLOWPOW0 5
-#define REG_ANACONF1_EARLOWPOW 4
+#define REG_ANACONF1_EARDACLOWPOW 4
#define REG_ANACONF1_EARSELCM 2
#define REG_ANACONF1_HSHPEN 1
+#define REG_ANACONF1_EARDRVLOWPOW 0
/* REG_ANACONF2 */
#define REG_ANACONF2_ENMIC1 7
@@ -254,6 +254,10 @@ extern struct snd_soc_codec_driver soc_codec_dev_ab8500;
/* REG_PWMGENCONF3 */
/* REG_PWMGENCONF4 */
/* REG_PWMGENCONF5 */
+#define REG_PWMGENCONFX_PWMVIBXPOL 7
+#define REG_PWMGENCONFX_PWMVIBXDUTCYC 0
+#define REG_PWMGENCONFX_PWMVIBXDUTCYC_MAX 0x64
+
/* REG_ANAGAIN1 */
/* REG_ANAGAIN2 */
#define REG_ANAGAINX_ENSEMICX 7
@@ -316,14 +320,14 @@ extern struct snd_soc_codec_driver soc_codec_dev_ab8500;
/* REG_DIGIFCONF4 */
/* REG_ADSLOTSELX */
-#define REG_ADSLOTSEL_ODDX_3 7
-#define REG_ADSLOTSEL_ODDX_2 6
-#define REG_ADSLOTSEL_ODDX_1 5
-#define REG_ADSLOTSEL_ODDX_0 4
-#define REG_ADSLOTSEL_EVENX_3 3
-#define REG_ADSLOTSEL_EVENX_2 2
-#define REG_ADSLOTSEL_EVENX_1 1
-#define REG_ADSLOTSEL_EVENX_0 0
+#define REG_ADSLOTSELX_ODDX_3 7
+#define REG_ADSLOTSELX_ODDX_2 6
+#define REG_ADSLOTSELX_ODDX_1 5
+#define REG_ADSLOTSELX_ODDX_0 4
+#define REG_ADSLOTSELX_EVENX_3 3
+#define REG_ADSLOTSELX_EVENX_2 2
+#define REG_ADSLOTSELX_EVENX_1 1
+#define REG_ADSLOTSELX_EVENX_0 0
/* REG_ADSLOTHIZCTRL1 */
/* REG_ADSLOTHIZCTRL2 */
@@ -357,11 +361,7 @@ extern struct snd_soc_codec_driver soc_codec_dev_ab8500;
/* REG_DASLOTCONF8 */
#define REG_DASLOTCONF8_DAI7TOADO8 5
-#define REG_DASLOTCONFX_SLTODAX4 4
-#define REG_DASLOTCONFX_SLTODAX3 3
-#define REG_DASLOTCONFX_SLTODAX2 2
-#define REG_DASLOTCONFX_SLTODAX1 1
-#define REG_DASLOTCONFX_SLTODAX0 0
+#define REG_DASLOTCONFX_SLTODAX_MASK 0x1F
/* REG_CLASSDCONF1 */
#define REG_CLASSDCONF1_PARLHF 7
@@ -389,6 +389,7 @@ extern struct snd_soc_codec_driver soc_codec_dev_ab8500;
/* REG_DMICFILTCONF */
#define REG_DMICFILTCONF_ANCINSEL 7
+#define REG_DMICFILTCONF_DA3TOEAR 6
#define REG_DMICFILTCONF_DMIC1SINC3 5
#define REG_DMICFILTCONF_DMIC2SINC3 4
#define REG_DMICFILTCONF_DMIC3SINC3 3
@@ -452,6 +453,11 @@ extern struct snd_soc_codec_driver soc_codec_dev_ab8500;
#define REG_SIDFIRGAINX_FIRSIDXGAIN_MAX 0x1F
/* REG_ANCCONF1 */
+#define REG_ANCCONF1_ANCIIRUPDATE 3
+#define REG_ANCCONF1_ENANC 2
+#define REG_ANCCONF1_ANCIIRINIT 1
+#define REG_ANCCONF1_ANCFIRUPDATE 0
+
/* REG_ANCCONF2 */
/* REG_ANCCONF3 */
/* REG_ANCCONF4 */
@@ -469,6 +475,10 @@ extern struct snd_soc_codec_driver soc_codec_dev_ab8500;
/* REG_SIDFIRCOEF1 */
/* REG_SIDFIRCOEF2 */
/* REG_SIDFIRCONF */
+#define REG_SIDFIRCONF_ENFIRSIDS 2
+#define REG_SIDFIRCONF_FIRSIDSTOIF1 1
+#define REG_SIDFIRCONF_FIRSIDBUSY 0
+
/* REG_AUDINTMASK1 */
/* REG_AUDINTSOURCE1 */
/* REG_AUDINTMASK2 */