Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c927b4a authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: hda - Add digital-mic support to ALC262 auto model



Add the digital-mic support with ALC262 auto model.
The new ALC262 models have the digital mic at NID 0x12.  This widget
isn't checked in the current alc262_auto_create_analog_input_ctls()
since it's under 0x18.  So, just reuse the routine for alc269 to fix
the behavior.

But, it doesn't suffice: the digital mic is supported only with the
ADC0, we have to exclude other ADCs when d-mic is detected.

Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 0169b6b3
Loading
Loading
Loading
Loading
+51 −35
Original line number Diff line number Diff line
@@ -10901,9 +10901,27 @@ static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
	return 0;
}
/* identical with ALC880 */
#define alc262_auto_create_analog_input_ctls \
	alc880_auto_create_analog_input_ctls
static int alc262_auto_create_analog_input_ctls(struct alc_spec *spec,
						const struct auto_pin_cfg *cfg)
{
	int err;
	err = alc880_auto_create_analog_input_ctls(spec, cfg);
	if (err < 0)
		return err;
	/* digital-mic input pin is excluded in alc880_auto_create..()
	 * because it's under 0x18
	 */
	if (cfg->input_pins[AUTO_PIN_MIC] == 0x12 ||
	    cfg->input_pins[AUTO_PIN_FRONT_MIC] == 0x12) {
		struct hda_input_mux *imux = &spec->private_imux[0];
		imux->items[imux->num_items].label = "Int Mic";
		imux->items[imux->num_items].index = 0x09;
		imux->num_items++;
	}
	return 0;
}
/*
 * generic initialization of ADC, input mixers and output mixers
@@ -11631,6 +11649,19 @@ static int patch_alc262(struct hda_codec *codec)
	spec->stream_digital_capture = &alc262_pcm_digital_capture;
	if (!spec->adc_nids && spec->input_mux) {
		int i;
		/* check whether the digital-mic has to be supported */
		for (i = 0; i < spec->input_mux->num_items; i++) {
			if (spec->input_mux->items[i].index >= 9)
				break;
		}
		if (i < spec->input_mux->num_items) {
			/* use only ADC0 */
			spec->adc_nids = alc262_dmic_adc_nids;
			spec->num_adc_nids = 1;
			spec->capsrc_nids = alc262_dmic_capsrc_nids;
		} else {
			/* all analog inputs */
			/* check whether NID 0x07 is valid */
			unsigned int wcap = get_wcaps(codec, 0x07);
@@ -11638,14 +11669,17 @@ static int patch_alc262(struct hda_codec *codec)
			wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
			if (wcap != AC_WID_AUD_IN) {
				spec->adc_nids = alc262_adc_nids_alt;
			spec->num_adc_nids = ARRAY_SIZE(alc262_adc_nids_alt);
				spec->num_adc_nids =
					ARRAY_SIZE(alc262_adc_nids_alt);
				spec->capsrc_nids = alc262_capsrc_nids_alt;
			} else {
				spec->adc_nids = alc262_adc_nids;
			spec->num_adc_nids = ARRAY_SIZE(alc262_adc_nids);
				spec->num_adc_nids =
					ARRAY_SIZE(alc262_adc_nids);
				spec->capsrc_nids = alc262_capsrc_nids;
			}
		}
	}
	if (!spec->cap_mixer && !spec->no_analog)
		set_capture_mixer(spec);
	if (!spec->no_analog)
@@ -13233,26 +13267,8 @@ static int alc269_auto_create_multi_out_ctls(struct alc_spec *spec,
	return 0;
}
static int alc269_auto_create_analog_input_ctls(struct alc_spec *spec,
						const struct auto_pin_cfg *cfg)
{
	int err;
	err = alc880_auto_create_analog_input_ctls(spec, cfg);
	if (err < 0)
		return err;
	/* digital-mic input pin is excluded in alc880_auto_create..()
	 * because it's under 0x18
	 */
	if (cfg->input_pins[AUTO_PIN_MIC] == 0x12 ||
	    cfg->input_pins[AUTO_PIN_FRONT_MIC] == 0x12) {
		struct hda_input_mux *imux = &spec->private_imux[0];
		imux->items[imux->num_items].label = "Int Mic";
		imux->items[imux->num_items].index = 0x05;
		imux->num_items++;
	}
	return 0;
}
#define alc269_auto_create_analog_input_ctls \
	alc262_auto_create_analog_input_ctls
#ifdef CONFIG_SND_HDA_POWER_SAVE
#define alc269_loopbacks	alc880_loopbacks