From 04f5ade6afc4326dc6cd10d235500972fba548eb Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Thu, 27 Oct 2011 20:47:07 +0200
Subject: [PATCH] ALSA: hda - Introduce snd_hda_get_pin_label()
Git-commit: 04f5ade6afc4326dc6cd10d235500972fba548eb
Patch-mainline: 3.3-rc1
References: FATE#313695

Create a new helper function snd_hda_get_pin_label() for getting a label
string for both input and output pins.  hda_get_input_pin_label() is
obsoleted by this function, and the callers are replaced appropriately
now by this patch.

Signed-off-by: Takashi Iwai <tiwai@suse.de>

---
 sound/pci/hda/hda_codec.c      |   63 +++++++++++++++++++++++++++++++++++++++--
 sound/pci/hda/hda_local.h      |    4 +-
 sound/pci/hda/patch_ca0110.c   |    2 -
 sound/pci/hda/patch_cirrus.c   |    2 -
 sound/pci/hda/patch_sigmatel.c |    4 +-
 5 files changed, 66 insertions(+), 9 deletions(-)

--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -5013,8 +5013,8 @@ EXPORT_SYMBOL_HDA(snd_hda_get_input_pin_
  * "Rear", "Internal".
  */
 
-const char *hda_get_input_pin_label(struct hda_codec *codec, hda_nid_t pin,
-					int check_location)
+static const char *hda_get_input_pin_label(struct hda_codec *codec,
+					   hda_nid_t pin, bool check_location)
 {
 	unsigned int def_conf;
 	static const char * const mic_names[] = {
@@ -5053,7 +5053,6 @@ const char *hda_get_input_pin_label(stru
 		return "Misc";
 	}
 }
-EXPORT_SYMBOL_HDA(hda_get_input_pin_label);
 
 /* Check whether the location prefix needs to be added to the label.
  * If all mic-jacks are in the same location (e.g. rear panel), we don't
@@ -5111,6 +5110,64 @@ const char *hda_get_autocfg_input_label(
 EXPORT_SYMBOL_HDA(hda_get_autocfg_input_label);
 
 /**
+ * snd_hda_get_pin_label - Get a label for the given I/O pin
+ *
+ * Get a label for the given pin.  This function works for both input and
+ * output pins.  When @cfg is given as non-NULL, the function tries to get
+ * an optimized label using hda_get_autocfg_input_label().
+ */
+const char *snd_hda_get_pin_label(struct hda_codec *codec, hda_nid_t nid,
+				  const struct auto_pin_cfg *cfg)
+{
+	unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid);
+	int attr;
+	int i;
+
+	if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE)
+		return NULL;
+
+	attr = snd_hda_get_input_pin_attr(def_conf);
+	switch (get_defcfg_device(def_conf)) {
+	case AC_JACK_LINE_OUT:
+		switch (attr) {
+		case INPUT_PIN_ATTR_INT:
+			return "Speaker";
+		case INPUT_PIN_ATTR_DOCK:
+			return "Dock Line-Out";
+		case INPUT_PIN_ATTR_FRONT:
+			return "Front Line-Out";
+		default:
+			return "Line-Out";
+		}
+	case AC_JACK_SPEAKER:
+		return "Speaker";
+	case AC_JACK_HP_OUT:
+		switch (attr) {
+		case INPUT_PIN_ATTR_DOCK:
+			return "Dock Headphone";
+		case INPUT_PIN_ATTR_FRONT:
+			return "Front Headphone";
+		default:
+			return "Headphone";
+		}
+	case AC_JACK_SPDIF_OUT:
+	case AC_JACK_DIG_OTHER_OUT:
+		if (get_defcfg_location(def_conf) == AC_JACK_LOC_HDMI)
+			return "HDMI";
+		else
+			return "SPDIF";
+	}
+
+	if (cfg) {
+		for (i = 0; i < cfg->num_inputs; i++)
+			if (cfg->inputs[i].pin == nid)
+				return hda_get_autocfg_input_label(codec, cfg, i);
+	}
+	return hda_get_input_pin_label(codec, nid, true);
+}
+EXPORT_SYMBOL_HDA(snd_hda_get_pin_label);
+
+/**
  * snd_hda_add_imux_item - Add an item to input_mux
  *
  * When the same label is used already in the existing items, the number
--- a/sound/pci/hda/hda_local.h
+++ b/sound/pci/hda/hda_local.h
@@ -394,11 +394,11 @@ struct auto_pin_cfg_item {
 };
 
 struct auto_pin_cfg;
-const char *hda_get_input_pin_label(struct hda_codec *codec, hda_nid_t pin,
-				    int check_location);
 const char *hda_get_autocfg_input_label(struct hda_codec *codec,
 					const struct auto_pin_cfg *cfg,
 					int input);
+const char *snd_hda_get_pin_label(struct hda_codec *codec, hda_nid_t nid,
+				  const struct auto_pin_cfg *cfg);
 int snd_hda_add_imux_item(struct hda_input_mux *imux, const char *label,
 			  int index, int *type_index_ret);
 
--- a/sound/pci/hda/patch_ca0110.c
+++ b/sound/pci/hda/patch_ca0110.c
@@ -475,7 +475,7 @@ static void parse_input(struct hda_codec
 		if (j >= cfg->num_inputs)
 			continue;
 		spec->input_pins[n] = pin;
-		spec->input_labels[n] = hda_get_input_pin_label(codec, pin, 1);
+		spec->input_labels[n] = snd_hda_get_pin_label(codec, pin, NULL);
 		spec->adcs[n] = nid;
 		n++;
 	}
--- a/sound/pci/hda/patch_cirrus.c
+++ b/sound/pci/hda/patch_cirrus.c
@@ -677,7 +677,7 @@ static int cs_capture_source_info(struct
 		uinfo->value.enumerated.item = spec->num_inputs - 1;
 	idx = spec->input_idx[uinfo->value.enumerated.item];
 	strcpy(uinfo->value.enumerated.name,
-	       hda_get_input_pin_label(codec, cfg->inputs[idx].pin, 1));
+	       snd_hda_get_pin_label(codec, cfg->inputs[idx].pin, NULL));
 	return 0;
 }
 
--- a/sound/pci/hda/patch_sigmatel.c
+++ b/sound/pci/hda/patch_sigmatel.c
@@ -2869,7 +2869,7 @@ static inline int stac92xx_add_jack_mode
 	}
 
 	if (control) {
-		strcpy(name, hda_get_input_pin_label(codec, nid, 1));
+		strcpy(name, snd_hda_get_pin_label(codec, nid, NULL));
 		return stac92xx_add_control(codec->spec, control,
 					strcat(name, " Jack Mode"), nid);
 	}
@@ -3560,7 +3560,7 @@ static int stac92xx_auto_create_dmic_inp
 		if (index < 0)
 			continue;
 
-		label = hda_get_input_pin_label(codec, nid, 1);
+		label = snd_hda_get_pin_label(codec, nid, NULL);
 		snd_hda_add_imux_item(dimux, label, index, &type_idx);
 		if (snd_hda_get_bool_hint(codec, "separate_dmux") != 1)
 			snd_hda_add_imux_item(imux, label, index, &type_idx);
