2 * comedi/drivers/pcl725.c
3 * Driver for PCL725 and clones
8 Description: Advantech PCL-725 (& compatibles)
11 Devices: [Advantech] PCL-725 (pcl725)
14 #include "../comedidev.h"
16 #include <linux/ioport.h>
23 static int pcl725_do_insn(struct comedi_device *dev, struct comedi_subdevice *s,
24 struct comedi_insn *insn, unsigned int *data)
28 s->state |= (data[0] & data[1]);
29 outb(s->state, dev->iobase + PCL725_DO);
37 static int pcl725_di_insn(struct comedi_device *dev, struct comedi_subdevice *s,
38 struct comedi_insn *insn, unsigned int *data)
40 data[1] = inb(dev->iobase + PCL725_DI);
45 static int pcl725_attach(struct comedi_device *dev, struct comedi_devconfig *it)
47 struct comedi_subdevice *s;
51 iobase = it->options[0];
52 printk(KERN_INFO "comedi%d: pcl725: 0x%04lx ", dev->minor, iobase);
53 if (!request_region(iobase, PCL725_SIZE, "pcl725")) {
54 printk("I/O port conflict\n");
57 dev->board_name = "pcl725";
61 ret = comedi_alloc_subdevices(dev, 2);
65 s = dev->subdevices + 0;
67 s->type = COMEDI_SUBD_DO;
68 s->subdev_flags = SDF_WRITABLE;
71 s->insn_bits = pcl725_do_insn;
72 s->range_table = &range_digital;
74 s = dev->subdevices + 1;
76 s->type = COMEDI_SUBD_DI;
77 s->subdev_flags = SDF_READABLE;
80 s->insn_bits = pcl725_di_insn;
81 s->range_table = &range_digital;
83 printk(KERN_INFO "\n");
88 static void pcl725_detach(struct comedi_device *dev)
91 release_region(dev->iobase, PCL725_SIZE);
94 static struct comedi_driver pcl725_driver = {
95 .driver_name = "pcl725",
96 .module = THIS_MODULE,
97 .attach = pcl725_attach,
98 .detach = pcl725_detach,
100 module_comedi_driver(pcl725_driver);
102 MODULE_AUTHOR("Comedi http://www.comedi.org");
103 MODULE_DESCRIPTION("Comedi low-level driver");
104 MODULE_LICENSE("GPL");