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.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/drivers/ide/ide-pnp.c b/drivers/ide/ide-pnp.c
index 8a178a55a027..10c20e9a5785 100644
--- a/drivers/ide/ide-pnp.c
+++ b/drivers/ide/ide-pnp.c
@@ -18,6 +18,8 @@
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 */
@@ -29,13 +31,29 @@ static 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(); 59 hwif = ide_find_port();
@@ -54,6 +72,9 @@ static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
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
@@ -65,6 +86,9 @@ static void idepnp_remove(struct pnp_dev *dev)
65 ide_unregister(hwif->index); 86 ide_unregister(hwif->index);
66 else 87 else
67 printk(KERN_ERR "idepnp: Unable to remove device, please report.\n"); 88 printk(KERN_ERR "idepnp: Unable to remove device, please report.\n");
89
90 release_region(pnp_port_start(dev, 1), 1);
91 release_region(pnp_port_start(dev, 0), 8);
68} 92}
69 93
70static struct pnp_driver idepnp_driver = { 94static struct pnp_driver idepnp_driver = {