]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
comedi: comedi_8254: Replace comedi_8254_init() and comedi_8254_mm_init()
authorIan Abbott <abbotti@mev.co.uk>
Wed, 13 Sep 2023 17:07:02 +0000 (18:07 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 5 Oct 2023 11:34:04 +0000 (13:34 +0200)
`comedi_8254_init()` and `comedi_8254_mm_init()` return `NULL` on
failure, but the failure is not necessarily due to lack of memory.
Change them to return an `ERR_PTR` value on failure and rename the
functions to make it obvious the API has changed.  `comedi_8254_init()`
has been replaced with `comedi_8254_io_alloc()`, and
`comedi_8254_mm_init()` has been replaced with `comedi_8254_mm_alloc()`.

Cc: Arnd Bergmann <arnd@kernel.org>
Cc: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Link: https://lore.kernel.org/r/20230913170712.111719-4-abbotti@mev.co.uk
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
29 files changed:
drivers/comedi/drivers.c
drivers/comedi/drivers/adl_pci9111.c
drivers/comedi/drivers/adl_pci9118.c
drivers/comedi/drivers/adv_pci1710.c
drivers/comedi/drivers/adv_pci_dio.c
drivers/comedi/drivers/aio_aio12_8.c
drivers/comedi/drivers/amplc_dio200_common.c
drivers/comedi/drivers/amplc_pci224.c
drivers/comedi/drivers/amplc_pci230.c
drivers/comedi/drivers/cb_das16_cs.c
drivers/comedi/drivers/cb_pcidas.c
drivers/comedi/drivers/cb_pcimdas.c
drivers/comedi/drivers/comedi_8254.c
drivers/comedi/drivers/das08.c
drivers/comedi/drivers/das16.c
drivers/comedi/drivers/das16m1.c
drivers/comedi/drivers/das1800.c
drivers/comedi/drivers/das6402.c
drivers/comedi/drivers/das800.c
drivers/comedi/drivers/me4000.c
drivers/comedi/drivers/ni_at_a2150.c
drivers/comedi/drivers/ni_at_ao.c
drivers/comedi/drivers/ni_labpc_common.c
drivers/comedi/drivers/pcl711.c
drivers/comedi/drivers/pcl812.c
drivers/comedi/drivers/pcl816.c
drivers/comedi/drivers/pcl818.c
drivers/comedi/drivers/rtd520.c
include/linux/comedi/comedi_8254.h

index d4e2ed709bfc7a5e27dd2361fa61ae6d1a85ebb2..376130bfba8a2c237939b115754aa538941be00e 100644 (file)
@@ -177,7 +177,8 @@ static void comedi_device_detach_cleanup(struct comedi_device *dev)
                dev->n_subdevices = 0;
        }
        kfree(dev->private);
-       kfree(dev->pacer);
+       if (!IS_ERR(dev->pacer))
+               kfree(dev->pacer);
        dev->private = NULL;
        dev->pacer = NULL;
        dev->driver = NULL;
index c50f94272a7404d9c57b81b84b31f375a6e2e43e..086d93f40cb98e3fb4d2b8a943f75a1b2a1c1f3f 100644 (file)
@@ -647,10 +647,10 @@ static int pci9111_auto_attach(struct comedi_device *dev,
                        dev->irq = pcidev->irq;
        }
 
-       dev->pacer = comedi_8254_init(dev->iobase + PCI9111_8254_BASE_REG,
-                                     I8254_OSC_BASE_2MHZ, I8254_IO16, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(dev->iobase + PCI9111_8254_BASE_REG,
+                                         I8254_OSC_BASE_2MHZ, I8254_IO16, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
        ret = comedi_alloc_subdevices(dev, 4);
        if (ret)
index 9a816c71830312e8dbeea3bbf4bca5b8c2faf246..a76e2666d583bccf9c6f1ef39c123cb5737def5c 100644 (file)
@@ -1524,10 +1524,10 @@ static int pci9118_common_attach(struct comedi_device *dev,
        devpriv->iobase_a = pci_resource_start(pcidev, 0);
        dev->iobase = pci_resource_start(pcidev, 2);
 
-       dev->pacer = comedi_8254_init(dev->iobase + PCI9118_TIMER_BASE,
-                                     I8254_OSC_BASE_4MHZ, I8254_IO32, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(dev->iobase + PCI9118_TIMER_BASE,
+                                         I8254_OSC_BASE_4MHZ, I8254_IO32, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
        pci9118_reset(dev);
 
index 4f26399682602545ca83042a6bfca072060549dd..c49b0f1f52283ed37588710dbd5f6435e581685e 100644 (file)
@@ -767,10 +767,10 @@ static int pci1710_auto_attach(struct comedi_device *dev,
                return ret;
        dev->iobase = pci_resource_start(pcidev, 2);
 
-       dev->pacer = comedi_8254_init(dev->iobase + PCI171X_TIMER_BASE,
-                                     I8254_OSC_BASE_10MHZ, I8254_IO16, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(dev->iobase + PCI171X_TIMER_BASE,
+                                         I8254_OSC_BASE_10MHZ, I8254_IO16, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
        n_subdevices = 1;       /* all boards have analog inputs */
        if (board->has_ao)
index efa3e46b554bea1b4452ad8128a8e15abec0c1b8..0319d8c7ee4703cd21d0639e8f93f07d19855709 100644 (file)
@@ -664,11 +664,11 @@ static int pci_dio_auto_attach(struct comedi_device *dev,
        if (board->timer_regbase) {
                s = &dev->subdevices[subdev++];
 
-               dev->pacer = comedi_8254_init(dev->iobase +
-                                             board->timer_regbase,
-                                             0, I8254_IO8, 0);
-               if (!dev->pacer)
-                       return -ENOMEM;
+               dev->pacer =
+                   comedi_8254_io_alloc(dev->iobase + board->timer_regbase,
+                                        0, I8254_IO8, 0);
+               if (IS_ERR(dev->pacer))
+                       return PTR_ERR(dev->pacer);
 
                comedi_8254_subdevice_init(s, dev->pacer);
        }
index 30b8a32204d8265468b5c0a108f56e63a240e0b4..f9d40fa3d3a9ca2f9788d268cff9ba6366b301a8 100644 (file)
@@ -206,10 +206,10 @@ static int aio_aio12_8_attach(struct comedi_device *dev,
        if (ret)
                return ret;
 
-       dev->pacer = comedi_8254_init(dev->iobase + AIO12_8_8254_BASE_REG,
-                                     0, I8254_IO8, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(dev->iobase + AIO12_8_8254_BASE_REG,
+                                         0, I8254_IO8, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
        ret = comedi_alloc_subdevices(dev, 4);
        if (ret)
index 2c1507a23f8af79f12c3de4e6aa5ceb72053b70e..19166cb26f5eec7b17c694e812448c2cf5f72f7f 100644 (file)
@@ -556,14 +556,14 @@ static int dio200_subdev_8254_init(struct comedi_device *dev,
        }
 
        if (dev->mmio) {
-               i8254 = comedi_8254_mm_init(dev->mmio + offset,
-                                           0, I8254_IO8, regshift);
+               i8254 = comedi_8254_mm_alloc(dev->mmio + offset,
+                                            0, I8254_IO8, regshift);
        } else {
-               i8254 = comedi_8254_init(dev->iobase + offset,
-                                        0, I8254_IO8, regshift);
+               i8254 = comedi_8254_io_alloc(dev->iobase + offset,
+                                            0, I8254_IO8, regshift);
        }
-       if (!i8254)
-               return -ENOMEM;
+       if (IS_ERR(i8254))
+               return PTR_ERR(i8254);
 
        comedi_8254_subdevice_init(s, i8254);
 
index 5a04e55daeea267370037baa179ac4b9fb948632..1373637c2ca22cd5b351a0b9a06d0cfef1c223c9 100644 (file)
@@ -1051,10 +1051,10 @@ pci224_auto_attach(struct comedi_device *dev, unsigned long context_model)
        outw(devpriv->daccon | PCI224_DACCON_FIFORESET,
             dev->iobase + PCI224_DACCON);
 
-       dev->pacer = comedi_8254_init(devpriv->iobase1 + PCI224_Z2_BASE,
-                                     I8254_OSC_BASE_10MHZ, I8254_IO8, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(devpriv->iobase1 + PCI224_Z2_BASE,
+                                         I8254_OSC_BASE_10MHZ, I8254_IO8, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
        ret = comedi_alloc_subdevices(dev, 1);
        if (ret)
index 92ba8b8c0172a3156d08dd64249dd55fe616b245..783da73877b91f977104317dcf4346865f31e239 100644 (file)
@@ -2475,10 +2475,10 @@ static int pci230_auto_attach(struct comedi_device *dev,
                        dev->irq = pci_dev->irq;
        }
 
-       dev->pacer = comedi_8254_init(dev->iobase + PCI230_Z2_CT_BASE,
-                                     0, I8254_IO8, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(dev->iobase + PCI230_Z2_CT_BASE,
+                                         0, I8254_IO8, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
        rc = comedi_alloc_subdevices(dev, 3);
        if (rc)
index 8e0d2fa5f95d8c44c901566c6fec0620f3b36a9a..306208a0695b913339d7f187f21949c43de88f56 100644 (file)
@@ -363,10 +363,10 @@ static int das16cs_auto_attach(struct comedi_device *dev,
        if (!devpriv)
                return -ENOMEM;
 
-       dev->pacer = comedi_8254_init(dev->iobase + DAS16CS_TIMER_BASE,
-                                     I8254_OSC_BASE_10MHZ, I8254_IO16, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(dev->iobase + DAS16CS_TIMER_BASE,
+                                         I8254_OSC_BASE_10MHZ, I8254_IO16, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
        ret = comedi_alloc_subdevices(dev, 4);
        if (ret)
index 0c7576b967fca2dd580313d3c84e8f613267c3c0..7a6cd681e932b612df3b574a01bc0c8780cd4c35 100644 (file)
@@ -1288,16 +1288,16 @@ static int cb_pcidas_auto_attach(struct comedi_device *dev,
        }
        dev->irq = pcidev->irq;
 
-       dev->pacer = comedi_8254_init(dev->iobase + PCIDAS_AI_8254_BASE,
-                                     I8254_OSC_BASE_10MHZ, I8254_IO8, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(dev->iobase + PCIDAS_AI_8254_BASE,
+                                         I8254_OSC_BASE_10MHZ, I8254_IO8, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
-       devpriv->ao_pacer = comedi_8254_init(dev->iobase + PCIDAS_AO_8254_BASE,
-                                            I8254_OSC_BASE_10MHZ,
-                                            I8254_IO8, 0);
-       if (!devpriv->ao_pacer)
-               return -ENOMEM;
+       devpriv->ao_pacer =
+           comedi_8254_io_alloc(dev->iobase + PCIDAS_AO_8254_BASE,
+                                I8254_OSC_BASE_10MHZ, I8254_IO8, 0);
+       if (IS_ERR(devpriv->ao_pacer))
+               return PTR_ERR(devpriv->ao_pacer);
 
        ret = comedi_alloc_subdevices(dev, 7);
        if (ret)
@@ -1453,7 +1453,8 @@ static void cb_pcidas_detach(struct comedi_device *dev)
                if (devpriv->amcc)
                        outl(INTCSR_INBOX_INTR_STATUS,
                             devpriv->amcc + AMCC_OP_REG_INTCSR);
-               kfree(devpriv->ao_pacer);
+               if (!IS_ERR(devpriv->ao_pacer))
+                       kfree(devpriv->ao_pacer);
        }
        comedi_pci_detach(dev);
 }
index 8bdb00774f11b085ea239de8f9ffd4977f57bbd1..5816ef65ed5faefa312e7c3b862ce01541bde85c 100644 (file)
@@ -364,11 +364,11 @@ static int cb_pcimdas_auto_attach(struct comedi_device *dev,
        devpriv->BADR3 = pci_resource_start(pcidev, 3);
        dev->iobase = pci_resource_start(pcidev, 4);
 
-       dev->pacer = comedi_8254_init(devpriv->BADR3 + PCIMDAS_8254_BASE,
-                                     cb_pcimdas_pacer_clk(dev),
-                                     I8254_IO8, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(devpriv->BADR3 + PCIMDAS_8254_BASE,
+                                         cb_pcimdas_pacer_clk(dev),
+                                         I8254_IO8, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
        ret = comedi_alloc_subdevices(dev, 6);
        if (ret)
index 3f8657fc7ee5a1482f0c3d8ddc1e45ccc15a3a4e..6965969445066de6ddaf209e881e780fbdb7911b 100644 (file)
  *
  * This module provides the following basic functions:
  *
- * comedi_8254_init() / comedi_8254_mm_init()
+ * comedi_8254_io_alloc() / comedi_8254_mm_alloc()
  *     Initializes this module to access the 8254 registers. The _mm version
- *     sets up the module for MMIO register access the other for PIO access.
- *     The pointer returned from these functions is normally stored in the
- *     comedi_device dev->pacer and will be freed by the comedi core during
- *     the driver (*detach). If a driver has multiple 8254 devices, they need
- *     to be stored in the drivers private data and freed when the driver is
- *     detached.
+ *     sets up the module for MMIO register access; the _io version sets it
+ *     up for PIO access.  These functions return a pointer to a struct
+ *     comedi_8254 on success, or an ERR_PTR value on failure.  The pointer
+ *     returned from these functions is normally stored in the comedi_device
+ *     dev->pacer and will be freed by the comedi core during the driver
+ *     (*detach). If a driver has multiple 8254 devices, they need to be
+ *     stored in the drivers private data and freed when the driver is
+ *     detached.  If the ERR_PTR value is stored, code should check the
+ *     pointer value with !IS_ERR(pointer) before freeing.
  *
  *     NOTE: The counters are reset by setting them to I8254_MODE0 as part of
  *     this initialization.
@@ -621,14 +624,14 @@ static struct comedi_8254 *__i8254_init(comedi_8254_iocb_fn *iocb,
        /* sanity check that the iosize is valid */
        if (!(iosize == I8254_IO8 || iosize == I8254_IO16 ||
              iosize == I8254_IO32))
-               return NULL;
+               return ERR_PTR(-EINVAL);
 
        if (!iocb)
-               return NULL;
+               return ERR_PTR(-EINVAL);
 
        i8254 = kzalloc(sizeof(*i8254), GFP_KERNEL);
        if (!i8254)
-               return NULL;
+               return ERR_PTR(-ENOMEM);
 
        i8254->iocb     = iocb;
        i8254->context  = context;
@@ -646,17 +649,19 @@ static struct comedi_8254 *__i8254_init(comedi_8254_iocb_fn *iocb,
 }
 
 /**
- * comedi_8254_init - allocate and initialize the 8254 device for pio access
+ * comedi_8254_io_alloc - allocate and initialize the 8254 device for pio access
  * @iobase:    port I/O base address
  * @osc_base:  base time of the counter in ns
  *             OPTIONAL - only used by comedi_8254_cascade_ns_to_timer()
  * @iosize:    I/O register size
  * @regshift:  register gap shift
+ *
+ * Return: A pointer to a struct comedi_8254 or an ERR_PTR value.
  */
-struct comedi_8254 *comedi_8254_init(unsigned long iobase,
-                                    unsigned int osc_base,
-                                    unsigned int iosize,
-                                    unsigned int regshift)
+struct comedi_8254 *comedi_8254_io_alloc(unsigned long iobase,
+                                        unsigned int osc_base,
+                                        unsigned int iosize,
+                                        unsigned int regshift)
 {
        comedi_8254_iocb_fn *iocb;
 
@@ -671,24 +676,26 @@ struct comedi_8254 *comedi_8254_init(unsigned long iobase,
                iocb = i8254_io32_cb;
                break;
        default:
-               return NULL;
+               return ERR_PTR(-EINVAL);
        }
        return __i8254_init(iocb, iobase, osc_base, iosize, regshift);
 }
-EXPORT_SYMBOL_GPL(comedi_8254_init);
+EXPORT_SYMBOL_GPL(comedi_8254_io_alloc);
 
 /**
- * comedi_8254_mm_init - allocate and initialize the 8254 device for mmio access
+ * comedi_8254_mm_alloc - allocate and initialize the 8254 device for mmio access
  * @mmio:      memory mapped I/O base address
  * @osc_base:  base time of the counter in ns
  *             OPTIONAL - only used by comedi_8254_cascade_ns_to_timer()
  * @iosize:    I/O register size
  * @regshift:  register gap shift
+ *
+ * Return: A pointer to a struct comedi_8254 or an ERR_PTR value.
  */
-struct comedi_8254 *comedi_8254_mm_init(void __iomem *mmio,
-                                       unsigned int osc_base,
-                                       unsigned int iosize,
-                                       unsigned int regshift)
+struct comedi_8254 *comedi_8254_mm_alloc(void __iomem *mmio,
+                                        unsigned int osc_base,
+                                        unsigned int iosize,
+                                        unsigned int regshift)
 {
        comedi_8254_iocb_fn *iocb;
 
@@ -703,11 +710,11 @@ struct comedi_8254 *comedi_8254_mm_init(void __iomem *mmio,
                iocb = i8254_mmio32_cb;
                break;
        default:
-               return NULL;
+               return ERR_PTR(-EINVAL);
        }
        return __i8254_init(iocb, (unsigned long)mmio, osc_base, iosize, regshift);
 }
-EXPORT_SYMBOL_GPL(comedi_8254_mm_init);
+EXPORT_SYMBOL_GPL(comedi_8254_mm_alloc);
 
 static int __init comedi_8254_module_init(void)
 {
index f8ab3af2e3910cf0302a8df7c3bda4d7ee33ccca..6a3b5411aa9046a3f0872aa4765b6815e5a4a864 100644 (file)
@@ -439,10 +439,11 @@ int das08_common_attach(struct comedi_device *dev, unsigned long iobase)
        /* Counter subdevice (8254) */
        s = &dev->subdevices[5];
        if (board->i8254_offset) {
-               dev->pacer = comedi_8254_init(dev->iobase + board->i8254_offset,
-                                             0, I8254_IO8, 0);
-               if (!dev->pacer)
-                       return -ENOMEM;
+               dev->pacer =
+                   comedi_8254_io_alloc(dev->iobase + board->i8254_offset,
+                                        0, I8254_IO8, 0);
+               if (IS_ERR(dev->pacer))
+                       return PTR_ERR(dev->pacer);
 
                comedi_8254_subdevice_init(s, dev->pacer);
        } else {
index 728dc02156c87d9aabf2c2ad1652e56eadf75a68..bfe8811be1b5c15089849a01986de594c447c50e 100644 (file)
@@ -1067,10 +1067,10 @@ static int das16_attach(struct comedi_device *dev, struct comedi_devconfig *it)
                        osc_base = I8254_OSC_BASE_1MHZ / it->options[3];
        }
 
-       dev->pacer = comedi_8254_init(dev->iobase + DAS16_TIMER_BASE_REG,
-                                     osc_base, I8254_IO8, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(dev->iobase + DAS16_TIMER_BASE_REG,
+                                         osc_base, I8254_IO8, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
        das16_alloc_dma(dev, it->options[2]);
 
index 275effb77746b6d58aebdd4300a95577a26924d6..ff9c5a8897bdca2df012a124c2f693f59c24b94c 100644 (file)
@@ -529,15 +529,16 @@ static int das16m1_attach(struct comedi_device *dev,
                        dev->irq = it->options[1];
        }
 
-       dev->pacer = comedi_8254_init(dev->iobase + DAS16M1_8254_IOBASE2,
-                                     I8254_OSC_BASE_10MHZ, I8254_IO8, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(dev->iobase + DAS16M1_8254_IOBASE2,
+                                         I8254_OSC_BASE_10MHZ, I8254_IO8, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
-       devpriv->counter = comedi_8254_init(dev->iobase + DAS16M1_8254_IOBASE1,
-                                           0, I8254_IO8, 0);
-       if (!devpriv->counter)
-               return -ENOMEM;
+       devpriv->counter =
+           comedi_8254_io_alloc(dev->iobase + DAS16M1_8254_IOBASE1,
+                                0, I8254_IO8, 0);
+       if (IS_ERR(devpriv->counter))
+               return PTR_ERR(devpriv->counter);
 
        ret = comedi_alloc_subdevices(dev, 4);
        if (ret)
@@ -603,7 +604,8 @@ static void das16m1_detach(struct comedi_device *dev)
        if (devpriv) {
                if (devpriv->extra_iobase)
                        release_region(devpriv->extra_iobase, DAS16M1_SIZE2);
-               kfree(devpriv->counter);
+               if (!IS_ERR(devpriv->counter))
+                       kfree(devpriv->counter);
        }
        comedi_legacy_detach(dev);
 }
index f09608c0f4ff7ebcad5288a6114c5997c9206fb7..7117c67aee7e13e240f5f22abf9c96559ac6cc51 100644 (file)
@@ -1233,10 +1233,10 @@ static int das1800_attach(struct comedi_device *dev,
        if (!devpriv->fifo_buf)
                return -ENOMEM;
 
-       dev->pacer = comedi_8254_init(dev->iobase + DAS1800_COUNTER,
-                                     I8254_OSC_BASE_5MHZ, I8254_IO8, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(dev->iobase + DAS1800_COUNTER,
+                                         I8254_OSC_BASE_5MHZ, I8254_IO8, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
        ret = comedi_alloc_subdevices(dev, 4);
        if (ret)
index 1af394591e748055bcb33dc89d9b68e15e45557c..68f95330de45fd4dd7c753c2bb74ffd595686bbe 100644 (file)
@@ -590,10 +590,10 @@ static int das6402_attach(struct comedi_device *dev,
                }
        }
 
-       dev->pacer = comedi_8254_init(dev->iobase + DAS6402_TIMER_BASE,
-                                     I8254_OSC_BASE_10MHZ, I8254_IO8, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(dev->iobase + DAS6402_TIMER_BASE,
+                                         I8254_OSC_BASE_10MHZ, I8254_IO8, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
        ret = comedi_alloc_subdevices(dev, 4);
        if (ret)
index 4ca33f46eaa7367923e1ae01de7eae86bfdd3db8..3007755230314f3bf08c3aafe6339cda6e08f90b 100644 (file)
@@ -672,10 +672,10 @@ static int das800_attach(struct comedi_device *dev, struct comedi_devconfig *it)
                        dev->irq = irq;
        }
 
-       dev->pacer = comedi_8254_init(dev->iobase + DAS800_8254,
-                                     I8254_OSC_BASE_1MHZ, I8254_IO8, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(dev->iobase + DAS800_8254,
+                                         I8254_OSC_BASE_1MHZ, I8254_IO8, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
        ret = comedi_alloc_subdevices(dev, 3);
        if (ret)
index 9aea02b86ed912fe7a00b46909d682a509e980cc..7dd3a007186300ffa250a152b3513ad7618418e2 100644 (file)
@@ -1209,9 +1209,9 @@ static int me4000_auto_attach(struct comedi_device *dev,
                if (!timer_base)
                        return -ENODEV;
 
-               dev->pacer = comedi_8254_init(timer_base, 0, I8254_IO8, 0);
-               if (!dev->pacer)
-                       return -ENOMEM;
+               dev->pacer = comedi_8254_io_alloc(timer_base, 0, I8254_IO8, 0);
+               if (IS_ERR(dev->pacer))
+                       return PTR_ERR(dev->pacer);
 
                comedi_8254_subdevice_init(s, dev->pacer);
        } else {
index df8d219e67234e74ba7ca97743ec48b4286e2ee6..e4e5a0ebd195a4df475e8941b81a6d0b8a8358f7 100644 (file)
@@ -707,10 +707,10 @@ static int a2150_attach(struct comedi_device *dev, struct comedi_devconfig *it)
        /* an IRQ and DMA are required to support async commands */
        a2150_alloc_irq_and_dma(dev, it);
 
-       dev->pacer = comedi_8254_init(dev->iobase + I8253_BASE_REG,
-                                     0, I8254_IO8, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(dev->iobase + I8253_BASE_REG,
+                                         0, I8254_IO8, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
        ret = comedi_alloc_subdevices(dev, 1);
        if (ret)
index 9f3147b72aa811d4a5df6b6b327ed7f639854649..9cf6b4ff6b653560e775428901db05174d73cc6d 100644 (file)
@@ -303,10 +303,10 @@ static int atao_attach(struct comedi_device *dev, struct comedi_devconfig *it)
        if (!devpriv)
                return -ENOMEM;
 
-       dev->pacer = comedi_8254_init(dev->iobase + ATAO_82C53_BASE,
-                                     0, I8254_IO8, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(dev->iobase + ATAO_82C53_BASE,
+                                         0, I8254_IO8, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
        ret = comedi_alloc_subdevices(dev, 4);
        if (ret)
index 7632496532285423034068d62e5cf03df0bbf376..eb8f6431276a6866c7eae31e563a8d884da7f798 100644 (file)
@@ -1222,24 +1222,24 @@ int labpc_common_attach(struct comedi_device *dev,
        }
 
        if (dev->mmio) {
-               dev->pacer = comedi_8254_mm_init(dev->mmio + COUNTER_B_BASE_REG,
-                                                I8254_OSC_BASE_2MHZ,
-                                                I8254_IO8, 0);
-               devpriv->counter = comedi_8254_mm_init(dev->mmio +
-                                                      COUNTER_A_BASE_REG,
-                                                      I8254_OSC_BASE_2MHZ,
-                                                      I8254_IO8, 0);
+               dev->pacer =
+                   comedi_8254_mm_alloc(dev->mmio + COUNTER_B_BASE_REG,
+                                        I8254_OSC_BASE_2MHZ, I8254_IO8, 0);
+               devpriv->counter =
+                   comedi_8254_mm_alloc(dev->mmio + COUNTER_A_BASE_REG,
+                                        I8254_OSC_BASE_2MHZ, I8254_IO8, 0);
        } else {
-               dev->pacer = comedi_8254_init(dev->iobase + COUNTER_B_BASE_REG,
-                                             I8254_OSC_BASE_2MHZ,
-                                             I8254_IO8, 0);
-               devpriv->counter = comedi_8254_init(dev->iobase +
-                                                   COUNTER_A_BASE_REG,
-                                                   I8254_OSC_BASE_2MHZ,
-                                                   I8254_IO8, 0);
+               dev->pacer =
+                   comedi_8254_io_alloc(dev->iobase + COUNTER_B_BASE_REG,
+                                        I8254_OSC_BASE_2MHZ, I8254_IO8, 0);
+               devpriv->counter =
+                   comedi_8254_io_alloc(dev->iobase + COUNTER_A_BASE_REG,
+                                        I8254_OSC_BASE_2MHZ, I8254_IO8, 0);
        }
-       if (!dev->pacer || !devpriv->counter)
-               return -ENOMEM;
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
+       if (IS_ERR(devpriv->counter))
+               return PTR_ERR(devpriv->counter);
 
        ret = comedi_alloc_subdevices(dev, 5);
        if (ret)
@@ -1341,8 +1341,10 @@ void labpc_common_detach(struct comedi_device *dev)
 {
        struct labpc_private *devpriv = dev->private;
 
-       if (devpriv)
-               kfree(devpriv->counter);
+       if (devpriv) {
+               if (!IS_ERR(devpriv->counter))
+                       kfree(devpriv->counter);
+       }
 }
 EXPORT_SYMBOL_GPL(labpc_common_detach);
 
index 05172c553c8ac0cb76744afcfa521b718e267474..0cf3917defe790213342008017ef0a2a1adaa657 100644 (file)
@@ -429,10 +429,10 @@ static int pcl711_attach(struct comedi_device *dev, struct comedi_devconfig *it)
                        dev->irq = it->options[1];
        }
 
-       dev->pacer = comedi_8254_init(dev->iobase + PCL711_TIMER_BASE,
-                                     I8254_OSC_BASE_2MHZ, I8254_IO8, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(dev->iobase + PCL711_TIMER_BASE,
+                                         I8254_OSC_BASE_2MHZ, I8254_IO8, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
        ret = comedi_alloc_subdevices(dev, 4);
        if (ret)
index 70dbc129fcf55810a96498a3372cdf63bf113c64..0df639c6a595e5e36ad2a7c28c90f4cccc6069bb 100644 (file)
@@ -1143,11 +1143,11 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
                return ret;
 
        if (board->irq_bits) {
-               dev->pacer = comedi_8254_init(dev->iobase + PCL812_TIMER_BASE,
-                                             I8254_OSC_BASE_2MHZ,
-                                             I8254_IO8, 0);
-               if (!dev->pacer)
-                       return -ENOMEM;
+               dev->pacer =
+                   comedi_8254_io_alloc(dev->iobase + PCL812_TIMER_BASE,
+                                        I8254_OSC_BASE_2MHZ, I8254_IO8, 0);
+               if (IS_ERR(dev->pacer))
+                       return PTR_ERR(dev->pacer);
 
                if ((1 << it->options[1]) & board->irq_bits) {
                        ret = request_irq(it->options[1], pcl812_interrupt, 0,
index a5e5320be648c45e83efb5dba3733bdbee6ba2ef..28d1a88c50f6531bebc16189ddffdf60e8b4a2d2 100644 (file)
@@ -615,10 +615,10 @@ static int pcl816_attach(struct comedi_device *dev, struct comedi_devconfig *it)
        /* an IRQ and DMA are required to support async commands */
        pcl816_alloc_irq_and_dma(dev, it);
 
-       dev->pacer = comedi_8254_init(dev->iobase + PCL816_TIMER_BASE,
-                                     I8254_OSC_BASE_10MHZ, I8254_IO8, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(dev->iobase + PCL816_TIMER_BASE,
+                                         I8254_OSC_BASE_10MHZ, I8254_IO8, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
        ret = comedi_alloc_subdevices(dev, 4);
        if (ret)
index 29e503de8267b3562f97407e25917e15c105768a..4127adcfb229559bd0f5be22445b3958f589f71d 100644 (file)
@@ -1015,10 +1015,10 @@ static int pcl818_attach(struct comedi_device *dev, struct comedi_devconfig *it)
        else
                osc_base = I8254_OSC_BASE_1MHZ;
 
-       dev->pacer = comedi_8254_init(dev->iobase + PCL818_TIMER_BASE,
-                                     osc_base, I8254_IO8, 0);
-       if (!dev->pacer)
-               return -ENOMEM;
+       dev->pacer = comedi_8254_io_alloc(dev->iobase + PCL818_TIMER_BASE,
+                                         osc_base, I8254_IO8, 0);
+       if (IS_ERR(dev->pacer))
+               return PTR_ERR(dev->pacer);
 
        /* max sampling speed */
        devpriv->ns_min = board->ns_min;
index 7e0ec1a2a2caf8db77a7d4ed6eccc85d11efb4a8..44bb0decd7a4ec3cecfcceef8335c8f5d6a778b3 100644 (file)
@@ -1289,9 +1289,9 @@ static int rtd_auto_attach(struct comedi_device *dev,
 
        /* 8254 Timer/Counter subdevice */
        s = &dev->subdevices[3];
-       dev->pacer = comedi_8254_mm_init(dev->mmio + LAS0_8254_TIMER_BASE,
-                                        RTD_CLOCK_BASE, I8254_IO8, 2);
-       if (!dev->pacer)
+       dev->pacer = comedi_8254_mm_alloc(dev->mmio + LAS0_8254_TIMER_BASE,
+                                         RTD_CLOCK_BASE, I8254_IO8, 2);
+       if (IS_ERR(dev->pacer))
                return -ENOMEM;
 
        comedi_8254_subdevice_init(s, dev->pacer);
index 18d12321c87d536a2e067bea7f1e47535b13cf40..393ccb301028fc7c20af1a0864630dc36c4e1391 100644 (file)
@@ -136,13 +136,13 @@ void comedi_8254_set_busy(struct comedi_8254 *i8254,
 void comedi_8254_subdevice_init(struct comedi_subdevice *s,
                                struct comedi_8254 *i8254);
 
-struct comedi_8254 *comedi_8254_init(unsigned long iobase,
-                                    unsigned int osc_base,
-                                    unsigned int iosize,
-                                    unsigned int regshift);
-struct comedi_8254 *comedi_8254_mm_init(void __iomem *mmio,
-                                       unsigned int osc_base,
-                                       unsigned int iosize,
-                                       unsigned int regshift);
+struct comedi_8254 *comedi_8254_io_alloc(unsigned long iobase,
+                                        unsigned int osc_base,
+                                        unsigned int iosize,
+                                        unsigned int regshift);
+struct comedi_8254 *comedi_8254_mm_alloc(void __iomem *mmio,
+                                        unsigned int osc_base,
+                                        unsigned int iosize,
+                                        unsigned int regshift);
 
 #endif /* _COMEDI_8254_H */