Commit 2ba0176c authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda/analog - Minor optimization for SPDIF mux connections

AD HD-audio codec driver has a few code lines invoking
snd_get_num_conns() and using its return value as the array index
without checking.  This is basically safe in all those places; at the
second and later calls snd_get_num_conns() returns the value cached
from the first invocation, hence the value is always consistent.

However, it looks a bit confusing as if a lack of the proper check.
This patch introduces a new field num_smux_conns in ad198x_spec for
simplifying the code.  Now we store and refer to the value more
locally without invoking the extra function at each time.
Reported-by: default avatarColin King <colin.king@canonical.com>
Link: https://lore.kernel.org/r/20200115100035.22511-1-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent c2491779
...@@ -28,6 +28,7 @@ struct ad198x_spec { ...@@ -28,6 +28,7 @@ struct ad198x_spec {
hda_nid_t eapd_nid; hda_nid_t eapd_nid;
unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */ unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */
int num_smux_conns;
}; };
...@@ -453,8 +454,7 @@ static int ad1983_auto_smux_enum_info(struct snd_kcontrol *kcontrol, ...@@ -453,8 +454,7 @@ static int ad1983_auto_smux_enum_info(struct snd_kcontrol *kcontrol,
struct ad198x_spec *spec = codec->spec; struct ad198x_spec *spec = codec->spec;
static const char * const texts2[] = { "PCM", "ADC" }; static const char * const texts2[] = { "PCM", "ADC" };
static const char * const texts3[] = { "PCM", "ADC1", "ADC2" }; static const char * const texts3[] = { "PCM", "ADC1", "ADC2" };
hda_nid_t dig_out = spec->gen.multiout.dig_out_nid; int num_conns = spec->num_smux_conns;
int num_conns = snd_hda_get_num_conns(codec, dig_out);
if (num_conns == 2) if (num_conns == 2)
return snd_hda_enum_helper_info(kcontrol, uinfo, 2, texts2); return snd_hda_enum_helper_info(kcontrol, uinfo, 2, texts2);
...@@ -481,7 +481,7 @@ static int ad1983_auto_smux_enum_put(struct snd_kcontrol *kcontrol, ...@@ -481,7 +481,7 @@ static int ad1983_auto_smux_enum_put(struct snd_kcontrol *kcontrol,
struct ad198x_spec *spec = codec->spec; struct ad198x_spec *spec = codec->spec;
unsigned int val = ucontrol->value.enumerated.item[0]; unsigned int val = ucontrol->value.enumerated.item[0];
hda_nid_t dig_out = spec->gen.multiout.dig_out_nid; hda_nid_t dig_out = spec->gen.multiout.dig_out_nid;
int num_conns = snd_hda_get_num_conns(codec, dig_out); int num_conns = spec->num_smux_conns;
if (val >= num_conns) if (val >= num_conns)
return -EINVAL; return -EINVAL;
...@@ -512,6 +512,7 @@ static int ad1983_add_spdif_mux_ctl(struct hda_codec *codec) ...@@ -512,6 +512,7 @@ static int ad1983_add_spdif_mux_ctl(struct hda_codec *codec)
num_conns = snd_hda_get_num_conns(codec, dig_out); num_conns = snd_hda_get_num_conns(codec, dig_out);
if (num_conns != 2 && num_conns != 3) if (num_conns != 2 && num_conns != 3)
return 0; return 0;
spec->num_smux_conns = num_conns;
if (!snd_hda_gen_add_kctl(&spec->gen, NULL, &ad1983_auto_smux_mixer)) if (!snd_hda_gen_add_kctl(&spec->gen, NULL, &ad1983_auto_smux_mixer))
return -ENOMEM; return -ENOMEM;
return 0; return 0;
...@@ -730,10 +731,12 @@ static int ad1988_auto_smux_enum_info(struct snd_kcontrol *kcontrol, ...@@ -730,10 +731,12 @@ static int ad1988_auto_smux_enum_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo) struct snd_ctl_elem_info *uinfo)
{ {
struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
struct ad198x_spec *spec = codec->spec;
static const char * const texts[] = { static const char * const texts[] = {
"PCM", "ADC1", "ADC2", "ADC3", "PCM", "ADC1", "ADC2", "ADC3",
}; };
int num_conns = snd_hda_get_num_conns(codec, 0x0b) + 1; int num_conns = spec->num_smux_conns;
if (num_conns > 4) if (num_conns > 4)
num_conns = 4; num_conns = 4;
return snd_hda_enum_helper_info(kcontrol, uinfo, num_conns, texts); return snd_hda_enum_helper_info(kcontrol, uinfo, num_conns, texts);
...@@ -756,7 +759,7 @@ static int ad1988_auto_smux_enum_put(struct snd_kcontrol *kcontrol, ...@@ -756,7 +759,7 @@ static int ad1988_auto_smux_enum_put(struct snd_kcontrol *kcontrol,
struct ad198x_spec *spec = codec->spec; struct ad198x_spec *spec = codec->spec;
unsigned int val = ucontrol->value.enumerated.item[0]; unsigned int val = ucontrol->value.enumerated.item[0];
struct nid_path *path; struct nid_path *path;
int num_conns = snd_hda_get_num_conns(codec, 0x0b) + 1; int num_conns = spec->num_smux_conns;
if (val >= num_conns) if (val >= num_conns)
return -EINVAL; return -EINVAL;
...@@ -847,6 +850,7 @@ static int ad1988_add_spdif_mux_ctl(struct hda_codec *codec) ...@@ -847,6 +850,7 @@ static int ad1988_add_spdif_mux_ctl(struct hda_codec *codec)
num_conns = snd_hda_get_num_conns(codec, 0x0b) + 1; num_conns = snd_hda_get_num_conns(codec, 0x0b) + 1;
if (num_conns != 3 && num_conns != 4) if (num_conns != 3 && num_conns != 4)
return 0; return 0;
spec->num_smux_conns = num_conns;
for (i = 0; i < num_conns; i++) { for (i = 0; i < num_conns; i++) {
struct nid_path *path = snd_array_new(&spec->gen.paths); struct nid_path *path = snd_array_new(&spec->gen.paths);
......
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