Commit 9eb413e5 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda - Move the call of snd_hda_parse_pin_defcfg() from snd_hda_gen_parse_auto_config()

In some cases, we want to manipulate the auto_pin_cfg table before
passing to snd_hda_gen_parse_auto_config() (e.g. Realtek SSID check
code fiddles with the headphone pin).   Also passing ignore_pins just
for snd_hda_parse_pin_defcfg() isn't good.

In this patch, snd_hda_gen_parse_auto_config() is changed to receive
the auto_pin_cfg table to be parsed.  The passed auto_pin_cfg table
must have been initialized (typically by calling
snd_hda_gen_parse_auto_config()) beforehand by the caller.

Also together with this change, spec->parse_flags is also removed.
Since this was referred only at the place calling
snd_hda_parse_pin_defcfg(), no longer needed to be kept in spec.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 12c93df6
...@@ -2785,21 +2785,23 @@ static int check_auto_mic_availability(struct hda_codec *codec) ...@@ -2785,21 +2785,23 @@ static int check_auto_mic_availability(struct hda_codec *codec)
} }
/* parse the BIOS configuration and set up the hda_gen_spec */ /*
/* return 1 if successful, 0 if the proper config is not found, * Parse the given BIOS configuration and set up the hda_gen_spec
*
* return 1 if successful, 0 if the proper config is not found,
* or a negative error code * or a negative error code
*/ */
int snd_hda_gen_parse_auto_config(struct hda_codec *codec, int snd_hda_gen_parse_auto_config(struct hda_codec *codec,
const hda_nid_t *ignore_nids) struct auto_pin_cfg *cfg)
{ {
struct hda_gen_spec *spec = codec->spec; struct hda_gen_spec *spec = codec->spec;
struct auto_pin_cfg *cfg = &spec->autocfg;
int err; int err;
err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids, if (cfg != &spec->autocfg) {
spec->parse_flags); spec->autocfg = *cfg;
if (err < 0) cfg = &spec->autocfg;
return err; }
if (!cfg->line_outs) { if (!cfg->line_outs) {
if (cfg->dig_outs || cfg->dig_in_pin) { if (cfg->dig_outs || cfg->dig_in_pin) {
spec->multiout.max_channels = 2; spec->multiout.max_channels = 2;
...@@ -3586,7 +3588,11 @@ int snd_hda_parse_generic_codec(struct hda_codec *codec) ...@@ -3586,7 +3588,11 @@ int snd_hda_parse_generic_codec(struct hda_codec *codec)
snd_hda_gen_spec_init(spec); snd_hda_gen_spec_init(spec);
codec->spec = spec; codec->spec = spec;
err = snd_hda_gen_parse_auto_config(codec, NULL); err = snd_hda_parse_pin_defcfg(codec, &spec->autocfg, NULL, 0);
if (err < 0)
return err;
err = snd_hda_gen_parse_auto_config(codec, &spec->autocfg);
if (err < 0) if (err < 0)
goto error; goto error;
......
...@@ -152,8 +152,6 @@ struct hda_gen_spec { ...@@ -152,8 +152,6 @@ struct hda_gen_spec {
unsigned int inv_dmic_split:1; /* inverted dmic w/a for conexant */ unsigned int inv_dmic_split:1; /* inverted dmic w/a for conexant */
unsigned int own_eapd_ctl:1; /* set EAPD by own function */ unsigned int own_eapd_ctl:1; /* set EAPD by own function */
unsigned int parse_flags; /* passed to snd_hda_parse_pin_defcfg() */
/* for virtual master */ /* for virtual master */
hda_nid_t vmaster_nid; hda_nid_t vmaster_nid;
struct hda_vmaster_mute_hook vmaster_mute; struct hda_vmaster_mute_hook vmaster_mute;
...@@ -197,7 +195,7 @@ snd_hda_gen_add_kctl(struct hda_gen_spec *spec, const char *name, ...@@ -197,7 +195,7 @@ snd_hda_gen_add_kctl(struct hda_gen_spec *spec, const char *name,
const struct snd_kcontrol_new *temp); const struct snd_kcontrol_new *temp);
int snd_hda_gen_parse_auto_config(struct hda_codec *codec, int snd_hda_gen_parse_auto_config(struct hda_codec *codec,
const hda_nid_t *ignore_nids); struct auto_pin_cfg *cfg);
int snd_hda_gen_build_controls(struct hda_codec *codec); int snd_hda_gen_build_controls(struct hda_codec *codec);
int snd_hda_gen_build_pcms(struct hda_codec *codec); int snd_hda_gen_build_pcms(struct hda_codec *codec);
......
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