summaryrefslogtreecommitdiff
path: root/drivers/comedi
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2026-04-24 13:23:50 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2026-04-24 13:23:50 -0700
commitcb4eb6771c0f8fd1c52a8f6fdec7762fb087380a (patch)
treec50311c87c0d464bfbba34e5c3b8699897fb1b65 /drivers/comedi
parentb2680ba4a2ad259c7bbd856ed830b459e11d88ba (diff)
parent1c0220a61508d67a09a6e71eb09593a8aea61822 (diff)
downloadlinux-next-cb4eb6771c0f8fd1c52a8f6fdec7762fb087380a.tar.gz
linux-next-cb4eb6771c0f8fd1c52a8f6fdec7762fb087380a.zip
Merge tag 'char-misc-7.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull char / misc / IIO / and others driver updates from Greg KH: "Here is the char/misc/iio and other smaller driver subsystem updates for 7.1-rc1. Lots of stuff in here, all tiny, but relevant for the different drivers they touch. Major points in here is: - the usual large set of new IIO drivers and updates for that subsystem (the large majority of this diffstat) - lots of comedi driver updates and bugfixes - coresight driver updates - interconnect driver updates and additions - mei driver updates - binder (both rust and C versions) updates and fixes - lots of other smaller driver subsystem updates and additions All of these have been in linux-next for a while with no reported issues" * tag 'char-misc-7.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (405 commits) coresight: tpdm: fix invalid MMIO access issue mei: me: add nova lake point H DID mei: lb: add late binding version 2 mei: bus: add mei_cldev_uuid w1: ds2490: drop redundant device reference bus: mhi: host: pci_generic: Add Telit FE912C04 modem support mei: csc: wake device while reading firmware status mei: csc: support controller with separate PCI device mei: convert PCI error to common errno mei: trace: print return value of pci_cfg_read mei: me: move trace into firmware status read mei: fix idle print specifiers mei: me: use PCI_DEVICE_DATA macro sonypi: Convert ACPI driver to a platform one misc: apds990x: fix all kernel-doc warnings most: usb: Use kzalloc_objs for endpoint address array hpet: Convert ACPI driver to a platform one misc: vmw_vmci: Fix spelling mistakes in comments parport: Remove completed item from to-do list char: remove unnecessary module_init/exit functions ...
Diffstat (limited to 'drivers/comedi')
-rw-r--r--drivers/comedi/Kconfig10
-rw-r--r--drivers/comedi/comedi_pci.c11
-rw-r--r--drivers/comedi/comedi_pcmcia.c11
-rw-r--r--drivers/comedi/comedi_usb.c11
-rw-r--r--drivers/comedi/drivers.c46
-rw-r--r--drivers/comedi/drivers/8255.c10
-rw-r--r--drivers/comedi/drivers/addi_watchdog.c11
-rw-r--r--drivers/comedi/drivers/adq12b.c3
-rw-r--r--drivers/comedi/drivers/aio_aio12_8.c15
-rw-r--r--drivers/comedi/drivers/aio_iiro_16.c11
-rw-r--r--drivers/comedi/drivers/amplc_dio200.c3
-rw-r--r--drivers/comedi/drivers/amplc_dio200_common.c11
-rw-r--r--drivers/comedi/drivers/amplc_pc236.c3
-rw-r--r--drivers/comedi/drivers/amplc_pc236_common.c11
-rw-r--r--drivers/comedi/drivers/amplc_pc263.c3
-rw-r--r--drivers/comedi/drivers/c6xdigio.c4
-rw-r--r--drivers/comedi/drivers/comedi_8254.c11
-rw-r--r--drivers/comedi/drivers/comedi_8255.c11
-rw-r--r--drivers/comedi/drivers/comedi_isadma.c32
-rw-r--r--drivers/comedi/drivers/comedi_parport.c4
-rw-r--r--drivers/comedi/drivers/dac02.c3
-rw-r--r--drivers/comedi/drivers/das08.c11
-rw-r--r--drivers/comedi/drivers/das08_isa.c3
-rw-r--r--drivers/comedi/drivers/das16.c31
-rw-r--r--drivers/comedi/drivers/das16m1.c3
-rw-r--r--drivers/comedi/drivers/das1800.c3
-rw-r--r--drivers/comedi/drivers/das6402.c3
-rw-r--r--drivers/comedi/drivers/das800.c3
-rw-r--r--drivers/comedi/drivers/dmm32at.c22
-rw-r--r--drivers/comedi/drivers/dt2801.c3
-rw-r--r--drivers/comedi/drivers/dt2811.c3
-rw-r--r--drivers/comedi/drivers/dt2814.c3
-rw-r--r--drivers/comedi/drivers/dt2815.c3
-rw-r--r--drivers/comedi/drivers/dt2817.c3
-rw-r--r--drivers/comedi/drivers/dt282x.c7
-rw-r--r--drivers/comedi/drivers/fl512.c8
-rw-r--r--drivers/comedi/drivers/mite.c11
-rw-r--r--drivers/comedi/drivers/mpc624.c3
-rw-r--r--drivers/comedi/drivers/multiq3.c3
-rw-r--r--drivers/comedi/drivers/ni_at_a2150.c3
-rw-r--r--drivers/comedi/drivers/ni_at_ao.c3
-rw-r--r--drivers/comedi/drivers/ni_atmio.c3
-rw-r--r--drivers/comedi/drivers/ni_atmio16d.c3
-rw-r--r--drivers/comedi/drivers/ni_labpc.c3
-rw-r--r--drivers/comedi/drivers/ni_labpc_common.c11
-rw-r--r--drivers/comedi/drivers/ni_labpc_isadma.c11
-rw-r--r--drivers/comedi/drivers/ni_tio.c11
-rw-r--r--drivers/comedi/drivers/ni_tiocmd.c11
-rw-r--r--drivers/comedi/drivers/ni_usb6501.c23
-rw-r--r--drivers/comedi/drivers/pcl711.c6
-rw-r--r--drivers/comedi/drivers/pcl724.c22
-rw-r--r--drivers/comedi/drivers/pcl726.c12
-rw-r--r--drivers/comedi/drivers/pcl730.c49
-rw-r--r--drivers/comedi/drivers/pcl812.c22
-rw-r--r--drivers/comedi/drivers/pcl816.c3
-rw-r--r--drivers/comedi/drivers/pcl818.c27
-rw-r--r--drivers/comedi/drivers/pcm3724.c3
-rw-r--r--drivers/comedi/drivers/pcmad.c3
-rw-r--r--drivers/comedi/drivers/pcmda12.c9
-rw-r--r--drivers/comedi/drivers/pcmmio.c3
-rw-r--r--drivers/comedi/drivers/pcmuio.c5
-rw-r--r--drivers/comedi/drivers/rti800.c3
-rw-r--r--drivers/comedi/drivers/rti802.c3
-rw-r--r--drivers/comedi/drivers/s526.c3
-rw-r--r--drivers/comedi/kcomedilib/kcomedilib_main.c12
65 files changed, 332 insertions, 296 deletions
diff --git a/drivers/comedi/Kconfig b/drivers/comedi/Kconfig
index 6dcc2567de6d..c34a8d68547b 100644
--- a/drivers/comedi/Kconfig
+++ b/drivers/comedi/Kconfig
@@ -405,20 +405,20 @@ config COMEDI_FL512
called fl512.
config COMEDI_AIO_AIO12_8
- tristate "I/O Products PC/104 AIO12-8 Analog I/O Board support"
+ tristate "ACCES I/O Products PC/104 AIO12-8 Analog I/O Board support"
select COMEDI_8254
select COMEDI_8255
help
- Enable support for I/O Products PC/104 AIO12-8 Analog I/O Board
+ Enable support for ACCES I/O Products PC/104 AIO12-8 Analog I/O Board
To compile this driver as a module, choose M here: the module will be
called aio_aio12_8.
config COMEDI_AIO_IIRO_16
- tristate "I/O Products PC/104 IIRO16 Board support"
+ tristate "ACCES I/O Products PC/104 IIRO16 Board support"
help
- Enable support for I/O Products PC/104 IIRO16 Relay And Isolated
- Input Board
+ Enable support for ACCES I/O Products PC/104 IIRO16 Relay And
+ Isolated Input Board
To compile this driver as a module, choose M here: the module will be
called aio_iiro_16.
diff --git a/drivers/comedi/comedi_pci.c b/drivers/comedi/comedi_pci.c
index cc2581902195..da618f5e3a4d 100644
--- a/drivers/comedi/comedi_pci.c
+++ b/drivers/comedi/comedi_pci.c
@@ -211,17 +211,6 @@ void comedi_pci_driver_unregister(struct comedi_driver *comedi_driver,
}
EXPORT_SYMBOL_GPL(comedi_pci_driver_unregister);
-static int __init comedi_pci_init(void)
-{
- return 0;
-}
-module_init(comedi_pci_init);
-
-static void __exit comedi_pci_exit(void)
-{
-}
-module_exit(comedi_pci_exit);
-
MODULE_AUTHOR("https://www.comedi.org");
MODULE_DESCRIPTION("Comedi PCI interface module");
MODULE_LICENSE("GPL");
diff --git a/drivers/comedi/comedi_pcmcia.c b/drivers/comedi/comedi_pcmcia.c
index c53aad0fc2ce..17962bf66892 100644
--- a/drivers/comedi/comedi_pcmcia.c
+++ b/drivers/comedi/comedi_pcmcia.c
@@ -192,17 +192,6 @@ void comedi_pcmcia_driver_unregister(struct comedi_driver *comedi_driver,
}
EXPORT_SYMBOL_GPL(comedi_pcmcia_driver_unregister);
-static int __init comedi_pcmcia_init(void)
-{
- return 0;
-}
-module_init(comedi_pcmcia_init);
-
-static void __exit comedi_pcmcia_exit(void)
-{
-}
-module_exit(comedi_pcmcia_exit);
-
MODULE_AUTHOR("https://www.comedi.org");
MODULE_DESCRIPTION("Comedi PCMCIA interface module");
MODULE_LICENSE("GPL");
diff --git a/drivers/comedi/comedi_usb.c b/drivers/comedi/comedi_usb.c
index d11ea148ebf8..75d65171c76d 100644
--- a/drivers/comedi/comedi_usb.c
+++ b/drivers/comedi/comedi_usb.c
@@ -134,17 +134,6 @@ void comedi_usb_driver_unregister(struct comedi_driver *comedi_driver,
}
EXPORT_SYMBOL_GPL(comedi_usb_driver_unregister);
-static int __init comedi_usb_init(void)
-{
- return 0;
-}
-module_init(comedi_usb_init);
-
-static void __exit comedi_usb_exit(void)
-{
-}
-module_exit(comedi_usb_exit);
-
MODULE_AUTHOR("https://www.comedi.org");
MODULE_DESCRIPTION("Comedi USB interface module");
MODULE_LICENSE("GPL");
diff --git a/drivers/comedi/drivers.c b/drivers/comedi/drivers.c
index 5ab96b5eefd1..e78ad565f8f3 100644
--- a/drivers/comedi/drivers.c
+++ b/drivers/comedi/drivers.c
@@ -933,19 +933,24 @@ int comedi_load_firmware(struct comedi_device *dev,
EXPORT_SYMBOL_GPL(comedi_load_firmware);
/**
- * __comedi_request_region() - Request an I/O region for a legacy driver
+ * __comedi_check_request_region() - Request an I/O region for a legacy driver
* @dev: COMEDI device.
* @start: Base address of the I/O region.
* @len: Length of the I/O region.
+ * @minstart: Minimum allowed start address of region.
+ * @maxend: Maximum allowed region end address of region.
+ * @minalign: Required alignment for base address.
*
* Requests the specified I/O port region which must start at a non-zero
- * address.
+ * address, must fall within specified bounds, and must be correctly aligned.
*
* Returns 0 on success, -EINVAL if @start is 0, or -EIO if the request
* fails.
*/
-int __comedi_request_region(struct comedi_device *dev,
- unsigned long start, unsigned long len)
+int __comedi_check_request_region(struct comedi_device *dev,
+ unsigned long start, unsigned long len,
+ unsigned long minstart, unsigned long maxend,
+ unsigned long minalign)
{
if (!start) {
dev_warn(dev->class_dev,
@@ -954,6 +959,19 @@ int __comedi_request_region(struct comedi_device *dev,
return -EINVAL;
}
+ if (start < minstart || start > maxend || maxend - start < len - 1) {
+ dev_warn(dev->class_dev,
+ "%s: I/O base address or length out of range\n",
+ dev->board_name);
+ return -EINVAL;
+ }
+ if (!IS_ALIGNED(start, minalign)) {
+ dev_warn(dev->class_dev,
+ "%s: I/O base address not correctly aligned\n",
+ dev->board_name);
+ return -EINVAL;
+ }
+
if (!request_region(start, len, dev->board_name)) {
dev_warn(dev->class_dev, "%s: I/O port conflict (%#lx,%lu)\n",
dev->board_name, start, len);
@@ -962,16 +980,19 @@ int __comedi_request_region(struct comedi_device *dev,
return 0;
}
-EXPORT_SYMBOL_GPL(__comedi_request_region);
+EXPORT_SYMBOL_GPL(__comedi_check_request_region);
/**
- * comedi_request_region() - Request an I/O region for a legacy driver
+ * comedi_check_request_region() - Request an I/O region for a legacy driver
* @dev: COMEDI device.
* @start: Base address of the I/O region.
* @len: Length of the I/O region.
+ * @minstart: Minimum allowed start address of region.
+ * @maxend: Maximum allowed region end address of region.
+ * @minalign: Required alignment for base address.
*
* Requests the specified I/O port region which must start at a non-zero
- * address.
+ * address, must fall within specified bounds, and must be correctly aligned.
*
* On success, @dev->iobase is set to the base address of the region and
* @dev->iolen is set to its length.
@@ -979,12 +1000,15 @@ EXPORT_SYMBOL_GPL(__comedi_request_region);
* Returns 0 on success, -EINVAL if @start is 0, or -EIO if the request
* fails.
*/
-int comedi_request_region(struct comedi_device *dev,
- unsigned long start, unsigned long len)
+int comedi_check_request_region(struct comedi_device *dev,
+ unsigned long start, unsigned long len,
+ unsigned long minstart, unsigned long maxend,
+ unsigned long minalign)
{
int ret;
- ret = __comedi_request_region(dev, start, len);
+ ret = __comedi_check_request_region(dev, start, len, minstart, maxend,
+ minalign);
if (ret == 0) {
dev->iobase = start;
dev->iolen = len;
@@ -992,7 +1016,7 @@ int comedi_request_region(struct comedi_device *dev,
return ret;
}
-EXPORT_SYMBOL_GPL(comedi_request_region);
+EXPORT_SYMBOL_GPL(comedi_check_request_region);
/**
* comedi_legacy_detach() - A generic (*detach) function for legacy drivers
diff --git a/drivers/comedi/drivers/8255.c b/drivers/comedi/drivers/8255.c
index 5f70938b4477..ff45248ebb29 100644
--- a/drivers/comedi/drivers/8255.c
+++ b/drivers/comedi/drivers/8255.c
@@ -47,7 +47,7 @@ static int dev_8255_attach(struct comedi_device *dev,
struct comedi_devconfig *it)
{
struct comedi_subdevice *s;
- unsigned long iobase;
+ unsigned int iobase;
int ret;
int i;
@@ -70,13 +70,15 @@ static int dev_8255_attach(struct comedi_device *dev,
iobase = it->options[i];
/*
- * __comedi_request_region() does not set dev->iobase.
+ * __comedi_check_request_region() does not set dev->iobase.
*
* For 8255 devices that are manually attached using
* comedi_config, the 'iobase' is the actual I/O port
- * base address of the chip.
+ * base address of the chip. It should be aligned on
+ * a 4-byte boundary.
*/
- ret = __comedi_request_region(dev, iobase, I8255_SIZE);
+ ret = __comedi_check_request_region(dev, iobase, I8255_SIZE,
+ 0, UINT_MAX, 4);
if (ret)
return ret;
ret = subdev_8255_io_init(dev, s, iobase);
diff --git a/drivers/comedi/drivers/addi_watchdog.c b/drivers/comedi/drivers/addi_watchdog.c
index ed87ab432020..b778c88d4c11 100644
--- a/drivers/comedi/drivers/addi_watchdog.c
+++ b/drivers/comedi/drivers/addi_watchdog.c
@@ -124,17 +124,6 @@ int addi_watchdog_init(struct comedi_subdevice *s, unsigned long iobase)
}
EXPORT_SYMBOL_GPL(addi_watchdog_init);
-static int __init addi_watchdog_module_init(void)
-{
- return 0;
-}
-module_init(addi_watchdog_module_init);
-
-static void __exit addi_watchdog_module_exit(void)
-{
-}
-module_exit(addi_watchdog_module_exit);
-
MODULE_DESCRIPTION("ADDI-DATA Watchdog subdevice");
MODULE_AUTHOR("H Hartley Sweeten <hsweeten@visionengravers.com>");
MODULE_LICENSE("GPL");
diff --git a/drivers/comedi/drivers/adq12b.c b/drivers/comedi/drivers/adq12b.c
index 19d765182006..f8fa5c6ecdff 100644
--- a/drivers/comedi/drivers/adq12b.c
+++ b/drivers/comedi/drivers/adq12b.c
@@ -179,7 +179,8 @@ static int adq12b_attach(struct comedi_device *dev, struct comedi_devconfig *it)
struct comedi_subdevice *s;
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x10);
+ ret = comedi_check_request_region(dev, it->options[0], 0x10,
+ 0x300, 0x3af, 0x20);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/aio_aio12_8.c b/drivers/comedi/drivers/aio_aio12_8.c
index 227a86a3a760..e0cbc2ec7c4d 100644
--- a/drivers/comedi/drivers/aio_aio12_8.c
+++ b/drivers/comedi/drivers/aio_aio12_8.c
@@ -1,17 +1,17 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* aio_aio12_8.c
- * Driver for Access I/O Products PC-104 AIO12-8 Analog I/O Board
+ * Driver for ACCES I/O Products PC-104 AIO12-8 Analog I/O Board
* Copyright (C) 2006 C&C Technologies, Inc.
*/
/*
* Driver: aio_aio12_8
- * Description: Access I/O Products PC-104 AIO12-8 Analog I/O Board
+ * Description: ACCES I/O Products PC-104 AIO12-8 Analog I/O Board
* Author: Pablo Mejia <pablo.mejia@cctechnol.com>
- * Devices: [Access I/O] PC-104 AIO12-8 (aio_aio12_8),
- * [Access I/O] PC-104 AI12-8 (aio_ai12_8),
- * [Access I/O] PC-104 AO12-4 (aio_ao12_4)
+ * Devices: [ACCES I/O] PC-104 AIO12-8 (aio_aio12_8),
+ * [ACCES I/O] PC-104 AI12-8 (aio_ai12_8),
+ * [ACCES I/O] PC-104 AO12-4 (aio_ao12_4)
* Status: experimental
*
* Configuration Options:
@@ -202,7 +202,8 @@ static int aio_aio12_8_attach(struct comedi_device *dev,
struct comedi_subdevice *s;
int ret;
- ret = comedi_request_region(dev, it->options[0], 32);
+ ret = comedi_check_request_region(dev, it->options[0], 32,
+ 0x100, 0x3ff, 32);
if (ret)
return ret;
@@ -272,5 +273,5 @@ static struct comedi_driver aio_aio12_8_driver = {
module_comedi_driver(aio_aio12_8_driver);
MODULE_AUTHOR("Comedi https://www.comedi.org");
-MODULE_DESCRIPTION("Comedi driver for Access I/O AIO12-8 Analog I/O Board");
+MODULE_DESCRIPTION("Comedi driver for ACCES I/O AIO12-8 Analog I/O Board");
MODULE_LICENSE("GPL");
diff --git a/drivers/comedi/drivers/aio_iiro_16.c b/drivers/comedi/drivers/aio_iiro_16.c
index 739cc4db52ac..d5d18fa2c638 100644
--- a/drivers/comedi/drivers/aio_iiro_16.c
+++ b/drivers/comedi/drivers/aio_iiro_16.c
@@ -1,15 +1,15 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* aio_iiro_16.c
- * Comedi driver for Access I/O Products 104-IIRO-16 board
+ * Comedi driver for ACCES I/O Products 104-IIRO-16 board
* Copyright (C) 2006 C&C Technologies, Inc.
*/
/*
* Driver: aio_iiro_16
- * Description: Access I/O Products PC/104 Isolated Input/Relay Output Board
+ * Description: ACCES I/O Products PC/104 Isolated Input/Relay Output Board
* Author: Zachary Ware <zach.ware@cctechnol.com>
- * Devices: [Access I/O] 104-IIRO-16 (aio_iiro_16)
+ * Devices: [ACCES I/O] 104-IIRO-16 (aio_iiro_16)
* Status: experimental
*
* Configuration Options:
@@ -167,7 +167,8 @@ static int aio_iiro_16_attach(struct comedi_device *dev,
struct comedi_subdevice *s;
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x8);
+ ret = comedi_check_request_region(dev, it->options[0], 0x8,
+ 0x100, 0x3ff, 0x8);
if (ret)
return ret;
@@ -231,5 +232,5 @@ static struct comedi_driver aio_iiro_16_driver = {
module_comedi_driver(aio_iiro_16_driver);
MODULE_AUTHOR("Comedi https://www.comedi.org");
-MODULE_DESCRIPTION("Comedi driver for Access I/O Products 104-IIRO-16 board");
+MODULE_DESCRIPTION("Comedi driver for ACCES I/O Products 104-IIRO-16 board");
MODULE_LICENSE("GPL");
diff --git a/drivers/comedi/drivers/amplc_dio200.c b/drivers/comedi/drivers/amplc_dio200.c
index 4544bcdd8a70..8b1cbc3d24e5 100644
--- a/drivers/comedi/drivers/amplc_dio200.c
+++ b/drivers/comedi/drivers/amplc_dio200.c
@@ -242,7 +242,8 @@ static int dio200_attach(struct comedi_device *dev, struct comedi_devconfig *it)
{
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x20);
+ ret = comedi_check_request_region(dev, it->options[0], 0x20,
+ 0, 0xfff, 0x20);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/amplc_dio200_common.c b/drivers/comedi/drivers/amplc_dio200_common.c
index b1a9b4c4a185..d61f51900976 100644
--- a/drivers/comedi/drivers/amplc_dio200_common.c
+++ b/drivers/comedi/drivers/amplc_dio200_common.c
@@ -901,17 +901,6 @@ int amplc_dio200_common_attach(struct comedi_device *dev, unsigned int irq,
}
EXPORT_SYMBOL_GPL(amplc_dio200_common_attach);
-static int __init amplc_dio200_common_init(void)
-{
- return 0;
-}
-module_init(amplc_dio200_common_init);
-
-static void __exit amplc_dio200_common_exit(void)
-{
-}
-module_exit(amplc_dio200_common_exit);
-
MODULE_AUTHOR("Comedi https://www.comedi.org");
MODULE_DESCRIPTION("Comedi helper for amplc_dio200 and amplc_dio200_pci");
MODULE_LICENSE("GPL");
diff --git a/drivers/comedi/drivers/amplc_pc236.c b/drivers/comedi/drivers/amplc_pc236.c
index b21e0c906aab..eadee10983bf 100644
--- a/drivers/comedi/drivers/amplc_pc236.c
+++ b/drivers/comedi/drivers/amplc_pc236.c
@@ -45,7 +45,8 @@ static int pc236_attach(struct comedi_device *dev, struct comedi_devconfig *it)
if (!devpriv)
return -ENOMEM;
- ret = comedi_request_region(dev, it->options[0], 0x4);
+ ret = comedi_check_request_region(dev, it->options[0], 0x4,
+ 0, 0xfff, 4);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/amplc_pc236_common.c b/drivers/comedi/drivers/amplc_pc236_common.c
index 326ca72c24ec..c3692f50bdb9 100644
--- a/drivers/comedi/drivers/amplc_pc236_common.c
+++ b/drivers/comedi/drivers/amplc_pc236_common.c
@@ -176,17 +176,6 @@ int amplc_pc236_common_attach(struct comedi_device *dev, unsigned long iobase,
}
EXPORT_SYMBOL_GPL(amplc_pc236_common_attach);
-static int __init amplc_pc236_common_init(void)
-{
- return 0;
-}
-module_init(amplc_pc236_common_init);
-
-static void __exit amplc_pc236_common_exit(void)
-{
-}
-module_exit(amplc_pc236_common_exit);
-
MODULE_AUTHOR("Comedi https://www.comedi.org");
MODULE_DESCRIPTION("Comedi helper for amplc_pc236 and amplc_pci236");
MODULE_LICENSE("GPL");
diff --git a/drivers/comedi/drivers/amplc_pc263.c b/drivers/comedi/drivers/amplc_pc263.c
index d7f088a8a5e3..e2196dc9d426 100644
--- a/drivers/comedi/drivers/amplc_pc263.c
+++ b/drivers/comedi/drivers/amplc_pc263.c
@@ -61,7 +61,8 @@ static int pc263_attach(struct comedi_device *dev, struct comedi_devconfig *it)
struct comedi_subdevice *s;
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x2);
+ ret = comedi_check_request_region(dev, it->options[0], 0x2,
+ 0, 0x7ff, 2);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/c6xdigio.c b/drivers/comedi/drivers/c6xdigio.c
index 8a38d97d463b..b6563a48ada6 100644
--- a/drivers/comedi/drivers/c6xdigio.c
+++ b/drivers/comedi/drivers/c6xdigio.c
@@ -239,9 +239,11 @@ static int c6xdigio_attach(struct comedi_device *dev,
struct comedi_devconfig *it)
{
struct comedi_subdevice *s;
+ unsigned int iobase = it->options[0];
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x03);
+ ret = comedi_check_request_region(dev, iobase, 0x03,
+ 0, UINT_MAX, 4);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/comedi_8254.c b/drivers/comedi/drivers/comedi_8254.c
index a297dd650dab..158e8b4108a8 100644
--- a/drivers/comedi/drivers/comedi_8254.c
+++ b/drivers/comedi/drivers/comedi_8254.c
@@ -724,17 +724,6 @@ struct comedi_8254 *comedi_8254_mm_alloc(void __iomem *mmio,
}
EXPORT_SYMBOL_GPL(comedi_8254_mm_alloc);
-static int __init comedi_8254_module_init(void)
-{
- return 0;
-}
-module_init(comedi_8254_module_init);
-
-static void __exit comedi_8254_module_exit(void)
-{
-}
-module_exit(comedi_8254_module_exit);
-
MODULE_AUTHOR("H Hartley Sweeten <hsweeten@visionengravers.com>");
MODULE_DESCRIPTION("Comedi: Generic 8254 timer/counter support");
MODULE_LICENSE("GPL");
diff --git a/drivers/comedi/drivers/comedi_8255.c b/drivers/comedi/drivers/comedi_8255.c
index a933ef53845a..fd6b1cf621a7 100644
--- a/drivers/comedi/drivers/comedi_8255.c
+++ b/drivers/comedi/drivers/comedi_8255.c
@@ -259,17 +259,6 @@ unsigned long subdev_8255_regbase(struct comedi_subdevice *s)
}
EXPORT_SYMBOL_GPL(subdev_8255_regbase);
-static int __init comedi_8255_module_init(void)
-{
- return 0;
-}
-module_init(comedi_8255_module_init);
-
-static void __exit comedi_8255_module_exit(void)
-{
-}
-module_exit(comedi_8255_module_exit);
-
MODULE_AUTHOR("Comedi https://www.comedi.org");
MODULE_DESCRIPTION("Comedi: Generic 8255 digital I/O support");
MODULE_LICENSE("GPL");
diff --git a/drivers/comedi/drivers/comedi_isadma.c b/drivers/comedi/drivers/comedi_isadma.c
index 04ce3eb9ae4f..b346079b9b6b 100644
--- a/drivers/comedi/drivers/comedi_isadma.c
+++ b/drivers/comedi/drivers/comedi_isadma.c
@@ -161,14 +161,10 @@ struct comedi_isadma *comedi_isadma_alloc(struct comedi_device *dev,
if (n_desc < 1 || n_desc > 2)
goto no_dma;
- dma = kzalloc_obj(*dma);
+ dma = kzalloc_flex(*dma, desc, n_desc);
if (!dma)
goto no_dma;
- desc = kzalloc_objs(*desc, n_desc);
- if (!desc)
- goto no_dma;
- dma->desc = desc;
dma->n_desc = n_desc;
if (dev->hw_dev) {
dma->dev = dev->hw_dev;
@@ -231,15 +227,12 @@ void comedi_isadma_free(struct comedi_isadma *dma)
if (!dma)
return;
- if (dma->desc) {
- for (i = 0; i < dma->n_desc; i++) {
- desc = &dma->desc[i];
- if (desc->virt_addr)
- dma_free_coherent(dma->dev, desc->maxsize,
- desc->virt_addr,
- desc->hw_addr);
- }
- kfree(dma->desc);
+ for (i = 0; i < dma->n_desc; i++) {
+ desc = &dma->desc[i];
+ if (desc->virt_addr)
+ dma_free_coherent(dma->dev, desc->maxsize,
+ desc->virt_addr,
+ desc->hw_addr);
}
if (dma->chan2 && dma->chan2 != dma->chan)
free_dma(dma->chan2);
@@ -249,17 +242,6 @@ void comedi_isadma_free(struct comedi_isadma *dma)
}
EXPORT_SYMBOL_GPL(comedi_isadma_free);
-static int __init comedi_isadma_init(void)
-{
- return 0;
-}
-module_init(comedi_isadma_init);
-
-static void __exit comedi_isadma_exit(void)
-{
-}
-module_exit(comedi_isadma_exit);
-
MODULE_AUTHOR("H Hartley Sweeten <hsweeten@visionengravers.com>");
MODULE_DESCRIPTION("Comedi ISA DMA support");
MODULE_LICENSE("GPL");
diff --git a/drivers/comedi/drivers/comedi_parport.c b/drivers/comedi/drivers/comedi_parport.c
index 098738a688fe..2604680d86c4 100644
--- a/drivers/comedi/drivers/comedi_parport.c
+++ b/drivers/comedi/drivers/comedi_parport.c
@@ -225,9 +225,11 @@ static int parport_attach(struct comedi_device *dev,
struct comedi_devconfig *it)
{
struct comedi_subdevice *s;
+ unsigned int iobase = it->options[0];
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x03);
+ ret = comedi_check_request_region(dev, iobase, 0x03,
+ 0, UINT_MAX, 4);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/dac02.c b/drivers/comedi/drivers/dac02.c
index 4b011d66d7b0..2c04472c5078 100644
--- a/drivers/comedi/drivers/dac02.c
+++ b/drivers/comedi/drivers/dac02.c
@@ -103,7 +103,8 @@ static int dac02_attach(struct comedi_device *dev, struct comedi_devconfig *it)
struct comedi_subdevice *s;
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x08);
+ ret = comedi_check_request_region(dev, it->options[0], 0x08,
+ 0x200, 0x3ff, 8);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/das08.c b/drivers/comedi/drivers/das08.c
index 49944ce1f813..a3298a3238e7 100644
--- a/drivers/comedi/drivers/das08.c
+++ b/drivers/comedi/drivers/das08.c
@@ -453,17 +453,6 @@ int das08_common_attach(struct comedi_device *dev, unsigned long iobase)
}
EXPORT_SYMBOL_GPL(das08_common_attach);
-static int __init das08_init(void)
-{
- return 0;
-}
-module_init(das08_init);
-
-static void __exit das08_exit(void)
-{
-}
-module_exit(das08_exit);
-
MODULE_AUTHOR("Comedi https://www.comedi.org");
MODULE_DESCRIPTION("Comedi common DAS08 support module");
MODULE_LICENSE("GPL");
diff --git a/drivers/comedi/drivers/das08_isa.c b/drivers/comedi/drivers/das08_isa.c
index 3d43b77cc9f4..1b022dc10b78 100644
--- a/drivers/comedi/drivers/das08_isa.c
+++ b/drivers/comedi/drivers/das08_isa.c
@@ -167,7 +167,8 @@ static int das08_isa_attach(struct comedi_device *dev,
if (!devpriv)
return -ENOMEM;
- ret = comedi_request_region(dev, it->options[0], board->iosize);
+ ret = comedi_check_request_region(dev, it->options[0], board->iosize,
+ 0, 0x3ff, board->iosize);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/das16.c b/drivers/comedi/drivers/das16.c
index 1f85572c21b4..6eebfda2cb53 100644
--- a/drivers/comedi/drivers/das16.c
+++ b/drivers/comedi/drivers/das16.c
@@ -1018,6 +1018,7 @@ static int das16_attach(struct comedi_device *dev, struct comedi_devconfig *it)
const struct das16_board *board = dev->board_ptr;
struct das16_private_struct *devpriv;
struct comedi_subdevice *s;
+ unsigned int iobase = it->options[0];
unsigned int osc_base;
unsigned int status;
int ret;
@@ -1037,11 +1038,25 @@ static int das16_attach(struct comedi_device *dev, struct comedi_devconfig *it)
devpriv->dev = dev;
if (board->size < 0x400) {
- ret = comedi_request_region(dev, it->options[0], board->size);
+ unsigned int size = board->size;
+
+ if (size > 0x10 && (iobase & 0x10) != 0) {
+ /*
+ * The board has more than 0x10 registers and is
+ * being placed on an odd 16-byte boundary. The
+ * board has some jumpers to configure this mode,
+ * disabling the 8255 at offset 0x10, so only 0x10
+ * registers will need to be mapped in this mode.
+ */
+ size = 0x10;
+ }
+ ret = comedi_check_request_region(dev, iobase, size,
+ 0, 0x3ff, 16);
if (ret)
return ret;
} else {
- ret = comedi_request_region(dev, it->options[0], 0x10);
+ ret = comedi_check_request_region(dev, iobase, 0x10,
+ 0, 0x3ff, 16);
if (ret)
return ret;
/* Request an additional region for the 8255 */
@@ -1146,9 +1161,15 @@ static int das16_attach(struct comedi_device *dev, struct comedi_devconfig *it)
/* 8255 Digital I/O subdevice */
if (board->has_8255) {
s = &dev->subdevices[4];
- ret = subdev_8255_io_init(dev, s, board->i8255_offset);
- if (ret)
- return ret;
+ if (board->i8255_offset == 0x10 && (dev->iobase & 0x10) != 0) {
+ dev_info(dev->class_dev,
+ "Disabling 8255 subdevice on unsupported base address\n");
+ s->type = COMEDI_SUBD_UNUSED;
+ } else {
+ ret = subdev_8255_io_init(dev, s, board->i8255_offset);
+ if (ret)
+ return ret;
+ }
}
das16_reset(dev);
diff --git a/drivers/comedi/drivers/das16m1.c b/drivers/comedi/drivers/das16m1.c
index 1b638f5b5a4f..9f531ba593b4 100644
--- a/drivers/comedi/drivers/das16m1.c
+++ b/drivers/comedi/drivers/das16m1.c
@@ -511,7 +511,8 @@ static int das16m1_attach(struct comedi_device *dev,
if (!devpriv)
return -ENOMEM;
- ret = comedi_request_region(dev, it->options[0], 0x10);
+ ret = comedi_check_request_region(dev, it->options[0], 0x10,
+ 0, 0x3ff, 16);
if (ret)
return ret;
/* Request an additional region for the 8255 and 3rd 8254 */
diff --git a/drivers/comedi/drivers/das1800.c b/drivers/comedi/drivers/das1800.c
index 7117c67aee7e..7d7ea99a81aa 100644
--- a/drivers/comedi/drivers/das1800.c
+++ b/drivers/comedi/drivers/das1800.c
@@ -1172,7 +1172,8 @@ static int das1800_attach(struct comedi_device *dev,
if (!devpriv)
return -ENOMEM;
- ret = comedi_request_region(dev, it->options[0], DAS1800_SIZE);
+ ret = comedi_check_request_region(dev, it->options[0], DAS1800_SIZE,
+ 0, 0x3ff, 16);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/das6402.c b/drivers/comedi/drivers/das6402.c
index 7660487e563c..516a5d5a2840 100644
--- a/drivers/comedi/drivers/das6402.c
+++ b/drivers/comedi/drivers/das6402.c
@@ -560,7 +560,8 @@ static int das6402_attach(struct comedi_device *dev,
if (!devpriv)
return -ENOMEM;
- ret = comedi_request_region(dev, it->options[0], 0x10);
+ ret = comedi_check_request_region(dev, it->options[0], 0x10,
+ 0, 0x3ff, 16);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/das800.c b/drivers/comedi/drivers/das800.c
index 300775523031..7563f40a4023 100644
--- a/drivers/comedi/drivers/das800.c
+++ b/drivers/comedi/drivers/das800.c
@@ -655,7 +655,8 @@ static int das800_attach(struct comedi_device *dev, struct comedi_devconfig *it)
if (!devpriv)
return -ENOMEM;
- ret = comedi_request_region(dev, it->options[0], 0x8);
+ ret = comedi_check_request_region(dev, it->options[0], 0x8,
+ 0, 0x3ff, 8);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/dmm32at.c b/drivers/comedi/drivers/dmm32at.c
index 910cd24b1bed..d1d9f75e168f 100644
--- a/drivers/comedi/drivers/dmm32at.c
+++ b/drivers/comedi/drivers/dmm32at.c
@@ -572,11 +572,27 @@ static int dmm32at_attach(struct comedi_device *dev,
struct comedi_devconfig *it)
{
struct comedi_subdevice *s;
+ unsigned int iobase = it->options[0];
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x10);
- if (ret)
- return ret;
+ switch (iobase) {
+ case 0x100:
+ case 0x140:
+ case 0x180:
+ case 0x200:
+ case 0x280:
+ case 0x300:
+ case 0x340:
+ case 0x380:
+ ret = comedi_request_region(dev, iobase, 0x10);
+ if (ret)
+ return ret;
+ break;
+ default:
+ dev_err(dev->class_dev, "unsupported base address %#x\n",
+ iobase);
+ return -EINVAL;
+ }
ret = dmm32at_reset(dev);
if (ret) {
diff --git a/drivers/comedi/drivers/dt2801.c b/drivers/comedi/drivers/dt2801.c
index 230d25010f58..d790e69f98a0 100644
--- a/drivers/comedi/drivers/dt2801.c
+++ b/drivers/comedi/drivers/dt2801.c
@@ -540,7 +540,8 @@ static int dt2801_attach(struct comedi_device *dev, struct comedi_devconfig *it)
int ret = 0;
int n_ai_chans;
- ret = comedi_request_region(dev, it->options[0], 0x2);
+ ret = comedi_check_request_region(dev, it->options[0], 0x2,
+ 0x200, 0x3ff, 2);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/dt2811.c b/drivers/comedi/drivers/dt2811.c
index dbb9f38da289..bcc4b5ef48e8 100644
--- a/drivers/comedi/drivers/dt2811.c
+++ b/drivers/comedi/drivers/dt2811.c
@@ -556,7 +556,8 @@ static int dt2811_attach(struct comedi_device *dev, struct comedi_devconfig *it)
if (!devpriv)
return -ENOMEM;
- ret = comedi_request_region(dev, it->options[0], 0x8);
+ ret = comedi_check_request_region(dev, it->options[0], 0x8,
+ 0x200, 0x3ff, 8);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/dt2814.c b/drivers/comedi/drivers/dt2814.c
index c98a5a4a7aec..caec16482afb 100644
--- a/drivers/comedi/drivers/dt2814.c
+++ b/drivers/comedi/drivers/dt2814.c
@@ -305,7 +305,8 @@ static int dt2814_attach(struct comedi_device *dev, struct comedi_devconfig *it)
struct comedi_subdevice *s;
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x2);
+ ret = comedi_check_request_region(dev, it->options[0], 0x2,
+ 0x200, 0x3ff, 2);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/dt2815.c b/drivers/comedi/drivers/dt2815.c
index d066dc303520..8832ecef2ab6 100644
--- a/drivers/comedi/drivers/dt2815.c
+++ b/drivers/comedi/drivers/dt2815.c
@@ -144,7 +144,8 @@ static int dt2815_attach(struct comedi_device *dev, struct comedi_devconfig *it)
const struct comedi_lrange *current_range_type, *voltage_range_type;
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x2);
+ ret = comedi_check_request_region(dev, it->options[0], 0x2,
+ 0x200, 0x3ff, 2);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/dt2817.c b/drivers/comedi/drivers/dt2817.c
index 6738045c7531..9fd5b47c7fa7 100644
--- a/drivers/comedi/drivers/dt2817.c
+++ b/drivers/comedi/drivers/dt2817.c
@@ -103,7 +103,8 @@ static int dt2817_attach(struct comedi_device *dev, struct comedi_devconfig *it)
int ret;
struct comedi_subdevice *s;
- ret = comedi_request_region(dev, it->options[0], 0x5);
+ ret = comedi_check_request_region(dev, it->options[0], 0x5,
+ 0x200, 0x3ff, 8);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/dt282x.c b/drivers/comedi/drivers/dt282x.c
index 4ae80e6c7266..29832e1f062d 100644
--- a/drivers/comedi/drivers/dt282x.c
+++ b/drivers/comedi/drivers/dt282x.c
@@ -1064,7 +1064,12 @@ static int dt282x_attach(struct comedi_device *dev, struct comedi_devconfig *it)
struct comedi_subdevice *s;
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x10);
+ /*
+ * Although it has only 16 bytes (8 16-bit registers), it needs to
+ * start on a 32-byte boundary in range 0x200 to 0x3E0.
+ */
+ ret = comedi_check_request_region(dev, it->options[0], 0x10,
+ 0x200, 0x3ff, 32);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/fl512.c b/drivers/comedi/drivers/fl512.c
index 139e801fc358..d9e6007556ac 100644
--- a/drivers/comedi/drivers/fl512.c
+++ b/drivers/comedi/drivers/fl512.c
@@ -98,9 +98,15 @@ static int fl512_ao_insn_write(struct comedi_device *dev,
static int fl512_attach(struct comedi_device *dev, struct comedi_devconfig *it)
{
struct comedi_subdevice *s;
+ unsigned int iobase = it->options[0];
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x10);
+ /*
+ * FIXME: Don't know the allowed range, but assume it needs to be
+ * on a 16-byte boundary - Ian Abbott
+ */
+ ret = comedi_check_request_region(dev, iobase, 0x10,
+ 0, UINT_MAX, 16);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/mite.c b/drivers/comedi/drivers/mite.c
index e93150d6dc57..9098616900f7 100644
--- a/drivers/comedi/drivers/mite.c
+++ b/drivers/comedi/drivers/mite.c
@@ -921,17 +921,6 @@ void mite_detach(struct mite *mite)
}
EXPORT_SYMBOL_GPL(mite_detach);
-static int __init mite_module_init(void)
-{
- return 0;
-}
-module_init(mite_module_init);
-
-static void __exit mite_module_exit(void)
-{
-}
-module_exit(mite_module_exit);
-
MODULE_AUTHOR("Comedi https://www.comedi.org");
MODULE_DESCRIPTION("Comedi helper for NI Mite PCI interface chip");
MODULE_LICENSE("GPL");
diff --git a/drivers/comedi/drivers/mpc624.c b/drivers/comedi/drivers/mpc624.c
index 9e51ff528ed1..e6343f4267c1 100644
--- a/drivers/comedi/drivers/mpc624.c
+++ b/drivers/comedi/drivers/mpc624.c
@@ -237,7 +237,8 @@ static int mpc624_attach(struct comedi_device *dev, struct comedi_devconfig *it)
struct comedi_subdevice *s;
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x10);
+ ret = comedi_check_request_region(dev, it->options[0], 0x10,
+ 0, 0x3ff, 16);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/multiq3.c b/drivers/comedi/drivers/multiq3.c
index ac369e9a262d..3dde3a1876d7 100644
--- a/drivers/comedi/drivers/multiq3.c
+++ b/drivers/comedi/drivers/multiq3.c
@@ -259,7 +259,8 @@ static int multiq3_attach(struct comedi_device *dev,
int ret;
int i;
- ret = comedi_request_region(dev, it->options[0], 0x10);
+ ret = comedi_check_request_region(dev, it->options[0], 0x10,
+ 0, 0x3ff, 16);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/ni_at_a2150.c b/drivers/comedi/drivers/ni_at_a2150.c
index e4e5a0ebd195..44221c928e32 100644
--- a/drivers/comedi/drivers/ni_at_a2150.c
+++ b/drivers/comedi/drivers/ni_at_a2150.c
@@ -694,7 +694,8 @@ static int a2150_attach(struct comedi_device *dev, struct comedi_devconfig *it)
if (!devpriv)
return -ENOMEM;
- ret = comedi_request_region(dev, it->options[0], 0x1c);
+ ret = comedi_check_request_region(dev, it->options[0], 0x1c,
+ 0, 0x3ff, 32);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/ni_at_ao.c b/drivers/comedi/drivers/ni_at_ao.c
index 9cf6b4ff6b65..31fd64bf8206 100644
--- a/drivers/comedi/drivers/ni_at_ao.c
+++ b/drivers/comedi/drivers/ni_at_ao.c
@@ -295,7 +295,8 @@ static int atao_attach(struct comedi_device *dev, struct comedi_devconfig *it)
struct comedi_subdevice *s;
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x20);
+ ret = comedi_check_request_region(dev, it->options[0], 0x20,
+ 0, 0x3ff, 32);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/ni_atmio.c b/drivers/comedi/drivers/ni_atmio.c
index b4e759e5703f..7bc336333ace 100644
--- a/drivers/comedi/drivers/ni_atmio.c
+++ b/drivers/comedi/drivers/ni_atmio.c
@@ -311,7 +311,8 @@ static int ni_atmio_attach(struct comedi_device *dev,
comedi_set_hw_dev(dev, &isapnp_dev->dev);
}
- ret = comedi_request_region(dev, iobase, 0x20);
+ ret = comedi_check_request_region(dev, iobase, 0x20,
+ 0x20, 0xffff, 32);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/ni_atmio16d.c b/drivers/comedi/drivers/ni_atmio16d.c
index b057b3b3582e..b2772d909896 100644
--- a/drivers/comedi/drivers/ni_atmio16d.c
+++ b/drivers/comedi/drivers/ni_atmio16d.c
@@ -574,7 +574,8 @@ static int atmio16d_attach(struct comedi_device *dev,
struct comedi_subdevice *s;
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x20);
+ ret = comedi_check_request_region(dev, it->options[0], 0x20,
+ 0, 0x3ff, 32);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/ni_labpc.c b/drivers/comedi/drivers/ni_labpc.c
index b25a8e117072..93b5333a99b5 100644
--- a/drivers/comedi/drivers/ni_labpc.c
+++ b/drivers/comedi/drivers/ni_labpc.c
@@ -78,7 +78,8 @@ static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it)
unsigned int dma_chan = it->options[2];
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x20);
+ ret = comedi_check_request_region(dev, it->options[0], 0x20,
+ 0, 0x3ff, 32);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/ni_labpc_common.c b/drivers/comedi/drivers/ni_labpc_common.c
index 7e0ce0ce0adf..21b838a9d9ec 100644
--- a/drivers/comedi/drivers/ni_labpc_common.c
+++ b/drivers/comedi/drivers/ni_labpc_common.c
@@ -1357,17 +1357,6 @@ void labpc_common_detach(struct comedi_device *dev)
}
EXPORT_SYMBOL_GPL(labpc_common_detach);
-static int __init labpc_common_init(void)
-{
- return 0;
-}
-module_init(labpc_common_init);
-
-static void __exit labpc_common_exit(void)
-{
-}
-module_exit(labpc_common_exit);
-
MODULE_AUTHOR("Comedi https://www.comedi.org");
MODULE_DESCRIPTION("Comedi helper for ni_labpc, ni_labpc_pci, ni_labpc_cs");
MODULE_LICENSE("GPL");
diff --git a/drivers/comedi/drivers/ni_labpc_isadma.c b/drivers/comedi/drivers/ni_labpc_isadma.c
index 0652ca8345b6..125797f655f2 100644
--- a/drivers/comedi/drivers/ni_labpc_isadma.c
+++ b/drivers/comedi/drivers/ni_labpc_isadma.c
@@ -164,17 +164,6 @@ void labpc_free_dma_chan(struct comedi_device *dev)
}
EXPORT_SYMBOL_GPL(labpc_free_dma_chan);
-static int __init ni_labpc_isadma_init_module(void)
-{
- return 0;
-}
-module_init(ni_labpc_isadma_init_module);
-
-static void __exit ni_labpc_isadma_cleanup_module(void)
-{
-}
-module_exit(ni_labpc_isadma_cleanup_module);
-
MODULE_AUTHOR("Comedi https://www.comedi.org");
MODULE_DESCRIPTION("Comedi NI Lab-PC ISA DMA support");
MODULE_LICENSE("GPL");
diff --git a/drivers/comedi/drivers/ni_tio.c b/drivers/comedi/drivers/ni_tio.c
index 519359a870a7..c3a909abcfa7 100644
--- a/drivers/comedi/drivers/ni_tio.c
+++ b/drivers/comedi/drivers/ni_tio.c
@@ -1825,17 +1825,6 @@ void ni_gpct_device_destroy(struct ni_gpct_device *counter_dev)
}
EXPORT_SYMBOL_GPL(ni_gpct_device_destroy);
-static int __init ni_tio_init_module(void)
-{
- return 0;
-}
-module_init(ni_tio_init_module);
-
-static void __exit ni_tio_cleanup_module(void)
-{
-}
-module_exit(ni_tio_cleanup_module);
-
MODULE_AUTHOR("Comedi <comedi@comedi.org>");
MODULE_DESCRIPTION("Comedi support for NI general-purpose counters");
MODULE_LICENSE("GPL");
diff --git a/drivers/comedi/drivers/ni_tiocmd.c b/drivers/comedi/drivers/ni_tiocmd.c
index ab6d9e8269f3..9c166703626b 100644
--- a/drivers/comedi/drivers/ni_tiocmd.c
+++ b/drivers/comedi/drivers/ni_tiocmd.c
@@ -494,17 +494,6 @@ void ni_tio_set_mite_channel(struct ni_gpct *counter,
}
EXPORT_SYMBOL_GPL(ni_tio_set_mite_channel);
-static int __init ni_tiocmd_init_module(void)
-{
- return 0;
-}
-module_init(ni_tiocmd_init_module);
-
-static void __exit ni_tiocmd_cleanup_module(void)
-{
-}
-module_exit(ni_tiocmd_cleanup_module);
-
MODULE_AUTHOR("Comedi <comedi@comedi.org>");
MODULE_DESCRIPTION("Comedi command support for NI general-purpose counters");
MODULE_LICENSE("GPL");
diff --git a/drivers/comedi/drivers/ni_usb6501.c b/drivers/comedi/drivers/ni_usb6501.c
index 0dd9edf7bced..7afc5661a5ec 100644
--- a/drivers/comedi/drivers/ni_usb6501.c
+++ b/drivers/comedi/drivers/ni_usb6501.c
@@ -477,31 +477,16 @@ static int ni6501_find_endpoints(struct comedi_device *dev)
struct usb_interface *intf = comedi_to_usb_interface(dev);
struct ni6501_private *devpriv = dev->private;
struct usb_host_interface *iface_desc = intf->cur_altsetting;
- struct usb_endpoint_descriptor *ep_desc;
- int i;
+ int ret;
if (iface_desc->desc.bNumEndpoints != 2) {
dev_err(dev->class_dev, "Wrong number of endpoints\n");
return -ENODEV;
}
- for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) {
- ep_desc = &iface_desc->endpoint[i].desc;
-
- if (usb_endpoint_is_bulk_in(ep_desc)) {
- if (!devpriv->ep_rx)
- devpriv->ep_rx = ep_desc;
- continue;
- }
-
- if (usb_endpoint_is_bulk_out(ep_desc)) {
- if (!devpriv->ep_tx)
- devpriv->ep_tx = ep_desc;
- continue;
- }
- }
-
- if (!devpriv->ep_rx || !devpriv->ep_tx)
+ ret = usb_find_common_endpoints(iface_desc, &devpriv->ep_rx,
+ &devpriv->ep_tx, NULL, NULL);
+ if (ret)
return -ENODEV;
if (usb_endpoint_maxp(devpriv->ep_rx) < RX_MAX_SIZE)
diff --git a/drivers/comedi/drivers/pcl711.c b/drivers/comedi/drivers/pcl711.c
index 0cf3917defe7..5d2c4b2aa3bb 100644
--- a/drivers/comedi/drivers/pcl711.c
+++ b/drivers/comedi/drivers/pcl711.c
@@ -112,6 +112,7 @@ struct pcl711_board {
int n_aichan;
int n_aochan;
int maxirq;
+ unsigned int min_io_start;
const struct comedi_lrange *ai_range_type;
};
@@ -132,12 +133,14 @@ static const struct pcl711_board boardtypes[] = {
.n_aichan = 16,
.n_aochan = 2,
.maxirq = 15,
+ .min_io_start = 0x200,
.ai_range_type = &range_acl8112hg_ai,
}, {
.name = "acl8112dg",
.n_aichan = 16,
.n_aochan = 2,
.maxirq = 15,
+ .min_io_start = 0x200,
.ai_range_type = &range_acl8112dg_ai,
},
};
@@ -418,7 +421,8 @@ static int pcl711_attach(struct comedi_device *dev, struct comedi_devconfig *it)
struct comedi_subdevice *s;
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x10);
+ ret = comedi_check_request_region(dev, it->options[0], 0x10,
+ board->min_io_start, 0x3ff, 16);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/pcl724.c b/drivers/comedi/drivers/pcl724.c
index 00474710b81f..9707d0c89304 100644
--- a/drivers/comedi/drivers/pcl724.c
+++ b/drivers/comedi/drivers/pcl724.c
@@ -31,6 +31,8 @@
struct pcl724_board {
const char *name;
unsigned int io_range;
+ unsigned int min_io_start;
+ unsigned int max_io_end;
unsigned int can_have96:1;
unsigned int is_pet48:1;
int numofports;
@@ -40,37 +42,53 @@ static const struct pcl724_board boardtypes[] = {
{
.name = "pcl724",
.io_range = 0x04,
+ .min_io_start = 0x200,
+ .max_io_end = 0x3ff,
.numofports = 1, /* 24 DIO channels */
}, {
.name = "pcl722",
.io_range = 0x20,
+ .min_io_start = 0x200,
+ .max_io_end = 0x3ff,
.can_have96 = 1,
.numofports = 6, /* 144 (or 96) DIO channels */
}, {
.name = "pcl731",
.io_range = 0x08,
+ .min_io_start = 0,
+ .max_io_end = 0x3ff,
.numofports = 2, /* 48 DIO channels */
}, {
.name = "acl7122",
.io_range = 0x20,
+ .min_io_start = 0x200,
+ .max_io_end = 0x3ff,
.can_have96 = 1,
.numofports = 6, /* 144 (or 96) DIO channels */
}, {
.name = "acl7124",
.io_range = 0x04,
+ .min_io_start = 0x200,
+ .max_io_end = 0x3ff,
.numofports = 1, /* 24 DIO channels */
}, {
.name = "pet48dio",
.io_range = 0x02,
+ .min_io_start = 0,
+ .max_io_end = 0x3ff,
.is_pet48 = 1,
.numofports = 2, /* 48 DIO channels */
}, {
.name = "pcmio48",
.io_range = 0x08,
+ .min_io_start = 0x100,
+ .max_io_end = 0x17f,
.numofports = 2, /* 48 DIO channels */
}, {
.name = "onyx-mm-dio",
.io_range = 0x10,
+ .min_io_start = 0,
+ .max_io_end = 0x3ff,
.numofports = 2, /* 48 DIO channels */
},
};
@@ -112,7 +130,9 @@ static int pcl724_attach(struct comedi_device *dev,
n_subdevices = 4;
}
- ret = comedi_request_region(dev, it->options[0], iorange);
+ ret = comedi_check_request_region(dev, it->options[0], iorange,
+ board->min_io_start,
+ board->max_io_end, iorange);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/pcl726.c b/drivers/comedi/drivers/pcl726.c
index b542896fa0e4..d3b1f4388643 100644
--- a/drivers/comedi/drivers/pcl726.c
+++ b/drivers/comedi/drivers/pcl726.c
@@ -91,7 +91,8 @@ static const struct comedi_lrange *const rangelist_728[] = {
struct pcl726_board {
const char *name;
- unsigned long io_len;
+ unsigned int io_len;
+ unsigned int min_io_start;
unsigned int irq_mask;
const struct comedi_lrange *const *ao_ranges;
int ao_num_ranges;
@@ -104,6 +105,7 @@ static const struct pcl726_board pcl726_boards[] = {
{
.name = "pcl726",
.io_len = 0x10,
+ .min_io_start = 0x200,
.ao_ranges = &rangelist_726[0],
.ao_num_ranges = ARRAY_SIZE(rangelist_726),
.ao_nchan = 6,
@@ -111,6 +113,7 @@ static const struct pcl726_board pcl726_boards[] = {
}, {
.name = "pcl727",
.io_len = 0x20,
+ .min_io_start = 0x200,
.ao_ranges = &rangelist_727[0],
.ao_num_ranges = ARRAY_SIZE(rangelist_727),
.ao_nchan = 12,
@@ -119,12 +122,14 @@ static const struct pcl726_board pcl726_boards[] = {
}, {
.name = "pcl728",
.io_len = 0x08,
+ .min_io_start = 0,
.ao_num_ranges = ARRAY_SIZE(rangelist_728),
.ao_ranges = &rangelist_728[0],
.ao_nchan = 2,
}, {
.name = "acl6126",
.io_len = 0x10,
+ .min_io_start = 0x200,
.irq_mask = 0x96e8,
.ao_num_ranges = ARRAY_SIZE(rangelist_726),
.ao_ranges = &rangelist_726[0],
@@ -133,6 +138,7 @@ static const struct pcl726_board pcl726_boards[] = {
}, {
.name = "acl6128",
.io_len = 0x08,
+ .min_io_start = 0,
.ao_num_ranges = ARRAY_SIZE(rangelist_728),
.ao_ranges = &rangelist_728[0],
.ao_nchan = 2,
@@ -316,7 +322,9 @@ static int pcl726_attach(struct comedi_device *dev,
int ret;
int i;
- ret = comedi_request_region(dev, it->options[0], board->io_len);
+ ret = comedi_check_request_region(dev, it->options[0], board->io_len,
+ board->min_io_start, 0x3ff,
+ board->io_len);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/pcl730.c b/drivers/comedi/drivers/pcl730.c
index d2733cd5383d..cf0f97b6e2c0 100644
--- a/drivers/comedi/drivers/pcl730.c
+++ b/drivers/comedi/drivers/pcl730.c
@@ -101,7 +101,9 @@
struct pcl730_board {
const char *name;
- unsigned int io_range;
+ unsigned short io_range;
+ unsigned short min_io_start;
+ unsigned short align_io_start;
unsigned is_pcl725:1;
unsigned is_acl7225b:1;
unsigned is_ir104:1;
@@ -117,6 +119,8 @@ static const struct pcl730_board pcl730_boards[] = {
{
.name = "pcl730",
.io_range = 0x04,
+ .min_io_start = 0,
+ .align_io_start = 0x04,
.has_ttl_io = 1,
.n_subdevs = 4,
.n_iso_out_chan = 16,
@@ -125,6 +129,8 @@ static const struct pcl730_board pcl730_boards[] = {
}, {
.name = "iso730",
.io_range = 0x04,
+ .min_io_start = 0,
+ .align_io_start = 0x04,
.n_subdevs = 4,
.n_iso_out_chan = 16,
.n_iso_in_chan = 16,
@@ -132,6 +138,8 @@ static const struct pcl730_board pcl730_boards[] = {
}, {
.name = "acl7130",
.io_range = 0x08,
+ .min_io_start = 0x200,
+ .align_io_start = 0x08,
.has_ttl_io = 1,
.n_subdevs = 4,
.n_iso_out_chan = 16,
@@ -140,6 +148,8 @@ static const struct pcl730_board pcl730_boards[] = {
}, {
.name = "pcm3730",
.io_range = 0x04,
+ .min_io_start = 0,
+ .align_io_start = 0x04,
.has_ttl_io = 1,
.n_subdevs = 4,
.n_iso_out_chan = 8,
@@ -148,6 +158,8 @@ static const struct pcl730_board pcl730_boards[] = {
}, {
.name = "pcl725",
.io_range = 0x02,
+ .min_io_start = 0x200,
+ .align_io_start = 0x02,
.is_pcl725 = 1,
.n_subdevs = 2,
.n_iso_out_chan = 8,
@@ -155,6 +167,8 @@ static const struct pcl730_board pcl730_boards[] = {
}, {
.name = "p8r8dio",
.io_range = 0x02,
+ .min_io_start = 0,
+ .align_io_start = 0x10,
.is_pcl725 = 1,
.has_readback = 1,
.n_subdevs = 2,
@@ -163,6 +177,8 @@ static const struct pcl730_board pcl730_boards[] = {
}, {
.name = "acl7225b",
.io_range = 0x08, /* only 4 are used */
+ .min_io_start = 0x200,
+ .align_io_start = 0x08,
.is_acl7225b = 1,
.has_readback = 1,
.n_subdevs = 2,
@@ -171,6 +187,8 @@ static const struct pcl730_board pcl730_boards[] = {
}, {
.name = "p16r16dio",
.io_range = 0x04,
+ .min_io_start = 0,
+ .align_io_start = 0x08,
.is_acl7225b = 1,
.has_readback = 1,
.n_subdevs = 2,
@@ -179,16 +197,22 @@ static const struct pcl730_board pcl730_boards[] = {
}, {
.name = "pcl733",
.io_range = 0x04,
+ .min_io_start = 0,
+ .align_io_start = 0x04,
.n_subdevs = 1,
.n_iso_in_chan = 32,
}, {
.name = "pcl734",
.io_range = 0x04,
+ .min_io_start = 0,
+ .align_io_start = 0x04,
.n_subdevs = 1,
.n_iso_out_chan = 32,
}, {
.name = "opmm-1616-xt",
.io_range = 0x10,
+ .min_io_start = 0x100,
+ .align_io_start = 0x10,
.is_acl7225b = 1,
.has_readback = 1,
.n_subdevs = 2,
@@ -197,11 +221,15 @@ static const struct pcl730_board pcl730_boards[] = {
}, {
.name = "pearl-mm-p",
.io_range = 0x02,
+ .min_io_start = 0x240,
+ .align_io_start = 0x40,
.n_subdevs = 1,
.n_iso_out_chan = 16,
}, {
.name = "ir104-pbf",
.io_range = 0x08,
+ .min_io_start = 0x240,
+ .align_io_start = 0x20,
.is_ir104 = 1,
.has_readback = 1,
.n_iso_out_chan = 20,
@@ -266,10 +294,27 @@ static int pcl730_attach(struct comedi_device *dev,
{
const struct pcl730_board *board = dev->board_ptr;
struct comedi_subdevice *s;
+ unsigned int iobase = it->options[0];
int subdev;
int ret;
- ret = comedi_request_region(dev, it->options[0], board->io_range);
+ if (board->is_ir104) {
+ switch (iobase) {
+ case 0x240:
+ case 0x260:
+ case 0x280:
+ case 0x300:
+ break;
+ default:
+ dev_warn(dev->class_dev,
+ "%s: unsupported I/O base address %#x\n",
+ dev->board_name, iobase);
+ return -EINVAL;
+ }
+ }
+ ret = comedi_check_request_region(dev, iobase, board->io_range,
+ board->min_io_start, 0x3ff,
+ board->align_io_start);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/pcl812.c b/drivers/comedi/drivers/pcl812.c
index abca61a72cf7..98b75792c09b 100644
--- a/drivers/comedi/drivers/pcl812.c
+++ b/drivers/comedi/drivers/pcl812.c
@@ -331,6 +331,7 @@ enum pcl812_boardtype {
struct pcl812_board {
const char *name;
enum pcl812_boardtype board_type;
+ unsigned short min_io_start;
int n_aichan;
int n_aochan;
unsigned int ai_ns_min;
@@ -346,6 +347,7 @@ static const struct pcl812_board boardtypes[] = {
{
.name = "pcl812",
.board_type = BOARD_PCL812,
+ .min_io_start = 0,
.n_aichan = 16,
.n_aochan = 2,
.ai_ns_min = 33000,
@@ -355,6 +357,7 @@ static const struct pcl812_board boardtypes[] = {
.has_dio = 1,
}, {
.name = "pcl812pg",
+ .min_io_start = 0,
.board_type = BOARD_PCL812PG,
.n_aichan = 16,
.n_aochan = 2,
@@ -366,6 +369,7 @@ static const struct pcl812_board boardtypes[] = {
}, {
.name = "acl8112pg",
.board_type = BOARD_PCL812PG,
+ .min_io_start = 0x200,
.n_aichan = 16,
.n_aochan = 2,
.ai_ns_min = 10000,
@@ -376,6 +380,7 @@ static const struct pcl812_board boardtypes[] = {
}, {
.name = "acl8112dg",
.board_type = BOARD_ACL8112,
+ .min_io_start = 0x200,
.n_aichan = 16, /* 8 differential */
.n_aochan = 2,
.ai_ns_min = 10000,
@@ -387,6 +392,7 @@ static const struct pcl812_board boardtypes[] = {
}, {
.name = "acl8112hg",
.board_type = BOARD_ACL8112,
+ .min_io_start = 0x200,
.n_aichan = 16, /* 8 differential */
.n_aochan = 2,
.ai_ns_min = 10000,
@@ -398,6 +404,7 @@ static const struct pcl812_board boardtypes[] = {
}, {
.name = "a821pgl",
.board_type = BOARD_A821,
+ .min_io_start = 0,
.n_aichan = 16, /* 8 differential */
.n_aochan = 1,
.ai_ns_min = 10000,
@@ -407,6 +414,7 @@ static const struct pcl812_board boardtypes[] = {
}, {
.name = "a821pglnda",
.board_type = BOARD_A821,
+ .min_io_start = 0,
.n_aichan = 16, /* 8 differential */
.ai_ns_min = 10000,
.rangelist_ai = &range_pcl813b_ai,
@@ -414,6 +422,7 @@ static const struct pcl812_board boardtypes[] = {
}, {
.name = "a821pgh",
.board_type = BOARD_A821,
+ .min_io_start = 0,
.n_aichan = 16, /* 8 differential */
.n_aochan = 1,
.ai_ns_min = 10000,
@@ -423,6 +432,7 @@ static const struct pcl812_board boardtypes[] = {
}, {
.name = "a822pgl",
.board_type = BOARD_ACL8112,
+ .min_io_start = 0,
.n_aichan = 16, /* 8 differential */
.n_aochan = 2,
.ai_ns_min = 10000,
@@ -433,6 +443,7 @@ static const struct pcl812_board boardtypes[] = {
}, {
.name = "a822pgh",
.board_type = BOARD_ACL8112,
+ .min_io_start = 0,
.n_aichan = 16, /* 8 differential */
.n_aochan = 2,
.ai_ns_min = 10000,
@@ -443,6 +454,7 @@ static const struct pcl812_board boardtypes[] = {
}, {
.name = "a823pgl",
.board_type = BOARD_ACL8112,
+ .min_io_start = 0,
.n_aichan = 16, /* 8 differential */
.n_aochan = 2,
.ai_ns_min = 8000,
@@ -453,6 +465,7 @@ static const struct pcl812_board boardtypes[] = {
}, {
.name = "a823pgh",
.board_type = BOARD_ACL8112,
+ .min_io_start = 0,
.n_aichan = 16, /* 8 differential */
.n_aochan = 2,
.ai_ns_min = 8000,
@@ -463,26 +476,31 @@ static const struct pcl812_board boardtypes[] = {
}, {
.name = "pcl813",
.board_type = BOARD_PCL813,
+ .min_io_start = 0,
.n_aichan = 32,
.rangelist_ai = &range_pcl813b_ai,
}, {
.name = "pcl813b",
.board_type = BOARD_PCL813B,
+ .min_io_start = 0,
.n_aichan = 32,
.rangelist_ai = &range_pcl813b_ai,
}, {
.name = "acl8113",
.board_type = BOARD_ACL8113,
+ .min_io_start = 0x200,
.n_aichan = 32,
.rangelist_ai = &range_acl8113_1_ai,
}, {
.name = "iso813",
.board_type = BOARD_ISO813,
+ .min_io_start = 0,
.n_aichan = 32,
.rangelist_ai = &range_iso813_1_ai,
}, {
.name = "acl8216",
.board_type = BOARD_ACL8216,
+ .min_io_start = 0x200,
.n_aichan = 16, /* 8 differential */
.n_aochan = 2,
.ai_ns_min = 10000,
@@ -495,6 +513,7 @@ static const struct pcl812_board boardtypes[] = {
}, {
.name = "a826pg",
.board_type = BOARD_ACL8216,
+ .min_io_start = 0,
.n_aichan = 16, /* 8 differential */
.n_aochan = 2,
.ai_ns_min = 10000,
@@ -1138,7 +1157,8 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
if (!devpriv)
return -ENOMEM;
- ret = comedi_request_region(dev, it->options[0], 0x10);
+ ret = comedi_check_request_region(dev, it->options[0], 0x10,
+ board->min_io_start, 0x3ff, 16);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/pcl816.c b/drivers/comedi/drivers/pcl816.c
index 28d1a88c50f6..1fcb2f798c7a 100644
--- a/drivers/comedi/drivers/pcl816.c
+++ b/drivers/comedi/drivers/pcl816.c
@@ -608,7 +608,8 @@ static int pcl816_attach(struct comedi_device *dev, struct comedi_devconfig *it)
if (!devpriv)
return -ENOMEM;
- ret = comedi_request_region(dev, it->options[0], 0x10);
+ ret = comedi_check_request_region(dev, it->options[0], 0x10,
+ 0, 0x3ff, 16);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/pcl818.c b/drivers/comedi/drivers/pcl818.c
index 06fe06396f23..aa775a024fc7 100644
--- a/drivers/comedi/drivers/pcl818.c
+++ b/drivers/comedi/drivers/pcl818.c
@@ -981,6 +981,10 @@ static int pcl818_attach(struct comedi_device *dev, struct comedi_devconfig *it)
const struct pcl818_board *board = dev->board_ptr;
struct pcl818_private *devpriv;
struct comedi_subdevice *s;
+ unsigned int io_base = it->options[0];
+ bool fifo_is_supported = board->has_fifo && !(io_base & 0x10);
+ bool fifo_is_wanted = board->has_fifo && it->options[2] == -1;
+ unsigned int io_len = fifo_is_supported ? 0x20 : 0x10;
unsigned int osc_base;
int ret;
@@ -988,11 +992,28 @@ static int pcl818_attach(struct comedi_device *dev, struct comedi_devconfig *it)
if (!devpriv)
return -ENOMEM;
- ret = comedi_request_region(dev, it->options[0],
- board->has_fifo ? 0x20 : 0x10);
+ ret = comedi_check_request_region(dev, io_base, io_len,
+ 0, 0x3ff, io_len);
if (ret)
return ret;
+ if (board->has_fifo) {
+ /* let user know about any required JP6 setting */
+ if (fifo_is_supported) {
+ if (fifo_is_wanted) {
+ dev_info(dev->class_dev,
+ "Assuming JP6 is in \"Enabled\" (default) position to use the FIFO.\n");
+ }
+ } else {
+ dev_info(dev->class_dev,
+ "JP6 needs to be in \"Disabled\" position for correct operation at this base address\n");
+ if (fifo_is_wanted) {
+ dev_warn(dev->class_dev,
+ "FIFO cannot be used at this base address\n");
+ }
+ }
+ }
+
/* we can use IRQ 2-7 for async command support */
if (it->options[1] >= 2 && it->options[1] <= 7) {
ret = request_irq(it->options[1], pcl818_interrupt, 0,
@@ -1002,7 +1023,7 @@ static int pcl818_attach(struct comedi_device *dev, struct comedi_devconfig *it)
}
/* should we use the FIFO? */
- if (dev->irq && board->has_fifo && it->options[2] == -1)
+ if (dev->irq && fifo_is_supported && fifo_is_wanted)
devpriv->usefifo = 1;
/* we need an IRQ to do DMA on channel 3 or 1 */
diff --git a/drivers/comedi/drivers/pcm3724.c b/drivers/comedi/drivers/pcm3724.c
index fb41de3baef8..867bb5b3860a 100644
--- a/drivers/comedi/drivers/pcm3724.c
+++ b/drivers/comedi/drivers/pcm3724.c
@@ -194,7 +194,8 @@ static int pcm3724_attach(struct comedi_device *dev,
if (!priv)
return -ENOMEM;
- ret = comedi_request_region(dev, it->options[0], 0x10);
+ ret = comedi_check_request_region(dev, it->options[0], 0x10,
+ 0, 0x3ff, 16);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/pcmad.c b/drivers/comedi/drivers/pcmad.c
index 976eda43881b..fd26b1eed1db 100644
--- a/drivers/comedi/drivers/pcmad.c
+++ b/drivers/comedi/drivers/pcmad.c
@@ -106,7 +106,8 @@ static int pcmad_attach(struct comedi_device *dev, struct comedi_devconfig *it)
struct comedi_subdevice *s;
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x04);
+ ret = comedi_check_request_region(dev, it->options[0], 0x04,
+ 0, 0x3ff, 4);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/pcmda12.c b/drivers/comedi/drivers/pcmda12.c
index 611f13bedca0..6efd1ae6271a 100644
--- a/drivers/comedi/drivers/pcmda12.c
+++ b/drivers/comedi/drivers/pcmda12.c
@@ -120,7 +120,14 @@ static int pcmda12_attach(struct comedi_device *dev,
struct comedi_subdevice *s;
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x10);
+ /*
+ * The datasheet says it requires 16 contiguous addresses and is
+ * "configurable on any even sixteen port boundary". So require
+ * a 32-byte boundary and assume it uses 10-bit addresses like
+ * similar boards.
+ */
+ ret = comedi_check_request_region(dev, it->options[0], 0x10,
+ 0, 0x3ff, 32);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/pcmmio.c b/drivers/comedi/drivers/pcmmio.c
index c2402239d551..d38202c8a12b 100644
--- a/drivers/comedi/drivers/pcmmio.c
+++ b/drivers/comedi/drivers/pcmmio.c
@@ -667,7 +667,8 @@ static int pcmmio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
struct comedi_subdevice *s;
int ret;
- ret = comedi_request_region(dev, it->options[0], 32);
+ ret = comedi_check_request_region(dev, it->options[0], 32,
+ 0, 0xffff, 32);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/pcmuio.c b/drivers/comedi/drivers/pcmuio.c
index 33b24dbbb919..0995911a3ea3 100644
--- a/drivers/comedi/drivers/pcmuio.c
+++ b/drivers/comedi/drivers/pcmuio.c
@@ -521,11 +521,12 @@ static int pcmuio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
const struct pcmuio_board *board = dev->board_ptr;
struct comedi_subdevice *s;
struct pcmuio_private *devpriv;
+ unsigned int io_len = board->num_asics * PCMUIO_ASIC_IOSIZE;
int ret;
int i;
- ret = comedi_request_region(dev, it->options[0],
- board->num_asics * PCMUIO_ASIC_IOSIZE);
+ ret = comedi_check_request_region(dev, it->options[0], io_len,
+ 0, 0xffff, io_len);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/rti800.c b/drivers/comedi/drivers/rti800.c
index 1b02e47bdb4c..fa3965cf92f2 100644
--- a/drivers/comedi/drivers/rti800.c
+++ b/drivers/comedi/drivers/rti800.c
@@ -257,7 +257,8 @@ static int rti800_attach(struct comedi_device *dev, struct comedi_devconfig *it)
struct comedi_subdevice *s;
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x10);
+ ret = comedi_check_request_region(dev, it->options[0], 0x10,
+ 0, 0x3ff, 16);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/rti802.c b/drivers/comedi/drivers/rti802.c
index d66762a22258..af990881c27a 100644
--- a/drivers/comedi/drivers/rti802.c
+++ b/drivers/comedi/drivers/rti802.c
@@ -72,7 +72,8 @@ static int rti802_attach(struct comedi_device *dev, struct comedi_devconfig *it)
int i;
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x04);
+ ret = comedi_check_request_region(dev, it->options[0], 0x04,
+ 0, 0x3ff, 4);
if (ret)
return ret;
diff --git a/drivers/comedi/drivers/s526.c b/drivers/comedi/drivers/s526.c
index 9245c679a3c4..dd27c754dea4 100644
--- a/drivers/comedi/drivers/s526.c
+++ b/drivers/comedi/drivers/s526.c
@@ -553,7 +553,8 @@ static int s526_attach(struct comedi_device *dev, struct comedi_devconfig *it)
struct comedi_subdevice *s;
int ret;
- ret = comedi_request_region(dev, it->options[0], 0x40);
+ ret = comedi_check_request_region(dev, it->options[0], 0x40,
+ 0, 0xffc0, 64);
if (ret)
return ret;
diff --git a/drivers/comedi/kcomedilib/kcomedilib_main.c b/drivers/comedi/kcomedilib/kcomedilib_main.c
index baa9eaaf97d4..517e60ffd81b 100644
--- a/drivers/comedi/kcomedilib/kcomedilib_main.c
+++ b/drivers/comedi/kcomedilib/kcomedilib_main.c
@@ -351,15 +351,3 @@ int comedi_get_n_channels(struct comedi_device *dev, unsigned int subdevice)
return n;
}
EXPORT_SYMBOL_GPL(comedi_get_n_channels);
-
-static int __init kcomedilib_module_init(void)
-{
- return 0;
-}
-
-static void __exit kcomedilib_module_exit(void)
-{
-}
-
-module_init(kcomedilib_module_init);
-module_exit(kcomedilib_module_exit);