diff options
author | Dylan Reid <dgreid@chromium.org> | 2014-02-28 15:41:16 -0800 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2014-03-01 11:21:13 +0100 |
commit | f46ea609d1484818f39e6760c33a1629c756116e (patch) | |
tree | 5efc408fd00355a9782532154f7544354ac36ab8 /sound/pci | |
parent | 8928756dbd956b474fc92ce0556fa3c35673c97c (diff) |
ALSA: hda - Add function pointer for disabling MSI
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>
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/hda/hda_intel.c | 23 | ||||
-rw-r--r-- | sound/pci/hda/hda_priv.h | 4 |
2 files changed, 22 insertions, 5 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 7630622e7f0f..c4b6447bfc7e 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -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, diff --git a/sound/pci/hda/hda_priv.h b/sound/pci/hda/hda_priv.h index 17afe90e90de..c231c11d8669 100644 --- a/sound/pci/hda/hda_priv.h +++ b/sound/pci/hda/hda_priv.h @@ -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 { |