#include <linux/slab.h>
 #include <linux/pci.h>
 #include <linux/mutex.h>
+#include <linux/reboot.h>
 #include <sound/core.h>
 #include <sound/initval.h>
 #include "hda_codec.h"
 
        /* for pending irqs */
        struct work_struct irq_pending_work;
+
+       /* reboot notifier (for mysterious hangup problem at power-down) */
+       struct notifier_block reboot_notifier;
 };
 
 /* driver types */
 #endif /* CONFIG_PM */
 
 
+/*
+ * reboot notifier for hang-up problem at power-down
+ */
+static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
+{
+       struct azx *chip = container_of(nb, struct azx, reboot_notifier);
+       azx_stop_chip(chip);
+       return NOTIFY_OK;
+}
+
+static void azx_notifier_register(struct azx *chip)
+{
+       chip->reboot_notifier.notifier_call = azx_halt;
+       register_reboot_notifier(&chip->reboot_notifier);
+}
+
+static void azx_notifier_unregister(struct azx *chip)
+{
+       if (chip->reboot_notifier.notifier_call)
+               unregister_reboot_notifier(&chip->reboot_notifier);
+}
+
 /*
  * destructor
  */
 {
        int i;
 
+       azx_notifier_unregister(chip);
+
        if (chip->initialized) {
                azx_clear_irq_pending(chip);
                for (i = 0; i < chip->num_streams; i++)
        pci_set_drvdata(pci, card);
        chip->running = 1;
        power_down_all_codecs(chip);
+       azx_notifier_register(chip);
 
        dev++;
        return err;