96 lines
3.7 KiB
Diff
96 lines
3.7 KiB
Diff
From 4b1ee1a603072d10c34ff1ae0ac81d34bce90b62 Mon Sep 17 00:00:00 2001
|
|
From: Arnaud Ferraris <arnaud.ferraris@collabora.com>
|
|
Date: Thu, 24 Sep 2020 23:01:57 -0500
|
|
Subject: [PATCH 251/389] ASoC: sun50i-codec-analog: Enable jack detection on
|
|
startup
|
|
|
|
This commit adds the necessary setup to enable jack detection on startup
|
|
as well as the callback function enabling the microphone ADC when
|
|
headset bias is enabled. The microphone ADC is also disabled in suspend.
|
|
|
|
Signed-off-by: Arnaud Ferraris <arnaud.ferraris@collabora.com>
|
|
[Samuel: Moved MICADCEN setup to HBIAS event, added bias hooks]
|
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
|
---
|
|
sound/soc/sunxi/sun50i-codec-analog.c | 32 ++++++++++++++++++++++++++-
|
|
1 file changed, 31 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/sound/soc/sunxi/sun50i-codec-analog.c b/sound/soc/sunxi/sun50i-codec-analog.c
|
|
index 45466a51a871..7ee72c0537c1 100644
|
|
--- a/sound/soc/sunxi/sun50i-codec-analog.c
|
|
+++ b/sound/soc/sunxi/sun50i-codec-analog.c
|
|
@@ -117,8 +117,10 @@
|
|
#define SUN50I_ADDA_HS_MBIAS_CTRL_MMICBIASEN 7
|
|
|
|
#define SUN50I_ADDA_JACK_MIC_CTRL 0x1d
|
|
+#define SUN50I_ADDA_JACK_MIC_CTRL_JACKDETEN 7
|
|
#define SUN50I_ADDA_JACK_MIC_CTRL_INNERRESEN 6
|
|
#define SUN50I_ADDA_JACK_MIC_CTRL_HMICBIASEN 5
|
|
+#define SUN50I_ADDA_JACK_MIC_CTRL_MICADCEN 4
|
|
|
|
struct sun50i_codec_analog {
|
|
bool internal_bias_resistor;
|
|
@@ -301,6 +303,19 @@ static const struct snd_kcontrol_new sun50i_codec_earpiece_switch[] = {
|
|
SUN50I_ADDA_EARPIECE_CTRL1_ESPPA_MUTE, 1, 0),
|
|
};
|
|
|
|
+static int sun50i_codec_hbias_event(struct snd_soc_dapm_widget *w,
|
|
+ struct snd_kcontrol *kcontrol, int event)
|
|
+{
|
|
+ struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
|
+ u32 value = !!SND_SOC_DAPM_EVENT_ON(event);
|
|
+
|
|
+ regmap_update_bits(component->regmap, SUN50I_ADDA_JACK_MIC_CTRL,
|
|
+ BIT(SUN50I_ADDA_JACK_MIC_CTRL_MICADCEN),
|
|
+ value << SUN50I_ADDA_JACK_MIC_CTRL_MICADCEN);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static const struct snd_soc_dapm_widget sun50i_a64_codec_widgets[] = {
|
|
/* DAC */
|
|
SND_SOC_DAPM_DAC("Left DAC", NULL, SUN50I_ADDA_MIX_DAC_CTRL,
|
|
@@ -372,7 +387,8 @@ static const struct snd_soc_dapm_widget sun50i_a64_codec_widgets[] = {
|
|
/* Microphone Bias */
|
|
SND_SOC_DAPM_SUPPLY("HBIAS", SUN50I_ADDA_JACK_MIC_CTRL,
|
|
SUN50I_ADDA_JACK_MIC_CTRL_HMICBIASEN,
|
|
- 0, NULL, 0),
|
|
+ 0, sun50i_codec_hbias_event,
|
|
+ SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
|
|
|
|
/* Mic input path */
|
|
SND_SOC_DAPM_PGA("Mic2 Amplifier", SUN50I_ADDA_MIC2_CTRL,
|
|
@@ -491,8 +507,15 @@ static int sun50i_a64_codec_probe(struct snd_soc_component *component)
|
|
static int sun50i_a64_codec_set_bias_level(struct snd_soc_component *component,
|
|
enum snd_soc_bias_level level)
|
|
{
|
|
+ struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
|
|
+ int hbias;
|
|
+
|
|
switch (level) {
|
|
case SND_SOC_BIAS_OFF:
|
|
+ regmap_update_bits(component->regmap, SUN50I_ADDA_JACK_MIC_CTRL,
|
|
+ BIT(SUN50I_ADDA_JACK_MIC_CTRL_JACKDETEN) |
|
|
+ BIT(SUN50I_ADDA_JACK_MIC_CTRL_MICADCEN), 0);
|
|
+
|
|
regmap_update_bits(component->regmap, SUN50I_ADDA_HP_CTRL,
|
|
BIT(SUN50I_ADDA_HP_CTRL_PA_CLK_GATE),
|
|
BIT(SUN50I_ADDA_HP_CTRL_PA_CLK_GATE));
|
|
@@ -500,6 +523,13 @@ static int sun50i_a64_codec_set_bias_level(struct snd_soc_component *component,
|
|
case SND_SOC_BIAS_STANDBY:
|
|
regmap_update_bits(component->regmap, SUN50I_ADDA_HP_CTRL,
|
|
BIT(SUN50I_ADDA_HP_CTRL_PA_CLK_GATE), 0);
|
|
+
|
|
+ hbias = snd_soc_dapm_get_pin_status(dapm, "HBIAS");
|
|
+ regmap_update_bits(component->regmap, SUN50I_ADDA_JACK_MIC_CTRL,
|
|
+ BIT(SUN50I_ADDA_JACK_MIC_CTRL_JACKDETEN) |
|
|
+ BIT(SUN50I_ADDA_JACK_MIC_CTRL_MICADCEN),
|
|
+ BIT(SUN50I_ADDA_JACK_MIC_CTRL_JACKDETEN) |
|
|
+ hbias << SUN50I_ADDA_JACK_MIC_CTRL_MICADCEN);
|
|
break;
|
|
default:
|
|
break;
|
|
--
|
|
2.35.3
|
|
|