]> rtime.felk.cvut.cz Git - linux-imx.git/commitdiff
staging: comedi: pcl730: add support for the ACL-7225b ISA board
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Thu, 6 Jun 2013 22:38:49 +0000 (15:38 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 9 Jun 2013 04:57:00 +0000 (21:57 -0700)
The ACL-7225b and P16R16R-DIO ISA boards can be supported by this driver.
These board have 16 isolated digital outputs and 16 isolated digital
outputs.

Add support for these boards to the pcl730 driver and remove the
standalone acl7225b 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>
drivers/staging/comedi/Kconfig
drivers/staging/comedi/drivers/Makefile
drivers/staging/comedi/drivers/acl7225b.c [deleted file]
drivers/staging/comedi/drivers/pcl730.c

index 0f32d7e79bcdbb2eeae60647ef8c176a04fa335d..a7c0d632ffe06c1a14513039fae9916637a8ca6f 100644 (file)
@@ -110,15 +110,6 @@ menuconfig COMEDI_ISA_DRIVERS
 
 if COMEDI_ISA_DRIVERS
 
-config COMEDI_ACL7225B
-       tristate "ADlink NuDAQ ACL-7225b and compatibles support"
-       ---help---
-         Enable support for ADlink NuDAQ ACL-7225b and compatibles,
-         ADlink ACL-7225b (acl7225b), ICP P16R16DIO (p16r16dio)
-
-         To compile this driver as a module, choose M here: the module will be
-         called acl7225b.
-
 config COMEDI_PCL711
        tristate "Advantech PCL-711/711b and ADlink ACL-8112 ISA card support"
        ---help---
@@ -156,6 +147,8 @@ config COMEDI_PCL730
          ADlink ACL-7130     isolated - 16 in/16 out  ttl - 16 in/16 out
          Advantech PCM-3730  isolated - 8 in/8 out    ttl - 16 in/16 out
          Advantech PCL-725   isolated - 8 in/8 out
+         ADlink ACL-7225b    isolated - 16 in/16 out
+         ICP P16R16-DIO      isolated - 16 in/16 out
          Advantech PCL-733   isolated - 32 in
          Advantech PCL-734   isolated - 32 out
 
index c4338e9d67c2f2ff6b122dfcd8978dcc503ba3cc..dbb93e332487ed505884e0f3ddc1072544b881fb 100644 (file)
@@ -11,7 +11,6 @@ obj-$(CONFIG_COMEDI_SERIAL2002)               += serial2002.o
 obj-$(CONFIG_COMEDI_SKEL)              += skel.o
 
 # Comedi ISA drivers
-obj-$(CONFIG_COMEDI_ACL7225B)          += acl7225b.o
 obj-$(CONFIG_COMEDI_AMPLC_DIO200_ISA)  += amplc_dio200.o
 obj-$(CONFIG_COMEDI_AMPLC_PC263_ISA)   += amplc_pc263.o
 obj-$(CONFIG_COMEDI_PCL711)            += pcl711.o
diff --git a/drivers/staging/comedi/drivers/acl7225b.c b/drivers/staging/comedi/drivers/acl7225b.c
deleted file mode 100644 (file)
index 9e2c7ae..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * comedi/drivers/acl7225b.c
- * Driver for Adlink NuDAQ ACL-7225b and clones
- * José Luis Sánchez
- */
-/*
-Driver: acl7225b
-Description: Adlink NuDAQ ACL-7225b & compatibles
-Author: José Luis Sánchez (jsanchezv@teleline.es)
-Status: testing
-Devices: [Adlink] ACL-7225b (acl7225b), [ICP] P16R16DIO (p16r16dio)
-*/
-
-#include "../comedidev.h"
-
-#include <linux/ioport.h>
-
-#define ACL7225_RIO_LO 0       /* Relays input/output low byte (R0-R7) */
-#define ACL7225_RIO_HI 1       /* Relays input/output high byte (R8-R15) */
-#define ACL7225_DI_LO  2       /* Digital input low byte (DI0-DI7) */
-#define ACL7225_DI_HI  3       /* Digital input high byte (DI8-DI15) */
-
-struct acl7225b_boardinfo {
-       const char *name;
-       int io_range;
-};
-
-static const struct acl7225b_boardinfo acl7225b_boards[] = {
-       {
-               .name           = "acl7225b",
-               .io_range       = 8,            /* only 4 are used */
-       }, {
-               .name           = "p16r16dio",
-               .io_range       = 4,
-       },
-};
-
-static int acl7225b_do_insn_bits(struct comedi_device *dev,
-                                struct comedi_subdevice *s,
-                                struct comedi_insn *insn,
-                                unsigned int *data)
-{
-       unsigned long reg = (unsigned long)s->private;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
-               if (mask & 0x00ff)
-                       outb(s->state & 0xff, dev->iobase + reg);
-               if (mask & 0xff00)
-                       outb((s->state >> 8), dev->iobase + reg + 1);
-       }
-
-       data[1] = s->state;
-
-       return insn->n;
-}
-
-static int acl7225b_di_insn_bits(struct comedi_device *dev,
-                                struct comedi_subdevice *s,
-                                struct comedi_insn *insn,
-                                unsigned int *data)
-{
-       unsigned long reg = (unsigned long)s->private;
-
-       data[1] = inb(dev->iobase + reg) |
-                 (inb(dev->iobase + reg + 1) << 8);
-
-       return insn->n;
-}
-
-static int acl7225b_attach(struct comedi_device *dev,
-                          struct comedi_devconfig *it)
-{
-       const struct acl7225b_boardinfo *board = comedi_board(dev);
-       struct comedi_subdevice *s;
-       int ret;
-
-       ret = comedi_request_region(dev, it->options[0], board->io_range);
-       if (ret)
-               return ret;
-
-       ret = comedi_alloc_subdevices(dev, 3);
-       if (ret)
-               return ret;
-
-       s = &dev->subdevices[0];
-       /* Relays outputs */
-       s->type         = COMEDI_SUBD_DO;
-       s->subdev_flags = SDF_WRITABLE;
-       s->maxdata      = 1;
-       s->n_chan       = 16;
-       s->insn_bits    = acl7225b_do_insn_bits;
-       s->range_table  = &range_digital;
-       s->private      = (void *)ACL7225_RIO_LO;
-
-       s = &dev->subdevices[1];
-       /* Relays status */
-       s->type         = COMEDI_SUBD_DI;
-       s->subdev_flags = SDF_READABLE;
-       s->maxdata      = 1;
-       s->n_chan       = 16;
-       s->insn_bits    = acl7225b_di_insn_bits;
-       s->range_table  = &range_digital;
-       s->private      = (void *)ACL7225_RIO_LO;
-
-       s = &dev->subdevices[2];
-       /* Isolated digital inputs */
-       s->type         = COMEDI_SUBD_DI;
-       s->subdev_flags = SDF_READABLE;
-       s->maxdata      = 1;
-       s->n_chan       = 16;
-       s->insn_bits    = acl7225b_di_insn_bits;
-       s->range_table  = &range_digital;
-       s->private      = (void *)ACL7225_DI_LO;
-
-       return 0;
-}
-
-static struct comedi_driver acl7225b_driver = {
-       .driver_name    = "acl7225b",
-       .module         = THIS_MODULE,
-       .attach         = acl7225b_attach,
-       .detach         = comedi_legacy_detach,
-       .board_name     = &acl7225b_boards[0].name,
-       .num_names      = ARRAY_SIZE(acl7225b_boards),
-       .offset         = sizeof(struct acl7225b_boardinfo),
-};
-module_comedi_driver(acl7225b_driver);
-
-MODULE_DESCRIPTION("Comedi: NuDAQ ACL-7225B, 16 Relay & 16 Isolated DI Card");
-MODULE_AUTHOR("Comedi http://www.comedi.org");
-MODULE_LICENSE("GPL");
index 64aafdaebeee029a4bcdf0a7a7717096442b787d..d3bdf744a07c30aefcb6d243600e04dac9f555c3 100644 (file)
@@ -12,6 +12,8 @@
  *         (Adlink) ACL-7130 [acl7130]
  *         (Advantech) PCM-3730 [pcm3730]
  *         (Advantech) PCL-725 [pcl725]
+ *         (Adlink) ACL-7225b [acl7225b]
+ *         (ICP) P16R16-DIO [p16r16dio]
  *         (Advantech) PCL-733 [pcl733]
  *         (Advantech) PCL-734 [pcl734]
  * Author: José Luis Sánchez (jsanchezv@teleline.es)
@@ -33,6 +35,8 @@
  *
  * 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.
+ * The acl7225b and p16r16dio boards have isolated digital output readback
+ * and separate registers for isolated digital I/O.
  * The pcl733 ISA board uses all four registers for isolated digital inputs.
  * The pcl734 ISA board uses all four registers for isolated digital outputs.
  */
@@ -45,6 +49,8 @@ struct pcl730_board {
        const char *name;
        unsigned int io_range;
        unsigned is_pcl725:1;
+       unsigned is_acl7225b:1;
+       unsigned has_readback:1;
        unsigned has_ttl_io:1;
        int n_subdevs;
        int n_iso_out_chan;
@@ -91,6 +97,22 @@ static const struct pcl730_board pcl730_boards[] = {
                .n_subdevs      = 2,
                .n_iso_out_chan = 8,
                .n_iso_in_chan  = 8,
+       }, {
+               .name           = "acl7225b",
+               .io_range       = 0x08,         /* only 4 are used */
+               .is_acl7225b    = 1,
+               .has_readback   = 1,
+               .n_subdevs      = 2,
+               .n_iso_out_chan = 16,
+               .n_iso_in_chan  = 16,
+       }, {
+               .name           = "p16r16dio",
+               .io_range       = 0x04,
+               .is_acl7225b    = 1,
+               .has_readback   = 1,
+               .n_subdevs      = 2,
+               .n_iso_out_chan = 16,
+               .n_iso_in_chan  = 16,
        }, {
                .name           = "pcl733",
                .io_range       = 0x04,
@@ -187,6 +209,10 @@ static int pcl730_attach(struct comedi_device *dev,
                s->range_table  = &range_digital;
                s->insn_bits    = pcl730_do_insn_bits;
                s->private      = (void *)PCL730_IDIO_LO;
+
+               /* get the initial state if supported */
+               if (board->has_readback)
+                       s->state = pcl730_get_bits(dev, s);
        }
 
        if (board->n_iso_in_chan) {
@@ -198,7 +224,8 @@ 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      = board->is_pcl725 ? (void *)PCL730_IDIO_HI
+               s->private      = board->is_acl7225b ? (void *)PCL730_DIO_LO :
+                                 board->is_pcl725 ? (void *)PCL730_IDIO_HI
                                                   : (void *)PCL730_IDIO_LO;
        }