Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

comedi: comedi_8254: Replace comedi_8254_init() and comedi_8254_mm_init()

`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>

authored by

Ian Abbott and committed by
Greg Kroah-Hartman
fade5e5b c62f5032

+179 -165
+2 -1
drivers/comedi/drivers.c
··· 177 177 dev->n_subdevices = 0; 178 178 } 179 179 kfree(dev->private); 180 - kfree(dev->pacer); 180 + if (!IS_ERR(dev->pacer)) 181 + kfree(dev->pacer); 181 182 dev->private = NULL; 182 183 dev->pacer = NULL; 183 184 dev->driver = NULL;
+4 -4
drivers/comedi/drivers/adl_pci9111.c
··· 647 647 dev->irq = pcidev->irq; 648 648 } 649 649 650 - dev->pacer = comedi_8254_init(dev->iobase + PCI9111_8254_BASE_REG, 651 - I8254_OSC_BASE_2MHZ, I8254_IO16, 0); 652 - if (!dev->pacer) 653 - return -ENOMEM; 650 + dev->pacer = comedi_8254_io_alloc(dev->iobase + PCI9111_8254_BASE_REG, 651 + I8254_OSC_BASE_2MHZ, I8254_IO16, 0); 652 + if (IS_ERR(dev->pacer)) 653 + return PTR_ERR(dev->pacer); 654 654 655 655 ret = comedi_alloc_subdevices(dev, 4); 656 656 if (ret)
+4 -4
drivers/comedi/drivers/adl_pci9118.c
··· 1524 1524 devpriv->iobase_a = pci_resource_start(pcidev, 0); 1525 1525 dev->iobase = pci_resource_start(pcidev, 2); 1526 1526 1527 - dev->pacer = comedi_8254_init(dev->iobase + PCI9118_TIMER_BASE, 1528 - I8254_OSC_BASE_4MHZ, I8254_IO32, 0); 1529 - if (!dev->pacer) 1530 - return -ENOMEM; 1527 + dev->pacer = comedi_8254_io_alloc(dev->iobase + PCI9118_TIMER_BASE, 1528 + I8254_OSC_BASE_4MHZ, I8254_IO32, 0); 1529 + if (IS_ERR(dev->pacer)) 1530 + return PTR_ERR(dev->pacer); 1531 1531 1532 1532 pci9118_reset(dev); 1533 1533
+4 -4
drivers/comedi/drivers/adv_pci1710.c
··· 767 767 return ret; 768 768 dev->iobase = pci_resource_start(pcidev, 2); 769 769 770 - dev->pacer = comedi_8254_init(dev->iobase + PCI171X_TIMER_BASE, 771 - I8254_OSC_BASE_10MHZ, I8254_IO16, 0); 772 - if (!dev->pacer) 773 - return -ENOMEM; 770 + dev->pacer = comedi_8254_io_alloc(dev->iobase + PCI171X_TIMER_BASE, 771 + I8254_OSC_BASE_10MHZ, I8254_IO16, 0); 772 + if (IS_ERR(dev->pacer)) 773 + return PTR_ERR(dev->pacer); 774 774 775 775 n_subdevices = 1; /* all boards have analog inputs */ 776 776 if (board->has_ao)
+5 -5
drivers/comedi/drivers/adv_pci_dio.c
··· 664 664 if (board->timer_regbase) { 665 665 s = &dev->subdevices[subdev++]; 666 666 667 - dev->pacer = comedi_8254_init(dev->iobase + 668 - board->timer_regbase, 669 - 0, I8254_IO8, 0); 670 - if (!dev->pacer) 671 - return -ENOMEM; 667 + dev->pacer = 668 + comedi_8254_io_alloc(dev->iobase + board->timer_regbase, 669 + 0, I8254_IO8, 0); 670 + if (IS_ERR(dev->pacer)) 671 + return PTR_ERR(dev->pacer); 672 672 673 673 comedi_8254_subdevice_init(s, dev->pacer); 674 674 }
+4 -4
drivers/comedi/drivers/aio_aio12_8.c
··· 206 206 if (ret) 207 207 return ret; 208 208 209 - dev->pacer = comedi_8254_init(dev->iobase + AIO12_8_8254_BASE_REG, 210 - 0, I8254_IO8, 0); 211 - if (!dev->pacer) 212 - return -ENOMEM; 209 + dev->pacer = comedi_8254_io_alloc(dev->iobase + AIO12_8_8254_BASE_REG, 210 + 0, I8254_IO8, 0); 211 + if (IS_ERR(dev->pacer)) 212 + return PTR_ERR(dev->pacer); 213 213 214 214 ret = comedi_alloc_subdevices(dev, 4); 215 215 if (ret)
+6 -6
drivers/comedi/drivers/amplc_dio200_common.c
··· 556 556 } 557 557 558 558 if (dev->mmio) { 559 - i8254 = comedi_8254_mm_init(dev->mmio + offset, 560 - 0, I8254_IO8, regshift); 559 + i8254 = comedi_8254_mm_alloc(dev->mmio + offset, 560 + 0, I8254_IO8, regshift); 561 561 } else { 562 - i8254 = comedi_8254_init(dev->iobase + offset, 563 - 0, I8254_IO8, regshift); 562 + i8254 = comedi_8254_io_alloc(dev->iobase + offset, 563 + 0, I8254_IO8, regshift); 564 564 } 565 - if (!i8254) 566 - return -ENOMEM; 565 + if (IS_ERR(i8254)) 566 + return PTR_ERR(i8254); 567 567 568 568 comedi_8254_subdevice_init(s, i8254); 569 569
+4 -4
drivers/comedi/drivers/amplc_pci224.c
··· 1051 1051 outw(devpriv->daccon | PCI224_DACCON_FIFORESET, 1052 1052 dev->iobase + PCI224_DACCON); 1053 1053 1054 - dev->pacer = comedi_8254_init(devpriv->iobase1 + PCI224_Z2_BASE, 1055 - I8254_OSC_BASE_10MHZ, I8254_IO8, 0); 1056 - if (!dev->pacer) 1057 - return -ENOMEM; 1054 + dev->pacer = comedi_8254_io_alloc(devpriv->iobase1 + PCI224_Z2_BASE, 1055 + I8254_OSC_BASE_10MHZ, I8254_IO8, 0); 1056 + if (IS_ERR(dev->pacer)) 1057 + return PTR_ERR(dev->pacer); 1058 1058 1059 1059 ret = comedi_alloc_subdevices(dev, 1); 1060 1060 if (ret)
+4 -4
drivers/comedi/drivers/amplc_pci230.c
··· 2475 2475 dev->irq = pci_dev->irq; 2476 2476 } 2477 2477 2478 - dev->pacer = comedi_8254_init(dev->iobase + PCI230_Z2_CT_BASE, 2479 - 0, I8254_IO8, 0); 2480 - if (!dev->pacer) 2481 - return -ENOMEM; 2478 + dev->pacer = comedi_8254_io_alloc(dev->iobase + PCI230_Z2_CT_BASE, 2479 + 0, I8254_IO8, 0); 2480 + if (IS_ERR(dev->pacer)) 2481 + return PTR_ERR(dev->pacer); 2482 2482 2483 2483 rc = comedi_alloc_subdevices(dev, 3); 2484 2484 if (rc)
+4 -4
drivers/comedi/drivers/cb_das16_cs.c
··· 363 363 if (!devpriv) 364 364 return -ENOMEM; 365 365 366 - dev->pacer = comedi_8254_init(dev->iobase + DAS16CS_TIMER_BASE, 367 - I8254_OSC_BASE_10MHZ, I8254_IO16, 0); 368 - if (!dev->pacer) 369 - return -ENOMEM; 366 + dev->pacer = comedi_8254_io_alloc(dev->iobase + DAS16CS_TIMER_BASE, 367 + I8254_OSC_BASE_10MHZ, I8254_IO16, 0); 368 + if (IS_ERR(dev->pacer)) 369 + return PTR_ERR(dev->pacer); 370 370 371 371 ret = comedi_alloc_subdevices(dev, 4); 372 372 if (ret)
+11 -10
drivers/comedi/drivers/cb_pcidas.c
··· 1288 1288 } 1289 1289 dev->irq = pcidev->irq; 1290 1290 1291 - dev->pacer = comedi_8254_init(dev->iobase + PCIDAS_AI_8254_BASE, 1292 - I8254_OSC_BASE_10MHZ, I8254_IO8, 0); 1293 - if (!dev->pacer) 1294 - return -ENOMEM; 1291 + dev->pacer = comedi_8254_io_alloc(dev->iobase + PCIDAS_AI_8254_BASE, 1292 + I8254_OSC_BASE_10MHZ, I8254_IO8, 0); 1293 + if (IS_ERR(dev->pacer)) 1294 + return PTR_ERR(dev->pacer); 1295 1295 1296 - devpriv->ao_pacer = comedi_8254_init(dev->iobase + PCIDAS_AO_8254_BASE, 1297 - I8254_OSC_BASE_10MHZ, 1298 - I8254_IO8, 0); 1299 - if (!devpriv->ao_pacer) 1300 - return -ENOMEM; 1296 + devpriv->ao_pacer = 1297 + comedi_8254_io_alloc(dev->iobase + PCIDAS_AO_8254_BASE, 1298 + I8254_OSC_BASE_10MHZ, I8254_IO8, 0); 1299 + if (IS_ERR(devpriv->ao_pacer)) 1300 + return PTR_ERR(devpriv->ao_pacer); 1301 1301 1302 1302 ret = comedi_alloc_subdevices(dev, 7); 1303 1303 if (ret) ··· 1453 1453 if (devpriv->amcc) 1454 1454 outl(INTCSR_INBOX_INTR_STATUS, 1455 1455 devpriv->amcc + AMCC_OP_REG_INTCSR); 1456 - kfree(devpriv->ao_pacer); 1456 + if (!IS_ERR(devpriv->ao_pacer)) 1457 + kfree(devpriv->ao_pacer); 1457 1458 } 1458 1459 comedi_pci_detach(dev); 1459 1460 }
+5 -5
drivers/comedi/drivers/cb_pcimdas.c
··· 364 364 devpriv->BADR3 = pci_resource_start(pcidev, 3); 365 365 dev->iobase = pci_resource_start(pcidev, 4); 366 366 367 - dev->pacer = comedi_8254_init(devpriv->BADR3 + PCIMDAS_8254_BASE, 368 - cb_pcimdas_pacer_clk(dev), 369 - I8254_IO8, 0); 370 - if (!dev->pacer) 371 - return -ENOMEM; 367 + dev->pacer = comedi_8254_io_alloc(devpriv->BADR3 + PCIMDAS_8254_BASE, 368 + cb_pcimdas_pacer_clk(dev), 369 + I8254_IO8, 0); 370 + if (IS_ERR(dev->pacer)) 371 + return PTR_ERR(dev->pacer); 372 372 373 373 ret = comedi_alloc_subdevices(dev, 6); 374 374 if (ret)
+31 -24
drivers/comedi/drivers/comedi_8254.c
··· 24 24 * 25 25 * This module provides the following basic functions: 26 26 * 27 - * comedi_8254_init() / comedi_8254_mm_init() 27 + * comedi_8254_io_alloc() / comedi_8254_mm_alloc() 28 28 * Initializes this module to access the 8254 registers. The _mm version 29 - * sets up the module for MMIO register access the other for PIO access. 30 - * The pointer returned from these functions is normally stored in the 31 - * comedi_device dev->pacer and will be freed by the comedi core during 32 - * the driver (*detach). If a driver has multiple 8254 devices, they need 33 - * to be stored in the drivers private data and freed when the driver is 34 - * detached. 29 + * sets up the module for MMIO register access; the _io version sets it 30 + * up for PIO access. These functions return a pointer to a struct 31 + * comedi_8254 on success, or an ERR_PTR value on failure. The pointer 32 + * returned from these functions is normally stored in the comedi_device 33 + * dev->pacer and will be freed by the comedi core during the driver 34 + * (*detach). If a driver has multiple 8254 devices, they need to be 35 + * stored in the drivers private data and freed when the driver is 36 + * detached. If the ERR_PTR value is stored, code should check the 37 + * pointer value with !IS_ERR(pointer) before freeing. 35 38 * 36 39 * NOTE: The counters are reset by setting them to I8254_MODE0 as part of 37 40 * this initialization. ··· 624 621 /* sanity check that the iosize is valid */ 625 622 if (!(iosize == I8254_IO8 || iosize == I8254_IO16 || 626 623 iosize == I8254_IO32)) 627 - return NULL; 624 + return ERR_PTR(-EINVAL); 628 625 629 626 if (!iocb) 630 - return NULL; 627 + return ERR_PTR(-EINVAL); 631 628 632 629 i8254 = kzalloc(sizeof(*i8254), GFP_KERNEL); 633 630 if (!i8254) 634 - return NULL; 631 + return ERR_PTR(-ENOMEM); 635 632 636 633 i8254->iocb = iocb; 637 634 i8254->context = context; ··· 649 646 } 650 647 651 648 /** 652 - * comedi_8254_init - allocate and initialize the 8254 device for pio access 649 + * comedi_8254_io_alloc - allocate and initialize the 8254 device for pio access 653 650 * @iobase: port I/O base address 654 651 * @osc_base: base time of the counter in ns 655 652 * OPTIONAL - only used by comedi_8254_cascade_ns_to_timer() 656 653 * @iosize: I/O register size 657 654 * @regshift: register gap shift 655 + * 656 + * Return: A pointer to a struct comedi_8254 or an ERR_PTR value. 658 657 */ 659 - struct comedi_8254 *comedi_8254_init(unsigned long iobase, 660 - unsigned int osc_base, 661 - unsigned int iosize, 662 - unsigned int regshift) 658 + struct comedi_8254 *comedi_8254_io_alloc(unsigned long iobase, 659 + unsigned int osc_base, 660 + unsigned int iosize, 661 + unsigned int regshift) 663 662 { 664 663 comedi_8254_iocb_fn *iocb; 665 664 ··· 676 671 iocb = i8254_io32_cb; 677 672 break; 678 673 default: 679 - return NULL; 674 + return ERR_PTR(-EINVAL); 680 675 } 681 676 return __i8254_init(iocb, iobase, osc_base, iosize, regshift); 682 677 } 683 - EXPORT_SYMBOL_GPL(comedi_8254_init); 678 + EXPORT_SYMBOL_GPL(comedi_8254_io_alloc); 684 679 685 680 /** 686 - * comedi_8254_mm_init - allocate and initialize the 8254 device for mmio access 681 + * comedi_8254_mm_alloc - allocate and initialize the 8254 device for mmio access 687 682 * @mmio: memory mapped I/O base address 688 683 * @osc_base: base time of the counter in ns 689 684 * OPTIONAL - only used by comedi_8254_cascade_ns_to_timer() 690 685 * @iosize: I/O register size 691 686 * @regshift: register gap shift 687 + * 688 + * Return: A pointer to a struct comedi_8254 or an ERR_PTR value. 692 689 */ 693 - struct comedi_8254 *comedi_8254_mm_init(void __iomem *mmio, 694 - unsigned int osc_base, 695 - unsigned int iosize, 696 - unsigned int regshift) 690 + struct comedi_8254 *comedi_8254_mm_alloc(void __iomem *mmio, 691 + unsigned int osc_base, 692 + unsigned int iosize, 693 + unsigned int regshift) 697 694 { 698 695 comedi_8254_iocb_fn *iocb; 699 696 ··· 710 703 iocb = i8254_mmio32_cb; 711 704 break; 712 705 default: 713 - return NULL; 706 + return ERR_PTR(-EINVAL); 714 707 } 715 708 return __i8254_init(iocb, (unsigned long)mmio, osc_base, iosize, regshift); 716 709 } 717 - EXPORT_SYMBOL_GPL(comedi_8254_mm_init); 710 + EXPORT_SYMBOL_GPL(comedi_8254_mm_alloc); 718 711 719 712 static int __init comedi_8254_module_init(void) 720 713 {
+5 -4
drivers/comedi/drivers/das08.c
··· 439 439 /* Counter subdevice (8254) */ 440 440 s = &dev->subdevices[5]; 441 441 if (board->i8254_offset) { 442 - dev->pacer = comedi_8254_init(dev->iobase + board->i8254_offset, 443 - 0, I8254_IO8, 0); 444 - if (!dev->pacer) 445 - return -ENOMEM; 442 + dev->pacer = 443 + comedi_8254_io_alloc(dev->iobase + board->i8254_offset, 444 + 0, I8254_IO8, 0); 445 + if (IS_ERR(dev->pacer)) 446 + return PTR_ERR(dev->pacer); 446 447 447 448 comedi_8254_subdevice_init(s, dev->pacer); 448 449 } else {
+4 -4
drivers/comedi/drivers/das16.c
··· 1067 1067 osc_base = I8254_OSC_BASE_1MHZ / it->options[3]; 1068 1068 } 1069 1069 1070 - dev->pacer = comedi_8254_init(dev->iobase + DAS16_TIMER_BASE_REG, 1071 - osc_base, I8254_IO8, 0); 1072 - if (!dev->pacer) 1073 - return -ENOMEM; 1070 + dev->pacer = comedi_8254_io_alloc(dev->iobase + DAS16_TIMER_BASE_REG, 1071 + osc_base, I8254_IO8, 0); 1072 + if (IS_ERR(dev->pacer)) 1073 + return PTR_ERR(dev->pacer); 1074 1074 1075 1075 das16_alloc_dma(dev, it->options[2]); 1076 1076
+11 -9
drivers/comedi/drivers/das16m1.c
··· 529 529 dev->irq = it->options[1]; 530 530 } 531 531 532 - dev->pacer = comedi_8254_init(dev->iobase + DAS16M1_8254_IOBASE2, 533 - I8254_OSC_BASE_10MHZ, I8254_IO8, 0); 534 - if (!dev->pacer) 535 - return -ENOMEM; 532 + dev->pacer = comedi_8254_io_alloc(dev->iobase + DAS16M1_8254_IOBASE2, 533 + I8254_OSC_BASE_10MHZ, I8254_IO8, 0); 534 + if (IS_ERR(dev->pacer)) 535 + return PTR_ERR(dev->pacer); 536 536 537 - devpriv->counter = comedi_8254_init(dev->iobase + DAS16M1_8254_IOBASE1, 538 - 0, I8254_IO8, 0); 539 - if (!devpriv->counter) 540 - return -ENOMEM; 537 + devpriv->counter = 538 + comedi_8254_io_alloc(dev->iobase + DAS16M1_8254_IOBASE1, 539 + 0, I8254_IO8, 0); 540 + if (IS_ERR(devpriv->counter)) 541 + return PTR_ERR(devpriv->counter); 541 542 542 543 ret = comedi_alloc_subdevices(dev, 4); 543 544 if (ret) ··· 604 603 if (devpriv) { 605 604 if (devpriv->extra_iobase) 606 605 release_region(devpriv->extra_iobase, DAS16M1_SIZE2); 607 - kfree(devpriv->counter); 606 + if (!IS_ERR(devpriv->counter)) 607 + kfree(devpriv->counter); 608 608 } 609 609 comedi_legacy_detach(dev); 610 610 }
+4 -4
drivers/comedi/drivers/das1800.c
··· 1233 1233 if (!devpriv->fifo_buf) 1234 1234 return -ENOMEM; 1235 1235 1236 - dev->pacer = comedi_8254_init(dev->iobase + DAS1800_COUNTER, 1237 - I8254_OSC_BASE_5MHZ, I8254_IO8, 0); 1238 - if (!dev->pacer) 1239 - return -ENOMEM; 1236 + dev->pacer = comedi_8254_io_alloc(dev->iobase + DAS1800_COUNTER, 1237 + I8254_OSC_BASE_5MHZ, I8254_IO8, 0); 1238 + if (IS_ERR(dev->pacer)) 1239 + return PTR_ERR(dev->pacer); 1240 1240 1241 1241 ret = comedi_alloc_subdevices(dev, 4); 1242 1242 if (ret)
+4 -4
drivers/comedi/drivers/das6402.c
··· 590 590 } 591 591 } 592 592 593 - dev->pacer = comedi_8254_init(dev->iobase + DAS6402_TIMER_BASE, 594 - I8254_OSC_BASE_10MHZ, I8254_IO8, 0); 595 - if (!dev->pacer) 596 - return -ENOMEM; 593 + dev->pacer = comedi_8254_io_alloc(dev->iobase + DAS6402_TIMER_BASE, 594 + I8254_OSC_BASE_10MHZ, I8254_IO8, 0); 595 + if (IS_ERR(dev->pacer)) 596 + return PTR_ERR(dev->pacer); 597 597 598 598 ret = comedi_alloc_subdevices(dev, 4); 599 599 if (ret)
+4 -4
drivers/comedi/drivers/das800.c
··· 672 672 dev->irq = irq; 673 673 } 674 674 675 - dev->pacer = comedi_8254_init(dev->iobase + DAS800_8254, 676 - I8254_OSC_BASE_1MHZ, I8254_IO8, 0); 677 - if (!dev->pacer) 678 - return -ENOMEM; 675 + dev->pacer = comedi_8254_io_alloc(dev->iobase + DAS800_8254, 676 + I8254_OSC_BASE_1MHZ, I8254_IO8, 0); 677 + if (IS_ERR(dev->pacer)) 678 + return PTR_ERR(dev->pacer); 679 679 680 680 ret = comedi_alloc_subdevices(dev, 3); 681 681 if (ret)
+3 -3
drivers/comedi/drivers/me4000.c
··· 1209 1209 if (!timer_base) 1210 1210 return -ENODEV; 1211 1211 1212 - dev->pacer = comedi_8254_init(timer_base, 0, I8254_IO8, 0); 1213 - if (!dev->pacer) 1214 - return -ENOMEM; 1212 + dev->pacer = comedi_8254_io_alloc(timer_base, 0, I8254_IO8, 0); 1213 + if (IS_ERR(dev->pacer)) 1214 + return PTR_ERR(dev->pacer); 1215 1215 1216 1216 comedi_8254_subdevice_init(s, dev->pacer); 1217 1217 } else {
+4 -4
drivers/comedi/drivers/ni_at_a2150.c
··· 707 707 /* an IRQ and DMA are required to support async commands */ 708 708 a2150_alloc_irq_and_dma(dev, it); 709 709 710 - dev->pacer = comedi_8254_init(dev->iobase + I8253_BASE_REG, 711 - 0, I8254_IO8, 0); 712 - if (!dev->pacer) 713 - return -ENOMEM; 710 + dev->pacer = comedi_8254_io_alloc(dev->iobase + I8253_BASE_REG, 711 + 0, I8254_IO8, 0); 712 + if (IS_ERR(dev->pacer)) 713 + return PTR_ERR(dev->pacer); 714 714 715 715 ret = comedi_alloc_subdevices(dev, 1); 716 716 if (ret)
+4 -4
drivers/comedi/drivers/ni_at_ao.c
··· 303 303 if (!devpriv) 304 304 return -ENOMEM; 305 305 306 - dev->pacer = comedi_8254_init(dev->iobase + ATAO_82C53_BASE, 307 - 0, I8254_IO8, 0); 308 - if (!dev->pacer) 309 - return -ENOMEM; 306 + dev->pacer = comedi_8254_io_alloc(dev->iobase + ATAO_82C53_BASE, 307 + 0, I8254_IO8, 0); 308 + if (IS_ERR(dev->pacer)) 309 + return PTR_ERR(dev->pacer); 310 310 311 311 ret = comedi_alloc_subdevices(dev, 4); 312 312 if (ret)
+20 -18
drivers/comedi/drivers/ni_labpc_common.c
··· 1222 1222 } 1223 1223 1224 1224 if (dev->mmio) { 1225 - dev->pacer = comedi_8254_mm_init(dev->mmio + COUNTER_B_BASE_REG, 1226 - I8254_OSC_BASE_2MHZ, 1227 - I8254_IO8, 0); 1228 - devpriv->counter = comedi_8254_mm_init(dev->mmio + 1229 - COUNTER_A_BASE_REG, 1230 - I8254_OSC_BASE_2MHZ, 1231 - I8254_IO8, 0); 1225 + dev->pacer = 1226 + comedi_8254_mm_alloc(dev->mmio + COUNTER_B_BASE_REG, 1227 + I8254_OSC_BASE_2MHZ, I8254_IO8, 0); 1228 + devpriv->counter = 1229 + comedi_8254_mm_alloc(dev->mmio + COUNTER_A_BASE_REG, 1230 + I8254_OSC_BASE_2MHZ, I8254_IO8, 0); 1232 1231 } else { 1233 - dev->pacer = comedi_8254_init(dev->iobase + COUNTER_B_BASE_REG, 1234 - I8254_OSC_BASE_2MHZ, 1235 - I8254_IO8, 0); 1236 - devpriv->counter = comedi_8254_init(dev->iobase + 1237 - COUNTER_A_BASE_REG, 1238 - I8254_OSC_BASE_2MHZ, 1239 - I8254_IO8, 0); 1232 + dev->pacer = 1233 + comedi_8254_io_alloc(dev->iobase + COUNTER_B_BASE_REG, 1234 + I8254_OSC_BASE_2MHZ, I8254_IO8, 0); 1235 + devpriv->counter = 1236 + comedi_8254_io_alloc(dev->iobase + COUNTER_A_BASE_REG, 1237 + I8254_OSC_BASE_2MHZ, I8254_IO8, 0); 1240 1238 } 1241 - if (!dev->pacer || !devpriv->counter) 1242 - return -ENOMEM; 1239 + if (IS_ERR(dev->pacer)) 1240 + return PTR_ERR(dev->pacer); 1241 + if (IS_ERR(devpriv->counter)) 1242 + return PTR_ERR(devpriv->counter); 1243 1243 1244 1244 ret = comedi_alloc_subdevices(dev, 5); 1245 1245 if (ret) ··· 1341 1341 { 1342 1342 struct labpc_private *devpriv = dev->private; 1343 1343 1344 - if (devpriv) 1345 - kfree(devpriv->counter); 1344 + if (devpriv) { 1345 + if (!IS_ERR(devpriv->counter)) 1346 + kfree(devpriv->counter); 1347 + } 1346 1348 } 1347 1349 EXPORT_SYMBOL_GPL(labpc_common_detach); 1348 1350
+4 -4
drivers/comedi/drivers/pcl711.c
··· 429 429 dev->irq = it->options[1]; 430 430 } 431 431 432 - dev->pacer = comedi_8254_init(dev->iobase + PCL711_TIMER_BASE, 433 - I8254_OSC_BASE_2MHZ, I8254_IO8, 0); 434 - if (!dev->pacer) 435 - return -ENOMEM; 432 + dev->pacer = comedi_8254_io_alloc(dev->iobase + PCL711_TIMER_BASE, 433 + I8254_OSC_BASE_2MHZ, I8254_IO8, 0); 434 + if (IS_ERR(dev->pacer)) 435 + return PTR_ERR(dev->pacer); 436 436 437 437 ret = comedi_alloc_subdevices(dev, 4); 438 438 if (ret)
+5 -5
drivers/comedi/drivers/pcl812.c
··· 1143 1143 return ret; 1144 1144 1145 1145 if (board->irq_bits) { 1146 - dev->pacer = comedi_8254_init(dev->iobase + PCL812_TIMER_BASE, 1147 - I8254_OSC_BASE_2MHZ, 1148 - I8254_IO8, 0); 1149 - if (!dev->pacer) 1150 - return -ENOMEM; 1146 + dev->pacer = 1147 + comedi_8254_io_alloc(dev->iobase + PCL812_TIMER_BASE, 1148 + I8254_OSC_BASE_2MHZ, I8254_IO8, 0); 1149 + if (IS_ERR(dev->pacer)) 1150 + return PTR_ERR(dev->pacer); 1151 1151 1152 1152 if ((1 << it->options[1]) & board->irq_bits) { 1153 1153 ret = request_irq(it->options[1], pcl812_interrupt, 0,
+4 -4
drivers/comedi/drivers/pcl816.c
··· 615 615 /* an IRQ and DMA are required to support async commands */ 616 616 pcl816_alloc_irq_and_dma(dev, it); 617 617 618 - dev->pacer = comedi_8254_init(dev->iobase + PCL816_TIMER_BASE, 619 - I8254_OSC_BASE_10MHZ, I8254_IO8, 0); 620 - if (!dev->pacer) 621 - return -ENOMEM; 618 + dev->pacer = comedi_8254_io_alloc(dev->iobase + PCL816_TIMER_BASE, 619 + I8254_OSC_BASE_10MHZ, I8254_IO8, 0); 620 + if (IS_ERR(dev->pacer)) 621 + return PTR_ERR(dev->pacer); 622 622 623 623 ret = comedi_alloc_subdevices(dev, 4); 624 624 if (ret)
+4 -4
drivers/comedi/drivers/pcl818.c
··· 1015 1015 else 1016 1016 osc_base = I8254_OSC_BASE_1MHZ; 1017 1017 1018 - dev->pacer = comedi_8254_init(dev->iobase + PCL818_TIMER_BASE, 1019 - osc_base, I8254_IO8, 0); 1020 - if (!dev->pacer) 1021 - return -ENOMEM; 1018 + dev->pacer = comedi_8254_io_alloc(dev->iobase + PCL818_TIMER_BASE, 1019 + osc_base, I8254_IO8, 0); 1020 + if (IS_ERR(dev->pacer)) 1021 + return PTR_ERR(dev->pacer); 1022 1022 1023 1023 /* max sampling speed */ 1024 1024 devpriv->ns_min = board->ns_min;
+3 -3
drivers/comedi/drivers/rtd520.c
··· 1289 1289 1290 1290 /* 8254 Timer/Counter subdevice */ 1291 1291 s = &dev->subdevices[3]; 1292 - dev->pacer = comedi_8254_mm_init(dev->mmio + LAS0_8254_TIMER_BASE, 1293 - RTD_CLOCK_BASE, I8254_IO8, 2); 1294 - if (!dev->pacer) 1292 + dev->pacer = comedi_8254_mm_alloc(dev->mmio + LAS0_8254_TIMER_BASE, 1293 + RTD_CLOCK_BASE, I8254_IO8, 2); 1294 + if (IS_ERR(dev->pacer)) 1295 1295 return -ENOMEM; 1296 1296 1297 1297 comedi_8254_subdevice_init(s, dev->pacer);
+8 -8
include/linux/comedi/comedi_8254.h
··· 136 136 void comedi_8254_subdevice_init(struct comedi_subdevice *s, 137 137 struct comedi_8254 *i8254); 138 138 139 - struct comedi_8254 *comedi_8254_init(unsigned long iobase, 140 - unsigned int osc_base, 141 - unsigned int iosize, 142 - unsigned int regshift); 143 - struct comedi_8254 *comedi_8254_mm_init(void __iomem *mmio, 144 - unsigned int osc_base, 145 - unsigned int iosize, 146 - unsigned int regshift); 139 + struct comedi_8254 *comedi_8254_io_alloc(unsigned long iobase, 140 + unsigned int osc_base, 141 + unsigned int iosize, 142 + unsigned int regshift); 143 + struct comedi_8254 *comedi_8254_mm_alloc(void __iomem *mmio, 144 + unsigned int osc_base, 145 + unsigned int iosize, 146 + unsigned int regshift); 147 147 148 148 #endif /* _COMEDI_8254_H */