PCI: Remove duplicate pci_disable_device() from pcie_portdrv_remove()
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / pci / setup-irq.c
CommitLineData
1da177e4
LT
1/*
2 * drivers/pci/setup-irq.c
3 *
4 * Extruded from code written by
5 * Dave Rusling (david.rusling@reo.mts.dec.com)
6 * David Mosberger (davidm@cs.arizona.edu)
7 * David Miller (davem@redhat.com)
8 *
9 * Support routines for initializing a PCI subsystem.
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
8885b7b6
TR
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}
1da177e4 25
3ddbebf8 26static void
1da177e4
LT
27pdev_fixup_irq(struct pci_dev *dev,
28 u8 (*swizzle)(struct pci_dev *, u8 *),
d5341942 29 int (*map_irq)(const struct pci_dev *, u8, u8))
1da177e4
LT
30{
31 u8 pin, slot;
691cd0c2 32 int irq = 0;
1da177e4
LT
33
34 /* If this device is not on the primary bus, we need to figure out
35 which interrupt pin it will come in on. We know which slot it
36 will come in on 'cos that slot is where the bridge is. Each
37 time the interrupt line passes through a PCI-PCI bridge we must
38 apply the swizzle function. */
39
40 pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
691cd0c2
AB
41 /* Cope with illegal. */
42 if (pin > 4)
1da177e4
LT
43 pin = 1;
44
691cd0c2
AB
45 if (pin != 0) {
46 /* Follow the chain of bridges, swizzling as we go. */
47 slot = (*swizzle)(dev, &pin);
1da177e4 48
691cd0c2
AB
49 irq = (*map_irq)(dev, slot, pin);
50 if (irq == -1)
51 irq = 0;
52 }
1da177e4
LT
53 dev->irq = irq;
54
80ccba11 55 dev_dbg(&dev->dev, "fixup irq: got %d\n", dev->irq);
1da177e4
LT
56
57 /* Always tell the device, so the driver knows what is
58 the real IRQ to use; the device does not use it. */
59 pcibios_update_irq(dev, irq);
60}
61
3ddbebf8 62void
1da177e4 63pci_fixup_irqs(u8 (*swizzle)(struct pci_dev *, u8 *),
d5341942 64 int (*map_irq)(const struct pci_dev *, u8, u8))
1da177e4
LT
65{
66 struct pci_dev *dev = NULL;
4e344b1c 67 for_each_pci_dev(dev)
1da177e4 68 pdev_fixup_irq(dev, swizzle, map_irq);
1da177e4 69}