aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-pnp.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide/ide-pnp.c')
-rw-r--r--drivers/ide/ide-pnp.c45
1 files changed, 33 insertions, 12 deletions
diff --git a/drivers/ide/ide-pnp.c b/drivers/ide/ide-pnp.c
index 34c2ad36ce54..6a8953f68e9f 100644
--- a/drivers/ide/ide-pnp.c
+++ b/drivers/ide/ide-pnp.c
@@ -11,34 +11,52 @@
11 * 11 *
12 * You should have received a copy of the GNU General Public License 12 * You should have received a copy of the GNU General Public License
13 * (for example /usr/src/linux/COPYING); if not, write to the Free 13 * (for example /usr/src/linux/COPYING); if not, write to the Free
14 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 14 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
15 */ 15 */
16 16
17#include <linux/init.h> 17#include <linux/init.h>
18#include <linux/pnp.h> 18#include <linux/pnp.h>
19#include <linux/ide.h> 19#include <linux/ide.h>
20 20
21#define DRV_NAME "ide-pnp"
22
21/* Add your devices here :)) */ 23/* Add your devices here :)) */
22static struct pnp_device_id idepnp_devices[] = { 24static struct pnp_device_id idepnp_devices[] = {
23 /* Generic ESDI/IDE/ATA compatible hard disk controller */ 25 /* Generic ESDI/IDE/ATA compatible hard disk controller */
24 {.id = "PNP0600", .driver_data = 0}, 26 {.id = "PNP0600", .driver_data = 0},
25 {.id = ""} 27 {.id = ""}
26}; 28};
27 29
28static int idepnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id) 30static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
29{ 31{
30 hw_regs_t hw; 32 hw_regs_t hw;
31 ide_hwif_t *hwif; 33 ide_hwif_t *hwif;
34 unsigned long base, ctl;
32 35
33 if (!(pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && pnp_irq_valid(dev, 0))) 36 if (!(pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && pnp_irq_valid(dev, 0)))
34 return -1; 37 return -1;
35 38
39 base = pnp_port_start(dev, 0);
40 ctl = pnp_port_start(dev, 1);
41
42 if (!request_region(base, 8, DRV_NAME)) {
43 printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n",
44 DRV_NAME, base, base + 7);
45 return -EBUSY;
46 }
47
48 if (!request_region(ctl, 1, DRV_NAME)) {
49 printk(KERN_ERR "%s: I/O resource 0x%lX not free.\n",
50 DRV_NAME, ctl);
51 release_region(base, 8);
52 return -EBUSY;
53 }
54
36 memset(&hw, 0, sizeof(hw)); 55 memset(&hw, 0, sizeof(hw));
37 ide_std_init_ports(&hw, pnp_port_start(dev, 0), 56 ide_std_init_ports(&hw, base, ctl);
38 pnp_port_start(dev, 1));
39 hw.irq = pnp_irq(dev, 0); 57 hw.irq = pnp_irq(dev, 0);
40 58
41 hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]); 59 hwif = ide_find_port();
42 if (hwif) { 60 if (hwif) {
43 u8 index = hwif->index; 61 u8 index = hwif->index;
44 u8 idx[4] = { index, 0xff, 0xff, 0xff }; 62 u8 idx[4] = { index, 0xff, 0xff, 0xff };
@@ -47,24 +65,27 @@ static int idepnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id
47 ide_init_port_hw(hwif, &hw); 65 ide_init_port_hw(hwif, &hw);
48 66
49 printk(KERN_INFO "ide%d: generic PnP IDE interface\n", index); 67 printk(KERN_INFO "ide%d: generic PnP IDE interface\n", index);
50 pnp_set_drvdata(dev,hwif); 68 pnp_set_drvdata(dev, hwif);
51 69
52 ide_device_add(idx, NULL); 70 ide_device_add(idx, NULL);
53 71
54 return 0; 72 return 0;
55 } 73 }
56 74
75 release_region(ctl, 1);
76 release_region(base, 8);
77
57 return -1; 78 return -1;
58} 79}
59 80
60static void idepnp_remove(struct pnp_dev * dev) 81static void idepnp_remove(struct pnp_dev *dev)
61{ 82{
62 ide_hwif_t *hwif = pnp_get_drvdata(dev); 83 ide_hwif_t *hwif = pnp_get_drvdata(dev);
63 84
64 if (hwif) 85 ide_unregister(hwif);
65 ide_unregister(hwif->index); 86
66 else 87 release_region(pnp_port_start(dev, 1), 1);
67 printk(KERN_ERR "idepnp: Unable to remove device, please report.\n"); 88 release_region(pnp_port_start(dev, 0), 8);
68} 89}
69 90
70static struct pnp_driver idepnp_driver = { 91static struct pnp_driver idepnp_driver = {