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

ALSA: hda - Use generic array for loopback list management

Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 46a14481
...@@ -42,6 +42,7 @@ int snd_hda_gen_spec_init(struct hda_gen_spec *spec) ...@@ -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->kctls, sizeof(struct snd_kcontrol_new), 32);
snd_array_init(&spec->paths, sizeof(struct nid_path), 8); 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); mutex_init(&spec->pcm_mutex);
return 0; return 0;
} }
...@@ -82,6 +83,7 @@ void snd_hda_gen_spec_free(struct hda_gen_spec *spec) ...@@ -82,6 +83,7 @@ void snd_hda_gen_spec_free(struct hda_gen_spec *spec)
return; return;
free_kctls(spec); free_kctls(spec);
snd_array_free(&spec->paths); snd_array_free(&spec->paths);
snd_array_free(&spec->loopback_list);
} }
EXPORT_SYMBOL_HDA(snd_hda_gen_spec_free); 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) ...@@ -2484,18 +2486,18 @@ static int create_in_jack_mode(struct hda_codec *codec, hda_nid_t pin)
*/ */
/* add the powersave loopback-list entry */ /* 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; struct hda_amp_list *list;
if (spec->num_loopbacks >= ARRAY_SIZE(spec->loopback_list) - 1) list = snd_array_new(&spec->loopback_list);
return; if (!list)
list = spec->loopback_list + spec->num_loopbacks; return -ENOMEM;
list->nid = mix; list->nid = mix;
list->dir = HDA_INPUT; list->dir = HDA_INPUT;
list->idx = idx; list->idx = idx;
spec->num_loopbacks++; spec->loopback.amplist = spec->loopback_list.list;
spec->loopback.amplist = spec->loopback_list; return 0;
} }
/* create input playback/capture controls for the given pin */ /* 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, ...@@ -2536,7 +2538,9 @@ static int new_analog_input(struct hda_codec *codec, int input_idx,
} }
path->active = true; 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 && if (spec->mixer_nid != spec->mixer_merge_nid &&
!spec->loopback_merge_path) { !spec->loopback_merge_path) {
......
...@@ -228,8 +228,7 @@ struct hda_gen_spec { ...@@ -228,8 +228,7 @@ struct hda_gen_spec {
struct hda_vmaster_mute_hook vmaster_mute; struct hda_vmaster_mute_hook vmaster_mute;
struct hda_loopback_check loopback; struct hda_loopback_check loopback;
int num_loopbacks; struct snd_array loopback_list;
struct hda_amp_list loopback_list[8];
/* multi-io */ /* multi-io */
int multi_ios; int multi_ios;
......
...@@ -355,10 +355,12 @@ static bool is_aa_path_mute(struct hda_codec *codec) ...@@ -355,10 +355,12 @@ static bool is_aa_path_mute(struct hda_codec *codec)
{ {
struct via_spec *spec = codec->spec; struct via_spec *spec = codec->spec;
const struct hda_amp_list *p; 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.amplist;
p = &spec->gen.loopback_list[i]; if (!p)
return true;
for (; p->nid; p++) {
for (ch = 0; ch < 2; ch++) { for (ch = 0; ch < 2; ch++) {
v = snd_hda_codec_amp_read(codec, p->nid, ch, p->dir, v = snd_hda_codec_amp_read(codec, p->nid, ch, p->dir,
p->idx); p->idx);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment