Got rid of unnecessary casts when initializing comedi_driver.board_name
[comedi.git] / comedi / drivers / pcl730.c
1 /*
2  * Driver for Advantech PCL-730 and clones
3  * José Luis Sánchez
4  */
5 /*
6 Driver: pcl730.o
7 Description: Advantech PCL-730 (& compatibles)
8 Author: José Luis Sánchez (jsanchezv@teleline.es)
9 Status: untested
10 Devices: [Advantech] PCL-730 (pcl730), [ICP] ISO-730 (iso730),
11                  [Adlink] ACL-7130 (acl7130)
12
13 Interrupts are not supported.
14 The ACL-7130 card have an 8254 timer/counter not supported by this driver.
15 */
16
17 #include <linux/comedidev.h>
18
19 #include <linux/ioport.h>
20
21 #define PCL730_SIZE             4
22 #define ACL7130_SIZE    8
23 #define PCL730_IDIO_LO  0  /* Isolated Digital I/O low byte (ID0-ID7) */
24 #define PCL730_IDIO_HI  1  /* Isolated Digital I/O high byte (ID8-ID15) */
25 #define PCL730_DIO_LO   2  /* TTL Digital I/O low byte (D0-D7) */
26 #define PCL730_DIO_HI   3  /* TTL Digital I/O high byte (D8-D15) */
27
28 static int pcl730_attach(comedi_device *dev,comedi_devconfig *it);
29 static int pcl730_detach(comedi_device *dev);
30
31 typedef struct {
32         const char      *name;          // board name
33         unsigned int    io_range;       // len of I/O space
34 } boardtype;
35
36 static boardtype boardtypes[] =
37 {
38         { "pcl730",  PCL730_SIZE, },
39         { "iso730",  PCL730_SIZE, },
40         { "acl7130", ACL7130_SIZE, },
41 };
42 #define n_boardtypes (sizeof(boardtypes)/sizeof(boardtype))
43 #define this_board ((boardtype *)dev->board_ptr)
44
45 static comedi_driver driver_pcl730 = {
46         driver_name:    "pcl730",
47         module:         THIS_MODULE,
48         attach:         pcl730_attach,
49         detach:         pcl730_detach,
50         board_name: &boardtypes[0].name,
51         num_names:      n_boardtypes,
52         offset:         sizeof(boardtype),
53 };
54 COMEDI_INITCLEANUP(driver_pcl730);
55
56 static int pcl730_do_insn(comedi_device *dev,comedi_subdevice *s,
57         comedi_insn *insn,lsampl_t *data)
58 {
59         if( insn->n != 2 )
60         return -EINVAL;
61
62         if(data[0])
63     {
64                 s->state &= ~data[0];
65                 s->state |= (data[0] & data[1]);
66         }
67     if( data[0] & 0x00ff )
68         outb(s->state & 0xff, dev->iobase+((unsigned long)s->private));
69     if( data[0] & 0xff00 )
70         outb((s->state >> 8), dev->iobase+((unsigned long)s->private)+1);
71
72         data[1]=s->state;
73
74         return 2;
75 }
76
77 static int pcl730_di_insn(comedi_device *dev,comedi_subdevice *s,
78         comedi_insn *insn,lsampl_t *data)
79 {
80         if( insn->n != 2 )
81         return -EINVAL;
82
83         data[1]=inb(dev->iobase+((unsigned long)s->private)) |
84                         (inb(dev->iobase+((unsigned long)s->private)+1)<<8);
85
86         return 2;
87 }
88
89 static int pcl730_attach(comedi_device *dev,comedi_devconfig *it)
90 {
91         comedi_subdevice *s;
92         unsigned long iobase;
93         unsigned int iorange;
94
95         iobase=it->options[0];
96         iorange=this_board->io_range;
97         printk("comedi%d: pcl730: board=%s 0x%04lx ", dev->minor,
98                         this_board->name, iobase);
99         if( !request_region(iobase, iorange, "pcl730") ) {
100                 printk("I/O port conflict\n");
101                 return -EIO;
102         }
103         dev->board_name=this_board->name;
104         dev->iobase=iobase;
105         dev->irq=0;
106
107         if( alloc_subdevices(dev, 4) < 0 )
108                 return -ENOMEM;
109
110         s=dev->subdevices+0;
111         /* Isolated do */
112         s->type=COMEDI_SUBD_DO;
113         s->subdev_flags=SDF_WRITABLE;
114         s->maxdata=1;
115         s->n_chan=16;
116         s->insn_bits = pcl730_do_insn;
117         s->range_table=&range_digital;
118         s->private = (void *)PCL730_IDIO_LO;
119
120         s=dev->subdevices+1;
121         /* Isolated di */
122         s->type=COMEDI_SUBD_DI;
123         s->subdev_flags=SDF_READABLE;
124         s->maxdata=1;
125         s->n_chan=16;
126         s->insn_bits = pcl730_di_insn;
127         s->range_table=&range_digital;
128         s->private = (void *)PCL730_IDIO_LO;
129
130         s=dev->subdevices+2;
131         /* TTL do */
132         s->type=COMEDI_SUBD_DO;
133         s->subdev_flags=SDF_WRITABLE;
134         s->maxdata=1;
135         s->n_chan=16;
136         s->insn_bits = pcl730_do_insn;
137         s->range_table=&range_digital;
138         s->private = (void *)PCL730_DIO_LO;
139
140         s=dev->subdevices+3;
141         /* TTL di */
142         s->type=COMEDI_SUBD_DI;
143         s->subdev_flags=SDF_READABLE;
144         s->maxdata=1;
145         s->n_chan=16;
146         s->insn_bits = pcl730_di_insn;
147         s->range_table=&range_digital;
148         s->private = (void *)PCL730_DIO_LO;
149
150         printk("\n");
151
152         return 0;
153 }
154
155 static int pcl730_detach(comedi_device *dev)
156 {
157         printk("comedi%d: pcl730: remove\n",dev->minor);
158
159         if(dev->iobase)
160         release_region(dev->iobase, this_board->io_range);
161
162         return 0;
163 }