2 * comedi/drivers/pcm3730.c
3 * Driver for PCM3730 and clones
5 * from pcl725 by David S.
11 Devices: [Advantech] PCM-3730 (pcm3730)
14 Configuration options:
18 #include "../comedidev.h"
20 #include <linux/ioport.h>
22 #define PCM3730_SIZE 4 /* consecutive io port addresses */
24 #define PCM3730_DOA 0 /* offsets for each port */
31 static int pcm3730_do_insn_bits(struct comedi_device
*dev
,
32 struct comedi_subdevice
*s
,
33 struct comedi_insn
*insn
, unsigned int *data
)
37 s
->state
|= (data
[0] & data
[1]);
38 outb(s
->state
, dev
->iobase
+ (unsigned long)(s
->private));
45 static int pcm3730_di_insn_bits(struct comedi_device
*dev
,
46 struct comedi_subdevice
*s
,
47 struct comedi_insn
*insn
, unsigned int *data
)
49 data
[1] = inb(dev
->iobase
+ (unsigned long)(s
->private));
53 static int pcm3730_attach(struct comedi_device
*dev
,
54 struct comedi_devconfig
*it
)
56 struct comedi_subdevice
*s
;
60 iobase
= it
->options
[0];
61 printk(KERN_INFO
"comedi%d: pcm3730: 0x%04lx ", dev
->minor
, iobase
);
62 if (!request_region(iobase
, PCM3730_SIZE
, "pcm3730")) {
63 printk("I/O port conflict\n");
67 dev
->board_name
= "pcm3730";
68 dev
->iobase
= dev
->iobase
;
71 ret
= comedi_alloc_subdevices(dev
, 6);
75 s
= &dev
->subdevices
[0];
76 s
->type
= COMEDI_SUBD_DO
;
77 s
->subdev_flags
= SDF_WRITABLE
;
80 s
->insn_bits
= pcm3730_do_insn_bits
;
81 s
->range_table
= &range_digital
;
82 s
->private = (void *)PCM3730_DOA
;
84 s
= &dev
->subdevices
[1];
85 s
->type
= COMEDI_SUBD_DO
;
86 s
->subdev_flags
= SDF_WRITABLE
;
89 s
->insn_bits
= pcm3730_do_insn_bits
;
90 s
->range_table
= &range_digital
;
91 s
->private = (void *)PCM3730_DOB
;
93 s
= &dev
->subdevices
[2];
94 s
->type
= COMEDI_SUBD_DO
;
95 s
->subdev_flags
= SDF_WRITABLE
;
98 s
->insn_bits
= pcm3730_do_insn_bits
;
99 s
->range_table
= &range_digital
;
100 s
->private = (void *)PCM3730_DOC
;
102 s
= &dev
->subdevices
[3];
103 s
->type
= COMEDI_SUBD_DI
;
104 s
->subdev_flags
= SDF_READABLE
;
107 s
->insn_bits
= pcm3730_di_insn_bits
;
108 s
->range_table
= &range_digital
;
109 s
->private = (void *)PCM3730_DIA
;
111 s
= &dev
->subdevices
[4];
112 s
->type
= COMEDI_SUBD_DI
;
113 s
->subdev_flags
= SDF_READABLE
;
116 s
->insn_bits
= pcm3730_di_insn_bits
;
117 s
->range_table
= &range_digital
;
118 s
->private = (void *)PCM3730_DIB
;
120 s
= &dev
->subdevices
[5];
121 s
->type
= COMEDI_SUBD_DI
;
122 s
->subdev_flags
= SDF_READABLE
;
125 s
->insn_bits
= pcm3730_di_insn_bits
;
126 s
->range_table
= &range_digital
;
127 s
->private = (void *)PCM3730_DIC
;
129 printk(KERN_INFO
"\n");
134 static void pcm3730_detach(struct comedi_device
*dev
)
137 release_region(dev
->iobase
, PCM3730_SIZE
);
140 static struct comedi_driver pcm3730_driver
= {
141 .driver_name
= "pcm3730",
142 .module
= THIS_MODULE
,
143 .attach
= pcm3730_attach
,
144 .detach
= pcm3730_detach
,
146 module_comedi_driver(pcm3730_driver
);
148 MODULE_AUTHOR("Comedi http://www.comedi.org");
149 MODULE_DESCRIPTION("Comedi low-level driver");
150 MODULE_LICENSE("GPL");