|
@@ -262,6 +262,9 @@ struct alc_spec {
|
|
unsigned int sense_updated: 1;
|
|
unsigned int sense_updated: 1;
|
|
unsigned int jack_present: 1;
|
|
unsigned int jack_present: 1;
|
|
|
|
|
|
|
|
+ /* for virtual master */
|
|
|
|
+ hda_nid_t vmaster_nid;
|
|
|
|
+ u32 vmaster_tlv[4];
|
|
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
|
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
|
struct hda_loopback_check loopback;
|
|
struct hda_loopback_check loopback;
|
|
#endif
|
|
#endif
|
|
@@ -1309,8 +1312,8 @@ static hda_nid_t alc880_f1734_dac_nids[1] = {
|
|
static struct snd_kcontrol_new alc880_f1734_mixer[] = {
|
|
static struct snd_kcontrol_new alc880_f1734_mixer[] = {
|
|
HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
|
|
HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
|
|
HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
|
|
HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
|
|
- HDA_CODEC_VOLUME("Internal Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
|
|
|
|
- HDA_BIND_MUTE("Internal Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
|
|
|
|
|
|
+ HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
|
|
|
|
+ HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
|
|
HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
|
|
HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
|
|
HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
|
|
HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
|
|
HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
|
|
HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
|
|
@@ -1408,10 +1411,10 @@ static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
|
|
|
|
|
|
/* Uniwill */
|
|
/* Uniwill */
|
|
static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
|
|
static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
|
|
- HDA_CODEC_VOLUME("HPhone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
|
|
|
|
- HDA_BIND_MUTE("HPhone Playback Switch", 0x0c, 2, HDA_INPUT),
|
|
|
|
- HDA_CODEC_VOLUME("iSpeaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
|
|
|
|
- HDA_BIND_MUTE("iSpeaker Playback Switch", 0x0d, 2, HDA_INPUT),
|
|
|
|
|
|
+ HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
|
|
|
|
+ HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
|
|
|
|
+ HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
|
|
|
|
+ HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
|
|
HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
|
|
HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
|
|
HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
|
|
HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
|
|
HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
|
|
HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
|
|
@@ -1451,15 +1454,49 @@ static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
|
|
};
|
|
};
|
|
|
|
|
|
static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
|
|
static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
|
|
- HDA_CODEC_VOLUME("HPhone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
|
|
|
|
- HDA_BIND_MUTE("HPhone Playback Switch", 0x0c, 2, HDA_INPUT),
|
|
|
|
- HDA_CODEC_VOLUME("iSpeaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
|
|
|
|
- HDA_BIND_MUTE("iSpeaker Playback Switch", 0x0d, 2, HDA_INPUT),
|
|
|
|
|
|
+ HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
|
|
|
|
+ HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
|
|
|
|
+ HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
|
|
|
|
+ HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
|
|
HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
|
|
HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
|
|
HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
|
|
HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
|
|
{ } /* end */
|
|
{ } /* end */
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * virtual master controls
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * slave controls for virtual master
|
|
|
|
+ */
|
|
|
|
+static const char *alc_slave_vols[] = {
|
|
|
|
+ "Front Playback Volume",
|
|
|
|
+ "Surround Playback Volume",
|
|
|
|
+ "Center Playback Volume",
|
|
|
|
+ "LFE Playback Volume",
|
|
|
|
+ "Side Playback Volume",
|
|
|
|
+ "Headphone Playback Volume",
|
|
|
|
+ "Speaker Playback Volume",
|
|
|
|
+ "Mono Playback Volume",
|
|
|
|
+ "iSpeaker Playback Volume",
|
|
|
|
+ "Line-Out Playback Volume",
|
|
|
|
+ NULL,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static const char *alc_slave_sws[] = {
|
|
|
|
+ "Front Playback Switch",
|
|
|
|
+ "Surround Playback Switch",
|
|
|
|
+ "Center Playback Switch",
|
|
|
|
+ "LFE Playback Switch",
|
|
|
|
+ "Side Playback Switch",
|
|
|
|
+ "Headphone Playback Switch",
|
|
|
|
+ "Speaker Playback Switch",
|
|
|
|
+ "Mono Playback Switch",
|
|
|
|
+ "iSpeaker Playback Switch",
|
|
|
|
+ NULL,
|
|
|
|
+};
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* build control elements
|
|
* build control elements
|
|
*/
|
|
*/
|
|
@@ -1486,6 +1523,23 @@ static int alc_build_controls(struct hda_codec *codec)
|
|
if (err < 0)
|
|
if (err < 0)
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /* if we have no master control, let's create it */
|
|
|
|
+ if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
|
|
|
|
+ snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
|
|
|
|
+ HDA_OUTPUT, spec->vmaster_tlv);
|
|
|
|
+ err = snd_hda_add_vmaster(codec, "Master Playback Volume",
|
|
|
|
+ spec->vmaster_tlv, alc_slave_vols);
|
|
|
|
+ if (err < 0)
|
|
|
|
+ return err;
|
|
|
|
+ }
|
|
|
|
+ if (!snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
|
|
|
|
+ err = snd_hda_add_vmaster(codec, "Master Playback Switch",
|
|
|
|
+ NULL, alc_slave_sws);
|
|
|
|
+ if (err < 0)
|
|
|
|
+ return err;
|
|
|
|
+ }
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2034,8 +2088,8 @@ static struct hda_channel_mode alc880_lg_ch_modes[3] = {
|
|
|
|
|
|
static struct snd_kcontrol_new alc880_lg_mixer[] = {
|
|
static struct snd_kcontrol_new alc880_lg_mixer[] = {
|
|
/* FIXME: it's not really "master" but front channels */
|
|
/* FIXME: it's not really "master" but front channels */
|
|
- HDA_CODEC_VOLUME("Master Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
|
|
|
|
- HDA_BIND_MUTE("Master Playback Switch", 0x0f, 2, HDA_INPUT),
|
|
|
|
|
|
+ HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
|
|
|
|
+ HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
|
|
HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
|
|
HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
|
|
HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
|
|
HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
|
|
HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
|
|
HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
|
|
@@ -3592,6 +3646,8 @@ static int patch_alc880(struct hda_codec *codec)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ spec->vmaster_nid = 0x0c;
|
|
|
|
+
|
|
codec->patch_ops = alc_patch_ops;
|
|
codec->patch_ops = alc_patch_ops;
|
|
if (board_config == ALC880_AUTO)
|
|
if (board_config == ALC880_AUTO)
|
|
spec->init_hook = alc880_auto_init;
|
|
spec->init_hook = alc880_auto_init;
|
|
@@ -4969,6 +5025,8 @@ static int patch_alc260(struct hda_codec *codec)
|
|
spec->stream_digital_playback = &alc260_pcm_digital_playback;
|
|
spec->stream_digital_playback = &alc260_pcm_digital_playback;
|
|
spec->stream_digital_capture = &alc260_pcm_digital_capture;
|
|
spec->stream_digital_capture = &alc260_pcm_digital_capture;
|
|
|
|
|
|
|
|
+ spec->vmaster_nid = 0x08;
|
|
|
|
+
|
|
codec->patch_ops = alc_patch_ops;
|
|
codec->patch_ops = alc_patch_ops;
|
|
if (board_config == ALC260_AUTO)
|
|
if (board_config == ALC260_AUTO)
|
|
spec->init_hook = alc260_auto_init;
|
|
spec->init_hook = alc260_auto_init;
|
|
@@ -5169,15 +5227,15 @@ static struct snd_kcontrol_new alc882_base_mixer[] = {
|
|
};
|
|
};
|
|
|
|
|
|
static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
|
|
static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
|
|
- HDA_CODEC_VOLUME("Master Volume", 0x0c, 0x00, HDA_OUTPUT),
|
|
|
|
- HDA_BIND_MUTE ("Master Switch", 0x0c, 0x02, HDA_INPUT),
|
|
|
|
- HDA_CODEC_MUTE ("Speaker Switch", 0x14, 0x00, HDA_OUTPUT),
|
|
|
|
- HDA_CODEC_VOLUME("Line Out Volume", 0x0d,0x00, HDA_OUTPUT),
|
|
|
|
- HDA_CODEC_VOLUME("Line In Playback Volume", 0x0b, 0x02, HDA_INPUT),
|
|
|
|
- HDA_CODEC_MUTE ("Line In Playback Switch", 0x0b, 0x02, HDA_INPUT),
|
|
|
|
|
|
+ HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
|
|
|
|
+ HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
|
|
|
|
+ HDA_CODEC_MUTE ("Speaker Playback Switch", 0x14, 0x00, HDA_OUTPUT),
|
|
|
|
+ HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
|
|
|
|
+ HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
|
|
|
|
+ HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
|
|
HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
|
|
HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
|
|
HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
|
|
HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
|
|
- HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0x00, HDA_INPUT),
|
|
|
|
|
|
+ HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
|
|
HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
|
|
HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
|
|
{ } /* end */
|
|
{ } /* end */
|
|
};
|
|
};
|
|
@@ -6181,6 +6239,8 @@ static int patch_alc882(struct hda_codec *codec)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ spec->vmaster_nid = 0x0c;
|
|
|
|
+
|
|
codec->patch_ops = alc_patch_ops;
|
|
codec->patch_ops = alc_patch_ops;
|
|
if (board_config == ALC882_AUTO)
|
|
if (board_config == ALC882_AUTO)
|
|
spec->init_hook = alc882_auto_init;
|
|
spec->init_hook = alc882_auto_init;
|
|
@@ -7763,6 +7823,8 @@ static int patch_alc883(struct hda_codec *codec)
|
|
spec->num_adc_nids = ARRAY_SIZE(alc883_adc_nids);
|
|
spec->num_adc_nids = ARRAY_SIZE(alc883_adc_nids);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ spec->vmaster_nid = 0x0c;
|
|
|
|
+
|
|
codec->patch_ops = alc_patch_ops;
|
|
codec->patch_ops = alc_patch_ops;
|
|
if (board_config == ALC883_AUTO)
|
|
if (board_config == ALC883_AUTO)
|
|
spec->init_hook = alc883_auto_init;
|
|
spec->init_hook = alc883_auto_init;
|
|
@@ -9123,6 +9185,8 @@ static int patch_alc262(struct hda_codec *codec)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ spec->vmaster_nid = 0x0c;
|
|
|
|
+
|
|
codec->patch_ops = alc_patch_ops;
|
|
codec->patch_ops = alc_patch_ops;
|
|
if (board_config == ALC262_AUTO)
|
|
if (board_config == ALC262_AUTO)
|
|
spec->init_hook = alc262_auto_init;
|
|
spec->init_hook = alc262_auto_init;
|
|
@@ -9848,6 +9912,9 @@ static int patch_alc268(struct hda_codec *codec)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ spec->vmaster_nid = 0x02;
|
|
|
|
+
|
|
codec->patch_ops = alc_patch_ops;
|
|
codec->patch_ops = alc_patch_ops;
|
|
if (board_config == ALC268_AUTO)
|
|
if (board_config == ALC268_AUTO)
|
|
spec->init_hook = alc268_auto_init;
|
|
spec->init_hook = alc268_auto_init;
|
|
@@ -11358,6 +11425,8 @@ static int patch_alc861(struct hda_codec *codec)
|
|
spec->stream_digital_playback = &alc861_pcm_digital_playback;
|
|
spec->stream_digital_playback = &alc861_pcm_digital_playback;
|
|
spec->stream_digital_capture = &alc861_pcm_digital_capture;
|
|
spec->stream_digital_capture = &alc861_pcm_digital_capture;
|
|
|
|
|
|
|
|
+ spec->vmaster_nid = 0x03;
|
|
|
|
+
|
|
codec->patch_ops = alc_patch_ops;
|
|
codec->patch_ops = alc_patch_ops;
|
|
if (board_config == ALC861_AUTO)
|
|
if (board_config == ALC861_AUTO)
|
|
spec->init_hook = alc861_auto_init;
|
|
spec->init_hook = alc861_auto_init;
|
|
@@ -12334,6 +12403,8 @@ static int patch_alc861vd(struct hda_codec *codec)
|
|
spec->mixers[spec->num_mixers] = alc861vd_capture_mixer;
|
|
spec->mixers[spec->num_mixers] = alc861vd_capture_mixer;
|
|
spec->num_mixers++;
|
|
spec->num_mixers++;
|
|
|
|
|
|
|
|
+ spec->vmaster_nid = 0x02;
|
|
|
|
+
|
|
codec->patch_ops = alc_patch_ops;
|
|
codec->patch_ops = alc_patch_ops;
|
|
|
|
|
|
if (board_config == ALC861VD_AUTO)
|
|
if (board_config == ALC861VD_AUTO)
|
|
@@ -13305,6 +13376,8 @@ static int patch_alc662(struct hda_codec *codec)
|
|
spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
|
|
spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ spec->vmaster_nid = 0x02;
|
|
|
|
+
|
|
codec->patch_ops = alc_patch_ops;
|
|
codec->patch_ops = alc_patch_ops;
|
|
if (board_config == ALC662_AUTO)
|
|
if (board_config == ALC662_AUTO)
|
|
spec->init_hook = alc662_auto_init;
|
|
spec->init_hook = alc662_auto_init;
|