2 * linux/drivers/ide/ide-pnp.c
4 * This file provides autodetection for ISA PnP IDE interfaces.
5 * It was tested with "ESS ES1868 Plug and Play AudioDrive" IDE interface.
7 * Copyright (C) 2000 Andrey Panin <pazke@orbita.don.sitek.net>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2, or (at your option)
14 * You should have received a copy of the GNU General Public License
15 * (for example /usr/src/linux/COPYING); if not, write to the Free
16 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 #include <linux/ide.h>
20 #include <linux/init.h>
22 #include <linux/isapnp.h>
24 #define DEV_IO(dev, index) (dev->resource[index].start)
25 #define DEV_IRQ(dev, index) (dev->irq_resource[index].start)
27 #define DEV_NAME(dev) (dev->bus->name ? dev->bus->name : "ISA PnP")
29 #define GENERIC_HD_DATA 0
30 #define GENERIC_HD_ERROR 1
31 #define GENERIC_HD_NSECTOR 2
32 #define GENERIC_HD_SECTOR 3
33 #define GENERIC_HD_LCYL 4
34 #define GENERIC_HD_HCYL 5
35 #define GENERIC_HD_SELECT 6
36 #define GENERIC_HD_STATUS 7
38 static int generic_ide_offsets[IDE_NR_PORTS] __initdata = {
39 GENERIC_HD_DATA, GENERIC_HD_ERROR, GENERIC_HD_NSECTOR,
40 GENERIC_HD_SECTOR, GENERIC_HD_LCYL, GENERIC_HD_HCYL,
41 GENERIC_HD_SELECT, GENERIC_HD_STATUS, -1, -1
44 /* ISA PnP device table entry */
46 unsigned short card_vendor, card_device, vendor, device;
47 int (*init_fn)(struct pci_dev *dev, int enable);
50 /* Generic initialisation function for ISA PnP IDE interface */
52 static int __init pnpide_generic_init(struct pci_dev *dev, int enable)
60 if (!(DEV_IO(dev, 0) && DEV_IO(dev, 1) && DEV_IRQ(dev, 0)))
63 ide_setup_ports(&hw, (ide_ioreg_t) DEV_IO(dev, 0),
65 (ide_ioreg_t) DEV_IO(dev, 1),
67 // generic_pnp_ide_iops,
70 index = ide_register_hw(&hw, NULL);
73 printk(KERN_INFO "ide%d: %s IDE interface\n", index, DEV_NAME(dev));
80 /* Add your devices here :)) */
81 struct pnp_dev_t idepnp_devices[] __initdata = {
82 /* Generic ESDI/IDE/ATA compatible hard disk controller */
83 { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
84 ISAPNP_VENDOR('P', 'N', 'P'), ISAPNP_DEVICE(0x0600),
85 pnpide_generic_init },
89 #define NR_PNP_DEVICES 8
92 struct pnp_dev_t *dev_type;
94 static struct pnp_dev_inst devices[NR_PNP_DEVICES];
95 static int pnp_ide_dev_idx = 0;
98 * Probe for ISA PnP IDE interfaces.
101 void __init pnpide_init(int enable)
103 struct pci_dev *dev = NULL;
104 struct pnp_dev_t *dev_type;
106 if (!isapnp_present())
109 /* Module unload, deactivate all registered devices. */
112 for (i = 0; i < pnp_ide_dev_idx; i++) {
113 dev = devices[i].dev;
114 devices[i].dev_type->init_fn(dev, 0);
116 dev->deactivate(dev);
121 for (dev_type = idepnp_devices; dev_type->vendor; dev_type++) {
122 while ((dev = isapnp_find_dev(NULL, dev_type->vendor,
123 dev_type->device, dev))) {
128 if (dev->prepare && dev->prepare(dev) < 0) {
129 printk(KERN_ERR"ide-pnp: %s prepare failed\n", DEV_NAME(dev));
133 if (dev->activate && dev->activate(dev) < 0) {
134 printk(KERN_ERR"ide: %s activate failed\n", DEV_NAME(dev));
138 /* Call device initialization function */
139 if (dev_type->init_fn(dev, 1)) {
140 if (dev->deactivate(dev))
141 dev->deactivate(dev);
145 * Register device in the array to
146 * deactivate it on a module unload.
148 if (pnp_ide_dev_idx >= NR_PNP_DEVICES)
150 devices[pnp_ide_dev_idx].dev = dev;
151 devices[pnp_ide_dev_idx].dev_type = dev_type;