1/*
2 * support for probing IDE PCI devices in the PCI bus order
3 *
4 * Copyright (c) 1998-2000  Andre Hedrick <andre@linux-ide.org>
5 * Copyright (c) 1995-1998  Mark Lord
6 *
7 * May be copied or modified under the terms of the GNU General Public License
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 *	Module interfaces
17 */
18
19static int pre_init = 1;		/* Before first ordered IDE scan */
20static LIST_HEAD(ide_pci_drivers);
21
22/*
23 *	__ide_pci_register_driver	-	attach IDE driver
24 *	@driver: pci driver
25 *	@module: owner module of the driver
26 *
27 *	Registers a driver with the IDE layer. The IDE layer arranges that
28 *	boot time setup is done in the expected device order and then
29 *	hands the controllers off to the core PCI code to do the rest of
30 *	the work.
31 *
32 *	Returns are the same as for pci_register_driver
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 *	ide_scan_pcidev		-	find an IDE driver for a device
48 *	@dev: PCI device to check
49 *
50 *	Look for an IDE driver to handle the device we are considering.
51 *	This is only used during boot up to get the ordering correct. After
52 *	boot up the pci layer takes over the job.
53 */
54
55static int __init ide_scan_pcidev(struct pci_dev *dev)
56{
57	struct list_head *l;
58	struct pci_driver *d;
59
60	list_for_each(l, &ide_pci_drivers) {
61		d = list_entry(l, struct pci_driver, node);
62		if (d->id_table) {
63			const struct pci_device_id *id =
64				pci_match_id(d->id_table, dev);
65
66			if (id != NULL && d->probe(dev, id) >= 0) {
67				dev->driver = d;
68				pci_dev_get(dev);
69				return 1;
70			}
71		}
72	}
73	return 0;
74}
75
76/**
77 *	ide_scan_pcibus		-	perform the initial IDE driver scan
78 *
79 *	Perform the initial bus rather than driver ordered scan of the
80 *	PCI drivers. After this all IDE pci handling becomes standard
81 *	module ordering not traditionally ordered.
82 */
83
84static int __init ide_scan_pcibus(void)
85{
86	struct pci_dev *dev = NULL;
87	struct pci_driver *d;
88	struct list_head *l, *n;
89
90	pre_init = 0;
91	for_each_pci_dev(dev)
92		ide_scan_pcidev(dev);
93
94	/*
95	 *	Hand the drivers over to the PCI layer now we
96	 *	are post init.
97	 */
98
99	list_for_each_safe(l, n, &ide_pci_drivers) {
100		list_del(l);
101		d = list_entry(l, struct pci_driver, node);
102		if (__pci_register_driver(d, d->driver.owner,
103					  d->driver.mod_name))
104			printk(KERN_ERR "%s: failed to register %s driver\n",
105					__func__, d->driver.mod_name);
106	}
107
108	return 0;
109}
110
111module_init(ide_scan_pcibus);
112