summaryrefslogtreecommitdiff
path: root/drivers/staging/comedi/drivers/pcl730.c
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2013-06-06 15:37:44 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-06-08 21:56:58 -0700
commitf68d07f0804e78c1e72cd6861a455b6889f3587e (patch)
tree303a1003fb43696a988f893897b2f1230fdddda4 /drivers/staging/comedi/drivers/pcl730.c
parent145ff35bab0c64320cba09a1c720525e035025c4 (diff)
staging: comedi: pcl730: add support for the PCL-725 ISA board
The PCL-725 ISA board can be supported by this driver. This board has 8 isolated digital inputs and 8 isolated digital outputs. Add support for the PCL-725 board to the pcl730 driver and remove the standalone pcl725 driver. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Cc: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/comedi/drivers/pcl730.c')
-rw-r--r--drivers/staging/comedi/drivers/pcl730.c64
1 files changed, 42 insertions, 22 deletions
diff --git a/drivers/staging/comedi/drivers/pcl730.c b/drivers/staging/comedi/drivers/pcl730.c
index 4b9a4fbd7b72..72e20a7a7d6a 100644
--- a/drivers/staging/comedi/drivers/pcl730.c
+++ b/drivers/staging/comedi/drivers/pcl730.c
@@ -11,6 +11,7 @@
* (ICP) ISO-730 [iso730]
* (Adlink) ACL-7130 [acl7130]
* (Advantech) PCM-3730 [pcm3730]
+ * (Advantech) PCL-725 [pcl725]
* Author: José Luis Sánchez (jsanchezv@teleline.es)
* Status: untested
*
@@ -29,6 +30,7 @@
* Register I/O map
*
* The pcm3730 PC/104 board does not have the PCL730_IDIO_HI register.
+ * The pcl725 ISA board uses separate registers for isolated digital I/O.
*/
#define PCL730_IDIO_LO 0 /* Isolated Digital I/O low byte (ID0-ID7) */
#define PCL730_IDIO_HI 1 /* Isolated Digital I/O high byte (ID8-ID15) */
@@ -38,25 +40,40 @@
struct pcl730_board {
const char *name;
unsigned int io_range;
+ unsigned is_pcl725:1;
+ unsigned has_ttl_io:1;
int n_iso_chan;
+ int n_ttl_chan;
};
static const struct pcl730_board pcl730_boards[] = {
{
.name = "pcl730",
.io_range = 0x04,
+ .has_ttl_io = 1,
.n_iso_chan = 16,
+ .n_ttl_chan = 16,
}, {
.name = "iso730",
.io_range = 0x04,
.n_iso_chan = 16,
+ .n_ttl_chan = 16,
}, {
.name = "acl7130",
.io_range = 0x08,
+ .has_ttl_io = 1,
.n_iso_chan = 16,
+ .n_ttl_chan = 16,
}, {
.name = "pcm3730",
.io_range = 0x04,
+ .has_ttl_io = 1,
+ .n_iso_chan = 8,
+ .n_ttl_chan = 16,
+ }, {
+ .name = "pcl725",
+ .io_range = 0x02,
+ .is_pcl725 = 1,
.n_iso_chan = 8,
},
};
@@ -113,7 +130,7 @@ static int pcl730_attach(struct comedi_device *dev,
if (ret)
return ret;
- ret = comedi_alloc_subdevices(dev, 4);
+ ret = comedi_alloc_subdevices(dev, board->has_ttl_io ? 4 : 2);
if (ret)
return ret;
@@ -135,27 +152,30 @@ static int pcl730_attach(struct comedi_device *dev,
s->maxdata = 1;
s->range_table = &range_digital;
s->insn_bits = pcl730_di_insn_bits;
- s->private = (void *)PCL730_IDIO_LO;
-
- /* TTL Digital Outputs */
- s = &dev->subdevices[2];
- s->type = COMEDI_SUBD_DO;
- s->subdev_flags = SDF_WRITABLE;
- s->n_chan = 16;
- s->maxdata = 1;
- s->range_table = &range_digital;
- s->insn_bits = pcl730_do_insn_bits;
- s->private = (void *)PCL730_DIO_LO;
-
- /* TTL Digital Inputs */
- s = &dev->subdevices[3];
- s->type = COMEDI_SUBD_DI;
- s->subdev_flags = SDF_READABLE;
- s->n_chan = 16;
- s->maxdata = 1;
- s->range_table = &range_digital;
- s->insn_bits = pcl730_di_insn_bits;
- s->private = (void *)PCL730_DIO_LO;
+ s->private = board->is_pcl725 ? (void *)PCL730_IDIO_HI
+ : (void *)PCL730_IDIO_LO;
+
+ if (board->has_ttl_io) {
+ /* TTL Digital Outputs */
+ s = &dev->subdevices[2];
+ s->type = COMEDI_SUBD_DO;
+ s->subdev_flags = SDF_WRITABLE;
+ s->n_chan = board->n_ttl_chan;
+ s->maxdata = 1;
+ s->range_table = &range_digital;
+ s->insn_bits = pcl730_do_insn_bits;
+ s->private = (void *)PCL730_DIO_LO;
+
+ /* TTL Digital Inputs */
+ s = &dev->subdevices[3];
+ s->type = COMEDI_SUBD_DI;
+ s->subdev_flags = SDF_READABLE;
+ s->n_chan = board->n_ttl_chan;
+ s->maxdata = 1;
+ s->range_table = &range_digital;
+ s->insn_bits = pcl730_di_insn_bits;
+ s->private = (void *)PCL730_DIO_LO;
+ }
return 0;
}