1
2
3
4
5
6
7
8
9
10
11
12
13
14#include "../comedidev.h"
15
16#include <linux/ioport.h>
17
18#define PCL725_SIZE 2
19
20#define PCL725_DO 0
21#define PCL725_DI 1
22
23static int pcl725_do_insn(struct comedi_device *dev, struct comedi_subdevice *s,
24 struct comedi_insn *insn, unsigned int *data)
25{
26 if (data[0]) {
27 s->state &= ~data[0];
28 s->state |= (data[0] & data[1]);
29 outb(s->state, dev->iobase + PCL725_DO);
30 }
31
32 data[1] = s->state;
33
34 return insn->n;
35}
36
37static int pcl725_di_insn(struct comedi_device *dev, struct comedi_subdevice *s,
38 struct comedi_insn *insn, unsigned int *data)
39{
40 data[1] = inb(dev->iobase + PCL725_DI);
41
42 return insn->n;
43}
44
45static int pcl725_attach(struct comedi_device *dev, struct comedi_devconfig *it)
46{
47 struct comedi_subdevice *s;
48 int ret;
49
50 ret = comedi_request_region(dev, it->options[0], PCL725_SIZE);
51 if (ret)
52 return ret;
53
54 ret = comedi_alloc_subdevices(dev, 2);
55 if (ret)
56 return ret;
57
58 s = &dev->subdevices[0];
59
60 s->type = COMEDI_SUBD_DO;
61 s->subdev_flags = SDF_WRITABLE;
62 s->maxdata = 1;
63 s->n_chan = 8;
64 s->insn_bits = pcl725_do_insn;
65 s->range_table = &range_digital;
66
67 s = &dev->subdevices[1];
68
69 s->type = COMEDI_SUBD_DI;
70 s->subdev_flags = SDF_READABLE;
71 s->maxdata = 1;
72 s->n_chan = 8;
73 s->insn_bits = pcl725_di_insn;
74 s->range_table = &range_digital;
75
76 printk(KERN_INFO "\n");
77
78 return 0;
79}
80
81static struct comedi_driver pcl725_driver = {
82 .driver_name = "pcl725",
83 .module = THIS_MODULE,
84 .attach = pcl725_attach,
85 .detach = comedi_legacy_detach,
86};
87module_comedi_driver(pcl725_driver);
88
89MODULE_AUTHOR("Comedi http://www.comedi.org");
90MODULE_DESCRIPTION("Comedi low-level driver");
91MODULE_LICENSE("GPL");
92