Commit 1c76aa5f authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda/realtek - Allow skipping spec->init_amp detection

Some devices have the overrides of spec->init_amp at
HDA_FIXUP_ACT_PROBE just because alc_ssid_check() gives the
false-positive values from the SSID.

For more consistent behavior, define the logic in the following way:

- Define ALC_INIT_UNDEFINED as the default value before calling
  alc_ssid_check()
- Each fixup may set up spec->init_amp with another value at
  HDA_FIXUP_ACT_PRE_PROBE
- At detection, check whether spec->init_amp is ALC_INIT_UNDEFINED or
  not; if it's different, we skip the detection

Also, it turned out that ASUS TX300 requires the spec->init_amp
override, too; currently it ignores the GPIO bits implicitly by its
static init verb, but this will be changed in the later patchset.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent ab1bcc93
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
/* extra amp-initialization sequence types */ /* extra amp-initialization sequence types */
enum { enum {
ALC_INIT_UNDEFINED,
ALC_INIT_NONE, ALC_INIT_NONE,
ALC_INIT_DEFAULT, ALC_INIT_DEFAULT,
ALC_INIT_GPIO1, ALC_INIT_GPIO1,
...@@ -656,6 +657,7 @@ static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports) ...@@ -656,6 +657,7 @@ static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
* 7~6 : Reserved * 7~6 : Reserved
*/ */
tmp = (ass & 0x38) >> 3; /* external Amp control */ tmp = (ass & 0x38) >> 3; /* external Amp control */
if (spec->init_amp == ALC_INIT_UNDEFINED) {
switch (tmp) { switch (tmp) {
case 1: case 1:
spec->init_amp = ALC_INIT_GPIO1; spec->init_amp = ALC_INIT_GPIO1;
...@@ -671,6 +673,7 @@ static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports) ...@@ -671,6 +673,7 @@ static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
spec->init_amp = ALC_INIT_DEFAULT; spec->init_amp = ALC_INIT_DEFAULT;
break; break;
} }
}
/* is laptop or Desktop and enable the function "Mute internal speaker /* is laptop or Desktop and enable the function "Mute internal speaker
* when the external headphone out jack is plugged" * when the external headphone out jack is plugged"
...@@ -1589,8 +1592,6 @@ static void alc260_fixup_kn1(struct hda_codec *codec, ...@@ -1589,8 +1592,6 @@ static void alc260_fixup_kn1(struct hda_codec *codec,
switch (action) { switch (action) {
case HDA_FIXUP_ACT_PRE_PROBE: case HDA_FIXUP_ACT_PRE_PROBE:
snd_hda_apply_pincfgs(codec, pincfgs); snd_hda_apply_pincfgs(codec, pincfgs);
break;
case HDA_FIXUP_ACT_PROBE:
spec->init_amp = ALC_INIT_NONE; spec->init_amp = ALC_INIT_NONE;
break; break;
} }
...@@ -1600,7 +1601,7 @@ static void alc260_fixup_fsc_s7020(struct hda_codec *codec, ...@@ -1600,7 +1601,7 @@ static void alc260_fixup_fsc_s7020(struct hda_codec *codec,
const struct hda_fixup *fix, int action) const struct hda_fixup *fix, int action)
{ {
struct alc_spec *spec = codec->spec; struct alc_spec *spec = codec->spec;
if (action == HDA_FIXUP_ACT_PROBE) if (action == HDA_FIXUP_ACT_PRE_PROBE)
spec->init_amp = ALC_INIT_NONE; spec->init_amp = ALC_INIT_NONE;
} }
...@@ -3892,6 +3893,7 @@ static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec, ...@@ -3892,6 +3893,7 @@ static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
struct alc_spec *spec = codec->spec; struct alc_spec *spec = codec->spec;
if (action == HDA_FIXUP_ACT_PRE_PROBE) { if (action == HDA_FIXUP_ACT_PRE_PROBE) {
spec->init_amp = ALC_INIT_DEFAULT;
if (alc_register_micmute_input_device(codec) != 0) if (alc_register_micmute_input_device(codec) != 0)
return; return;
...@@ -3914,9 +3916,6 @@ static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec, ...@@ -3914,9 +3916,6 @@ static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
return; return;
switch (action) { switch (action) {
case HDA_FIXUP_ACT_PROBE:
spec->init_amp = ALC_INIT_DEFAULT;
break;
case HDA_FIXUP_ACT_FREE: case HDA_FIXUP_ACT_FREE:
input_unregister_device(spec->kb_dev); input_unregister_device(spec->kb_dev);
spec->kb_dev = NULL; spec->kb_dev = NULL;
...@@ -3937,6 +3936,7 @@ static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec, ...@@ -3937,6 +3936,7 @@ static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
struct alc_spec *spec = codec->spec; struct alc_spec *spec = codec->spec;
if (action == HDA_FIXUP_ACT_PRE_PROBE) { if (action == HDA_FIXUP_ACT_PRE_PROBE) {
spec->init_amp = ALC_INIT_DEFAULT;
if (alc_register_micmute_input_device(codec) != 0) if (alc_register_micmute_input_device(codec) != 0)
return; return;
...@@ -3955,9 +3955,6 @@ static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec, ...@@ -3955,9 +3955,6 @@ static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
return; return;
switch (action) { switch (action) {
case HDA_FIXUP_ACT_PROBE:
spec->init_amp = ALC_INIT_DEFAULT;
break;
case HDA_FIXUP_ACT_FREE: case HDA_FIXUP_ACT_FREE:
input_unregister_device(spec->kb_dev); input_unregister_device(spec->kb_dev);
spec->kb_dev = NULL; spec->kb_dev = NULL;
...@@ -5227,6 +5224,7 @@ static void alc282_fixup_asus_tx300(struct hda_codec *codec, ...@@ -5227,6 +5224,7 @@ static void alc282_fixup_asus_tx300(struct hda_codec *codec,
switch (action) { switch (action) {
case HDA_FIXUP_ACT_PRE_PROBE: case HDA_FIXUP_ACT_PRE_PROBE:
spec->init_amp = ALC_INIT_DEFAULT;
snd_hda_add_verbs(codec, gpio2_verbs); snd_hda_add_verbs(codec, gpio2_verbs);
snd_hda_apply_pincfgs(codec, dock_pins); snd_hda_apply_pincfgs(codec, dock_pins);
spec->gen.auto_mute_via_amp = 1; spec->gen.auto_mute_via_amp = 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