Commit f46ea609 authored by Dylan Reid's avatar Dylan Reid Committed by Takashi Iwai

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: default avatarDylan Reid <dgreid@chromium.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 8928756d
...@@ -600,11 +600,8 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, ...@@ -600,11 +600,8 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus,
dev_warn(chip->card->dev, dev_warn(chip->card->dev,
"No response from codec, disabling MSI: last cmd=0x%08x\n", "No response from codec, disabling MSI: last cmd=0x%08x\n",
chip->last_cmd[addr]); chip->last_cmd[addr]);
free_irq(chip->irq, chip); if (chip->ops->disable_msi_reset_irq &&
chip->irq = -1; chip->ops->disable_msi_reset_irq(chip) < 0) {
pci_disable_msi(chip->pci);
chip->msi = 0;
if (azx_acquire_irq(chip, 1) < 0) {
bus->rirb_error = 1; bus->rirb_error = 1;
return -1; return -1;
} }
...@@ -3469,6 +3466,21 @@ static u8 pci_azx_readb(u8 *addr) ...@@ -3469,6 +3466,21 @@ static u8 pci_azx_readb(u8 *addr)
return readb(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 = { static const struct hda_controller_ops pci_hda_ops = {
.writel = pci_azx_writel, .writel = pci_azx_writel,
.readl = pci_azx_readl, .readl = pci_azx_readl,
...@@ -3476,6 +3488,7 @@ static const struct hda_controller_ops pci_hda_ops = { ...@@ -3476,6 +3488,7 @@ static const struct hda_controller_ops pci_hda_ops = {
.readw = pci_azx_readw, .readw = pci_azx_readw,
.writeb = pci_azx_writeb, .writeb = pci_azx_writeb,
.readb = pci_azx_readb, .readb = pci_azx_readb,
.disable_msi_reset_irq = disable_msi_reset_irq,
}; };
static int azx_probe(struct pci_dev *pci, static int azx_probe(struct pci_dev *pci,
......
...@@ -285,6 +285,8 @@ struct azx_rb { ...@@ -285,6 +285,8 @@ struct azx_rb {
u32 res[AZX_MAX_CODECS]; /* last read value */ u32 res[AZX_MAX_CODECS]; /* last read value */
}; };
struct azx;
/* Functions to read/write to hda registers. */ /* Functions to read/write to hda registers. */
struct hda_controller_ops { struct hda_controller_ops {
/* Register Access */ /* Register Access */
...@@ -294,6 +296,8 @@ struct hda_controller_ops { ...@@ -294,6 +296,8 @@ struct hda_controller_ops {
u16 (*readw)(u16 *addr); u16 (*readw)(u16 *addr);
void (*writeb)(u8 value, u8 *addr); void (*writeb)(u8 value, u8 *addr);
u8 (*readb)(u8 *addr); u8 (*readb)(u8 *addr);
/* Disable msi if supported, PCI only */
int (*disable_msi_reset_irq)(struct azx *);
}; };
struct azx_pcm { struct azx_pcm {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment