Commit ae77b4ed authored by Takashi Iwai's avatar Takashi Iwai

Merge branch 'fix/hda' into for-linus

* fix/hda:
  ALSA: hda - Add missing initializations for ALC268 and ALC269
  ALSA: hda - Line In for Acer Inspire 6530G model
  ALSA: hda - Use model=acer-aspire-6530g for Acer Aspire 6930G
  ALSA: hda - Fix acer-aspire-6530g model quirk
  ALSA: hda - Add pin-sense trigger when needed for Realtek codecs
parents 10121a12 1d955ebd
...@@ -945,11 +945,12 @@ static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid, ...@@ -945,11 +945,12 @@ static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
static void alc_automute_pin(struct hda_codec *codec) static void alc_automute_pin(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; struct alc_spec *spec = codec->spec;
unsigned int present; unsigned int present, pincap;
unsigned int nid = spec->autocfg.hp_pins[0]; unsigned int nid = spec->autocfg.hp_pins[0];
int i; int i;
/* need to execute and sync at first */ pincap = snd_hda_query_pin_caps(codec, nid);
if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */
snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0); snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0);
present = snd_hda_codec_read(codec, nid, 0, present = snd_hda_codec_read(codec, nid, 0,
AC_VERB_GET_PIN_SENSE, 0); AC_VERB_GET_PIN_SENSE, 0);
...@@ -1392,7 +1393,7 @@ static struct hda_verb alc888_fujitsu_xa3530_verbs[] = { ...@@ -1392,7 +1393,7 @@ static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
static void alc_automute_amp(struct hda_codec *codec) static void alc_automute_amp(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; struct alc_spec *spec = codec->spec;
unsigned int val, mute; unsigned int val, mute, pincap;
hda_nid_t nid; hda_nid_t nid;
int i; int i;
...@@ -1401,6 +1402,10 @@ static void alc_automute_amp(struct hda_codec *codec) ...@@ -1401,6 +1402,10 @@ static void alc_automute_amp(struct hda_codec *codec)
nid = spec->autocfg.hp_pins[i]; nid = spec->autocfg.hp_pins[i];
if (!nid) if (!nid)
break; break;
pincap = snd_hda_query_pin_caps(codec, nid);
if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */
snd_hda_codec_read(codec, nid, 0,
AC_VERB_SET_PIN_SENSE, 0);
val = snd_hda_codec_read(codec, nid, 0, val = snd_hda_codec_read(codec, nid, 0,
AC_VERB_GET_PIN_SENSE, 0); AC_VERB_GET_PIN_SENSE, 0);
if (val & AC_PINSENSE_PRESENCE) { if (val & AC_PINSENSE_PRESENCE) {
...@@ -1471,6 +1476,10 @@ static struct hda_verb alc888_acer_aspire_4930g_verbs[] = { ...@@ -1471,6 +1476,10 @@ static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
static struct hda_verb alc888_acer_aspire_6530g_verbs[] = { static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
/* Bias voltage on for external mic port */ /* Bias voltage on for external mic port */
{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80}, {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
/* Front Mic: set to PIN_IN (empty by default) */
{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
/* Unselect Front Mic by default in input mixer 3 */
{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
/* Enable unsolicited event for HP jack */ /* Enable unsolicited event for HP jack */
{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
/* Enable speaker output */ /* Enable speaker output */
...@@ -1560,18 +1569,22 @@ static struct hda_input_mux alc888_2_capture_sources[2] = { ...@@ -1560,18 +1569,22 @@ static struct hda_input_mux alc888_2_capture_sources[2] = {
static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = { static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
/* Interal mic only available on one ADC */ /* Interal mic only available on one ADC */
{ {
.num_items = 3, .num_items = 5,
.items = { .items = {
{ "Ext Mic", 0x0 }, { "Ext Mic", 0x0 },
{ "Line In", 0x2 },
{ "CD", 0x4 }, { "CD", 0x4 },
{ "Input Mix", 0xa },
{ "Int Mic", 0xb }, { "Int Mic", 0xb },
}, },
}, },
{ {
.num_items = 2, .num_items = 4,
.items = { .items = {
{ "Ext Mic", 0x0 }, { "Ext Mic", 0x0 },
{ "Line In", 0x2 },
{ "CD", 0x4 }, { "CD", 0x4 },
{ "Input Mix", 0xa },
}, },
} }
}; };
...@@ -1639,6 +1652,17 @@ static void alc888_acer_aspire_4930g_init_hook(struct hda_codec *codec) ...@@ -1639,6 +1652,17 @@ static void alc888_acer_aspire_4930g_init_hook(struct hda_codec *codec)
alc_automute_amp(codec); alc_automute_amp(codec);
} }
static void alc888_acer_aspire_6530g_init_hook(struct hda_codec *codec)
{
struct alc_spec *spec = codec->spec;
spec->autocfg.hp_pins[0] = 0x15;
spec->autocfg.speaker_pins[0] = 0x14;
spec->autocfg.speaker_pins[1] = 0x16;
spec->autocfg.speaker_pins[2] = 0x17;
alc_automute_amp(codec);
}
static void alc889_acer_aspire_8930g_init_hook(struct hda_codec *codec) static void alc889_acer_aspire_8930g_init_hook(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; struct alc_spec *spec = codec->spec;
...@@ -8189,6 +8213,8 @@ static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = { ...@@ -8189,6 +8213,8 @@ static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT), HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
HDA_BIND_MUTE("LFE Playback Switch", 0x0f, 2, HDA_INPUT), HDA_BIND_MUTE("LFE Playback Switch", 0x0f, 2, HDA_INPUT),
HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, 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),
...@@ -9064,7 +9090,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = { ...@@ -9064,7 +9090,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = {
SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC883_AUTO), SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC883_AUTO),
SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC883_AUTO), SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC883_AUTO),
SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G", SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
ALC888_ACER_ASPIRE_4930G), ALC888_ACER_ASPIRE_6530G),
SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G", SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
ALC888_ACER_ASPIRE_6530G), ALC888_ACER_ASPIRE_6530G),
/* default Acer -- disabled as it causes more problems. /* default Acer -- disabled as it causes more problems.
...@@ -9317,7 +9343,7 @@ static struct alc_config_preset alc883_presets[] = { ...@@ -9317,7 +9343,7 @@ static struct alc_config_preset alc883_presets[] = {
ARRAY_SIZE(alc888_2_capture_sources), ARRAY_SIZE(alc888_2_capture_sources),
.input_mux = alc888_acer_aspire_6530_sources, .input_mux = alc888_acer_aspire_6530_sources,
.unsol_event = alc_automute_amp_unsol_event, .unsol_event = alc_automute_amp_unsol_event,
.init_hook = alc888_acer_aspire_4930g_init_hook, .init_hook = alc888_acer_aspire_6530g_init_hook,
}, },
[ALC888_ACER_ASPIRE_8930G] = { [ALC888_ACER_ASPIRE_8930G] = {
.mixers = { alc888_base_mixer, .mixers = { alc888_base_mixer,
...@@ -12437,6 +12463,8 @@ static int alc268_parse_auto_config(struct hda_codec *codec) ...@@ -12437,6 +12463,8 @@ static int alc268_parse_auto_config(struct hda_codec *codec)
if (err < 0) if (err < 0)
return err; return err;
alc_ssid_check(codec, 0x15, 0x1b, 0x14);
return 1; return 1;
} }
...@@ -13345,6 +13373,8 @@ static int alc269_parse_auto_config(struct hda_codec *codec) ...@@ -13345,6 +13373,8 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
if (!spec->cap_mixer && !spec->no_analog) if (!spec->cap_mixer && !spec->no_analog)
set_capture_mixer(spec); set_capture_mixer(spec);
alc_ssid_check(codec, 0x15, 0x1b, 0x14);
return 1; return 1;
} }
......
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