On Mon, 2024-12-02 at 13:16 +0000, Mark Brown wrote: > On Sun, Dec 01, 2024 at 05:15:45PM +0000, Jiaxin Yu (俞家鑫) wrote: > > > So I want to ask if I can do it by just adding > > SOC_DAPM_PIN_SWITCH("Speakers") and SOC_DAPM_PIN_SWITCH("HDMI")? > > Correspondingly, dapm widget and route path need to be added. That > > is > > "SND_SOC_DAPM_SPK("Speakers", NULL)/ SND_SOC_DAPM_LINE("HDMI1", > > NULL)" > > and "{"Speakers", NULL, "Speaker"}/ {"HDMI1", NULL, "TX"}". > > Yes, that's what I'd expect to see. Dear Mark, So if I open the "HDMI Switch" amixer control, it will call 'hdmi_codec_startup', which in turn calls "audio_startup()" in 'hdmi_codec_ops'. Conversely, if I close it, it will call 'hdmi_codec_shutdown', which in turn calls 'audio_shutdown' in 'hdmi_codec_ops'. Is this understanding correct? static const struct snd_soc_dai_ops hdmi_codec_i2s_dai_ops = { .probe = hdmi_dai_probe, .startup = hdmi_codec_startup, .shutdown = hdmi_codec_shutdown, .hw_params = hdmi_codec_hw_params, .prepare = hdmi_codec_prepare, .set_fmt = hdmi_codec_i2s_set_fmt, .mute_stream = hdmi_codec_mute, .pcm_new = hdmi_codec_pcm_new, .auto_selectable_formats = &hdmi_codec_formats, .num_auto_selectable_formats = 1, }; struct hdmi_codec_ops { /* * Called when ASoC starts an audio stream setup. * Optional */ int (*audio_startup)(struct device *dev, void *data); /* * Shuts down the audio stream. * Mandatory */ void (*audio_shutdown)(struct device *dev, void *data);