| /* | 
 |  * support for probing IDE PCI devices in the PCI bus order | 
 |  * | 
 |  * Copyright (c) 1998-2000  Andre Hedrick <andre@linux-ide.org> | 
 |  * Copyright (c) 1995-1998  Mark Lord | 
 |  * | 
 |  * May be copied or modified under the terms of the GNU General Public License | 
 |  */ | 
 |  | 
 | #include <linux/kernel.h> | 
 | #include <linux/init.h> | 
 | #include <linux/module.h> | 
 | #include <linux/ide.h> | 
 |  | 
 | /* | 
 |  *	Module interfaces | 
 |  */ | 
 |  | 
 | static int pre_init = 1;		/* Before first ordered IDE scan */ | 
 | static LIST_HEAD(ide_pci_drivers); | 
 |  | 
 | /* | 
 |  *	__ide_pci_register_driver	-	attach IDE driver | 
 |  *	@driver: pci driver | 
 |  *	@module: owner module of the driver | 
 |  * | 
 |  *	Registers a driver with the IDE layer. The IDE layer arranges that | 
 |  *	boot time setup is done in the expected device order and then | 
 |  *	hands the controllers off to the core PCI code to do the rest of | 
 |  *	the work. | 
 |  * | 
 |  *	Returns are the same as for pci_register_driver | 
 |  */ | 
 |  | 
 | int __ide_pci_register_driver(struct pci_driver *driver, struct module *module, | 
 | 			      const char *mod_name) | 
 | { | 
 | 	if (!pre_init) | 
 | 		return __pci_register_driver(driver, module, mod_name); | 
 | 	driver->driver.owner = module; | 
 | 	list_add_tail(&driver->node, &ide_pci_drivers); | 
 | 	return 0; | 
 | } | 
 | EXPORT_SYMBOL_GPL(__ide_pci_register_driver); | 
 |  | 
 | /** | 
 |  *	ide_scan_pcidev		-	find an IDE driver for a device | 
 |  *	@dev: PCI device to check | 
 |  * | 
 |  *	Look for an IDE driver to handle the device we are considering. | 
 |  *	This is only used during boot up to get the ordering correct. After | 
 |  *	boot up the pci layer takes over the job. | 
 |  */ | 
 |  | 
 | static int __init ide_scan_pcidev(struct pci_dev *dev) | 
 | { | 
 | 	struct list_head *l; | 
 | 	struct pci_driver *d; | 
 |  | 
 | 	list_for_each(l, &ide_pci_drivers) { | 
 | 		d = list_entry(l, struct pci_driver, node); | 
 | 		if (d->id_table) { | 
 | 			const struct pci_device_id *id = | 
 | 				pci_match_id(d->id_table, dev); | 
 |  | 
 | 			if (id != NULL && d->probe(dev, id) >= 0) { | 
 | 				dev->driver = d; | 
 | 				pci_dev_get(dev); | 
 | 				return 1; | 
 | 			} | 
 | 		} | 
 | 	} | 
 | 	return 0; | 
 | } | 
 |  | 
 | /** | 
 |  *	ide_scan_pcibus		-	perform the initial IDE driver scan | 
 |  * | 
 |  *	Perform the initial bus rather than driver ordered scan of the | 
 |  *	PCI drivers. After this all IDE pci handling becomes standard | 
 |  *	module ordering not traditionally ordered. | 
 |  */ | 
 |  | 
 | static int __init ide_scan_pcibus(void) | 
 | { | 
 | 	struct pci_dev *dev = NULL; | 
 | 	struct pci_driver *d; | 
 | 	struct list_head *l, *n; | 
 |  | 
 | 	pre_init = 0; | 
 | 	for_each_pci_dev(dev) | 
 | 		ide_scan_pcidev(dev); | 
 |  | 
 | 	/* | 
 | 	 *	Hand the drivers over to the PCI layer now we | 
 | 	 *	are post init. | 
 | 	 */ | 
 |  | 
 | 	list_for_each_safe(l, n, &ide_pci_drivers) { | 
 | 		list_del(l); | 
 | 		d = list_entry(l, struct pci_driver, node); | 
 | 		if (__pci_register_driver(d, d->driver.owner, | 
 | 					  d->driver.mod_name)) | 
 | 			printk(KERN_ERR "%s: failed to register %s driver\n", | 
 | 					__func__, d->driver.mod_name); | 
 | 	} | 
 |  | 
 | 	return 0; | 
 | } | 
 |  | 
 | module_init(ide_scan_pcibus); |