On Thu, 2022-12-01 at 15:23 +0000, Mark Brown wrote:
On Thu, Dec 01, 2022 at 03:06:04PM +0000, Jiaxin Yu (俞家鑫) wrote:
On Tue, 2022-11-29 at 17:22 +0000, Mark Brown wrote:
static const struct snd_kcontrol_new mt8186_mt6366_rt1019_rt5682s_controls[] = { SOC_DAPM_PIN_SWITCH("Speakers"), SOC_DAPM_PIN_SWITCH("Headphone"), SOC_DAPM_PIN_SWITCH("Headset Mic"), SOC_DAPM_PIN_SWITCH("HDMI1"), };
Which operation should I use to inform bridge driver to control audio on or off? I'm curious why I don't see .trigger in the structure hdmi_codec_ops compared to the structure snd_soc_dai_ops?
You'd need to add a callback that the user of hdmi-codec passes in which would be triggered by an event on a DAPM widget added in the audio path rather than trying to shoehorn this into a PCM operation - a big part of the problem here is that you're trying to add something that doesn't fit into a PCM operation.
Dear Mark,
1. I have added a DAPM widget that is "SDB", when we open or close HDMI PIN_SWITCH, the callback 'hdmi_tx_event' registered in the widget will be triggered. Maybe you mean I shouldn't use SNDRV_PCM_TRIGGER_START and SNDRV_PCM_TRIGGER_STOP?
2. If I don't use hcd.ops->trigger notifies the bridge ic driver to switch the audio, which ops should I use? I actually want to know hdmi-codec.c and it6505.c except hdmi_codec_ops, is there any other way to communicate?
My understanding is not deep enough, so please help explain more in detail, thank you very much!
+static int hdmi_tx_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 hdmi_codec_priv *hcp = snd_soc_component_get_drvdata(component); + + switch (event) { + case SND_SOC_DAPM_PRE_PMU: + if (hcp->hcd.ops->trigger) + hcp->hcd.ops->trigger(component->dev->parent, SNDRV_PCM_TRIGGER_START); + break; + case SND_SOC_DAPM_POST_PMD: + if (hcp->hcd.ops->trigger) + hcp->hcd.ops->trigger(component->dev->parent, SNDRV_PCM_TRIGGER_STOP); + break; + default: + break; + } + + return 0; +} + static const struct snd_soc_dapm_widget hdmi_widgets[] = { + SND_SOC_DAPM_OUT_DRV_E("SDB", SND_SOC_NOPM, 0, 0, NULL, 0, hdmi_tx_event, + SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_PRE_PMU), SND_SOC_DAPM_OUTPUT("TX"), SND_SOC_DAPM_OUTPUT("RX"), };