mirror of
https://github.com/raspberrypi/linux.git
synced 2026-01-02 15:53:42 +00:00
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>
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user