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

Commit 6a92934d authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: hda - Add input volume control for each mic/line-in pin



The input pins on cirrus codecs have also input amps.  Let's make
control elemetns for them.

Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent f46119b7
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -742,6 +742,27 @@ static struct hda_bind_ctls *make_bind_capture(struct hda_codec *codec,
	return bind;
}

/* add a (input-boost) volume control to the given input pin */
static int add_input_volume_control(struct hda_codec *codec,
				    struct auto_pin_cfg *cfg,
				    int item)
{
	hda_nid_t pin = cfg->inputs[item].pin;
	u32 caps;
	const char *label;
	struct snd_kcontrol *kctl;
		
	if (!(get_wcaps(codec, pin) & AC_WCAP_IN_AMP))
		return 0;
	caps = query_amp_caps(codec, pin, HDA_INPUT);
	caps = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT;
	if (caps <= 1)
		return 0;
	label = hda_get_autocfg_input_label(codec, cfg, item);
	return add_volume(codec, label, 0,
			  HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_INPUT), 1, &kctl);
}

static int build_input(struct hda_codec *codec)
{
	struct cs_spec *spec = codec->spec;
@@ -781,6 +802,12 @@ static int build_input(struct hda_codec *codec)
			return err;
	}

	for (i = 0; i < spec->num_inputs; i++) {
		err = add_input_volume_control(codec, &spec->autocfg, i);
		if (err < 0)
			return err;
	}

	return 0;
}