Updated from Linux LTS 3.10.24 to 3.10.25
This commit is contained in:
@@ -469,6 +469,20 @@ static void invalidate_nid_path(struct hda_codec *codec, int idx)
|
||||
memset(path, 0, sizeof(*path));
|
||||
}
|
||||
|
||||
/* return a DAC if paired to the given pin by codec driver */
|
||||
static hda_nid_t get_preferred_dac(struct hda_codec *codec, hda_nid_t pin)
|
||||
{
|
||||
struct hda_gen_spec *spec = codec->spec;
|
||||
const hda_nid_t *list = spec->preferred_dacs;
|
||||
|
||||
if (!list)
|
||||
return 0;
|
||||
for (; *list; list += 2)
|
||||
if (*list == pin)
|
||||
return list[1];
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* look for an empty DAC slot */
|
||||
static hda_nid_t look_for_dac(struct hda_codec *codec, hda_nid_t pin,
|
||||
bool is_digital)
|
||||
@@ -1135,7 +1149,14 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs,
|
||||
continue;
|
||||
}
|
||||
|
||||
dacs[i] = look_for_dac(codec, pin, false);
|
||||
dacs[i] = get_preferred_dac(codec, pin);
|
||||
if (dacs[i]) {
|
||||
if (is_dac_already_used(codec, dacs[i]))
|
||||
badness += bad->shared_primary;
|
||||
}
|
||||
|
||||
if (!dacs[i])
|
||||
dacs[i] = look_for_dac(codec, pin, false);
|
||||
if (!dacs[i] && !i) {
|
||||
/* try to steal the DAC of surrounds for the front */
|
||||
for (j = 1; j < num_outs; j++) {
|
||||
@@ -4284,6 +4305,26 @@ static unsigned int snd_hda_gen_path_power_filter(struct hda_codec *codec,
|
||||
return AC_PWRST_D3;
|
||||
}
|
||||
|
||||
/* mute all aamix inputs initially; parse up to the first leaves */
|
||||
static void mute_all_mixer_nid(struct hda_codec *codec, hda_nid_t mix)
|
||||
{
|
||||
int i, nums;
|
||||
const hda_nid_t *conn;
|
||||
bool has_amp;
|
||||
|
||||
nums = snd_hda_get_conn_list(codec, mix, &conn);
|
||||
has_amp = nid_has_mute(codec, mix, HDA_INPUT);
|
||||
for (i = 0; i < nums; i++) {
|
||||
if (has_amp)
|
||||
snd_hda_codec_amp_stereo(codec, mix,
|
||||
HDA_INPUT, i,
|
||||
0xff, HDA_AMP_MUTE);
|
||||
else if (nid_has_volume(codec, conn[i], HDA_OUTPUT))
|
||||
snd_hda_codec_amp_stereo(codec, conn[i],
|
||||
HDA_OUTPUT, 0,
|
||||
0xff, HDA_AMP_MUTE);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse the given BIOS configuration and set up the hda_gen_spec
|
||||
@@ -4422,6 +4463,10 @@ int snd_hda_gen_parse_auto_config(struct hda_codec *codec,
|
||||
}
|
||||
}
|
||||
|
||||
/* mute all aamix input initially */
|
||||
if (spec->mixer_nid)
|
||||
mute_all_mixer_nid(codec, spec->mixer_nid);
|
||||
|
||||
dig_only:
|
||||
parse_digital(codec);
|
||||
|
||||
|
||||
@@ -241,6 +241,9 @@ struct hda_gen_spec {
|
||||
const struct badness_table *main_out_badness;
|
||||
const struct badness_table *extra_out_badness;
|
||||
|
||||
/* preferred pin/DAC pairs; an array of paired NIDs */
|
||||
const hda_nid_t *preferred_dacs;
|
||||
|
||||
/* loopback mixing mode */
|
||||
bool aamix_mode;
|
||||
|
||||
|
||||
@@ -1227,6 +1227,14 @@ static int ad1986a_parse_auto_config(struct hda_codec *codec)
|
||||
{
|
||||
int err;
|
||||
struct ad198x_spec *spec;
|
||||
static hda_nid_t preferred_pairs[] = {
|
||||
0x1a, 0x03,
|
||||
0x1b, 0x03,
|
||||
0x1c, 0x04,
|
||||
0x1d, 0x05,
|
||||
0x1e, 0x03,
|
||||
0
|
||||
};
|
||||
|
||||
err = alloc_ad_spec(codec);
|
||||
if (err < 0)
|
||||
@@ -1247,6 +1255,8 @@ static int ad1986a_parse_auto_config(struct hda_codec *codec)
|
||||
* So, let's disable the shared stream.
|
||||
*/
|
||||
spec->gen.multiout.no_share_stream = 1;
|
||||
/* give fixed DAC/pin pairs */
|
||||
spec->gen.preferred_dacs = preferred_pairs;
|
||||
|
||||
snd_hda_pick_fixup(codec, NULL, ad1986a_fixup_tbl, ad1986a_fixups);
|
||||
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
|
||||
|
||||
@@ -2209,8 +2209,9 @@ static int simple_playback_build_controls(struct hda_codec *codec)
|
||||
int err;
|
||||
|
||||
per_cvt = get_cvt(spec, 0);
|
||||
err = snd_hda_create_spdif_out_ctls(codec, per_cvt->cvt_nid,
|
||||
per_cvt->cvt_nid);
|
||||
err = snd_hda_create_dig_out_ctls(codec, per_cvt->cvt_nid,
|
||||
per_cvt->cvt_nid,
|
||||
HDA_PCM_TYPE_HDMI);
|
||||
if (err < 0)
|
||||
return err;
|
||||
return simple_hdmi_build_jack(codec, 0);
|
||||
|
||||
Reference in New Issue
Block a user