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_attach(struct comedi_device
*dev
,
32 struct comedi_devconfig
*it
);
33 static int pcm3730_detach(struct comedi_device
*dev
);
34 static struct comedi_driver driver_pcm3730
= {
35 .driver_name
= "pcm3730",
36 .module
= THIS_MODULE
,
37 .attach
= pcm3730_attach
,
38 .detach
= pcm3730_detach
,
41 static int __init
driver_pcm3730_init_module(void)
43 return comedi_driver_register(&driver_pcm3730
);
46 static void __exit
driver_pcm3730_cleanup_module(void)
48 comedi_driver_unregister(&driver_pcm3730
);
51 module_init(driver_pcm3730_init_module
);
52 module_exit(driver_pcm3730_cleanup_module
);
54 static int pcm3730_do_insn_bits(struct comedi_device
*dev
,
55 struct comedi_subdevice
*s
,
56 struct comedi_insn
*insn
, unsigned int *data
)
62 s
->state
|= (data
[0] & data
[1]);
63 outb(s
->state
, dev
->iobase
+ (unsigned long)(s
->private));
70 static int pcm3730_di_insn_bits(struct comedi_device
*dev
,
71 struct comedi_subdevice
*s
,
72 struct comedi_insn
*insn
, unsigned int *data
)
76 data
[1] = inb(dev
->iobase
+ (unsigned long)(s
->private));
80 static int pcm3730_attach(struct comedi_device
*dev
,
81 struct comedi_devconfig
*it
)
83 struct comedi_subdevice
*s
;
86 iobase
= it
->options
[0];
87 printk(KERN_INFO
"comedi%d: pcm3730: 0x%04lx ", dev
->minor
, iobase
);
88 if (!request_region(iobase
, PCM3730_SIZE
, "pcm3730")) {
89 printk("I/O port conflict\n");
93 dev
->board_name
= "pcm3730";
94 dev
->iobase
= dev
->iobase
;
97 if (alloc_subdevices(dev
, 6) < 0)
100 s
= dev
->subdevices
+ 0;
101 s
->type
= COMEDI_SUBD_DO
;
102 s
->subdev_flags
= SDF_WRITABLE
;
105 s
->insn_bits
= pcm3730_do_insn_bits
;
106 s
->range_table
= &range_digital
;
107 s
->private = (void *)PCM3730_DOA
;
109 s
= dev
->subdevices
+ 1;
110 s
->type
= COMEDI_SUBD_DO
;
111 s
->subdev_flags
= SDF_WRITABLE
;
114 s
->insn_bits
= pcm3730_do_insn_bits
;
115 s
->range_table
= &range_digital
;
116 s
->private = (void *)PCM3730_DOB
;
118 s
= dev
->subdevices
+ 2;
119 s
->type
= COMEDI_SUBD_DO
;
120 s
->subdev_flags
= SDF_WRITABLE
;
123 s
->insn_bits
= pcm3730_do_insn_bits
;
124 s
->range_table
= &range_digital
;
125 s
->private = (void *)PCM3730_DOC
;
127 s
= dev
->subdevices
+ 3;
128 s
->type
= COMEDI_SUBD_DI
;
129 s
->subdev_flags
= SDF_READABLE
;
132 s
->insn_bits
= pcm3730_di_insn_bits
;
133 s
->range_table
= &range_digital
;
134 s
->private = (void *)PCM3730_DIA
;
136 s
= dev
->subdevices
+ 4;
137 s
->type
= COMEDI_SUBD_DI
;
138 s
->subdev_flags
= SDF_READABLE
;
141 s
->insn_bits
= pcm3730_di_insn_bits
;
142 s
->range_table
= &range_digital
;
143 s
->private = (void *)PCM3730_DIB
;
145 s
= dev
->subdevices
+ 5;
146 s
->type
= COMEDI_SUBD_DI
;
147 s
->subdev_flags
= SDF_READABLE
;
150 s
->insn_bits
= pcm3730_di_insn_bits
;
151 s
->range_table
= &range_digital
;
152 s
->private = (void *)PCM3730_DIC
;
154 printk(KERN_INFO
"\n");
159 static int pcm3730_detach(struct comedi_device
*dev
)
161 printk(KERN_INFO
"comedi%d: pcm3730: remove\n", dev
->minor
);
164 release_region(dev
->iobase
, PCM3730_SIZE
);
169 MODULE_AUTHOR("Comedi http://www.comedi.org");
170 MODULE_DESCRIPTION("Comedi low-level driver");
171 MODULE_LICENSE("GPL");