ALSA: hda - Add function pointer for disabling MSI
authorDylan Reid <dgreid@chromium.org>
Fri, 28 Feb 2014 23:41:16 +0000 (15:41 -0800)
committerTakashi Iwai <tiwai@suse.de>
Sat, 1 Mar 2014 10:21:13 +0000 (11:21 +0100)
This is a PCI-only feature, but adding a callback for it in the chip
structure breaks the PCI dependency in the RIRB code allowing the
logic there to be re-used by the platform HDA driver.

Signed-off-by: Dylan Reid <dgreid@chromium.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_intel.c
sound/pci/hda/hda_priv.h

index 7630622e7f0fdfb4888dfee742b74d2ee11a76b5..c4b6447bfc7e77023cab4bd4aa1a61299e964178 100644 (file)
@@ -600,11 +600,8 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus,
                dev_warn(chip->card->dev,
                         "No response from codec, disabling MSI: last cmd=0x%08x\n",
                         chip->last_cmd[addr]);
-               free_irq(chip->irq, chip);
-               chip->irq = -1;
-               pci_disable_msi(chip->pci);
-               chip->msi = 0;
-               if (azx_acquire_irq(chip, 1) < 0) {
+               if (chip->ops->disable_msi_reset_irq &&
+                   chip->ops->disable_msi_reset_irq(chip) < 0) {
                        bus->rirb_error = 1;
                        return -1;
                }
@@ -3469,6 +3466,21 @@ static u8 pci_azx_readb(u8 *addr)
        return readb(addr);
 }
 
+static int disable_msi_reset_irq(struct azx *chip)
+{
+       int err;
+
+       free_irq(chip->irq, chip);
+       chip->irq = -1;
+       pci_disable_msi(chip->pci);
+       chip->msi = 0;
+       err = azx_acquire_irq(chip, 1);
+       if (err < 0)
+               return err;
+
+       return 0;
+}
+
 static const struct hda_controller_ops pci_hda_ops = {
        .writel = pci_azx_writel,
        .readl = pci_azx_readl,
@@ -3476,6 +3488,7 @@ static const struct hda_controller_ops pci_hda_ops = {
        .readw = pci_azx_readw,
        .writeb = pci_azx_writeb,
        .readb = pci_azx_readb,
+       .disable_msi_reset_irq = disable_msi_reset_irq,
 };
 
 static int azx_probe(struct pci_dev *pci,
index 17afe90e90deace1db100f95d0532948ddb178a0..c231c11d86698250a630aecf0cadc92e2860c675 100644 (file)
@@ -285,6 +285,8 @@ struct azx_rb {
        u32 res[AZX_MAX_CODECS];        /* last read value */
 };
 
+struct azx;
+
 /* Functions to read/write to hda registers. */
 struct hda_controller_ops {
        /* Register Access */
@@ -294,6 +296,8 @@ struct hda_controller_ops {
        u16 (*readw)(u16 *addr);
        void (*writeb)(u8 value, u8 *addr);
        u8 (*readb)(u8 *addr);
+       /* Disable msi if supported, PCI only */
+       int (*disable_msi_reset_irq)(struct azx *);
 };
 
 struct azx_pcm {