diff options
| author | Adam Belay <ambx1@neo.rr.com> | 2003-02-19 17:49:06 +0000 |
|---|---|---|
| committer | Adam Belay <ambx1@neo.rr.com> | 2003-02-19 17:49:06 +0000 |
| commit | d27d703a0b68f992d582cf4cec6444b5e1827903 (patch) | |
| tree | 7c0611b7a4071a7c99e81cd966de72f8ed77d4d6 | |
| parent | 05140d26777aa90ec267ab2f2e714502d5bdd9b8 (diff) | |
IDE PnP Update
Updates the IDE PnP driver to the new PnP API.
| -rw-r--r-- | drivers/ide/Kconfig | 13 | ||||
| -rw-r--r-- | drivers/ide/Makefile | 2 | ||||
| -rw-r--r-- | drivers/ide/ide-pnp.c | 112 | ||||
| -rw-r--r-- | drivers/ide/ide.c | 9 | ||||
| -rw-r--r-- | include/linux/ide.h | 1 |
5 files changed, 43 insertions, 94 deletions
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index 0f9b0783ed37..0237a5524e07 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig @@ -239,14 +239,13 @@ config BLK_DEV_CMD640_ENHANCED and your BIOS does not already do this for you, then say Y here. Otherwise say N. -config BLK_DEV_ISAPNP - bool "ISA-PNP EIDE support" - depends on BLK_DEV_IDE && ISAPNP +config BLK_DEV_IDEPNP + bool "PNP EIDE support" + depends on BLK_DEV_IDE && PNP help - If you have an ISA EIDE card that is PnP (Plug and Play) and - requires setup first before scanning for devices, say Y here. - - If unsure, say N. + If you have a PnP (Plug and Play) compatible EIDE card and + would like the kernel to automatically detect and activate + it, say Y here. config BLK_DEV_IDEPCI bool "PCI IDE chipset support" if PCI diff --git a/drivers/ide/Makefile b/drivers/ide/Makefile index 13bc81139536..83ee41a73b97 100644 --- a/drivers/ide/Makefile +++ b/drivers/ide/Makefile @@ -21,7 +21,7 @@ obj-$(CONFIG_BLK_DEV_IDEFLOPPY) += ide-floppy.o obj-$(CONFIG_BLK_DEV_IDEPCI) += setup-pci.o obj-$(CONFIG_BLK_DEV_IDEDMA_PCI) += ide-dma.o obj-$(CONFIG_BLK_DEV_IDE_TCQ) += ide-tcq.o -obj-$(CONFIG_BLK_DEV_ISAPNP) += ide-pnp.o +obj-$(CONFIG_BLK_DEV_IDEPNP) += ide-pnp.o ifeq ($(CONFIG_BLK_DEV_IDE),y) obj-$(CONFIG_PROC_FS) += ide-proc.o diff --git a/drivers/ide/ide-pnp.c b/drivers/ide/ide-pnp.c index 63085d6d00d1..00a240f73c09 100644 --- a/drivers/ide/ide-pnp.c +++ b/drivers/ide/ide-pnp.c @@ -19,9 +19,7 @@ #include <linux/ide.h> #include <linux/init.h> -#include <linux/isapnp.h> - -#define DEV_NAME(dev) (dev->name) +#include <linux/pnp.h> #define GENERIC_HD_DATA 0 #define GENERIC_HD_ERROR 1 @@ -32,31 +30,27 @@ #define GENERIC_HD_SELECT 6 #define GENERIC_HD_STATUS 7 -static int generic_ide_offsets[IDE_NR_PORTS] __initdata = { +static int generic_ide_offsets[IDE_NR_PORTS] = { GENERIC_HD_DATA, GENERIC_HD_ERROR, GENERIC_HD_NSECTOR, GENERIC_HD_SECTOR, GENERIC_HD_LCYL, GENERIC_HD_HCYL, GENERIC_HD_SELECT, GENERIC_HD_STATUS, -1, -1 }; -/* ISA PnP device table entry */ -struct pnp_dev_t { - unsigned short card_vendor, card_device, vendor, device; - int (*init_fn)(struct pnp_dev *dev, int enable); +/* Add your devices here :)) */ +struct pnp_device_id idepnp_devices[] = { + /* Generic ESDI/IDE/ATA compatible hard disk controller */ + {.id = "PNP0600", .driver_data = 0}, + {.id = ""} }; -/* Generic initialisation function for ISA PnP IDE interface */ - -static int __init pnpide_generic_init(struct pnp_dev *dev, int enable) +static int idepnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id) { hw_regs_t hw; ide_hwif_t *hwif; int index; - if (!enable) - return 0; - if (!(pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && pnp_irq_valid(dev, 0))) - return 1; + return -1; ide_setup_ports(&hw, (unsigned long) pnp_port_start(dev, 0), generic_ide_offsets, @@ -68,82 +62,36 @@ static int __init pnpide_generic_init(struct pnp_dev *dev, int enable) index = ide_register_hw(&hw, &hwif); if (index != -1) { - printk(KERN_INFO "ide%d: %s IDE interface\n", index, DEV_NAME(dev)); + printk(KERN_INFO "ide%d: generic PnP IDE interface\n", index); + pnp_set_drvdata(dev,hwif); hwif->pnp_dev = dev; return 0; } - return 1; + return -1; } -/* Add your devices here :)) */ -struct pnp_dev_t idepnp_devices[] __initdata = { - /* Generic ESDI/IDE/ATA compatible hard disk controller */ - { ISAPNP_ANY_ID, ISAPNP_ANY_ID, - ISAPNP_VENDOR('P', 'N', 'P'), ISAPNP_DEVICE(0x0600), - pnpide_generic_init }, - { 0 } -}; +static void idepnp_remove(struct pnp_dev * dev) +{ + ide_hwif_t *hwif = pnp_get_drvdata(dev); + if (hwif) { + ide_unregister(hwif->index); + } else + printk(KERN_ERR "idepnp: Unable to remove device, please report.\n"); +} -#define NR_PNP_DEVICES 8 -struct pnp_dev_inst { - struct pnp_dev *dev; - struct pnp_dev_t *dev_type; +static struct pnp_driver idepnp_driver = { + .name = "ide", + .id_table = idepnp_devices, + .probe = idepnp_probe, + .remove = idepnp_remove, }; -static struct pnp_dev_inst devices[NR_PNP_DEVICES]; -static int pnp_ide_dev_idx = 0; -/* - * Probe for ISA PnP IDE interfaces. - */ -void __init pnpide_init(int enable) +void pnpide_init(int enable) { - struct pnp_dev *dev = NULL; - struct pnp_dev_t *dev_type; - - if (!isapnp_present()) - return; - - /* Module unload, deactivate all registered devices. */ - if (!enable) { - int i; - for (i = 0; i < pnp_ide_dev_idx; i++) { - dev = devices[i].dev; - devices[i].dev_type->init_fn(dev, 0); - pnp_device_detach(dev); - } - return; - } - - for (dev_type = idepnp_devices; dev_type->vendor; dev_type++) { - while ((dev = pnp_find_dev(NULL, dev_type->vendor, - dev_type->device, dev))) { - - if (pnp_device_attach(dev) < 0) - continue; - - if (pnp_activate_dev(dev, NULL) < 0) { - printk(KERN_ERR"ide: %s activate failed\n", DEV_NAME(dev)); - continue; - } - - /* Call device initialization function */ - if (dev_type->init_fn(dev, 1)) { - pnp_device_detach(dev); - } else { -#ifdef MODULE - /* - * Register device in the array to - * deactivate it on a module unload. - */ - if (pnp_ide_dev_idx >= NR_PNP_DEVICES) - return; - devices[pnp_ide_dev_idx].dev = dev; - devices[pnp_ide_dev_idx].dev_type = dev_type; - pnp_ide_dev_idx++; -#endif - } - } - } + if(enable) + pnp_register_driver(&idepnp_driver); + else + pnp_unregister_driver(&idepnp_driver); } diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 46fa224180d4..e4df5743e77f 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c @@ -818,6 +818,7 @@ abort: EXPORT_SYMBOL(ide_unregister); + /** * ide_setup_ports - set up IDE interface ports * @hw: register descriptions @@ -2145,12 +2146,12 @@ static void __init probe_for_hwifs (void) buddha_init(); } #endif /* CONFIG_BLK_DEV_BUDDHA */ -#if defined(CONFIG_BLK_DEV_ISAPNP) && defined(CONFIG_ISAPNP) +#if defined(CONFIG_BLK_DEV_IDEPNP) && defined(CONFIG_PNP) { extern void pnpide_init(int enable); pnpide_init(1); } -#endif /* CONFIG_BLK_DEV_ISAPNP */ +#endif /* CONFIG_BLK_DEV_IDEPNP */ } void __init ide_init_builtin_drivers (void) @@ -2321,9 +2322,9 @@ int ide_unregister_subdriver (ide_drive_t *drive) spin_unlock_irqrestore(&ide_lock, flags); return 1; } -#if defined(CONFIG_BLK_DEV_ISAPNP) && defined(CONFIG_ISAPNP) && defined(MODULE) +#if defined(CONFIG_BLK_DEV_IDEPNP) && defined(CONFIG_PNP) && defined(MODULE) pnpide_init(0); -#endif /* CONFIG_BLK_DEV_ISAPNP */ +#endif /* CONFIG_BLK_DEV_IDEPNP */ #ifdef CONFIG_PROC_FS ide_remove_proc_entries(drive->proc, DRIVER(drive)->proc); ide_remove_proc_entries(drive->proc, generic_subdriver_entries); diff --git a/include/linux/ide.h b/include/linux/ide.h index 32f4e6650463..7510ad7d1aa4 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -1705,6 +1705,7 @@ static inline void ide_release_dma(ide_hwif_t *drive) {;} #endif extern void hwif_unregister(ide_hwif_t *); +extern void ide_unregister (unsigned int index); extern void export_ide_init_queue(ide_drive_t *); extern u8 export_probe_for_drive(ide_drive_t *); |
