ALSA: hda - Add reboot notifier to each codec
authorTakashi Iwai <tiwai@suse.de>
Tue, 10 Nov 2009 15:02:29 +0000 (16:02 +0100)
committerTakashi Iwai <tiwai@suse.de>
Tue, 10 Nov 2009 15:02:29 +0000 (16:02 +0100)
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=544779

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.h
sound/pci/hda/hda_intel.c
sound/pci/hda/patch_sigmatel.c

index 2c13663433355d40e102e68ee0d80c0c0cdb6bb6..146f95be8737e73d1923bee5af2bcda57d08bbc7 100644 (file)
@@ -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
  */
index 99552fb5f75699d09461bebfbfd997e37c685f75..624060837653a5e919260f3f94a34494326cc21a 100644 (file)
@@ -674,6 +674,7 @@ struct hda_codec_ops {
 #ifdef CONFIG_SND_HDA_POWER_SAVE
        int (*check_power_status)(struct hda_codec *codec, hda_nid_t nid);
 #endif
 #ifdef CONFIG_SND_HDA_POWER_SAVE
        int (*check_power_status)(struct hda_codec *codec, hda_nid_t nid);
 #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,
  * Misc
  */
 void snd_hda_get_codec_name(struct hda_codec *codec, char *name, int namelen);
  * Misc
  */
 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
index 55c7da30bb61a6ad75e9154cf7d6da7e34ce55b1..0d3e0c9ea81261ab3775d0432bf6b9eee10d399b 100644 (file)
@@ -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)
 {
        struct azx *chip = container_of(nb, struct azx, reboot_notifier);
 static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
 {
        struct azx *chip = container_of(nb, struct azx, reboot_notifier);
+       snd_hda_bus_reboot_notify(chip->bus);
        azx_stop_chip(chip);
        return NOTIFY_OK;
 }
        azx_stop_chip(chip);
        return NOTIFY_OK;
 }
index 3087705a8e5160f9ad8cfb5e5167720a1658556b..9c33700b21a89748df89618808340d7936d3d7e6 100644 (file)
@@ -4831,6 +4831,7 @@ static struct hda_codec_ops stac92xx_patch_ops = {
        .suspend = stac92xx_suspend,
        .resume = stac92xx_resume,
 #endif
        .suspend = stac92xx_suspend,
        .resume = stac92xx_resume,
 #endif
+       .reboot_notify = stac92xx_shutup,
 };
 
 static int patch_stac9200(struct hda_codec *codec)
 };
 
 static int patch_stac9200(struct hda_codec *codec)