cs35l41: separate ASPRX1 and ASPRX2 event function
mute amp when ASPRX1 and ASPRX2 both power down.
Bug: 216235756
Test: amp is not muted after run below commands
adb shell "tinymix 'DSP RX1 Source' ASPRX2"
adb shell "tinymix 'DSP RX1 Source' ASPRX1"
Change-Id: Ib519a45f83eb675988eb908088932301dd617f68
Signed-off-by: Robert Lee <lerobert@google.com>
diff --git a/cs35l41/cs35l41.c b/cs35l41/cs35l41.c
index 46805cc..72c6aed 100644
--- a/cs35l41/cs35l41.c
+++ b/cs35l41/cs35l41.c
@@ -2132,7 +2132,20 @@
return ret;
}
-static int cs35l41_asprx_event(struct snd_soc_dapm_widget *w,
+static void cs35l41_mute_amp(struct cs35l41_private *cs35l41)
+{
+ bool mute = !(cs35l41->asprx1_enabled || cs35l41->asprx2_enabled);
+
+ if (mute) {
+ regmap_update_bits(cs35l41->regmap, CS35L41_AMP_OUT_MUTE,
+ CS35L41_AMP_MUTE_MASK, CS35L41_AMP_MUTE_MASK);
+ } else {
+ regmap_update_bits(cs35l41->regmap, CS35L41_AMP_OUT_MUTE,
+ CS35L41_AMP_MUTE_MASK, 0);
+ }
+}
+
+static int cs35l41_asprx1_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
struct snd_soc_component *component =
@@ -2143,18 +2156,44 @@
switch (event) {
case SND_SOC_DAPM_POST_PMU:
- regmap_update_bits(cs35l41->regmap, CS35L41_AMP_OUT_MUTE,
- CS35L41_AMP_MUTE_MASK, 0);
+ cs35l41->asprx1_enabled = true;
break;
case SND_SOC_DAPM_PRE_PMD:
- regmap_update_bits(cs35l41->regmap, CS35L41_AMP_OUT_MUTE,
- CS35L41_AMP_MUTE_MASK, CS35L41_AMP_MUTE_MASK);
+ cs35l41->asprx1_enabled = false;
break;
default:
dev_err(cs35l41->dev, "Invalid event = 0x%x\n", event);
ret = -EINVAL;
break;
}
+ if (ret == 0)
+ cs35l41_mute_amp(cs35l41);
+ return ret;
+}
+
+static int cs35l41_asprx2_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);
+ struct cs35l41_private *cs35l41 =
+ snd_soc_component_get_drvdata(component);
+ int ret = 0;
+
+ switch (event) {
+ case SND_SOC_DAPM_POST_PMU:
+ cs35l41->asprx2_enabled = true;
+ break;
+ case SND_SOC_DAPM_PRE_PMD:
+ cs35l41->asprx2_enabled = false;
+ break;
+ default:
+ dev_err(cs35l41->dev, "Invalid event = 0x%x\n", event);
+ ret = -EINVAL;
+ break;
+ }
+ if (ret == 0)
+ cs35l41_mute_amp(cs35l41);
return ret;
}
@@ -2168,10 +2207,10 @@
cs35l41_dsp_load_ev, SND_SOC_DAPM_POST_PMU),
SND_SOC_DAPM_OUTPUT("SPK"),
SND_SOC_DAPM_AIF_IN_E("ASPRX1", NULL, 0, CS35L41_SP_ENABLES, 16, 0,
- cs35l41_asprx_event,
+ cs35l41_asprx1_event,
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
SND_SOC_DAPM_AIF_IN_E("ASPRX2", NULL, 0, CS35L41_SP_ENABLES, 17, 0,
- cs35l41_asprx_event,
+ cs35l41_asprx2_event,
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
SND_SOC_DAPM_AIF_OUT("ASPTX1", NULL, 0, CS35L41_SP_ENABLES, 0, 0),
SND_SOC_DAPM_AIF_OUT("ASPTX2", NULL, 0, CS35L41_SP_ENABLES, 1, 0),
diff --git a/cs35l41/include/sound/cs35l41.h b/cs35l41/include/sound/cs35l41.h
index 12ddfa5..1c1dd89 100644
--- a/cs35l41/include/sound/cs35l41.h
+++ b/cs35l41/include/sound/cs35l41.h
@@ -113,6 +113,8 @@
bool fast_switch_en;
bool force_int;
bool hibernate_force_wake;
+ bool asprx1_enabled;
+ bool asprx2_enabled;
/* GPIO for /RST */
struct gpio_desc *reset_gpio;
/* Run-time mixer */