Răsfoiți Sursa

ALSA: hda - Search ADC NIDs dynamically in Conexant auto-parser

Instead of giving fixed arrays, look for ADC nids dynamically in the
tree in Conexant auto-parser code.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 14 ani în urmă
părinte
comite
22ce5f74a9
1 a modificat fișierele cu 26 adăugiri și 14 ștergeri
  1. 26 14
      sound/pci/hda/patch_conexant.c

+ 26 - 14
sound/pci/hda/patch_conexant.c

@@ -110,6 +110,7 @@ struct conexant_spec {
 	struct hda_input_mux private_imux;
 	hda_nid_t imux_adcs[HDA_MAX_NUM_INPUTS];
 	hda_nid_t imux_pins[HDA_MAX_NUM_INPUTS];
+	hda_nid_t private_adc_nids[HDA_MAX_NUM_INPUTS];
 	hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
 	struct pin_dac_pair dac_info[8];
 	int dac_info_filled;
@@ -4034,6 +4035,28 @@ static int cx_auto_build_controls(struct hda_codec *codec)
 	return conexant_build_controls(codec);
 }
 
+static int cx_auto_search_adcs(struct hda_codec *codec)
+{
+	struct conexant_spec *spec = codec->spec;
+	hda_nid_t nid, end_nid;
+
+	end_nid = codec->start_nid + codec->num_nodes;
+	for (nid = codec->start_nid; nid < end_nid; nid++) {
+		unsigned int caps = get_wcaps(codec, nid);
+		if (get_wcaps_type(caps) != AC_WID_AUD_IN)
+			continue;
+		if (caps & AC_WCAP_DIGITAL)
+			continue;
+		if (snd_BUG_ON(spec->num_adc_nids >=
+			       ARRAY_SIZE(spec->private_adc_nids)))
+			break;
+		spec->private_adc_nids[spec->num_adc_nids++] = nid;
+	}
+	spec->adc_nids = spec->private_adc_nids;
+	return 0;
+}
+
+
 static const struct hda_codec_ops cx_auto_patch_ops = {
 	.build_controls = cx_auto_build_controls,
 	.build_pcms = conexant_build_pcms,
@@ -4058,29 +4081,18 @@ static int patch_conexant_auto(struct hda_codec *codec)
 	if (!spec)
 		return -ENOMEM;
 	codec->spec = spec;
+	err = cx_auto_search_adcs(codec);
+	if (err < 0)
+		return err;
 	switch (codec->vendor_id) {
 	case 0x14f15051:
 		codec->pin_amp_workaround = 1;
-		spec->adc_nids = cxt5051_adc_nids;
-		spec->num_adc_nids = ARRAY_SIZE(cxt5051_adc_nids);
-		spec->capsrc_nids = spec->adc_nids;
 		break;
 	case 0x14f15045:
 		codec->pin_amp_workaround = 1;
-		spec->adc_nids = cxt5045_adc_nids;
-		spec->num_adc_nids = ARRAY_SIZE(cxt5045_adc_nids);
-		spec->capsrc_nids = spec->adc_nids;
 		break;
 	case 0x14f15047:
 		codec->pin_amp_workaround = 1;
-		spec->adc_nids = cxt5047_adc_nids;
-		spec->num_adc_nids = ARRAY_SIZE(cxt5047_adc_nids);
-		spec->capsrc_nids = cxt5047_capsrc_nids;
-		break;
-	default:
-		spec->adc_nids = cx_auto_adc_nids;
-		spec->num_adc_nids = ARRAY_SIZE(cx_auto_adc_nids);
-		spec->capsrc_nids = spec->adc_nids;
 		break;
 	}
 	err = cx_auto_parse_auto_config(codec);