Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
pci
setup-irq.c
Go to the documentation of this file.
1
/*
2
* drivers/pci/setup-irq.c
3
*
4
* Extruded from code written by
5
* Dave Rusling (
[email protected]
)
6
* David Mosberger (
[email protected]
)
7
* David Miller (
[email protected]
)
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
20
void
__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
26
static
void
27
pdev_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
/* 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);
41
/* Cope with illegal. */
42
if
(pin > 4)
43
pin = 1;
44
45
if
(pin != 0) {
46
/* Follow the chain of bridges, swizzling as we go. */
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
/* 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
62
void
63
pci_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
}
Generated on Thu Jan 10 2013 14:14:27 for Linux Kernel by
1.8.2