Patch from Ian Abbot <abbotti@mev.co.uk>:
authorFrank Mori Hess <fmhess@speakeasy.net>
Sat, 4 Jun 2005 14:32:48 +0000 (14:32 +0000)
committerFrank Mori Hess <fmhess@speakeasy.net>
Sat, 4 Jun 2005 14:32:48 +0000 (14:32 +0000)
I've done some work on getting rid of the check_region calls which are now
deprecated.

I first mentioned this back in March and did a little bit of work on it at the time:

https://cvs.comedi.org/pipermail/comedi/2005-March/006971.html
https://cvs.comedi.org/pipermail/comedi/2005-March/006977.html

My new patch seems to be too large for the comedi mailing list - they just
disappear into a black hole, so here is a description of my latest patch:

I used a static inline function called compat__request_region and (re)defined a
macro called request_region to use it.  The result is that drivers can check the
return value of request_region (or pci_request_regions) instead of calling
check_region.  Note that the compat__request_region does not return a pointer to
anything real, but it can be compared to NULL.

The attached patch implements the above compatibility stuff and changes the
drivers to use it (but I changed the amplc_pci230 driver to use
pci_request_regions instead of request_region while I was at it).  I've also
changed the compatibility version of pci_request_regions to avoid calling
check_regions (otherwise it would be called twice) and also made it release any
regions it successfully requested on failure.

Most of the changes to the individual drivers were straightforward.  One or two
required a modicum of thought to release resources on error.

45 files changed:
comedi/drivers/8255.c
comedi/drivers/acl7225b.c
comedi/drivers/adl_pci6208.c
comedi/drivers/adl_pci9118.c
comedi/drivers/adv_pci1710.c
comedi/drivers/amplc_dio200.c
comedi/drivers/amplc_pc236.c
comedi/drivers/amplc_pc263.c
comedi/drivers/amplc_pci230.c
comedi/drivers/cb_pcidas.c
comedi/drivers/comedi_parport.c
comedi/drivers/das08.c
comedi/drivers/das16.c
comedi/drivers/das16m1.c
comedi/drivers/das1800.c
comedi/drivers/das6402.c
comedi/drivers/das800.c
comedi/drivers/dt2801.c
comedi/drivers/dt2811.c
comedi/drivers/dt2814.c
comedi/drivers/dt2815.c
comedi/drivers/dt2817.c
comedi/drivers/dt282x.c
comedi/drivers/fl512.c
comedi/drivers/multiq3.c
comedi/drivers/ni_at_a2150.c
comedi/drivers/ni_at_ao.c
comedi/drivers/ni_atmio.c
comedi/drivers/ni_atmio16d.c
comedi/drivers/ni_labpc.c
comedi/drivers/pcl711.c
comedi/drivers/pcl724.c
comedi/drivers/pcl725.c
comedi/drivers/pcl726.c
comedi/drivers/pcl730.c
comedi/drivers/pcl812.c
comedi/drivers/pcl816.c
comedi/drivers/pcl818.c
comedi/drivers/pcm3730.c
comedi/drivers/pcmad.c
comedi/drivers/poc.c
comedi/drivers/rti800.c
comedi/drivers/rti802.c
include/linux/ioport.h
include/linux/pci.h

index 3a8679b77ba856b6373b50c029c1ac950b3526fb..fa752385d2ab49d2e6ed404a5339723a2764db8a 100644 (file)
@@ -385,13 +385,11 @@ static int dev_8255_attach(comedi_device *dev,comedi_devconfig *it)
                iobase=it->options[i];
 
                printk(" 0x%04x",iobase);
-               if(check_region(iobase,_8255_SIZE)<0){
+               if(!request_region(iobase,_8255_SIZE,"8255")){
                        printk(" (I/O port conflict)");
 
                        dev->subdevices[i].type=COMEDI_SUBD_UNUSED;
                }else{
-                       request_region(iobase,_8255_SIZE,"8255");
-
                        subdev_8255_init(dev,dev->subdevices+i,NULL,iobase);
                }
        }
index e0351bc1360bfaf7ba5eaa748096455336397724..d7c0479eafd5cf6709fd437b02aeda46a170efe7 100644 (file)
@@ -90,13 +90,11 @@ static int acl7225b_attach(comedi_device *dev,comedi_devconfig *it)
        iorange=this_board->io_range;
        printk("comedi%d: acl7225b: board=%s 0x%04x ", dev->minor,
            this_board->name, iobase);
-       if( check_region(iobase, iorange) < 0 )
-    {
+       if( !request_region(iobase, iorange, "acl7225b") ) {
                printk("I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase, iorange, "acl7225b");
-    dev->board_name=this_board->name;
+       dev->board_name=this_board->name;
        dev->iobase=iobase;
        dev->irq=0;
 
index 6023e274a309a41294d7842bc432ea0631d1dc27..ea50c9707d082d0934bf8192017fbe27184d1b1f 100644 (file)
@@ -368,11 +368,6 @@ pci6208_pci_setup(struct pci_dev *pci_dev, int *io_base_ptr, int dev_minor)
                lcr_io_base,
                lcr_io_range);
          
-       if (check_region (lcr_io_base, lcr_io_range) < 0) {
-               printk("comedi%d: I/O port conflict\n",dev_minor);
-               return -EIO;
-       }
-  
        // Read PCI6208 register base address [PCI_BASE_ADDRESS #2].
        io_base = pci_resource_start (pci_dev, 2);
        io_range = pci_resource_end (pci_dev, 2) - io_base +1;
@@ -382,13 +377,11 @@ pci6208_pci_setup(struct pci_dev *pci_dev, int *io_base_ptr, int dev_minor)
                io_base,
                io_range);
        
-       if (check_region (io_base, io_range) < 0) {
+       // Allocate IO ressources         
+       if (pci_request_regions(pci_dev, PCI6208_DRIVER_NAME) < 0) {
                printk("comedi%d: I/O port conflict\n",dev_minor);
                return -EIO;
        }
-  
-       // Allocate IO ressources         
-       pci_request_regions(pci_dev, PCI6208_DRIVER_NAME);
        
        *io_base_ptr = io_base;
        //devpriv->io_range = io_range;
index 119c710f606ca01dd2df6d507de990f899a103f0..0babd0a35b2196a159f74a6130b7d8fb1b745160 100644 (file)
@@ -1706,16 +1706,10 @@ static int pci9118_attach(comedi_device *dev,comedi_devconfig *it)
 
        rt_printk(", b:s:f=%d:%d:%d, io=0x%4x, 0x%4x",pci_bus,pci_slot,pci_func,iobase_9,iobase_a);
        
-        if (check_region(iobase_9, this_board->iorange_9118) < 0) {
+       if (!request_region(iobase_9, this_board->iorange_9118, "ADLink PCI-9118")) {
                rt_printk("I/O port conflict\n");
                return -EIO;
         }
-        if (check_region(iobase_a, this_board->iorange_amcc) < 0) {
-               rt_printk("I/O port conflict\n");
-               return -EIO;
-        }
-
-        request_region(iobase_9, this_board->iorange_9118, "ADLink PCI-9118");
 
         dev->iobase=iobase_9;
        dev->board_name = this_board->name;
@@ -1726,7 +1720,10 @@ static int pci9118_attach(comedi_device *dev,comedi_devconfig *it)
 
        devpriv->amcc=card;
        devpriv->pcidev=card->pcidev;
-        request_region(iobase_a, this_board->iorange_amcc, "ADLink PCI-9118");
+       if (!request_region(iobase_a, this_board->iorange_amcc, "ADLink PCI-9118")) {
+               rt_printk("I/O port conflict\n");
+               return -EIO;
+       }
        devpriv->iobase_a=iobase_a;
        
        if (it->options[3]&2) irq=0; // user don't want use IRQ
@@ -1871,7 +1868,7 @@ static int pci9118_detach(comedi_device *dev)
 {
        if (dev->private) {
                if (devpriv->valid) pci9118_reset(dev);
-               release_region(devpriv->iobase_a,this_board->iorange_amcc);
+               if (devpriv->iobase_a) release_region(devpriv->iobase_a,this_board->iorange_amcc);
                if (devpriv->allocated) pci_card_free(devpriv->amcc);
                if (devpriv->dmabuf_virt[0]) free_pages((unsigned long)devpriv->dmabuf_virt[0],devpriv->dmabuf_pages[0]);
                if (devpriv->dmabuf_virt[1]) free_pages((unsigned long)devpriv->dmabuf_virt[1],devpriv->dmabuf_pages[1]);
index 1fe2e30fc63829927394e3edd4f3b0ff1f80736d..d51298a85bed775b548d7828d50b1062b1f6e8b2 100644 (file)
@@ -1255,13 +1255,12 @@ static int pci1710_attach(comedi_device *dev,comedi_devconfig *it)
 
        rt_printk(", b:s:f=%d:%d:%d, io=0x%4x",pci_bus,pci_slot,pci_func,iobase);
 
-        if (check_region(iobase, this_board->iorange) < 0) {
+       if (!request_region(iobase, this_board->iorange, "Advantech PCI-1710")) {
                pci_card_free(card);
                rt_printk("I/O port conflict\n");
                return -EIO;
         }
 
-        request_region(iobase, this_board->iorange, "Advantech PCI-1710");
         dev->iobase=iobase;
 
        dev->board_name = this_board->name;
index c90b6983f9765f321abaff5a307d77540dfcd55b..e9efe1441f376f9f32f5ecd80ae16f9a18df1093 100644 (file)
@@ -323,12 +323,11 @@ dio200_find_pci(comedi_device *dev, int bus, int slot,
 static int
 dio200_request_region(unsigned minor, unsigned long from, unsigned long extent)
 {
-       if (check_region(from, extent) < 0) {
+       if (!request_region(from, extent, DIO200_DRIVER_NAME)) {
                printk(KERN_ERR "comedi%d: I/O port conflict (%#lx,%lu)!\n",
                                minor, from, extent);
                return -EIO;
        }
-       request_region(from, extent, DIO200_DRIVER_NAME);
        return 0;
 }
 
index 2c4bab78948d316d87c4d8ba30f3c3bd512eb40b..bccd7ca886cf956b3eaf8ce7b6c2eaddcba11d2c 100644 (file)
@@ -366,11 +366,10 @@ static int pc236_detach(comedi_device *dev)
  */
 static int pc236_request_region(unsigned long from, unsigned long extent)
 {
-       if (check_region(from, extent) < 0) {
+       if (!request_region(from, extent, PC236_DRIVER_NAME)) {
                printk("I/O port conflict (%#lx,%lu)!\n", from, extent);
                return -EIO;
        }
-       request_region(from, extent, PC236_DRIVER_NAME);
        return 0;
 }
 
index 6a44acfe4f5e0c8981cae17a0c65afcea5ef02fe..1309c5a793fac83813d9c85238d6b7763bebad06 100644 (file)
@@ -300,11 +300,10 @@ static int pc263_detach(comedi_device *dev)
  */
 static int pc263_request_region(unsigned long from, unsigned long extent)
 {
-       if (check_region(from, extent) < 0) {
+       if (!request_region(from, extent, PC263_DRIVER_NAME)) {
                printk("I/O port conflict (%#lx,%lu)!\n", from, extent);
                return -EIO;
        }
-       request_region(from, extent, PC263_DRIVER_NAME);
        return 0;
 }
 
index abc01daee2dae126e79448448121a0a74a898858..08caa601e2441c3e7737167d66d96cbc7e20e2fd 100644 (file)
@@ -368,20 +368,12 @@ static int pci230_attach(comedi_device *dev,comedi_devconfig *it)
        }
        devpriv->pci_dev = pci_dev;
 
-       /* Reserve I/O space 1. */
-       if(check_region(pci_iobase,PCI230_IO1_SIZE)<0){
-               printk("comedi%d: amplc_pci230: I/O space conflict\n",dev->minor);
+       /* Reserve I/O spaces. */
+       if(pci_request_regions(pci_dev,"PCI230")<0){
+               printk("comedi%d: amplc_pci230: I/O space conflict\n",dev->minor);
                return -EIO;
        }
-       request_region(pci_iobase,PCI230_IO1_SIZE,"PCI230");
        devpriv->pci_iobase = pci_iobase;
-
-       /* Reserve I/O space 2. */
-       if(check_region(iobase,PCI230_IO2_SIZE)<0){
-               printk("comedi%d: amplc_pci230: I/O space 2 conflict\n",dev->minor);
-               return -EIO;
-       }
-       request_region(iobase,PCI230_IO2_SIZE,"PCI230");
        dev->iobase = iobase;
 
 /*
@@ -481,17 +473,13 @@ static int pci230_detach(comedi_device *dev)
        if(dev->subdevices && thisboard->have_dio)
                subdev_8255_cleanup(dev,dev->subdevices + 2);   /* Clean up dio subdevice. */
 
-       if(dev->iobase)
-               release_region(dev->iobase,PCI230_IO2_SIZE);
-
        if(dev->irq)
                comedi_free_irq(dev->irq, dev);
 
        if(devpriv){
-               if(devpriv->pci_iobase){
-                       release_region(devpriv->pci_iobase, PCI230_IO1_SIZE);
-               }
                if(devpriv->pci_dev){
+                       if(devpriv->pci_iobase)
+                               pci_release_regions(devpriv->pci_dev);
                        pci_dev_put(devpriv->pci_dev);
                }
        }
index 25046ade7c537b9759297f5dac5e72e1deb0aaf5..0f7a12839e93bba12f9d2f0ee3cd00ea5748086a 100644 (file)
@@ -575,35 +575,32 @@ found:
 
        // reserve io ports
        err = 0;
-       if(check_region(s5933_config, AMCC_OP_REG_SIZE) < 0)
+       if(request_region(s5933_config, AMCC_OP_REG_SIZE, "cb_pcidas"))
+               devpriv->s5933_config = s5933_config;
+       else
                err++;
-       if(check_region(control_status, CONT_STAT_SIZE) < 0)
+       if(request_region(control_status, CONT_STAT_SIZE, "cb_pcidas"))
+               devpriv->control_status = control_status;
+       else
                err++;
-       if(check_region(adc_fifo, ADC_FIFO_SIZE) < 0)
+       if(request_region(adc_fifo, ADC_FIFO_SIZE, "cb_pcidas"))
+               devpriv->adc_fifo = adc_fifo;
+       else
                err++;
-       if(check_region(pacer_counter_dio, PACER_SIZE) < 0)
+       if(request_region(pacer_counter_dio, PACER_SIZE, "cb_pcidas"))
+               devpriv->pacer_counter_dio = pacer_counter_dio;
+       else
                err++;
        if(thisboard->ao_nchan)
-               if(check_region(ao_registers, AO_SIZE) < 0)
+               if(request_region(ao_registers, AO_SIZE, "cb_pcidas"))
+                       devpriv->ao_registers = ao_registers;
+               else
                        err++;
        if(err)
        {
                printk(" I/O port conflict\n");
                return -EIO;
        }
-       request_region(s5933_config, AMCC_OP_REG_SIZE, "cb_pcidas");
-       devpriv->s5933_config = s5933_config;
-       request_region(control_status, CONT_STAT_SIZE, "cb_pcidas");
-       devpriv->control_status = control_status;
-       request_region(adc_fifo, ADC_FIFO_SIZE, "cb_pcidas");
-       devpriv->adc_fifo = adc_fifo;
-       request_region(pacer_counter_dio, PACER_SIZE, "cb_pcidas");
-       devpriv->pacer_counter_dio = pacer_counter_dio;
-       if(thisboard->ao_nchan)
-       {
-               request_region(ao_registers, AO_SIZE, "cb_pcidas");
-               devpriv->ao_registers = ao_registers;
-       }
 
        // get irq
        if(comedi_request_irq(devpriv->pci_dev->irq, cb_pcidas_interrupt, SA_SHIRQ, "cb_pcidas", dev ))
index 07f64fad94e17cdefc1b75e38505f98a7762a1b4..6bfa5189829db52b1387f759307f6ce22612af8e 100644 (file)
@@ -290,11 +290,10 @@ static int parport_attach(comedi_device *dev,comedi_devconfig *it)
 
        iobase=it->options[0];
        printk("comedi%d: parport: 0x%04x ",dev->minor,iobase);
-       if(check_region(iobase,PARPORT_SIZE)<0){
+       if(!request_region(iobase,PARPORT_SIZE,"parport (comedi)")){
                printk("I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase,PARPORT_SIZE,"parport (comedi)");
        dev->iobase=iobase;
 
        irq=it->options[1];
index c1677af0f173c5934134d244fbea5661a5793fdc..4e47619790913522574c2c5e9a32152a5ed77048 100644 (file)
@@ -819,11 +819,10 @@ int das08_common_attach(comedi_device *dev, unsigned long iobase )
        if(thisboard->bustype != pcmcia)
        {
                printk(" iobase 0x%lx\n", iobase);
-               if(check_region(iobase, thisboard->iosize)<0){
+               if(!request_region(iobase, thisboard->iosize,"das08")){
                        printk(" I/O port conflict\n");
                        return -EIO;
                }
-               request_region(iobase, thisboard->iosize,"das08");
        }
        dev->iobase = iobase;
 
@@ -969,11 +968,10 @@ static int das08_attach(comedi_device *dev,comedi_devconfig *it)
                iobase = pci_resource_start(pdev, 2);
                printk("pcibase 0x%lx ", pci_iobase);
                // reserve io ports for 9052 pci chip
-               if(check_region(pci_iobase,PCIDAS08_SIZE)<0){
+               if(!request_region(pci_iobase,PCIDAS08_SIZE,"das08")){
                        printk(" I/O port conflict\n");
                        return -EIO;
                }
-               request_region(pci_iobase,PCIDAS08_SIZE,"das08");
                devpriv->pci_iobase = pci_iobase;
 #if 0
 /* We could enable to pci-das08's interrupt here to make it possible
index ba4f894d0357e765aad91f0b42dc53711968792a..0b8de4cfc143388ec9d910d1081775e9054e5d8f 100644 (file)
@@ -1421,7 +1421,7 @@ static int das16_attach(comedi_device *dev, comedi_devconfig *it)
 
        if(thisboard->size<0x400){
                printk(" 0x%04x-0x%04x\n", iobase, iobase+thisboard->size);
-               if(check_region(iobase,thisboard->size)<0){
+               if(!request_region(iobase,thisboard->size,"das16")){
                        printk(" I/O port conflict\n");
                        return -EIO;
                }
@@ -1429,12 +1429,13 @@ static int das16_attach(comedi_device *dev, comedi_devconfig *it)
                printk(" 0x%04x-0x%04x 0x%04x-0x%04x\n",
                           iobase,iobase+0x0f,
                           iobase+0x400,iobase+0x400+(thisboard->size&0x3ff));
-               if(check_region(iobase,0x10) < 0) {
+               if(!request_region(iobase,0x10,"das16")){
                        printk(" I/O port conflict:  0x%04x-0x%04x\n",
                                   iobase,iobase+0x0f);
                        return -EIO;
                }
-               if(check_region(iobase+0x400,thisboard->size&0x3ff)<0){
+               if(!request_region(iobase+0x400,thisboard->size&0x3ff,"das16")){
+                       release_region(iobase, 0x10);
                        printk(" I/O port conflict:  0x%04x-0x%04x\n",
                                   iobase+0x400,
                                   iobase+0x400+(thisboard->size&0x3ff));
@@ -1442,13 +1443,6 @@ static int das16_attach(comedi_device *dev, comedi_devconfig *it)
                }
        }
 
-       if(thisboard->size < 0x400){
-               request_region(iobase,thisboard->size,"das16");
-       }else{
-               request_region(iobase,0x10,"das16");
-               request_region(iobase+0x400,thisboard->size&0x3ff,"das16");
-       }
-
        dev->iobase = iobase;
 
        // probe id bits to make sure they are consistent
index 0399476cc9f9ee4d56dbe78c050750db4533adad..3472811a0c0840d72d52bac65a847170ee158e0e 100644 (file)
@@ -648,16 +648,15 @@ static int das16m1_attach(comedi_device *dev, comedi_devconfig *it)
        printk(" io 0x%x-0x%x 0x%x-0x%x",
                   iobase, iobase + DAS16M1_SIZE,
                   iobase + DAS16M1_82C55, iobase + DAS16M1_82C55 + DAS16M1_SIZE2);
-       if(check_region(iobase, DAS16M1_SIZE) < 0) {
+       if(!request_region(iobase, DAS16M1_SIZE, driver_das16m1.driver_name)) {
                printk(" I/O port conflict\n");
                return -EIO;
        }
-       if(check_region(iobase + DAS16M1_82C55, DAS16M1_SIZE2) < 0){
+       if(!request_region(iobase + DAS16M1_82C55, DAS16M1_SIZE2, driver_das16m1.driver_name)) {
+               release_region(iobase , DAS16M1_SIZE);
                printk(" I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase, DAS16M1_SIZE, driver_das16m1.driver_name);
-       request_region(iobase + DAS16M1_82C55, DAS16M1_SIZE2, driver_das16m1.driver_name);
        dev->iobase = iobase;
 
        /* now for the irq */
index 0c88596dcc6ab45cd2659e70c2e58c6c8208d1af..b799ab25dd04ddb15b68cfa259b442d08cb6f437 100644 (file)
@@ -617,13 +617,12 @@ static int das1800_attach(comedi_device *dev, comedi_devconfig *it)
        }
 
        /* check if io addresses are available */
-       if(check_region(iobase, DAS1800_SIZE) < 0)
+       if(!request_region(iobase, DAS1800_SIZE, driver_das1800.driver_name))
        {
                printk(" I/O port conflict: failed to allocate ports 0x%x to 0x%x\n",
                        iobase, iobase + DAS1800_SIZE - 1);
                return -EIO;
        }
-       request_region(iobase, DAS1800_SIZE, driver_das1800.driver_name);
        dev->iobase = iobase;
 
        board = das1800_probe(dev);
@@ -640,13 +639,12 @@ static int das1800_attach(comedi_device *dev, comedi_devconfig *it)
        if(thisboard->ao_ability == 2)
        {
                iobase2 = iobase + IOBASE2;
-               if(check_region(iobase2, DAS1800_SIZE) < 0)
+               if(!request_region(iobase2, DAS1800_SIZE, driver_das1800.driver_name))
                {
                        printk(" I/O port conflict: failed to allocate ports 0x%x to 0x%x\n",
                                iobase2, iobase2 + DAS1800_SIZE - 1);
                        return -EIO;
                }
-               request_region(iobase2, DAS1800_SIZE, driver_das1800.driver_name);
                devpriv->iobase2 = iobase2;
        }
 
index 5cdfe909919e06a6dffad6a23fa9f74a300e8b95..d970615199e4c3f4308805fb5eb47c3fb87f9413 100644 (file)
@@ -311,11 +311,10 @@ static int das6402_attach(comedi_device *dev,comedi_devconfig *it)
 
        printk("comedi%d: das6402: 0x%04x",dev->minor,iobase);
 
-       if(check_region(iobase,DAS6402_SIZE)<0){
+       if(!request_region(iobase,DAS6402_SIZE,"das6402")){
                printk(" I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase,DAS6402_SIZE,"das6402");
        dev->iobase=iobase;
 
        /* should do a probe here */
index 1895853cebf5d04711bc059c90d9fa34c83380a2..f1d83c4b4731941b28f082d653ead8af6e18af1c 100644 (file)
@@ -477,12 +477,11 @@ static int das800_attach(comedi_device *dev, comedi_devconfig *it)
        }
 
        /* check if io addresses are available */
-       if(check_region(iobase, DAS800_SIZE) < 0)
+       if(!request_region(iobase, DAS800_SIZE, "das800"))
        {
                printk("I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase, DAS800_SIZE, "das800");
        dev->iobase = iobase;
 
        board = das800_probe(dev);
index d7c6829d4ae2b8fccaf52e4a23c0ac1172b5df8c..eeea7072be0e5fe2baba039151ce3fdc4fd643e9 100644 (file)
@@ -492,11 +492,10 @@ static int dt2801_attach(comedi_device *dev,comedi_devconfig *it)
        int n_ai_chans;
 
        iobase=it->options[0];
-       if(check_region(iobase,DT2801_IOSIZE)<0){
+       if(!request_region(iobase, DT2801_IOSIZE, "dt2801")){
                comedi_error(dev,"I/O port conflict");
                return -EIO;
        }
-       request_region(iobase, DT2801_IOSIZE, "dt2801");
        dev->iobase=iobase;
 
        /* do some checking */
index bcbd86ac5832dd4278952b88f31172c2a99def7e..494e0d4b77af7a3727958ea0f0fea143060acab4 100644 (file)
@@ -307,11 +307,10 @@ static int dt2811_attach(comedi_device * dev, comedi_devconfig * it)
 
        printk("comedi%d: dt2811: base=0x%04x\n", dev->minor, iobase);
 
-       if (check_region(iobase, DT2811_SIZE) < 0) {
+       if (!request_region(iobase, DT2811_SIZE, driver_name)) {
                printk("I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase, DT2811_SIZE, driver_name);
 
        dev->iobase = iobase;
        dev->board_name = this_board->name;
index 0b16d54956143331c944f6b4cf36b23e462535d7..eea183653f35a38c02de83cfbbc875a919442b50 100644 (file)
@@ -241,11 +241,10 @@ static int dt2814_attach(comedi_device *dev,comedi_devconfig *it)
 
        iobase=it->options[0];
        printk("comedi%d: dt2814: 0x%04lx ",dev->minor,dev->iobase);
-       if(check_region(iobase,DT2814_SIZE)<0){
+       if(!request_region(iobase,DT2814_SIZE,"dt2814")){
                printk("I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase,DT2814_SIZE,"dt2814");
        dev->iobase=iobase;
        dev->board_name = "dt2814";
 
index 72faec621033bf99d64c8c7a65d1da3178fe4e9b..aafe13de27804bcc2b807dc9b1ba19591ab931c1 100644 (file)
@@ -182,11 +182,10 @@ static int dt2815_attach(comedi_device * dev, comedi_devconfig * it)
 
   iobase = it->options[0];
   printk("comedi%d: dt2815: 0x%04x ", dev->minor, iobase);
-  if (check_region(iobase, DT2815_SIZE) < 0) {
+  if (!request_region(iobase, DT2815_SIZE, "dt2815")) {
     printk("I/O port conflict\n");
     return -EIO;
   }
-  request_region(iobase, DT2815_SIZE, "dt2815");
 
   dev->iobase = iobase;
   dev->board_name = "dt2815";
index 35421f989e15b84266ff2b407c1112bbeb893200..9a86a62b665e851e91de61a7340a8fa676af0377 100644 (file)
@@ -131,11 +131,10 @@ static int dt2817_attach(comedi_device *dev,comedi_devconfig *it)
 
        iobase=it->options[0];
        printk("comedi%d: dt2817: 0x%04x ",dev->minor,iobase);
-       if(check_region(iobase,DT2817_SIZE)<0){
+       if(!request_region(iobase,DT2817_SIZE,"dt2817")){
                printk("I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase,DT2817_SIZE,"dt2817");
        dev->iobase = iobase;
        dev->board_name="dt2817";
 
index 01e179d40e33c813eaf2f9189ff157c0736efb08..4ce4fbdf1686d300101e1cea9744c7fd5e1caa20 100644 (file)
@@ -1218,11 +1218,10 @@ static int dt282x_attach(comedi_device * dev, comedi_devconfig * it)
        if(!iobase)iobase = 0x240;
 
        printk("comedi%d: dt282x: 0x%04x", dev->minor, iobase);
-       if (check_region(iobase, DT2821_SIZE) < 0) {
+       if (!request_region(iobase, DT2821_SIZE, "dt282x")) {
                printk(" I/O port conflict\n");
                return -EBUSY;
        }
-       request_region(iobase, DT2821_SIZE, "dt282x");
        dev->iobase = iobase;
 
        outw(DT2821_BDINIT, dev->iobase + DT2821_SUPCSR);
index c2957f2e7bb52e1ca314ac4044a6d647248bedc6..fc42a641ec63e51c017b62fef2d78cc8cc4a2d8f 100644 (file)
@@ -141,11 +141,10 @@ static int fl512_attach(comedi_device *dev,comedi_devconfig *it)
 
   iobase = it->options[0];
   printk("comedi:%d fl512: 0x%04x",dev->minor,iobase);
-  if (check_region(iobase, FL512_SIZE) < 0) {
+  if (!request_region(iobase, FL512_SIZE, "fl512")) {
     printk(" I/O port conflict\n");
     return -EIO;
   }
-  request_region(iobase, FL512_SIZE, "fl512");
   dev->iobase = iobase;
   dev->board_name = "fl512";
   if(alloc_private(dev,sizeof(fl512_private)) < 0)
index 83257a58ac084f57204edf9e1f74ab7a33a6e8eb..691750992ba3e1119b8fbc2fb4d85dbdf7ce82d4 100644 (file)
@@ -238,12 +238,11 @@ static int multiq3_attach(comedi_device * dev, comedi_devconfig * it)
 
     iobase = it->options[0];
     printk("comedi%d: multiq3: 0x%04x ", dev->minor, iobase);
-    if (check_region(iobase, MULTIQ3_SIZE) < 0) {
+    if (!request_region(iobase, MULTIQ3_SIZE, "multiq3")) {
       printk("comedi%d: I/O port conflict\n", dev->minor);
       return -EIO;
     }
 
-      request_region(iobase, MULTIQ3_SIZE, "multiq3");
       dev->iobase = iobase;
 
       irq = it->options[1];
index 77559c1cb9089638e3257de0f1dff4ea782bc30e..cf421d559de72740a1d9e0c3be0934d0123c523d 100644 (file)
@@ -365,12 +365,11 @@ static int a2150_attach(comedi_device *dev, comedi_devconfig *it)
        }
 
        /* check if io addresses are available */
-       if(check_region(iobase, A2150_SIZE) < 0)
+       if(!request_region(iobase, A2150_SIZE, driver_a2150.driver_name))
        {
                printk(" I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase, A2150_SIZE, driver_a2150.driver_name);
        dev->iobase = iobase;
 
        /* grab our IRQ */
index 5f0e57d8c4c494d9d8190c5249a127abe29e35a9..0e084ee26d9eae577aadd2254cce9810e24689ef 100644 (file)
@@ -216,11 +216,10 @@ static int atao_attach(comedi_device *dev,comedi_devconfig *it)
        
        printk("comedi%d: ni_at_ao: 0x%04lx",dev->minor,iobase);
        
-       if(check_region(iobase, ATAO_SIZE) < 0){
+       if(!request_region(iobase, ATAO_SIZE, "ni_at_ao")){
                printk(" I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase, ATAO_SIZE, "ni_at_ao");
        dev->iobase = iobase;
 
        //dev->board_ptr = atao_probe(dev);
index 1ac604bd3c30ac0721bb220714998b1637fd8b3c..5d545b07f81a679acf8fff647778ad702b9c90f5 100644 (file)
@@ -434,11 +434,10 @@ static int ni_atmio_attach(comedi_device *dev,comedi_devconfig *it)
        /* reserve our I/O region */
 
        printk("comedi%d: ni_atmio: 0x%04x",dev->minor,iobase);
-       if(check_region(iobase,NI_SIZE)<0){
+       if(!request_region(iobase,NI_SIZE,"ni_atmio")){
                printk(" I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase,NI_SIZE,"ni_atmio");
 
        dev->iobase=iobase;
 
index 6bb043409d77a8d211f995007a988ecbc9e2a8ae..0dd3fc95cb968607aebf890febd008c043f3197f 100644 (file)
@@ -706,11 +706,10 @@ static int atmio16d_attach(comedi_device * dev, comedi_devconfig * it)
        /* make sure the address range is free and allocate it */
        iobase = it->options[0];
        printk("comedi%d: atmio16d: 0x%04x ", dev->minor, iobase);
-       if (check_region(iobase, ATMIO16D_SIZE) < 0) {
+       if (!request_region(iobase, ATMIO16D_SIZE, "ni_atmio16d")) {
                printk("I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase, ATMIO16D_SIZE, "ni_atmio16d");
        dev->iobase = iobase;
 
        
index 9b5680249d74d411ccd9b7293cb7105973cb9bd5..69556267e8de60e67e439ea2f0e6e3f17ad5d0f6 100644 (file)
@@ -494,12 +494,11 @@ int labpc_common_attach( comedi_device *dev, unsigned long iobase,
        if(thisboard->bustype == isa_bustype)
        {
                /* check if io addresses are available */
-               if(check_region(iobase, LABPC_SIZE) < 0)
+               if(!request_region(iobase, LABPC_SIZE, driver_labpc.driver_name))
                {
                        printk("I/O port conflict\n");
                        return -EIO;
                }
-               request_region(iobase, LABPC_SIZE, driver_labpc.driver_name);
        }
        dev->iobase = iobase;
 
index a8e91316a85b11fab2a3692d4311ff34570cc0e4..6c05d029ca1d981db3f4a9a16e1fb7a114fd97aa 100644 (file)
@@ -499,11 +499,10 @@ static int pcl711_attach(comedi_device * dev, comedi_devconfig * it)
 
        iobase = it->options[0];
        printk("comedi%d: pcl711: 0x%04x ", dev->minor, iobase);
-       if (check_region(iobase, PCL711_SIZE) < 0) {
+       if (!request_region(iobase, PCL711_SIZE, "pcl711")) {
                printk("I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase, PCL711_SIZE, "pcl711");
        dev->iobase = iobase;
 
        /* there should be a sanity check here */
index 522f017867e9b256a5cf0f95fc457d22a199a5fc..28bf8d610ba6e52c133f77ee2ca23c0134850c8b 100644 (file)
@@ -133,12 +133,11 @@ static int pcl724_attach(comedi_device *dev,comedi_devconfig *it)
                iorange=PCL722_96_SIZE; // PCL-724 in 96 DIO configuration
        printk("comedi%d: pcl724: board=%s, 0x%03x ",dev->minor,
                this_board->name,iobase);
-       if(check_region(iobase,iorange)<0){
+       if(!request_region(iobase, iorange, "pcl724")){
                printk("I/O port conflict\n");
                return -EIO;
        }
 
-        request_region(iobase, iorange, "pcl724");
         dev->iobase=iobase;
 
        dev->board_name = this_board->name;
index af864e76b23b409c842a1a4be850b69047dacf10..a9d29b3ee696676134151a6e525036cb47dff3f9 100644 (file)
@@ -64,11 +64,10 @@ static int pcl725_attach(comedi_device *dev,comedi_devconfig *it)
 
        iobase=it->options[0];
        printk("comedi%d: pcl725: 0x%04x ",dev->minor,iobase);
-       if(check_region(iobase,PCL725_SIZE)<0){
+       if(!request_region(iobase,PCL725_SIZE,"pcl725")){
                printk("I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase,PCL725_SIZE,"pcl725");
        dev->board_name="pcl725";
        dev->iobase=iobase;
        dev->irq=0;
index 1f1bfadccb8e0ea12d5282e1166e1b950732e87b..2f15431eff52bc8ea47e16a6aa9f7a3d2f2606b3 100644 (file)
@@ -245,12 +245,11 @@ static int pcl726_attach(comedi_device *dev,comedi_devconfig *it)
         iobase=it->options[0];
         iorange=this_board->io_range;
        printk("comedi%d: pcl726: board=%s, 0x%03x ",dev->minor,this_board->name,iobase);
-       if(check_region(iobase,iorange)<0){
+       if(!request_region(iobase, iorange, "pcl726")){
                printk("I/O port conflict\n");
                return -EIO;
        }
        
-        request_region(iobase, iorange, "pcl726");
         dev->iobase=iobase;
     
        dev->board_name = this_board->name;
index 70c3f5e2299702c93d294469a284202ad7ccec07..797213ea998fea49a8b8b99c9428a198e0b0e19e 100644 (file)
@@ -95,13 +95,11 @@ static int pcl730_attach(comedi_device *dev,comedi_devconfig *it)
        iorange=this_board->io_range;
        printk("comedi%d: pcl730: board=%s 0x%04x ", dev->minor,
                        this_board->name, iobase);
-       if( check_region(iobase, iorange) < 0 )
-    {
+       if( !request_region(iobase, iorange, "pcl730") ) {
                printk("I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase, iorange, "pcl730");
-    dev->board_name=this_board->name;
+       dev->board_name=this_board->name;
        dev->iobase=iobase;
        dev->irq=0;
 
index 88bf4525cbdd9faf64eccc21343018f2f1f9647b..3877404bddf08ba42f542791784ff7fc056bac3f 100644 (file)
@@ -1183,11 +1183,10 @@ static int pcl812_attach(comedi_device * dev, comedi_devconfig * it)
        printk("comedi%d: pcl812:  board=%s, ioport=0x%03x", dev->minor,
                this_board->name, iobase);
 
-       if (check_region(iobase, this_board->io_range) < 0) {
+       if (!request_region(iobase, this_board->io_range, "pcl812")) {
                printk("I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase, this_board->io_range, "pcl812");
        dev->iobase = iobase;
 
        if ((ret = alloc_private(dev, sizeof(pcl812_private))) < 0) {
index 621a8c45f74989a17d362c508d5f62ed7a5b4503..276e9553d1e99d2855993d8115428b3dc0d1bbbf 100644 (file)
@@ -1024,12 +1024,11 @@ pcl816_attach (comedi_device * dev, comedi_devconfig * it)
   printk("comedi%d: pcl816:  board=%s, ioport=0x%03x", dev->minor,
                this_board->name, iobase);
                 
-  if (check_region (iobase, this_board->io_range) < 0) {
+  if (!request_region (iobase, this_board->io_range, "pcl816")) {
       rt_printk ("I/O port conflict\n");
       return -EIO;
   }
 
-  request_region (iobase, this_board->io_range, "pcl816");
   dev->iobase = iobase;
 
   if (pcl816_check (iobase)) {
@@ -1084,9 +1083,8 @@ pcl816_attach (comedi_device * dev, comedi_devconfig * it)
     {                          // we want to use DMA
       if (RTC_lock == 0)
        {
-         if (check_region (RTC_PORT (0), RTC_IO_EXTENT) < 0)
+         if (!request_region (RTC_PORT (0), RTC_IO_EXTENT, "pcl816 (RTC)"))
            goto no_rtc;
-         request_region (RTC_PORT (0), RTC_IO_EXTENT, "pcl816 (RTC)");
        }
       devpriv->rtc_iobase = RTC_PORT (0);
       devpriv->rtc_iosize = RTC_IO_EXTENT;
index be2a9b407db2713f60bd152ee8cff025920995ce..6c211801497af4dec59ef383b8cd98466bb4c389 100644 (file)
@@ -1597,12 +1597,11 @@ static int pcl818_attach(comedi_device * dev, comedi_devconfig * it)
                devpriv->io_range=PCLx1xFIFO_RANGE;
                devpriv->usefifo = 1;
        }
-       if (check_region(iobase, this_board->io_range) < 0) {
+       if (!request_region(iobase, devpriv->io_range, "pcl818")) {
                rt_printk("I/O port conflict\n");
                return -EIO;
        }
 
-       request_region(iobase, devpriv->io_range, "pcl818");
        dev->iobase=iobase;
 
        if (pcl818_check(iobase)) {
@@ -1642,8 +1641,8 @@ static int pcl818_attach(comedi_device * dev, comedi_devconfig * it)
         devpriv->dma_rtc=0;
         if (it->options[2]>0) { // we want to use DMA
                if (RTC_lock==0) {
-                       if (check_region(RTC_PORT(0), RTC_IO_EXTENT) < 0) goto no_rtc;
-                       request_region(RTC_PORT(0), RTC_IO_EXTENT, "pcl818 (RTC)");
+                       if (!request_region(RTC_PORT(0), RTC_IO_EXTENT, "pcl818 (RTC)"))
+                               goto no_rtc;
                } 
                devpriv->rtc_iobase=RTC_PORT(0);
                devpriv->rtc_iosize=RTC_IO_EXTENT;
index 34be1f5c741b0c678a01fddf1583993f6e61684d..bbe75eb38b3e84c88655e2417bbdcc419a610057 100644 (file)
@@ -69,11 +69,10 @@ static int pcm3730_attach(comedi_device *dev,comedi_devconfig *it)
 
        iobase=it->options[0];
        printk("comedi%d: pcm3730: 0x%04x ",dev->minor,iobase);
-       if(check_region(iobase,PCM3730_SIZE)<0){
+       if(!request_region(iobase,PCM3730_SIZE,"pcm3730")){
                printk("I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase,PCM3730_SIZE,"pcm3730");
        dev->iobase=iobase;
        dev->board_name="pcm3730";
        dev->iobase=dev->iobase;
index 8b5c99b013e6f82a618563a2405d0dc8b2e5e65d..509f4f158f4f8163dc4ca8adf1eed50fd6ddd7b8 100644 (file)
@@ -135,11 +135,10 @@ static int pcmad_attach(comedi_device *dev,comedi_devconfig *it)
 
        iobase=it->options[0];
        printk("comedi%d: pcmad: 0x%04x ",dev->minor,iobase);
-       if(check_region(iobase,PCMAD_SIZE)<0){
+       if(!request_region(iobase,PCMAD_SIZE,"pcmad")){
                printk("I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase,PCMAD_SIZE,"pcmad");
        dev->iobase=iobase;
 
        if((ret=alloc_subdevices(dev, 1))<0)
index 6dbeb82399cf1e9eb9dce220301d6392f5aa124c..8dc2dd1b5493a66db07c333ca9d5ebb79d2d6346 100644 (file)
@@ -127,13 +127,12 @@ static int poc_attach(comedi_device *dev, comedi_devconfig *it)
 
        iosize = this_board->iosize;
        /* check if io addresses are available */
-       if(check_region(iobase, iosize) < 0)
+       if(!request_region(iobase, iosize, "dac02"))
        {
                printk("I/O port conflict: failed to allocate ports 0x%x to 0x%x\n",
                        iobase, iobase + iosize - 1);
                return -EIO;
        }
-       request_region(iobase, iosize, "dac02");
        dev->iobase = iobase;
 
        if(alloc_subdevices(dev, 1) < 0)
index c0512cd897dbbb3f834df0c65025cb6fcd1b8fe1..f15fa47ba735aec691150ce6e25358a1f5cdc7e7 100644 (file)
@@ -302,11 +302,10 @@ static int rti800_attach(comedi_device * dev, comedi_devconfig * it)
 
        iobase = it->options[0];
        printk("comedi%d: rti800: 0x%04x ", dev->minor, iobase);
-       if (check_region(iobase, RTI800_SIZE) < 0) {
+       if (!request_region(iobase, RTI800_SIZE, "rti800")) {
                printk("I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase, RTI800_SIZE, "rti800");
        dev->iobase = iobase;
 
 #ifdef DEBUG
index f5a50573f67d4a215456cb51fcd0ae6e6647bd1f..3b9612b057bac10117319d5d767c2e98cb84cccb 100644 (file)
@@ -105,11 +105,10 @@ static int rti802_attach(comedi_device * dev, comedi_devconfig * it)
 
        iobase = it->options[0];
        printk("comedi%d: rti802: 0x%04x ", dev->minor, iobase);
-       if (check_region(iobase, RTI802_SIZE) < 0) {
+       if (!request_region(iobase, RTI802_SIZE, "rti802")) {
                printk("I/O port conflict\n");
                return -EIO;
        }
-       request_region(iobase, RTI802_SIZE, "rti802");
        dev->iobase = iobase;
 
        dev->board_name = "rti802";
index 1b59cc59dbe33345b73323062a43758413726844..1755fe3ad87fc86162294dec7f3a13a98356edf3 100644 (file)
 
 #include_next <linux/ioport.h>
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,11)
+
+/* 'struct resource' not defined.  Define a dummy version. */
+struct resource {
+       int dummy;
+};
+
+/* Define a compatible version of request_region that returns a pointer
+ * to a non-NULL value on success.  */
+static inline struct resource *compat__request_region(unsigned long from,
+               unsigned long extent, const char *name)
+{
+       if (check_region(from, extent) < 0) {
+               return (struct resource *)0;
+       }
+       request_region(from, extent, name);
+       return ((struct resource *)0 + 1);      /* Should be non-NULL */
+}
+
+/* Replace existing request_region macro/function. */
+#undef request_region
+#define request_region(f,e,n)  compat__request_region(f,e,n)
+
+#endif
+
 #endif // _COMPAT_IOPORT_H
 
index e295c534fbd166d24fb1e816473637cf5d2b56fc..ea1f41944539b4bdf3c7866445f870164638f87d 100644 (file)
@@ -103,26 +103,26 @@ static inline int pci_request_regions(struct pci_dev *dev, char *name)
                if(dev->base_address[i])
                {
                        if(dev->base_address[i] & PCI_BASE_ADDRESS_SPACE_IO)
-                               retval = check_region(pci_resource_start(dev, i),
-                                       fake_length);
-                       if( retval )
-                               break;
+                               if(!request_region(pci_resource_start(dev, i),
+                                       fake_length, name))
+                               {
+                                       retval = -EBUSY;
+                                       break;
+                               }
                }
        }
 
-       if(retval) return retval;
-
-       for(i = 0; i < max_num_base_addr; i++)
+       if(retval)
        {
-               if(dev->base_address[i])
+               while(--i >= 0)
                {
                        if(dev->base_address[i] & PCI_BASE_ADDRESS_SPACE_IO)
-                               request_region(pci_resource_start(dev, i),
-                                       fake_length, name);
+                               release_region(pci_resource_start(dev, i),
+                                       fake_length);
                }
        }
 
-       return 0;
+       return retval;
 }
 
 static inline void pci_release_regions(struct pci_dev *dev)