ALSA: hda - Add sanity check in PCM open callback
[pandora-kernel.git] / sound / pci / hda / hda_intel.c
index 9f44645..1877d95 100644 (file)
@@ -1260,17 +1260,20 @@ static void azx_stop_chip(struct azx *chip);
 static void azx_bus_reset(struct hda_bus *bus)
 {
        struct azx *chip = bus->private_data;
-       int i;
 
        bus->in_reset = 1;
        azx_stop_chip(chip);
        azx_init_chip(chip);
+#ifdef CONFIG_PM
        if (chip->initialized) {
+               int i;
+
                for (i = 0; i < AZX_MAX_PCMS; i++)
                        snd_pcm_suspend_all(chip->pcm[i]);
                snd_hda_suspend(chip->bus);
                snd_hda_resume(chip->bus);
        }
+#endif
        bus->in_reset = 0;
 }
 
@@ -1451,6 +1454,7 @@ static int azx_pcm_open(struct snd_pcm_substream *substream)
                mutex_unlock(&chip->open_mutex);
                return err;
        }
+       snd_pcm_limit_hw_rates(runtime);
        spin_lock_irqsave(&chip->reg_lock, flags);
        azx_dev->substream = substream;
        azx_dev->running = 0;
@@ -1460,6 +1464,12 @@ static int azx_pcm_open(struct snd_pcm_substream *substream)
        snd_pcm_set_sync(substream);
        mutex_unlock(&chip->open_mutex);
 
+       if (snd_BUG_ON(!runtime->hw.channels_min || !runtime->hw.channels_max))
+               return -EINVAL;
+       if (snd_BUG_ON(!runtime->hw.formats))
+               return -EINVAL;
+       if (snd_BUG_ON(!runtime->hw.rates))
+               return -EINVAL;
        return 0;
 }