1
2
3
4
5
6
7
8
9
10
11
12
13#include <linux/init.h>
14#include <linux/kernel.h>
15#include <linux/pci.h>
16#include <linux/errno.h>
17#include <linux/ioport.h>
18#include <linux/cache.h>
19
20void __weak pcibios_update_irq(struct pci_dev *dev, int irq)
21{
22 dev_dbg(&dev->dev, "assigning IRQ %02d\n", irq);
23 pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq);
24}
25
26static void
27pdev_fixup_irq(struct pci_dev *dev,
28 u8 (*swizzle)(struct pci_dev *, u8 *),
29 int (*map_irq)(const struct pci_dev *, u8, u8))
30{
31 u8 pin, slot;
32 int irq = 0;
33
34
35
36
37
38
39
40 pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
41
42 if (pin > 4)
43 pin = 1;
44
45 if (pin != 0) {
46
47 slot = (*swizzle)(dev, &pin);
48
49 irq = (*map_irq)(dev, slot, pin);
50 if (irq == -1)
51 irq = 0;
52 }
53 dev->irq = irq;
54
55 dev_dbg(&dev->dev, "fixup irq: got %d\n", dev->irq);
56
57
58
59 pcibios_update_irq(dev, irq);
60}
61
62void
63pci_fixup_irqs(u8 (*swizzle)(struct pci_dev *, u8 *),
64 int (*map_irq)(const struct pci_dev *, u8, u8))
65{
66 struct pci_dev *dev = NULL;
67 for_each_pci_dev(dev)
68 pdev_fixup_irq(dev, swizzle, map_irq);
69}
70