diff options
Diffstat (limited to 'sound/soc/codecs/hdmi-codec.c')
| -rw-r--r-- | sound/soc/codecs/hdmi-codec.c | 46 | 
1 files changed, 46 insertions, 0 deletions
diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c index 0bf1c8cad108..b5fd8f08726e 100644 --- a/sound/soc/codecs/hdmi-codec.c +++ b/sound/soc/codecs/hdmi-codec.c @@ -7,6 +7,7 @@  #include <linux/module.h>  #include <linux/string.h>  #include <sound/core.h> +#include <sound/jack.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h>  #include <sound/soc.h> @@ -274,6 +275,8 @@ struct hdmi_codec_priv {  	struct snd_pcm_chmap *chmap_info;  	unsigned int chmap_idx;  	struct mutex lock; +	struct snd_soc_jack *jack; +	unsigned int jack_status;  };  static const struct snd_soc_dapm_widget hdmi_widgets[] = { @@ -663,6 +666,49 @@ static int hdmi_dai_probe(struct snd_soc_dai *dai)  	return 0;  } +static void hdmi_codec_jack_report(struct hdmi_codec_priv *hcp, +				   unsigned int jack_status) +{ +	if (hcp->jack && jack_status != hcp->jack_status) { +		snd_soc_jack_report(hcp->jack, jack_status, SND_JACK_LINEOUT); +		hcp->jack_status = jack_status; +	} +} + +static void plugged_cb(struct device *dev, bool plugged) +{ +	struct hdmi_codec_priv *hcp = dev_get_drvdata(dev); + +	if (plugged) +		hdmi_codec_jack_report(hcp, SND_JACK_LINEOUT); +	else +		hdmi_codec_jack_report(hcp, 0); +} + +/** + * hdmi_codec_set_jack_detect - register HDMI plugged callback + * @component: the hdmi-codec instance + * @jack: ASoC jack to report (dis)connection events on + */ +int hdmi_codec_set_jack_detect(struct snd_soc_component *component, +			       struct snd_soc_jack *jack) +{ +	struct hdmi_codec_priv *hcp = snd_soc_component_get_drvdata(component); +	int ret = -EOPNOTSUPP; + +	if (hcp->hcd.ops->hook_plugged_cb) { +		hcp->jack = jack; +		ret = hcp->hcd.ops->hook_plugged_cb(component->dev->parent, +						    hcp->hcd.data, +						    plugged_cb, +						    component->dev); +		if (ret) +			hcp->jack = NULL; +	} +	return ret; +} +EXPORT_SYMBOL_GPL(hdmi_codec_set_jack_detect); +  static int hdmi_dai_spdif_probe(struct snd_soc_dai *dai)  {  	struct hdmi_codec_daifmt *cf = dai->playback_dma_data;  |