All of lore.kernel.org
 help / color / mirror / Atom feed
From: jeeja.kp@intel.com
To: alsa-devel@alsa-project.org
Cc: tiwai@suse.de, patches.audio@intel.com, broonie@kernel.org,
	liam.r.girdwood@intel.com, Jeeja KP <jeeja.kp@intel.com>
Subject: [PATCH 24/30] ASoC: hdac_hdmi: Add machine pin widget for each port
Date: Mon, 16 Jan 2017 23:27:51 +0530	[thread overview]
Message-ID: <1484589477-7630-25-git-send-email-jeeja.kp@intel.com> (raw)
In-Reply-To: <1484589477-7630-1-git-send-email-jeeja.kp@intel.com>

From: Jeeja KP <jeeja.kp@intel.com>

Represent each port as machine DAPM pin widget. This helps in
enable/disable pin when monitor is connected/disconnected in case pcm
is rendered to multiple ports.

Create machine pin widgets  and pin switch kcontrol for each port and
report based on the pin status

Signed-off-by: Jeeja KP <jeeja.kp@intel.com>
---
 sound/soc/codecs/hdac_hdmi.c | 130 +++++++++++++++++++++++++++++++++++++++++++
 sound/soc/codecs/hdac_hdmi.h |   2 +
 2 files changed, 132 insertions(+)

diff --git a/sound/soc/codecs/hdac_hdmi.c b/sound/soc/codecs/hdac_hdmi.c
index 8c950f4..a6d28c6 100644
--- a/sound/soc/codecs/hdac_hdmi.c
+++ b/sound/soc/codecs/hdac_hdmi.c
@@ -95,6 +95,9 @@ struct hdac_hdmi_port {
 	int num_mux_nids;
 	hda_nid_t mux_nids[HDA_MAX_CONNECTIONS];
 	struct hdac_hdmi_eld eld;
+	const char *jack_pin;
+	struct snd_soc_dapm_context *dapm;
+	const char *output_pin;
 };
 
 struct hdac_hdmi_pcm {
@@ -149,6 +152,11 @@ static void hdac_hdmi_jack_report(struct hdac_hdmi_pcm *pcm,
 {
 	struct hdac_ext_device *edev = port->pin->edev;
 
+	if (is_connect)
+		snd_soc_dapm_enable_pin(port->dapm, port->jack_pin);
+	else
+		snd_soc_dapm_disable_pin(port->dapm, port->jack_pin);
+
 	if (is_connect) {
 		/*
 		 * Report Jack connect event when a device is connected
@@ -174,6 +182,8 @@ static void hdac_hdmi_jack_report(struct hdac_hdmi_pcm *pcm,
 		if (pcm->jack_event > 0)
 			pcm->jack_event--;
 	}
+
+	snd_soc_dapm_sync(port->dapm);
 }
 
 /* MST supported verbs */
@@ -1059,6 +1069,7 @@ static int create_fill_widget_route_map(struct snd_soc_dapm_context *dapm)
 					SND_SOC_DAPM_POST_PMD);
 			if (ret < 0)
 				return ret;
+			pin->ports[j].output_pin = widgets[i].name;
 			i++;
 		}
 	}
@@ -1556,6 +1567,125 @@ static struct snd_pcm *hdac_hdmi_get_pcm_from_id(struct snd_soc_card *card,
 	return NULL;
 }
 
+/* create jack pin kcontrols */
+static int create_fill_jack_kcontrols(struct snd_soc_card *card,
+				    struct hdac_ext_device *edev)
+{
+	struct hdac_hdmi_pin *pin;
+	struct snd_kcontrol_new *kc;
+	char kc_name[NAME_SIZE], xname[NAME_SIZE];
+	char *name;
+	int i = 0, j;
+	struct snd_soc_codec *codec = edev->scodec;
+	struct hdac_hdmi_priv *hdmi = edev->private_data;
+
+	kc = devm_kcalloc(codec->dev, hdmi->num_ports,
+				sizeof(*kc), GFP_KERNEL);
+
+	if (!kc)
+		return -ENOMEM;
+
+	list_for_each_entry(pin, &hdmi->pin_list, head) {
+		for (j = 0; j < pin->num_ports; j++) {
+			snprintf(xname, sizeof(xname), "hif%d-%d Jack",
+						pin->nid, pin->ports[j].id);
+			name = devm_kstrdup(codec->dev, xname, GFP_KERNEL);
+			if (!name)
+				return -ENOMEM;
+			snprintf(kc_name, sizeof(kc_name), "%s Switch", xname);
+			kc[i].name = devm_kstrdup(codec->dev, kc_name,
+							GFP_KERNEL);
+			if (!kc[i].name)
+				return -ENOMEM;
+
+			kc[i].private_value = (unsigned long)name;
+			kc[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER;
+			kc[i].access = 0;
+			kc[i].info = snd_soc_dapm_info_pin_switch;
+			kc[i].put = snd_soc_dapm_put_pin_switch;
+			kc[i].get = snd_soc_dapm_get_pin_switch;
+			i++;
+		}
+	}
+
+	return snd_soc_add_card_controls(card, kc, i);
+}
+
+int hdac_hdmi_jack_port_init(struct snd_soc_codec *codec,
+			struct snd_soc_dapm_context *dapm)
+{
+	struct hdac_ext_device *edev = snd_soc_codec_get_drvdata(codec);
+	struct hdac_hdmi_priv *hdmi = edev->private_data;
+	struct hdac_hdmi_pin *pin;
+	struct snd_soc_dapm_widget *widgets;
+	struct snd_soc_dapm_route *route;
+	char w_name[NAME_SIZE];
+	int i = 0, j, ret;
+
+	widgets = devm_kcalloc(dapm->dev, hdmi->num_ports,
+				sizeof(*widgets), GFP_KERNEL);
+
+	if (!widgets)
+		return -ENOMEM;
+
+	route = devm_kcalloc(dapm->dev, hdmi->num_ports,
+				sizeof(*route), GFP_KERNEL);
+	if (!route)
+		return -ENOMEM;
+
+	/* create Jack DAPM widget */
+	list_for_each_entry(pin, &hdmi->pin_list, head) {
+		for (j = 0; j < pin->num_ports; j++) {
+			snprintf(w_name, sizeof(w_name), "hif%d-%d Jack",
+						pin->nid, pin->ports[j].id);
+
+			ret = hdac_hdmi_fill_widget_info(dapm->dev, &widgets[i],
+					snd_soc_dapm_spk, NULL,
+					w_name, NULL, NULL, 0, NULL, 0);
+			if (ret < 0)
+				return ret;
+
+			pin->ports[j].jack_pin = widgets[i].name;
+			pin->ports[j].dapm = dapm;
+
+			/* add to route from Jack widget to output */
+			hdac_hdmi_fill_route(&route[i], pin->ports[j].jack_pin,
+					NULL, pin->ports[j].output_pin, NULL);
+
+			i++;
+		}
+	}
+
+	/* Add Route from Jack widget to the output widget */
+	ret = snd_soc_dapm_new_controls(dapm, widgets, hdmi->num_ports);
+	if (ret < 0)
+		return ret;
+
+	ret = snd_soc_dapm_add_routes(dapm, route, hdmi->num_ports);
+	if (ret < 0)
+		return ret;
+
+	ret = snd_soc_dapm_new_widgets(dapm->card);
+	if (ret < 0)
+		return ret;
+
+	/* Add Jack Pin switch Kcontrol */
+	ret = create_fill_jack_kcontrols(dapm->card, edev);
+
+	if (ret < 0)
+		return ret;
+
+	/* default set the Jack Pin switch to OFF */
+	list_for_each_entry(pin, &hdmi->pin_list, head) {
+		for (j = 0; j < pin->num_ports; j++)
+			snd_soc_dapm_disable_pin(pin->ports[j].dapm,
+						pin->ports[j].jack_pin);
+	}
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(hdac_hdmi_jack_port_init);
+
 int hdac_hdmi_jack_init(struct snd_soc_dai *dai, int device,
 				struct snd_soc_jack *jack)
 {
diff --git a/sound/soc/codecs/hdac_hdmi.h b/sound/soc/codecs/hdac_hdmi.h
index bf7edb3..dfc3a9c 100644
--- a/sound/soc/codecs/hdac_hdmi.h
+++ b/sound/soc/codecs/hdac_hdmi.h
@@ -4,4 +4,6 @@
 int hdac_hdmi_jack_init(struct snd_soc_dai *dai, int pcm,
 				struct snd_soc_jack *jack);
 
+int hdac_hdmi_jack_port_init(struct snd_soc_codec *codec,
+			struct snd_soc_dapm_context *dapm);
 #endif /* __HDAC_HDMI_H__ */
-- 
2.5.0

  parent reply	other threads:[~2017-01-16 17:48 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-16 17:57 [PATCH 00/30] ASoC: hdac_hdmi: Add support to enable MST audio jeeja.kp
2017-01-16 17:57 ` [PATCH 01/30] ASoC: hdac_hdmi: use audio component framework to read ELD jeeja.kp
2017-01-20 13:37   ` Applied "ASoC: hdac_hdmi: use audio component framework to read ELD" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 02/30] ASoC: hdac_hdmi: Register widget event handlers jeeja.kp
2017-01-16 17:57 ` [PATCH 03/30] ASoC: Intel: Skylake: Use set_tdm_slot to set the dma channel jeeja.kp
2017-01-24 18:40   ` Applied "ASoC: Intel: Skylake: Use set_tdm_slot to set the dma channel" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 04/30] ASoC: hdac_hdmi: Move channel info from pin to PCM structure jeeja.kp
2017-02-04 12:12   ` Applied "ASoC: hdac_hdmi: Move channel info from pin to PCM structure" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 05/30] ASoC: Intel: bxt: add channel map support in rt298 machine jeeja.kp
2017-02-04 12:12   ` Applied "ASoC: Intel: bxt: add channel map support in rt298 machine" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 06/30] ASoC: Intel: bxt: add channel map support in bxt_da7219_max98357a machine jeeja.kp
2017-02-04 12:12   ` Applied "ASoC: Intel: bxt: add channel map support in bxt_da7219_max98357a machine" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 07/30] ASoC: hdac_hdmi: Begin to add support for DP Multi-stream audio jeeja.kp
2017-01-16 17:57 ` [PATCH 08/30] ASoC: Intel: Skylake: Add route change to rt286 machine jeeja.kp
2017-01-16 17:57 ` [PATCH 09/30] ASoC: Intel: Skylake: Add route change to nau88l25_max98357a machine jeeja.kp
2017-01-16 17:57 ` [PATCH 10/30] ASoC: Intel: Skylake: Add route change to nau88l25_ssm4567 machine jeeja.kp
2017-01-16 17:57 ` [PATCH 11/30] ASoC: Intel: bxt: Add route change to rt298 machine jeeja.kp
2017-01-16 17:57 ` [PATCH 12/30] ASoC: Intel: bxt: Add route change to da7219_max98357a machine jeeja.kp
2017-01-16 17:57 ` [PATCH 13/30] ASoC: hdac_hdmi: Add support to handle MST capable pin jeeja.kp
2017-01-16 17:57 ` [PATCH 14/30] ASoC: hdac_hdmi: Add MST verb support jeeja.kp
2017-02-16 19:04   ` Applied "ASoC: hdac_hdmi: Add MST verb support" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 15/30] ASoC: hdac_hdmi: Handle MST pin jack detection at boot/resume jeeja.kp
2017-02-16 19:04   ` Applied "ASoC: hdac_hdmi: Handle MST pin jack detection at boot/resume" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 16/30] ASoc: hdac_hdmi: Configure pin verbs for MST jeeja.kp
2017-02-16 19:04   ` Applied "ASoc: hdac_hdmi: Configure pin verbs for MST" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 17/30] ASoC: hdac_hdmi: Add support for multiple ports to a PCM jeeja.kp
2017-02-16 19:04   ` Applied "ASoC: hdac_hdmi: Add support for multiple ports to a PCM" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 18/30] ASoC: hdac_hdmi: Use ASoC jack instead of snd_jack jeeja.kp
2017-02-16 19:04   ` Applied "ASoC: hdac_hdmi: Use ASoC jack instead of snd_jack" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 19/30] ASoC: Intel: Skylake: Create ASoC jack for hdmi in rt286 machine jeeja.kp
2017-02-16 19:04   ` Applied "ASoC: Intel: Skylake: Create ASoC jack for hdmi in rt286 machine" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 20/30] ASoC: Intel: Skylake: Create ASoC jack for hdmi in skl_nau88l25_max98357a machine jeeja.kp
2017-02-16 19:04   ` Applied "ASoC: Intel: Skylake: Create ASoC jack for hdmi in skl_nau88l25_max98357a machine" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 21/30] ASoC: Intel: Skylake: Create ASoC jack for hdmi in skl_nau88l25_ssm4567 machine jeeja.kp
2017-02-16 19:04   ` Applied "ASoC: Intel: Skylake: Create ASoC jack for hdmi in nau88l25_ssm4567 machine" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 22/30] ASoC: Intel: bxt: Create ASoC jack for hdmi in bxt_rt298 machine jeeja.kp
2017-02-16 19:04   ` Applied "ASoC: Intel: bxt: Create ASoC jack for hdmi in bxt_rt298 machine" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 23/30] ASoC: Intel: bxt: Create ASoC jack for hdmi in bxt_da7219_max98357 machine jeeja.kp
2017-02-16 19:04   ` Applied "ASoC: Intel: bxt: Create ASoC jack for hdmi in bxt_da7219_max98357 machine" to the asoc tree Mark Brown
2017-01-16 17:57 ` jeeja.kp [this message]
2017-02-16 19:04   ` Applied "ASoC: hdac_hdmi: Add machine pin widget for each port" " Mark Brown
2017-01-16 17:57 ` [PATCH 25/30] ASoC: Intel: Skylake: Add jack port initialize in rt286 machine jeeja.kp
2017-02-16 19:04   ` Applied "ASoC: Intel: Skylake: Add jack port initialize in rt286 machine" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 26/30] ASoC: Intel: Skylake: Add jack port initialize in skl_nau88l25_max98357a machine jeeja.kp
2017-02-16 19:04   ` Applied "ASoC: Intel: Skylake: Add jack port initialize in nau88l25_max98357a machine" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 27/30] ASoC: Intel: Skylake: Add jack port initialize in skl_nau88l25_ssm4567 machine jeeja.kp
2017-02-16 19:04   ` Applied "ASoC: Intel: Skylake: Add jack port initialize in nau88l25_ssm4567 machine" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 28/30] ASoC: Intel: Skylake: Add jack port initialize in bxt_rt298 machine jeeja.kp
2017-02-17 13:22   ` Applied "ASoC: Intel: bxt: Add jack port initialize in bxt_rt298 machine" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 29/30] ASoC: Intel: Skylake: Add jack port initialize in bxt_da7219_max98357a machine jeeja.kp
2017-02-16 19:04   ` Applied "ASoC: Intel: bxt: Add jack port initialize in da7219_max98357a machine" to the asoc tree Mark Brown
2017-01-16 17:57 ` [PATCH 30/30] ASoC: Intel: Skylake: Fix to delete DSP pipe after stopping pipe jeeja.kp
2017-03-15 18:13   ` Applied "ASoC: Intel: Skylake: Fix to delete DSP pipe after stopping pipe" to the asoc tree Mark Brown
2017-01-17 17:54 ` [PATCH 00/30] ASoC: hdac_hdmi: Add support to enable MST audio Mark Brown
2017-01-18 12:44   ` Jeeja KP

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1484589477-7630-25-git-send-email-jeeja.kp@intel.com \
    --to=jeeja.kp@intel.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=broonie@kernel.org \
    --cc=liam.r.girdwood@intel.com \
    --cc=patches.audio@intel.com \
    --cc=tiwai@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.