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

Commit 0186f4f4 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: hda - Use generic array for loopback list management



Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 46a14481
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ int snd_hda_gen_spec_init(struct hda_gen_spec *spec)
{
	snd_array_init(&spec->kctls, sizeof(struct snd_kcontrol_new), 32);
	snd_array_init(&spec->paths, sizeof(struct nid_path), 8);
	snd_array_init(&spec->loopback_list, sizeof(struct hda_amp_list), 8);
	mutex_init(&spec->pcm_mutex);
	return 0;
}
@@ -82,6 +83,7 @@ void snd_hda_gen_spec_free(struct hda_gen_spec *spec)
		return;
	free_kctls(spec);
	snd_array_free(&spec->paths);
	snd_array_free(&spec->loopback_list);
}
EXPORT_SYMBOL_HDA(snd_hda_gen_spec_free);

@@ -2484,18 +2486,18 @@ static int create_in_jack_mode(struct hda_codec *codec, hda_nid_t pin)
 */

/* add the powersave loopback-list entry */
static void add_loopback_list(struct hda_gen_spec *spec, hda_nid_t mix, int idx)
static int add_loopback_list(struct hda_gen_spec *spec, hda_nid_t mix, int idx)
{
	struct hda_amp_list *list;

	if (spec->num_loopbacks >= ARRAY_SIZE(spec->loopback_list) - 1)
		return;
	list = spec->loopback_list + spec->num_loopbacks;
	list = snd_array_new(&spec->loopback_list);
	if (!list)
		return -ENOMEM;
	list->nid = mix;
	list->dir = HDA_INPUT;
	list->idx = idx;
	spec->num_loopbacks++;
	spec->loopback.amplist = spec->loopback_list;
	spec->loopback.amplist = spec->loopback_list.list;
	return 0;
}

/* create input playback/capture controls for the given pin */
@@ -2536,7 +2538,9 @@ static int new_analog_input(struct hda_codec *codec, int input_idx,
	}

	path->active = true;
	add_loopback_list(spec, mix_nid, idx);
	err = add_loopback_list(spec, mix_nid, idx);
	if (err < 0)
		return err;

	if (spec->mixer_nid != spec->mixer_merge_nid &&
	    !spec->loopback_merge_path) {
+1 −2
Original line number Diff line number Diff line
@@ -228,8 +228,7 @@ struct hda_gen_spec {
	struct hda_vmaster_mute_hook vmaster_mute;

	struct hda_loopback_check loopback;
	int num_loopbacks;
	struct hda_amp_list loopback_list[8];
	struct snd_array loopback_list;

	/* multi-io */
	int multi_ios;
+5 −3
Original line number Diff line number Diff line
@@ -355,10 +355,12 @@ static bool is_aa_path_mute(struct hda_codec *codec)
{
	struct via_spec *spec = codec->spec;
	const struct hda_amp_list *p;
	int i, ch, v;
	int ch, v;

	for (i = 0; i < spec->gen.num_loopbacks; i++) {
		p = &spec->gen.loopback_list[i];
	p = spec->gen.loopback.amplist;
	if (!p)
		return true;
	for (; p->nid; p++) {
		for (ch = 0; ch < 2; ch++) {
			v = snd_hda_codec_amp_read(codec, p->nid, ch, p->dir,
						   p->idx);