Skip to content

Commit

Permalink
ASoC: sunxi: sun50i-codec-analog: Add earpiece
Browse files Browse the repository at this point in the history
This adds the necessary registers and audio routes to play audio using
the Earpiece, that's supported on the A64.

Signed-off-by: Luca Weiss <[email protected]>
Reviewed-by: Chen-Yu Tsai <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Mark Brown <[email protected]>
  • Loading branch information
z3ntu authored and broonie committed Jul 5, 2019
1 parent 590eb2f commit 1fe0860
Showing 1 changed file with 50 additions and 0 deletions.
50 changes: 50 additions & 0 deletions sound/soc/sunxi/sun50i-codec-analog.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,15 @@
#define SUN50I_ADDA_OR_MIX_CTRL_DACR 1
#define SUN50I_ADDA_OR_MIX_CTRL_DACL 0

#define SUN50I_ADDA_EARPIECE_CTRL0 0x03
#define SUN50I_ADDA_EARPIECE_CTRL0_EAR_RAMP_TIME 4
#define SUN50I_ADDA_EARPIECE_CTRL0_ESPSR 0

#define SUN50I_ADDA_EARPIECE_CTRL1 0x04
#define SUN50I_ADDA_EARPIECE_CTRL1_ESPPA_EN 7
#define SUN50I_ADDA_EARPIECE_CTRL1_ESPPA_MUTE 6
#define SUN50I_ADDA_EARPIECE_CTRL1_ESP_VOL 0

#define SUN50I_ADDA_LINEOUT_CTRL0 0x05
#define SUN50I_ADDA_LINEOUT_CTRL0_LEN 7
#define SUN50I_ADDA_LINEOUT_CTRL0_REN 6
Expand Down Expand Up @@ -172,6 +181,10 @@ static const DECLARE_TLV_DB_RANGE(sun50i_codec_lineout_vol_scale,
2, 31, TLV_DB_SCALE_ITEM(-4350, 150, 0),
);

static const DECLARE_TLV_DB_RANGE(sun50i_codec_earpiece_vol_scale,
0, 1, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1),
2, 31, TLV_DB_SCALE_ITEM(-4350, 150, 0),
);

/* volume / mute controls */
static const struct snd_kcontrol_new sun50i_a64_codec_controls[] = {
Expand Down Expand Up @@ -225,6 +238,15 @@ static const struct snd_kcontrol_new sun50i_a64_codec_controls[] = {
SUN50I_ADDA_LINEOUT_CTRL0_LEN,
SUN50I_ADDA_LINEOUT_CTRL0_REN, 1, 0),

SOC_SINGLE_TLV("Earpiece Playback Volume",
SUN50I_ADDA_EARPIECE_CTRL1,
SUN50I_ADDA_EARPIECE_CTRL1_ESP_VOL, 0x1f, 0,
sun50i_codec_earpiece_vol_scale),

SOC_SINGLE("Earpiece Playback Switch",
SUN50I_ADDA_EARPIECE_CTRL1,
SUN50I_ADDA_EARPIECE_CTRL1_ESPPA_MUTE, 1, 0),

};

static const char * const sun50i_codec_hp_src_enum_text[] = {
Expand Down Expand Up @@ -257,6 +279,20 @@ static const struct snd_kcontrol_new sun50i_codec_lineout_src[] = {
sun50i_codec_lineout_src_enum),
};

static const char * const sun50i_codec_earpiece_src_enum_text[] = {
"DACR", "DACL", "Right Mixer", "Left Mixer",
};

static SOC_ENUM_SINGLE_DECL(sun50i_codec_earpiece_src_enum,
SUN50I_ADDA_EARPIECE_CTRL0,
SUN50I_ADDA_EARPIECE_CTRL0_ESPSR,
sun50i_codec_earpiece_src_enum_text);

static const struct snd_kcontrol_new sun50i_codec_earpiece_src[] = {
SOC_DAPM_ENUM("Earpiece Source Playback Route",
sun50i_codec_earpiece_src_enum),
};

static const struct snd_soc_dapm_widget sun50i_a64_codec_widgets[] = {
/* DAC */
SND_SOC_DAPM_DAC("Left DAC", NULL, SUN50I_ADDA_MIX_DAC_CTRL,
Expand Down Expand Up @@ -285,6 +321,12 @@ static const struct snd_soc_dapm_widget sun50i_a64_codec_widgets[] = {
SND_SOC_NOPM, 0, 0, sun50i_codec_lineout_src),
SND_SOC_DAPM_OUTPUT("LINEOUT"),

SND_SOC_DAPM_MUX("Earpiece Source Playback Route",
SND_SOC_NOPM, 0, 0, sun50i_codec_earpiece_src),
SND_SOC_DAPM_OUT_DRV("Earpiece Amp", SUN50I_ADDA_EARPIECE_CTRL1,
SUN50I_ADDA_EARPIECE_CTRL1_ESPPA_EN, 0, NULL, 0),
SND_SOC_DAPM_OUTPUT("EARPIECE"),

/* Microphone inputs */
SND_SOC_DAPM_INPUT("MIC1"),

Expand Down Expand Up @@ -388,6 +430,14 @@ static const struct snd_soc_dapm_route sun50i_a64_codec_routes[] = {
{ "Line Out Source Playback Route", "Mono Differential",
"Right Mixer" },
{ "LINEOUT", NULL, "Line Out Source Playback Route" },

/* Earpiece Routes */
{ "Earpiece Source Playback Route", "DACL", "Left DAC" },
{ "Earpiece Source Playback Route", "DACR", "Right DAC" },
{ "Earpiece Source Playback Route", "Left Mixer", "Left Mixer" },
{ "Earpiece Source Playback Route", "Right Mixer", "Right Mixer" },
{ "Earpiece Amp", NULL, "Earpiece Source Playback Route" },
{ "EARPIECE", NULL, "Earpiece Amp" },
};

static const struct snd_soc_component_driver sun50i_codec_analog_cmpnt_drv = {
Expand Down

0 comments on commit 1fe0860

Please sign in to comment.