| Bartlomiej Zolnierkiewicz | 9ac5922 | 2008-01-26 20:13:09 +0100 | [diff] [blame] | 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 |  | 
| Bartlomiej Zolnierkiewicz | ade2daf | 2008-01-26 20:13:07 +0100 | [diff] [blame] | 10 | #include <linux/kernel.h> | 
|  | 11 | #include <linux/init.h> | 
|  | 12 | #include <linux/module.h> | 
|  | 13 | #include <linux/ide.h> | 
|  | 14 |  | 
| Bartlomiej Zolnierkiewicz | 9ac5922 | 2008-01-26 20:13:09 +0100 | [diff] [blame] | 15 | /* | 
|  | 16 | *	Module interfaces | 
|  | 17 | */ | 
|  | 18 |  | 
|  | 19 | static int pre_init = 1;		/* Before first ordered IDE scan */ | 
|  | 20 | static 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 |  | 
|  | 35 | int __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 | } | 
|  | 44 | EXPORT_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 |  | 
|  | 55 | static 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 |  | 
| Adrian Bunk | 2eae6eb | 2008-02-01 23:09:16 +0100 | [diff] [blame] | 84 | static int __init ide_scan_pcibus(void) | 
| Bartlomiej Zolnierkiewicz | 9ac5922 | 2008-01-26 20:13:09 +0100 | [diff] [blame] | 85 | { | 
|  | 86 | struct pci_dev *dev = NULL; | 
|  | 87 | struct pci_driver *d; | 
|  | 88 | struct list_head *l, *n; | 
|  | 89 |  | 
|  | 90 | pre_init = 0; | 
| Greg Kroah-Hartman | a594eeb | 2008-04-18 00:46:20 +0200 | [diff] [blame] | 91 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev))) | 
|  | 92 | ide_scan_pcidev(dev); | 
| Bartlomiej Zolnierkiewicz | 9ac5922 | 2008-01-26 20:13:09 +0100 | [diff] [blame] | 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", | 
| Harvey Harrison | eb63963 | 2008-04-26 22:25:20 +0200 | [diff] [blame] | 105 | __func__, d->driver.mod_name); | 
| Bartlomiej Zolnierkiewicz | 9ac5922 | 2008-01-26 20:13:09 +0100 | [diff] [blame] | 106 | } | 
|  | 107 |  | 
|  | 108 | return 0; | 
|  | 109 | } | 
|  | 110 |  | 
| Adrian Bunk | 2eae6eb | 2008-02-01 23:09:16 +0100 | [diff] [blame] | 111 | module_init(ide_scan_pcibus); |