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;
{
.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,
}, {
.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,
}, {
.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,
}, {
.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,
}, {
.name = "pcl725",
.io_range = 0x02,
+ .min_io_start = 0x200,
+ .align_io_start = 0x02,
.is_pcl725 = 1,
.n_subdevs = 2,
.n_iso_out_chan = 8,
}, {
.name = "p8r8dio",
.io_range = 0x02,
+ .min_io_start = 0,
+ .align_io_start = 0x10,
.is_pcl725 = 1,
.has_readback = 1,
.n_subdevs = 2,
}, {
.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,
}, {
.name = "p16r16dio",
.io_range = 0x04,
+ .min_io_start = 0,
+ .align_io_start = 0x08,
.is_acl7225b = 1,
.has_readback = 1,
.n_subdevs = 2,
}, {
.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,
}, {
.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,
{
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;