aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ide/ide-pnp.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/drivers/ide/ide-pnp.c b/drivers/ide/ide-pnp.c
index 8a178a55a027..a0b7d170ecdb 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();
@@ -45,6 +63,7 @@ static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
45 63
46 ide_init_port_data(hwif, index); 64 ide_init_port_data(hwif, index);
47 ide_init_port_hw(hwif, &hw); 65 ide_init_port_hw(hwif, &hw);
66 hwif->mmio = 1;
48 67
49 printk(KERN_INFO "ide%d: generic PnP IDE interface\n", index); 68 printk(KERN_INFO "ide%d: generic PnP IDE interface\n", index);
50 pnp_set_drvdata(dev, hwif); 69 pnp_set_drvdata(dev, hwif);
@@ -54,6 +73,9 @@ static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
54 return 0; 73 return 0;
55 } 74 }
56 75
76 release_region(ctl, 1);
77 release_region(base, 8);
78
57 return -1; 79 return -1;
58} 80}
59 81
@@ -65,6 +87,9 @@ static void idepnp_remove(struct pnp_dev *dev)
65 ide_unregister(hwif->index); 87 ide_unregister(hwif->index);
66 else 88 else
67 printk(KERN_ERR "idepnp: Unable to remove device, please report.\n"); 89 printk(KERN_ERR "idepnp: Unable to remove device, please report.\n");
90
91 release_region(pnp_port_start(dev, 1), 1);
92 release_region(pnp_port_start(dev, 0), 8);
68} 93}
69 94
70static struct pnp_driver idepnp_driver = { 95static struct pnp_driver idepnp_driver = {