|
@@ -432,6 +432,12 @@ static DECLARE_TLV_DB_SCALE(hs_tlv, -3000, 200, 0);
|
|
*/
|
|
*/
|
|
static DECLARE_TLV_DB_SCALE(hf_tlv, -5200, 200, 0);
|
|
static DECLARE_TLV_DB_SCALE(hf_tlv, -5200, 200, 0);
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * EPGAIN volume control:
|
|
|
|
+ * from -24 to 6 dB in 2 dB steps
|
|
|
|
+ */
|
|
|
|
+static DECLARE_TLV_DB_SCALE(ep_tlv, -2400, 200, 0);
|
|
|
|
+
|
|
/* Left analog microphone selection */
|
|
/* Left analog microphone selection */
|
|
static const char *twl6040_amicl_texts[] =
|
|
static const char *twl6040_amicl_texts[] =
|
|
{"Headset Mic", "Main Mic", "Aux/FM Left", "Off"};
|
|
{"Headset Mic", "Main Mic", "Aux/FM Left", "Off"};
|
|
@@ -479,6 +485,9 @@ static const struct snd_kcontrol_new hfl_driver_switch_controls =
|
|
static const struct snd_kcontrol_new hfr_driver_switch_controls =
|
|
static const struct snd_kcontrol_new hfr_driver_switch_controls =
|
|
SOC_DAPM_SINGLE("Switch", TWL6040_REG_HFRCTL, 4, 1, 0);
|
|
SOC_DAPM_SINGLE("Switch", TWL6040_REG_HFRCTL, 4, 1, 0);
|
|
|
|
|
|
|
|
+static const struct snd_kcontrol_new ep_driver_switch_controls =
|
|
|
|
+ SOC_DAPM_SINGLE("Switch", TWL6040_REG_EARCTL, 0, 1, 0);
|
|
|
|
+
|
|
static const struct snd_kcontrol_new twl6040_snd_controls[] = {
|
|
static const struct snd_kcontrol_new twl6040_snd_controls[] = {
|
|
/* Capture gains */
|
|
/* Capture gains */
|
|
SOC_DOUBLE_TLV("Capture Preamplifier Volume",
|
|
SOC_DOUBLE_TLV("Capture Preamplifier Volume",
|
|
@@ -491,7 +500,8 @@ static const struct snd_kcontrol_new twl6040_snd_controls[] = {
|
|
TWL6040_REG_HSGAIN, 0, 4, 0xF, 1, hs_tlv),
|
|
TWL6040_REG_HSGAIN, 0, 4, 0xF, 1, hs_tlv),
|
|
SOC_DOUBLE_R_TLV("Handsfree Playback Volume",
|
|
SOC_DOUBLE_R_TLV("Handsfree Playback Volume",
|
|
TWL6040_REG_HFLGAIN, TWL6040_REG_HFRGAIN, 0, 0x1D, 1, hf_tlv),
|
|
TWL6040_REG_HFLGAIN, TWL6040_REG_HFRGAIN, 0, 0x1D, 1, hf_tlv),
|
|
-
|
|
|
|
|
|
+ SOC_SINGLE_TLV("Earphone Playback Volume",
|
|
|
|
+ TWL6040_REG_EARCTL, 1, 0xF, 1, ep_tlv),
|
|
};
|
|
};
|
|
|
|
|
|
static const struct snd_soc_dapm_widget twl6040_dapm_widgets[] = {
|
|
static const struct snd_soc_dapm_widget twl6040_dapm_widgets[] = {
|
|
@@ -507,6 +517,7 @@ static const struct snd_soc_dapm_widget twl6040_dapm_widgets[] = {
|
|
SND_SOC_DAPM_OUTPUT("HSOR"),
|
|
SND_SOC_DAPM_OUTPUT("HSOR"),
|
|
SND_SOC_DAPM_OUTPUT("HFL"),
|
|
SND_SOC_DAPM_OUTPUT("HFL"),
|
|
SND_SOC_DAPM_OUTPUT("HFR"),
|
|
SND_SOC_DAPM_OUTPUT("HFR"),
|
|
|
|
+ SND_SOC_DAPM_OUTPUT("EP"),
|
|
|
|
|
|
/* Analog input muxes for the capture amplifiers */
|
|
/* Analog input muxes for the capture amplifiers */
|
|
SND_SOC_DAPM_MUX("Analog Left Capture Route",
|
|
SND_SOC_DAPM_MUX("Analog Left Capture Route",
|
|
@@ -572,6 +583,10 @@ static const struct snd_soc_dapm_widget twl6040_dapm_widgets[] = {
|
|
SND_SOC_NOPM, 0, 0, &hfr_driver_switch_controls,
|
|
SND_SOC_NOPM, 0, 0, &hfr_driver_switch_controls,
|
|
twl6040_power_mode_event,
|
|
twl6040_power_mode_event,
|
|
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
|
|
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
|
|
|
|
+ SND_SOC_DAPM_SWITCH_E("Earphone Driver",
|
|
|
|
+ SND_SOC_NOPM, 0, 0, &ep_driver_switch_controls,
|
|
|
|
+ twl6040_power_mode_event,
|
|
|
|
+ SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
|
|
|
|
|
|
/* Analog playback PGAs */
|
|
/* Analog playback PGAs */
|
|
SND_SOC_DAPM_PGA("HFDAC Left PGA",
|
|
SND_SOC_DAPM_PGA("HFDAC Left PGA",
|
|
@@ -607,6 +622,10 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|
{"HSOL", NULL, "Headset Left Driver"},
|
|
{"HSOL", NULL, "Headset Left Driver"},
|
|
{"HSOR", NULL, "Headset Right Driver"},
|
|
{"HSOR", NULL, "Headset Right Driver"},
|
|
|
|
|
|
|
|
+ /* Earphone playback path */
|
|
|
|
+ {"Earphone Driver", "Switch", "HSDAC Left"},
|
|
|
|
+ {"EP", NULL, "Earphone Driver"},
|
|
|
|
+
|
|
/* Handsfree playback path */
|
|
/* Handsfree playback path */
|
|
{"HFDAC Left Playback", "Switch", "HFDAC Left"},
|
|
{"HFDAC Left Playback", "Switch", "HFDAC Left"},
|
|
{"HFDAC Right Playback", "Switch", "HFDAC Right"},
|
|
{"HFDAC Right Playback", "Switch", "HFDAC Right"},
|