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
20
21static void __init
22pdev_fixup_irq(struct pci_dev *dev,
23 u8 (*swizzle)(struct pci_dev *, u8 *),
24 int (*map_irq)(const struct pci_dev *, u8, u8))
25{
26 u8 pin, slot;
27 int irq = 0;
28
29
30
31
32
33
34
35 pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
36
37 if (pin > 4)
38 pin = 1;
39
40 if (pin != 0) {
41
42 slot = (*swizzle)(dev, &pin);
43
44 irq = (*map_irq)(dev, slot, pin);
45 if (irq == -1)
46 irq = 0;
47 }
48 dev->irq = irq;
49
50 dev_dbg(&dev->dev, "fixup irq: got %d\n", dev->irq);
51
52
53
54 pcibios_update_irq(dev, irq);
55}
56
57void __init
58pci_fixup_irqs(u8 (*swizzle)(struct pci_dev *, u8 *),
59 int (*map_irq)(const struct pci_dev *, u8, u8))
60{
61 struct pci_dev *dev = NULL;
62 for_each_pci_dev(dev)
63 pdev_fixup_irq(dev, swizzle, map_irq);
64}
65