ide-pnp: manage I/O resources in driver
PATCH 1/3 ide-pnp: manage I/O resources in driver
* Tell IDE layer to not manage resources by setting hwif->mmio flag.
* Use {request,release}_region() for resources management.
* Use driver name for resources management.
Signed-off-by Bartlomiej Zolnierkiewicz <[email protected]>
--- drivers/ide/ide-pnp.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-)
drivers/ide/ide-pnp.c +27 -2
@@ -18,6 +18,8 @@#include <linux/pnp.h> #include <linux/ide.h> +#define DRV_NAME "ide-pnp" +/* Add your devices here :)) */ static struct pnp_device_id idepnp_devices[] = {/* Generic ESDI/IDE/ATA compatible hard disk controller */
@@ -29,13 +31,29 @@ static int idepnp_probe(struct pnp_dev * {hw_regs_t hw;ide_hwif_t *hwif; +unsigned long base, ctl;if (!(pnp_port_valid (dev,0 ) &&pnp_port_valid (dev,1 ) &&pnp_irq_valid (dev,0 )))return -1 ; + base =pnp_port_start (dev,0 ); + ctl =pnp_port_start (dev,1 ); + +if (!request_region (base,8 ,DRV_NAME )) { +printk (KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n" , +DRV_NAME , base, base +7 ); +return -EBUSY ; + } + +if (!request_region (ctl,1 ,DRV_NAME )) { +printk (KERN_ERR "%s: I/O resource 0x%lX not free.\n" , +DRV_NAME , ctl); +release_region (base,8 ); +return -EBUSY ; + } +memset (&hw,0 ,sizeof (hw)); -ide_std_init_ports (&hw,pnp_port_start (dev,0 ), -pnp_port_start (dev,1 )); +ide_std_init_ports (&hw, base, ctl); hw.irq =pnp_irq (dev,0 ); hwif =ide_find_port ();
@@ -45,6 +63,7 @@ static int idepnp_probe(struct pnp_dev *ide_init_port_data (hwif, index);ide_init_port_hw (hwif, &hw); + hwif->mmio =1 ;printk (KERN_INFO "ide%d: generic PnP IDE interface\n" , index);pnp_set_drvdata (dev, hwif);
@@ -54,6 +73,9 @@ static int idepnp_probe(struct pnp_dev *return 0 ; } +release_region (ctl,1 ); +release_region (base,8 ); +return -1 ; }
@@ -65,6 +87,9 @@ static void idepnp_remove(struct pnp_devide_unregister (hwif->index); else printk(KERN_ERR "idepnp: Unable to remove device, please report.\n"); + +release_region (pnp_port_start (dev,1 ),1 ); +release_region (pnp_port_start (dev,0 ),8 ); }static struct pnp_driver idepnp_driver = {