Commit 6a05ac4a authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda - Support multiple digital outs with auto-probing

Added the support of multiple digital outputs via auto-probing for
Realtek ALC88x codecs.  The multiple outputs are handled as slave
streams, so only one PCM stream (and the corresponding IEC958*
elements) is provided to control both digital outputs.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 9b5f12e5
...@@ -279,6 +279,7 @@ struct alc_spec { ...@@ -279,6 +279,7 @@ struct alc_spec {
* dig_out_nid and hp_nid are optional * dig_out_nid and hp_nid are optional
*/ */
hda_nid_t alt_dac_nid; hda_nid_t alt_dac_nid;
hda_nid_t slave_dig_outs[3]; /* optional - for auto-parsing */
int dig_out_type; int dig_out_type;
/* capture */ /* capture */
...@@ -4269,7 +4270,7 @@ static void alc880_auto_init_analog_input(struct hda_codec *codec) ...@@ -4269,7 +4270,7 @@ static void alc880_auto_init_analog_input(struct hda_codec *codec)
static int alc880_parse_auto_config(struct hda_codec *codec) static int alc880_parse_auto_config(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; struct alc_spec *spec = codec->spec;
int err; int i, err;
static hda_nid_t alc880_ignore[] = { 0x1d, 0 }; static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
...@@ -4300,8 +4301,23 @@ static int alc880_parse_auto_config(struct hda_codec *codec) ...@@ -4300,8 +4301,23 @@ static int alc880_parse_auto_config(struct hda_codec *codec)
spec->multiout.max_channels = spec->multiout.num_dacs * 2; spec->multiout.max_channels = spec->multiout.num_dacs * 2;
if (spec->autocfg.dig_outs) /* check multiple SPDIF-out (for recent codecs) */
spec->multiout.dig_out_nid = ALC880_DIGOUT_NID; for (i = 0; i < spec->autocfg.dig_outs; i++) {
hda_nid_t dig_nid;
err = snd_hda_get_connections(codec,
spec->autocfg.dig_out_pins[i],
&dig_nid, 1);
if (err < 0)
continue;
if (!i)
spec->multiout.dig_out_nid = dig_nid;
else {
spec->multiout.slave_dig_outs = spec->slave_dig_outs;
spec->slave_dig_outs[i - 1] = dig_nid;
if (i == ARRAY_SIZE(spec->slave_dig_outs) - 1)
break;
}
}
if (spec->autocfg.dig_in_pin) if (spec->autocfg.dig_in_pin)
spec->dig_in_nid = ALC880_DIGIN_NID; spec->dig_in_nid = ALC880_DIGIN_NID;
......
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