summarylogtreecommitdiffstats
path: root/0011-mute-unmute-using-SND_SOC_DAPM_SWITCH.patch
blob: 01d2d7048dfe037a394a254fd291271d16d74d96 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
diff --git a/sound/soc/codecs/tas2783-sdw.c b/sound/soc/codecs/tas2783-sdw.c
index a97cd3ba1e7f..28971840ce24 100644
--- a/sound/soc/codecs/tas2783-sdw.c
+++ b/sound/soc/codecs/tas2783-sdw.c
@@ -549,6 +549,22 @@ static const struct snd_kcontrol_new tas2783_snd_controls[] = {
  	SOC_ENUM("Channel Playback", tas2783_ch_enum),
 };
 
+static const struct snd_kcontrol_new fu21_playback_switch =
+	SOC_DAPM_SINGLE_AUTODISABLE("Switch",
+		SDW_SDCA_CTL(SDCA_FUNCTION_TYPE_SMART_AMP,
+			TAS2783_SDCA_ENT_FU21,
+			SDCA_CTL_FU_MUTE,
+			SDCA_CHAN_REL_GENERIC_MONO),
+	0, 1, 1);
+
+static const struct snd_kcontrol_new fu23_playback_switch =
+	SOC_DAPM_SINGLE_AUTODISABLE("Switch",
+		SDW_SDCA_CTL(SDCA_FUNCTION_TYPE_SMART_AMP,
+			TAS2783_SDCA_ENT_FU23,
+			SDCA_CTL_FU_MUTE,
+			SDCA_CHAN_REL_GENERIC_MONO),
+	0, 1, 1);
+
 static s32 tas2783_validate_calibdata(struct tas2783_prv *tas_dev,
 				      u8 *data, u32 size)
 {
@@ -862,67 +878,31 @@ static inline s32 tas_clear_latch(struct tas2783_prv *priv)
 				  0x04, 0x04);
 }
 
-static s32 tas_fu21_event(struct snd_soc_dapm_widget *w,
-			  struct snd_kcontrol *k, s32 event)
-{
-	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
-	struct tas2783_prv *tas_dev = snd_soc_component_get_drvdata(component);
-	s32 mute;
-
-	switch (event) {
-	case SND_SOC_DAPM_POST_PMU:
-		mute = 0;
-		break;
-
-	case SND_SOC_DAPM_PRE_PMD:
-		mute = 1;
-		break;
-	}
-
-	return sdw_write_no_pm(tas_dev->sdw_peripheral,
-			       SDW_SDCA_CTL(1, TAS2783_SDCA_ENT_FU21,
-					    TAS2783_SDCA_CTL_FU_MUTE, 1), mute);
-}
-
-static s32 tas_fu23_event(struct snd_soc_dapm_widget *w,
-			  struct snd_kcontrol *k, s32 event)
-{
-	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
-	struct tas2783_prv *tas_dev = snd_soc_component_get_drvdata(component);
-	s32 mute;
-
-	switch (event) {
-	case SND_SOC_DAPM_POST_PMU:
-		mute = 0;
-		break;
-
-	case SND_SOC_DAPM_PRE_PMD:
-		mute = 1;
-		break;
-	}
-
-	return sdw_write_no_pm(tas_dev->sdw_peripheral,
-			       SDW_SDCA_CTL(1, TAS2783_SDCA_ENT_FU23,
-					    TAS2783_SDCA_CTL_FU_MUTE, 1), mute);
-}
-
 static const struct snd_soc_dapm_widget tas_dapm_widgets[] = {
 	SND_SOC_DAPM_AIF_IN("ASI", "Playback", 0, SND_SOC_NOPM, 0, 0),
 	SND_SOC_DAPM_AIF_OUT("ASI OUT", "Capture", 0, SND_SOC_NOPM,
 			     0, 0),
-	SND_SOC_DAPM_DAC_E("FU21", NULL, SND_SOC_NOPM, 0, 0, tas_fu21_event,
-			   SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
-	SND_SOC_DAPM_DAC_E("FU23", NULL, SND_SOC_NOPM, 0, 0, tas_fu23_event,
-			   SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
+
+	/* Switches (FU21 = Speaker/DVC, FU23 = Amp/Mute) */
+	SND_SOC_DAPM_SWITCH("Speaker Playback", SND_SOC_NOPM, 0, 0, &fu21_playback_switch),
+	SND_SOC_DAPM_SWITCH("Amp Playback", SND_SOC_NOPM, 0, 0, &fu23_playback_switch),
+
+	SND_SOC_DAPM_DAC("FU21", NULL, SND_SOC_NOPM, 0, 0),
+	SND_SOC_DAPM_DAC("FU23", NULL, SND_SOC_NOPM, 0, 0),
 	SND_SOC_DAPM_OUTPUT("SPK"),
 	SND_SOC_DAPM_INPUT("DMIC"),
 };
 
 static const struct snd_soc_dapm_route tas_audio_map[] = {
-	{"FU21", NULL, "ASI"},
+	{ "Speaker Playback", "Switch", "ASI" },
+	{ "Amp Playback", "Switch", "ASI" },
+
+	{"FU21", NULL, "Speaker Playback"},
+	{"FU23", NULL, "Amp Playback"},
+
 	{"SPK", NULL, "FU21"},
-	{"FU23", NULL, "ASI"},
 	{"SPK", NULL, "FU23"},
+
 	{"ASI OUT", NULL, "DMIC"},
 };
 
-- 
2.54.0