 db210f824c
			
		
	
	
	db210f824c
	
	
	
		
			
			Use for_each_pci_dev() to simplify the code. Signed-off-by: Thiago Farina <tfransosi@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
		
			
				
	
	
		
			111 lines
		
	
	
	
		
			2.7 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
	
		
			2.7 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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);
 |