Commit 00e25397 authored by Daniel Axtens's avatar Daniel Axtens Committed by Michael Ellerman

powerpc/fsl_msi: Move MSI-related ops to pci_controller_ops

Move the fsl_msi subsystem to use the pci_controller_ops structure
rather than ppc_md for MSI related PCI controller operations.

Previously, MSI ops were added to ppc_md at the subsys level. However,
in fsl_pci.c, PCI controllers are created at the at arch level. So,
unlike in e.g. PowerNV/pSeries/Cell, we can't simply populate a
platform-level controller ops structure and have it copied into the
controllers when they are created.

Instead, walk every phb, and attempt to populate it with the MSI ops.
Signed-off-by: default avatarDaniel Axtens <dja@axtens.net>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 1d14b875
...@@ -405,6 +405,7 @@ static int fsl_of_msi_probe(struct platform_device *dev) ...@@ -405,6 +405,7 @@ static int fsl_of_msi_probe(struct platform_device *dev)
const struct fsl_msi_feature *features; const struct fsl_msi_feature *features;
int len; int len;
u32 offset; u32 offset;
struct pci_controller *phb;
match = of_match_device(fsl_of_msi_ids, &dev->dev); match = of_match_device(fsl_of_msi_ids, &dev->dev);
if (!match) if (!match)
...@@ -541,15 +542,21 @@ static int fsl_of_msi_probe(struct platform_device *dev) ...@@ -541,15 +542,21 @@ static int fsl_of_msi_probe(struct platform_device *dev)
list_add_tail(&msi->list, &msi_head); list_add_tail(&msi->list, &msi_head);
/* The multiple setting ppc_md.setup_msi_irqs will not harm things */ /*
if (!ppc_md.setup_msi_irqs) { * Apply the MSI ops to all the controllers.
ppc_md.setup_msi_irqs = fsl_setup_msi_irqs; * It doesn't hurt to reassign the same ops,
ppc_md.teardown_msi_irqs = fsl_teardown_msi_irqs; * but bail out if we find another MSI driver.
} else if (ppc_md.setup_msi_irqs != fsl_setup_msi_irqs) { */
list_for_each_entry(phb, &hose_list, list_node) {
if (!phb->controller_ops.setup_msi_irqs) {
phb->controller_ops.setup_msi_irqs = fsl_setup_msi_irqs;
phb->controller_ops.teardown_msi_irqs = fsl_teardown_msi_irqs;
} else if (phb->controller_ops.setup_msi_irqs != fsl_setup_msi_irqs) {
dev_err(&dev->dev, "Different MSI driver already installed!\n"); dev_err(&dev->dev, "Different MSI driver already installed!\n");
err = -ENODEV; err = -ENODEV;
goto error_out; goto error_out;
} }
}
return 0; return 0;
error_out: error_out:
fsl_of_msi_remove(dev); fsl_of_msi_remove(dev);
......
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