Commit f68d07f0 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman
Browse files

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: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 145ff35b
Loading
Loading
Loading
Loading
+9 −12
Original line number Diff line number Diff line
@@ -137,14 +137,6 @@ config COMEDI_PCL724
	  To compile this driver as a module, choose M here: the module will be
	  called pcl724.

config COMEDI_PCL725
	tristate "Advantech PCL-725 and compatible ISA card support"
	---help---
	  Enable support for Advantech PCL-725 and compatible ISA cards.

	  To compile this driver as a module, choose M here: the module will be
	  called pcl725.

config COMEDI_PCL726
	tristate "Advantech PCL-726 and compatible ISA card support"
	---help---
@@ -154,11 +146,16 @@ config COMEDI_PCL726
	  called pcl726.

config COMEDI_PCL730
	tristate "Advantech PCL-730/PCM-3730 and compatible board support"
	tristate "Simple Digital I/O board support (8-bit ports)"
	---help---
	  Enable support for Advantech PCL-730, ICP ISO-730 and ADlink
	  ACL-7130 ISA cards as well as the Advantech PCM-3730 and clone
	  PC/104 boards.
	  Enable support for various simple ISA or PC/104 Digital I/O boards.
	  These boards all use 8-bit I/O ports.

	  Advantech PCL-730   isolated - 16 in/16 out  ttl - 16 in/16 out
	  ICP ISO-730         isolated - 16 in/16 out  ttl - 16 in/16 out
	  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

	  To compile this driver as a module, choose M here: the module will be
	  called pcl730.
+0 −1
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@ obj-$(CONFIG_COMEDI_AMPLC_DIO200_ISA) += amplc_dio200.o
obj-$(CONFIG_COMEDI_AMPLC_PC263_ISA)	+= amplc_pc263.o
obj-$(CONFIG_COMEDI_PCL711)		+= pcl711.o
obj-$(CONFIG_COMEDI_PCL724)		+= pcl724.o
obj-$(CONFIG_COMEDI_PCL725)		+= pcl725.o
obj-$(CONFIG_COMEDI_PCL726)		+= pcl726.o
obj-$(CONFIG_COMEDI_PCL730)		+= pcl730.o
obj-$(CONFIG_COMEDI_PCL812)		+= pcl812.o
+0 −91
Original line number Diff line number Diff line
/*
 * comedi/drivers/pcl725.c
 * Driver for PCL725 and clones
 * David A. Schleef
 */
/*
Driver: pcl725
Description: Advantech PCL-725 (& compatibles)
Author: ds
Status: unknown
Devices: [Advantech] PCL-725 (pcl725)
*/

#include "../comedidev.h"

#include <linux/ioport.h>

#define PCL725_SIZE 2

#define PCL725_DO 0
#define PCL725_DI 1

static int pcl725_do_insn(struct comedi_device *dev, struct comedi_subdevice *s,
			  struct comedi_insn *insn, unsigned int *data)
{
	if (data[0]) {
		s->state &= ~data[0];
		s->state |= (data[0] & data[1]);
		outb(s->state, dev->iobase + PCL725_DO);
	}

	data[1] = s->state;

	return insn->n;
}

static int pcl725_di_insn(struct comedi_device *dev, struct comedi_subdevice *s,
			  struct comedi_insn *insn, unsigned int *data)
{
	data[1] = inb(dev->iobase + PCL725_DI);

	return insn->n;
}

static int pcl725_attach(struct comedi_device *dev, struct comedi_devconfig *it)
{
	struct comedi_subdevice *s;
	int ret;

	ret = comedi_request_region(dev, it->options[0], PCL725_SIZE);
	if (ret)
		return ret;

	ret = comedi_alloc_subdevices(dev, 2);
	if (ret)
		return ret;

	s = &dev->subdevices[0];
	/* do */
	s->type = COMEDI_SUBD_DO;
	s->subdev_flags = SDF_WRITABLE;
	s->maxdata = 1;
	s->n_chan = 8;
	s->insn_bits = pcl725_do_insn;
	s->range_table = &range_digital;

	s = &dev->subdevices[1];
	/* di */
	s->type = COMEDI_SUBD_DI;
	s->subdev_flags = SDF_READABLE;
	s->maxdata = 1;
	s->n_chan = 8;
	s->insn_bits = pcl725_di_insn;
	s->range_table = &range_digital;

	printk(KERN_INFO "\n");

	return 0;
}

static struct comedi_driver pcl725_driver = {
	.driver_name	= "pcl725",
	.module		= THIS_MODULE,
	.attach		= pcl725_attach,
	.detach		= comedi_legacy_detach,
};
module_comedi_driver(pcl725_driver);

MODULE_AUTHOR("Comedi http://www.comedi.org");
MODULE_DESCRIPTION("Comedi low-level driver");
MODULE_LICENSE("GPL");
+42 −22
Original line number Diff line number Diff line
@@ -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,13 +152,15 @@ 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;
	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	= 16;
		s->n_chan	= board->n_ttl_chan;
		s->maxdata	= 1;
		s->range_table	= &range_digital;
		s->insn_bits	= pcl730_do_insn_bits;
@@ -151,11 +170,12 @@ static int pcl730_attach(struct comedi_device *dev,
		s = &dev->subdevices[3];
		s->type		= COMEDI_SUBD_DI;
		s->subdev_flags	= SDF_READABLE;
	s->n_chan	= 16;
		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;
}