ALSA: hda/tegra: clear pending irq handlers
[linux-2.6-block.git] / sound / pci / hda / hda_tegra.c
index dd7d4242d6d2afeec5cfb5a813ef43d813c0b6be..97a176d817a0cbd7feb49283f24415f1e9196b27 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/of_device.h>
 #include <linux/slab.h>
 #include <linux/time.h>
+#include <linux/string.h>
 
 #include <sound/core.h>
 #include <sound/initval.h>
@@ -233,10 +234,12 @@ static int hda_tegra_suspend(struct device *dev)
        struct snd_card *card = dev_get_drvdata(dev);
        struct azx *chip = card->private_data;
        struct hda_tegra *hda = container_of(chip, struct hda_tegra, chip);
+       struct hdac_bus *bus = azx_bus(chip);
 
        snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
 
        azx_stop_chip(chip);
+       synchronize_irq(bus->irq);
        azx_enter_link_reset(chip);
        hda_tegra_disable_clocks(hda);
 
@@ -344,6 +347,8 @@ static int hda_tegra_first_init(struct azx *chip, struct platform_device *pdev)
        int err;
        unsigned short gcap;
        int irq_id = platform_get_irq(pdev, 0);
+       const char *sname;
+       struct device_node *root;
 
        err = hda_tegra_init_chip(chip, pdev);
        if (err)
@@ -401,8 +406,23 @@ static int hda_tegra_first_init(struct azx *chip, struct platform_device *pdev)
                return -ENODEV;
        }
 
+       /* driver name */
        strcpy(card->driver, "tegra-hda");
-       strcpy(card->shortname, "tegra-hda");
+
+       root = of_find_node_by_path("/");
+       sname = of_get_property(root, "compatible", NULL);
+       of_node_put(root);
+       if (!sname) {
+               dev_err(card->dev,
+                       "failed to get compatible property from root node\n");
+               return -ENODEV;
+       }
+       /* shortname for card */
+       if (strlen(sname) > sizeof(card->shortname))
+               dev_info(card->dev, "truncating shortname for card\n");
+       strncpy(card->shortname, sname, sizeof(card->shortname));
+
+       /* longname for card */
        snprintf(card->longname, sizeof(card->longname),
                 "%s at 0x%lx irq %i",
                 card->shortname, bus->addr, bus->irq);
@@ -513,7 +533,7 @@ static void hda_tegra_probe_work(struct work_struct *work)
                goto out_free;
 
        /* create codec instances */
-       err = azx_probe_codecs(chip, 0);
+       err = azx_probe_codecs(chip, 8);
        if (err < 0)
                goto out_free;