summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorJohan Bohlin <johan.bohlin@stericsson.com>2011-10-04 15:41:19 +0200
committerJonas ABERG <jonas.aberg@stericsson.com>2011-10-05 09:57:02 +0200
commitdaa197bb42558389f35ae95fc278ba00b6dd4d7d (patch)
treee28a9ba884f890ddf08ab3c5a6f80d3a3ecc815c /sound
parentcf61219c61ff55a420bc3355555fbdf9d55531f6 (diff)
ASoC: Ux500: Added support for Line Out
Added support for Line Out in the DAPM-chain. The DAPM-chains have been rearranged to better fit the introduction of Line Out. ST-Ericsson ID: 362841 ST-Ericsson Linux next: Not tested ST-Ericsson FOSS-OUT ID: Trivial Change-Id: I8ba138af2ca16552dfe871c61c59784a64943039 Signed-off-by: Johan Bohlin <johan.bohlin@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/32985 Reviewed-by: Ola LILJA2 <ola.o.lilja@stericsson.com> Tested-by: Ola LILJA2 <ola.o.lilja@stericsson.com> Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/codecs/ab8500_audio.c168
-rw-r--r--sound/soc/codecs/ab8500_audio.h5
2 files changed, 129 insertions, 44 deletions
diff --git a/sound/soc/codecs/ab8500_audio.c b/sound/soc/codecs/ab8500_audio.c
index a20eb3f7618..5d51727ab76 100644
--- a/sound/soc/codecs/ab8500_audio.c
+++ b/sound/soc/codecs/ab8500_audio.c
@@ -414,36 +414,61 @@ static const struct snd_kcontrol_new dapm_ear_mute[] = {
};
/* Earpiece source selector */
-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),
+static const char * const enum_ear_lineout_source[] = {"Headset Left", "IHF Left"};
+static SOC_ENUM_SINGLE_DECL(dapm_enum_ear_lineout_source, REG_DMICFILTCONF,
+ REG_DMICFILTCONF_DA3TOEAR, enum_ear_lineout_source);
+static const struct snd_kcontrol_new dapm_ear_lineout_source[] = {
+ SOC_DAPM_ENUM("Earpiece or Lineout Mono Source", dapm_enum_ear_lineout_source),
};
+/* Lineout */
+
+/* Lineout source selector */
+static const char * const enum_lineout_source[] = {"Mono Path", "Stereo Path"};
+static SOC_ENUM_DOUBLE_DECL(dapm_enum_lineout_source, REG_ANACONF5,
+ REG_ANACONF5_HSLDACTOLOL, REG_ANACONF5_HSRDACTOLOR, enum_lineout_source);
+static const struct snd_kcontrol_new dapm_lineout_source[] = {
+ SOC_DAPM_ENUM("LineOut Source", dapm_enum_lineout_source),
+};
+
+/* Lineout */
+
+/* Lineout Left - Enable/Disable */
+static const struct soc_enum enum_lineout_left = SOC_ENUM_SINGLE(0, 0, 2, enum_dis_ena);
+static const struct snd_kcontrol_new dapm_lineout_left_mux =
+ SOC_DAPM_ENUM_VIRT("LineOut Left", enum_lineout_left);
+
+/* Lineout Right - Enable/Disable */
+static const struct soc_enum enum_lineout_right = SOC_ENUM_SINGLE(0, 0, 2, enum_dis_ena);
+static const struct snd_kcontrol_new dapm_lineout_right_mux =
+ SOC_DAPM_ENUM_VIRT("LineOut Right", enum_lineout_right);
+
+/* Lineout/IHF - Select */
+static const char * const enum_ihf_or_lineout_select_sel[] = {"IHF", "LineOut"};
+static const struct soc_enum enum_ihf_or_lineout_select = SOC_ENUM_SINGLE(0, 0, 2, enum_ihf_or_lineout_select_sel);
+static const struct snd_kcontrol_new dapm_ihf_or_lineout_select_mux =
+ SOC_DAPM_ENUM_VIRT("IHF or Lineout Select", enum_ihf_or_lineout_select);
+
+
/* IHF */
-static const char *enum_ihfx_sel[] = {"Audio Path", "ANC"};
+/* IHF - Enable/Disable */
+static const struct soc_enum enum_ihf_left = SOC_ENUM_SINGLE(0, 0, 2, enum_dis_ena);
+static const struct snd_kcontrol_new dapm_ihf_left_mux =
+ SOC_DAPM_ENUM_VIRT("IHF Left", enum_ihf_left);
-/* IHF left - Mute */
-static const struct snd_kcontrol_new dapm_ihfl_mute[] = {
- SOC_DAPM_SINGLE("Playback Switch", REG_DIGMULTCONF2,
- REG_DIGMULTCONF2_DATOHFLEN, 1, NORMAL),
-};
+static const struct soc_enum enum_ihf_right = SOC_ENUM_SINGLE(0, 0, 2, enum_dis_ena);
+static const struct snd_kcontrol_new dapm_ihf_right_mux =
+ SOC_DAPM_ENUM_VIRT("IHF Right", enum_ihf_right);
/* IHF left - ANC selector */
+static const char * const enum_ihfx_sel[] = {"Audio Path", "ANC"};
static SOC_ENUM_SINGLE_DECL(dapm_enum_ihfl_sel, REG_DIGMULTCONF2,
REG_DIGMULTCONF2_HFLSEL, enum_ihfx_sel);
static const struct snd_kcontrol_new dapm_ihfl_select[] = {
SOC_DAPM_ENUM("IHF Left Source", dapm_enum_ihfl_sel),
};
-/* IHF right - Mute */
-static const struct snd_kcontrol_new dapm_ihfr_mute[] = {
- SOC_DAPM_SINGLE("Playback Switch", REG_DIGMULTCONF2,
- REG_DIGMULTCONF2_DATOHFREN, 1, NORMAL),
-};
-
/* IHF right - ANC selector */
static SOC_ENUM_SINGLE_DECL(dapm_enum_ihfr_sel, REG_DIGMULTCONF2,
REG_DIGMULTCONF2_HFRSEL, enum_ihfx_sel);
@@ -685,10 +710,26 @@ static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
SND_SOC_DAPM_OUTPUT("HSL"),
SND_SOC_DAPM_OUTPUT("HSR"),
+ /* Lineout path */
+
+ SND_SOC_DAPM_MUX("LineOut Source Playback Route",
+ SND_SOC_NOPM, 0, 0, dapm_lineout_source),
+
+ SND_SOC_DAPM_MIXER("LOL Enable", REG_ANACONF5,
+ REG_ANACONF5_ENLOL, 0, NULL, 0),
+ SND_SOC_DAPM_MIXER("LOR Enable", REG_ANACONF5,
+ REG_ANACONF5_ENLOR, 0, NULL, 0),
+
+ SND_SOC_DAPM_MUX("LineOut Left",
+ SND_SOC_NOPM, 0, 0, &dapm_lineout_left_mux),
+
+ SND_SOC_DAPM_MUX("LineOut Right",
+ SND_SOC_NOPM, 0, 0, &dapm_lineout_right_mux),
+
/* Earpiece path */
- SND_SOC_DAPM_MUX("Earpiece Source Playback Route",
- SND_SOC_NOPM, 0, 0, dapm_ear_source),
+ SND_SOC_DAPM_MUX("Earpiece or Lineout Mono Source",
+ SND_SOC_NOPM, 0, 0, &dapm_ear_lineout_source),
SND_SOC_DAPM_MIXER("EAR DAC", REG_DAPATHCONF,
REG_DAPATHCONF_ENDACEAR, 0, NULL, 0),
@@ -717,14 +758,22 @@ static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
SND_SOC_DAPM_MUX("IHF Right Source Playback Route",
SND_SOC_NOPM, 0, 0, dapm_ihfr_select),
- 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_MUX("IHF Left", SND_SOC_NOPM, 0, 0, &dapm_ihf_left_mux),
+ SND_SOC_DAPM_MUX("IHF Right", SND_SOC_NOPM, 0, 0, &dapm_ihf_right_mux),
+
+ SND_SOC_DAPM_MUX("IHF or Lineout Select", SND_SOC_NOPM,
+ 0, 0, &dapm_ihf_or_lineout_select_mux),
SND_SOC_DAPM_MIXER("IHFL DAC", REG_DAPATHCONF,
REG_DAPATHCONF_ENDACHFL, 0, NULL, 0),
SND_SOC_DAPM_MIXER("IHFR DAC", REG_DAPATHCONF,
REG_DAPATHCONF_ENDACHFR, 0, NULL, 0),
+ SND_SOC_DAPM_MIXER("DA4 or ANC path to HfR", REG_DIGMULTCONF2,
+ REG_DIGMULTCONF2_DATOHFREN, 0, NULL, 0),
+ SND_SOC_DAPM_MIXER("DA3 or ANC path to HfL", REG_DIGMULTCONF2,
+ REG_DIGMULTCONF2_DATOHFLEN, 0, NULL, 0),
+
SND_SOC_DAPM_MIXER("IHFL Enable", REG_ANACONF4,
REG_ANACONF4_ENHFL, 0, NULL, 0),
SND_SOC_DAPM_MIXER("IHFR Enable", REG_ANACONF4,
@@ -924,12 +973,37 @@ static const struct snd_soc_dapm_route dapm_routes[] = {
{"HSL", NULL, "Charge Pump"},
{"HSR", NULL, "Charge Pump"},
+ /* IHF or Lineout path */
+
+ {"DA3 Channel Gain", NULL, "DA_IN3"},
+ {"DA4 Channel Gain", NULL, "DA_IN4"},
+
+ {"IHF Left Source Playback Route", "Audio Path", "DA3 Channel Gain"},
+ {"IHF Right Source Playback Route", "Audio Path", "DA4 Channel Gain"},
+
+ {"DA3 or ANC path to HfL", NULL, "IHF Left Source Playback Route"},
+ {"DA4 or ANC path to HfR", NULL, "IHF Right Source Playback Route"},
+
+ /* IHF path */
+
+ {"IHF Left", "Enabled", "DA3 or ANC path to HfL"},
+ {"IHF Right", "Enabled", "DA4 or ANC path to HfR"},
+
+ {"IHFL DAC", NULL, "IHF Left"},
+ {"IHFR DAC", NULL, "IHF Right"},
+
+ {"IHFL Enable", NULL, "IHFL DAC"},
+ {"IHFR Enable", NULL, "IHFR DAC"},
+
+ {"IHF or Lineout Select", "IHF", "IHFL Enable"},
+ {"IHF or Lineout Select", "IHF", "IHFR Enable"},
+
/* Earpiece path */
- {"Earpiece Source Playback Route", "Headset Left", "HSL Digital Gain"},
- {"Earpiece Source Playback Route", "IHF Left", "IHF Left"},
+ {"Earpiece or Lineout Mono Source", "Headset Left", "HSL Digital Gain"},
+ {"Earpiece or Lineout Mono Source", "IHF Left", "DA3 or ANC path to HfL"},
- {"EAR DAC", NULL, "Earpiece Source Playback Route"},
+ {"EAR DAC", NULL, "Earpiece or Lineout Mono Source"},
{"Earpiece", "Playback Switch", "EAR DAC"},
@@ -937,33 +1011,36 @@ static const struct snd_soc_dapm_route dapm_routes[] = {
{"EAR", NULL, "EAR Enable"},
- /* Handsfree path */
+ /* Lineout path stereo */
- {"DA3 Channel Gain", NULL, "DA_IN3"},
- {"DA4 Channel Gain", NULL, "DA_IN4"},
+ {"LineOut Source Playback Route", "Stereo Path", "HSL DAC Driver"},
+ {"LineOut Source Playback Route", "Stereo Path", "HSR DAC Driver"},
- {"IHF Left Source Playback Route", "Audio Path", "DA3 Channel Gain"},
- {"IHF Right Source Playback Route", "Audio Path", "DA4 Channel Gain"},
+ /* Lineout path mono */
- {"IHF Left", "Playback Switch", "IHF Left Source Playback Route"},
- {"IHF Right", "Playback Switch", "IHF Right Source Playback Route"},
+ {"LineOut Source Playback Route", "Mono Path", "EAR DAC"},
- {"IHFL DAC", NULL, "IHF Left"},
- {"IHFR DAC", NULL, "IHF Right"},
+ /* Lineout path */
- {"IHFL Enable", NULL, "IHFL DAC"},
- {"IHFR Enable", NULL, "IHFR DAC"},
+ {"LineOut Left", "Enabled", "LineOut Source Playback Route"},
+ {"LineOut Right", "Enabled", "LineOut Source Playback Route"},
- {"IHFL", NULL, "IHFL Enable"},
- {"IHFR", NULL, "IHFR Enable"},
+ {"LOL Enable", NULL, "LineOut Left"},
+ {"LOR Enable", NULL, "LineOut Right"},
- /* Vibrator path */
+ {"IHF or Lineout Select", "LineOut", "LOL Enable"},
+ {"IHF or Lineout Select", "LineOut", "LOR Enable"},
+
+ /* IHF path */
+
+ {"IHFL", NULL, "IHF or Lineout Select"},
+ {"IHFR", NULL, "IHF or Lineout Select"},
- {"Vibra 1", "Enabled", "DA_IN5"},
- {"Vibra 2", "Enabled", "DA_IN6"},
- {"DA5 Channel Gain", NULL, "Vibra 1"},
- {"DA6 Channel Gain", NULL, "Vibra 2"},
+ /* Vibrator path */
+
+ {"DA5 Channel Gain", NULL, "DA_IN5"},
+ {"DA6 Channel Gain", NULL, "DA_IN6"},
{"VIB1 DAC", NULL, "DA5 Channel Gain"},
{"VIB2 DAC", NULL, "DA6 Channel Gain"},
@@ -973,8 +1050,11 @@ static const struct snd_soc_dapm_route dapm_routes[] = {
{"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"},
+ {"Vibra 1", "Enabled", "Vibra 1 Controller Playback Route"},
+ {"Vibra 2", "Enabled", "Vibra 2 Controller Playback Route"},
+
+ {"VIB1 Enable", NULL, "Vibra 1"},
+ {"VIB2 Enable", NULL, "Vibra 2"},
{"VIB1", NULL, "VIB1 Enable"},
{"VIB2", NULL, "VIB2 Enable"},
diff --git a/sound/soc/codecs/ab8500_audio.h b/sound/soc/codecs/ab8500_audio.h
index c3b24bbc754..4ac8220d8d6 100644
--- a/sound/soc/codecs/ab8500_audio.h
+++ b/sound/soc/codecs/ab8500_audio.h
@@ -248,8 +248,13 @@ bool ab8500_audio_dapm_path_active(enum ab8500_audio_dapm_path dapm_path);
#define REG_MUTECONF_MUTHSR 4
/* REG_SHORTCIRCONF */
+
/* REG_ANACONF5 */
#define REG_ANACONF5_ENCPHS 7
+#define REG_ANACONF5_HSLDACTOLOL 5
+#define REG_ANACONF5_HSRDACTOLOR 4
+#define REG_ANACONF5_ENLOL 3
+#define REG_ANACONF5_ENLOR 2
#define REG_ANACONF5_HSAUTOEN 0
/* REG_ENVCPCONF */