1
2
3
4
5
6
7
8
9
10#include <linux/kernel.h>
11#include <linux/init.h>
12#include <linux/module.h>
13#include <linux/ide.h>
14
15
16
17
18
19static int pre_init = 1;
20static LIST_HEAD(ide_pci_drivers);
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35int __ide_pci_register_driver(struct pci_driver *driver, struct module *module,
36 const char *mod_name)
37{
38 if (!pre_init)
39 return __pci_register_driver(driver, module, mod_name);
40 driver->driver.owner = module;
41 list_add_tail(&driver->node, &ide_pci_drivers);
42 return 0;
43}
44EXPORT_SYMBOL_GPL(__ide_pci_register_driver);
45
46
47
48
49
50
51
52
53
54
55static int __init ide_scan_pcidev(struct pci_dev *dev)
56{
57 struct list_head *l;
58 struct pci_driver *d;
59 int ret;
60
61 list_for_each(l, &ide_pci_drivers) {
62 d = list_entry(l, struct pci_driver, node);
63 if (d->id_table) {
64 const struct pci_device_id *id =
65 pci_match_id(d->id_table, dev);
66
67 if (id != NULL) {
68 pci_assign_irq(dev);
69 ret = d->probe(dev, id);
70 if (ret >= 0) {
71 dev->driver = d;
72 pci_dev_get(dev);
73 return 1;
74 }
75 }
76 }
77 }
78 return 0;
79}
80
81
82
83
84
85
86
87
88
89static int __init ide_scan_pcibus(void)
90{
91 struct pci_dev *dev = NULL;
92 struct pci_driver *d, *tmp;
93
94 pre_init = 0;
95 for_each_pci_dev(dev)
96 ide_scan_pcidev(dev);
97
98
99
100
101
102
103 list_for_each_entry_safe(d, tmp, &ide_pci_drivers, node) {
104 list_del(&d->node);
105 if (__pci_register_driver(d, d->driver.owner,
106 d->driver.mod_name))
107 printk(KERN_ERR "%s: failed to register %s driver\n",
108 __func__, d->driver.mod_name);
109 }
110
111 return 0;
112}
113device_initcall(ide_scan_pcibus);
114