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
|