Commit fb8d1a34 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda - Add reboot notifier to each codec

Add reboot notifier to each codec so that it can do some workarounds
needed for reboot.

So far, patch_sigmatel.c calls its shutup routine for avoiding noises
at reboot on some HP machines.

References: Novell bnc#544779
	http://bugzilla.novell.com/show_bug.cgi?id=544779Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 167eae5a
...@@ -3404,6 +3404,23 @@ static void cleanup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid) ...@@ -3404,6 +3404,23 @@ static void cleanup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid)
} }
} }
/* call each reboot notifier */
void snd_hda_bus_reboot_notify(struct hda_bus *bus)
{
struct hda_codec *codec;
if (!bus)
return;
list_for_each_entry(codec, &bus->codec_list, list) {
#ifdef CONFIG_SND_HDA_POWER_SAVE
if (!codec->power_on)
continue;
#endif
if (codec->patch_ops.reboot_notify)
codec->patch_ops.reboot_notify(codec);
}
}
/* /*
* open the digital out in the exclusive mode * open the digital out in the exclusive mode
*/ */
......
...@@ -674,6 +674,7 @@ struct hda_codec_ops { ...@@ -674,6 +674,7 @@ struct hda_codec_ops {
#ifdef CONFIG_SND_HDA_POWER_SAVE #ifdef CONFIG_SND_HDA_POWER_SAVE
int (*check_power_status)(struct hda_codec *codec, hda_nid_t nid); int (*check_power_status)(struct hda_codec *codec, hda_nid_t nid);
#endif #endif
void (*reboot_notify)(struct hda_codec *codec);
}; };
/* record for amp information cache */ /* record for amp information cache */
...@@ -910,6 +911,7 @@ int snd_hda_is_supported_format(struct hda_codec *codec, hda_nid_t nid, ...@@ -910,6 +911,7 @@ int snd_hda_is_supported_format(struct hda_codec *codec, hda_nid_t nid,
* Misc * Misc
*/ */
void snd_hda_get_codec_name(struct hda_codec *codec, char *name, int namelen); void snd_hda_get_codec_name(struct hda_codec *codec, char *name, int namelen);
void snd_hda_bus_reboot_notify(struct hda_bus *bus);
/* /*
* power management * power management
......
...@@ -2150,6 +2150,7 @@ static int azx_resume(struct pci_dev *pci) ...@@ -2150,6 +2150,7 @@ static int azx_resume(struct pci_dev *pci)
static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf) static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
{ {
struct azx *chip = container_of(nb, struct azx, reboot_notifier); struct azx *chip = container_of(nb, struct azx, reboot_notifier);
snd_hda_bus_reboot_notify(chip->bus);
azx_stop_chip(chip); azx_stop_chip(chip);
return NOTIFY_OK; return NOTIFY_OK;
} }
......
...@@ -4831,6 +4831,7 @@ static struct hda_codec_ops stac92xx_patch_ops = { ...@@ -4831,6 +4831,7 @@ static struct hda_codec_ops stac92xx_patch_ops = {
.suspend = stac92xx_suspend, .suspend = stac92xx_suspend,
.resume = stac92xx_resume, .resume = stac92xx_resume,
#endif #endif
.reboot_notify = stac92xx_shutup,
}; };
static int patch_stac9200(struct hda_codec *codec) static int patch_stac9200(struct hda_codec *codec)
......
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