|
@@ -692,7 +692,23 @@ static void init_amp(struct hda_codec *codec, hda_nid_t nid, int dir, int idx)
|
|
{
|
|
{
|
|
unsigned int caps = query_amp_caps(codec, nid, dir);
|
|
unsigned int caps = query_amp_caps(codec, nid, dir);
|
|
int val = get_amp_val_to_activate(codec, nid, dir, caps, false);
|
|
int val = get_amp_val_to_activate(codec, nid, dir, caps, false);
|
|
- snd_hda_codec_amp_init_stereo(codec, nid, dir, idx, 0xff, val);
|
|
|
|
|
|
+
|
|
|
|
+ if (get_wcaps(codec, nid) & AC_WCAP_STEREO)
|
|
|
|
+ snd_hda_codec_amp_init_stereo(codec, nid, dir, idx, 0xff, val);
|
|
|
|
+ else
|
|
|
|
+ snd_hda_codec_amp_init(codec, nid, 0, dir, idx, 0xff, val);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* update the amp, doing in stereo or mono depending on NID */
|
|
|
|
+static int update_amp(struct hda_codec *codec, hda_nid_t nid, int dir, int idx,
|
|
|
|
+ unsigned int mask, unsigned int val)
|
|
|
|
+{
|
|
|
|
+ if (get_wcaps(codec, nid) & AC_WCAP_STEREO)
|
|
|
|
+ return snd_hda_codec_amp_stereo(codec, nid, dir, idx,
|
|
|
|
+ mask, val);
|
|
|
|
+ else
|
|
|
|
+ return snd_hda_codec_amp_update(codec, nid, 0, dir, idx,
|
|
|
|
+ mask, val);
|
|
}
|
|
}
|
|
|
|
|
|
/* calculate amp value mask we can modify;
|
|
/* calculate amp value mask we can modify;
|
|
@@ -732,7 +748,7 @@ static void activate_amp(struct hda_codec *codec, hda_nid_t nid, int dir,
|
|
return;
|
|
return;
|
|
|
|
|
|
val &= mask;
|
|
val &= mask;
|
|
- snd_hda_codec_amp_stereo(codec, nid, dir, idx, mask, val);
|
|
|
|
|
|
+ update_amp(codec, nid, dir, idx, mask, val);
|
|
}
|
|
}
|
|
|
|
|
|
static void activate_amp_out(struct hda_codec *codec, struct nid_path *path,
|
|
static void activate_amp_out(struct hda_codec *codec, struct nid_path *path,
|
|
@@ -4424,13 +4440,11 @@ static void mute_all_mixer_nid(struct hda_codec *codec, hda_nid_t mix)
|
|
has_amp = nid_has_mute(codec, mix, HDA_INPUT);
|
|
has_amp = nid_has_mute(codec, mix, HDA_INPUT);
|
|
for (i = 0; i < nums; i++) {
|
|
for (i = 0; i < nums; i++) {
|
|
if (has_amp)
|
|
if (has_amp)
|
|
- snd_hda_codec_amp_stereo(codec, mix,
|
|
|
|
- HDA_INPUT, i,
|
|
|
|
- 0xff, HDA_AMP_MUTE);
|
|
|
|
|
|
+ update_amp(codec, mix, HDA_INPUT, i,
|
|
|
|
+ 0xff, HDA_AMP_MUTE);
|
|
else if (nid_has_volume(codec, conn[i], HDA_OUTPUT))
|
|
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);
|
|
|
|
|
|
+ update_amp(codec, conn[i], HDA_OUTPUT, 0,
|
|
|
|
+ 0xff, HDA_AMP_MUTE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|