|
@@ -111,6 +111,7 @@ struct alc_spec {
|
|
|
void (*power_hook)(struct hda_codec *codec);
|
|
|
#endif
|
|
|
void (*shutup)(struct hda_codec *codec);
|
|
|
+ void (*reboot_notify)(struct hda_codec *codec);
|
|
|
|
|
|
int init_amp;
|
|
|
int codec_variant; /* flag for other variants */
|
|
@@ -773,6 +774,25 @@ static inline void alc_shutup(struct hda_codec *codec)
|
|
|
snd_hda_shutup_pins(codec);
|
|
|
}
|
|
|
|
|
|
+static void alc_reboot_notify(struct hda_codec *codec)
|
|
|
+{
|
|
|
+ struct alc_spec *spec = codec->spec;
|
|
|
+
|
|
|
+ if (spec && spec->reboot_notify)
|
|
|
+ spec->reboot_notify(codec);
|
|
|
+ else
|
|
|
+ alc_shutup(codec);
|
|
|
+}
|
|
|
+
|
|
|
+/* power down codec to D3 at reboot/shutdown; set as reboot_notify ops */
|
|
|
+static void alc_d3_at_reboot(struct hda_codec *codec)
|
|
|
+{
|
|
|
+ snd_hda_codec_set_power_to_all(codec, codec->core.afg, AC_PWRST_D3);
|
|
|
+ snd_hda_codec_write(codec, codec->core.afg, 0,
|
|
|
+ AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
|
|
|
+ msleep(10);
|
|
|
+}
|
|
|
+
|
|
|
#define alc_free snd_hda_gen_free
|
|
|
|
|
|
#ifdef CONFIG_PM
|
|
@@ -818,7 +838,7 @@ static const struct hda_codec_ops alc_patch_ops = {
|
|
|
.suspend = alc_suspend,
|
|
|
.check_power_status = snd_hda_gen_check_power_status,
|
|
|
#endif
|
|
|
- .reboot_notify = alc_shutup,
|
|
|
+ .reboot_notify = alc_reboot_notify,
|
|
|
};
|
|
|
|
|
|
|
|
@@ -4199,6 +4219,7 @@ static void alc_fixup_tpt440_dock(struct hda_codec *codec,
|
|
|
|
|
|
if (action == HDA_FIXUP_ACT_PRE_PROBE) {
|
|
|
spec->shutup = alc_no_shutup; /* reduce click noise */
|
|
|
+ spec->reboot_notify = alc_d3_at_reboot; /* reduce noise */
|
|
|
spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
|
|
|
codec->power_save_node = 0; /* avoid click noises */
|
|
|
snd_hda_apply_pincfgs(codec, pincfgs);
|