Merge tag 'arc-v3.9-rc1-late' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc
[firefly-linux-kernel-4.4.55.git] / drivers / staging / comedi / drivers / das08_isa.c
1 /*
2  *  das08_isa.c
3  *  comedi driver for DAS08 ISA/PC-104 boards
4  *
5  *  COMEDI - Linux Control and Measurement Device Interface
6  *  Copyright (C) 2000 David A. Schleef <ds@schleef.org>
7  *  Copyright (C) 2001,2002,2003 Frank Mori Hess <fmhess@users.sourceforge.net>
8  *  Copyright (C) 2004 Salvador E. Tropea <set@users.sf.net> <set@ieee.org>
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23  */
24
25 /*
26  * Driver: das08_isa
27  * Description: DAS-08 ISA/PC-104 compatible boards
28  * Devices: (Keithley Metrabyte) DAS08 [isa-das08],
29  *          (ComputerBoards) DAS08 [isa-das08]
30  *          (ComputerBoards) DAS08-PGM [das08-pgm]
31  *          (ComputerBoards) DAS08-PGH [das08-pgh]
32  *          (ComputerBoards) DAS08-PGL [das08-pgl]
33  *          (ComputerBoards) DAS08-AOH [das08-aoh]
34  *          (ComputerBoards) DAS08-AOL [das08-aol]
35  *          (ComputerBoards) DAS08-AOM [das08-aom]
36  *          (ComputerBoards) DAS08/JR-AO [das08/jr-ao]
37  *          (ComputerBoards) DAS08/JR-16-AO [das08jr-16-ao]
38  *          (ComputerBoards) PC104-DAS08 [pc104-das08]
39  *          (ComputerBoards) DAS08/JR/16 [das08jr/16]
40  * Author: Warren Jasper, ds, Frank Hess
41  * Updated: Fri, 31 Aug 2012 19:19:06 +0100
42  * Status: works
43  *
44  * This is the ISA/PC-104-specific support split off from the das08 driver.
45  *
46  * Configuration Options:
47  *      [0] - base io address
48  */
49
50 #include "../comedidev.h"
51
52 #include "das08.h"
53
54 static const struct das08_board_struct das08_isa_boards[] = {
55         {
56                 /* cio-das08.pdf */
57                 .name           = "isa-das08",
58                 .ai_nbits       = 12,
59                 .ai_pg          = das08_pg_none,
60                 .ai_encoding    = das08_encode12,
61                 .di_nchan       = 3,
62                 .do_nchan       = 4,
63                 .i8255_offset   = 8,
64                 .i8254_offset   = 4,
65                 .iosize         = 16,           /* unchecked */
66         }, {
67                 /* cio-das08pgx.pdf */
68                 .name           = "das08-pgm",
69                 .ai_nbits       = 12,
70                 .ai_pg          = das08_pgm,
71                 .ai_encoding    = das08_encode12,
72                 .di_nchan       = 3,
73                 .do_nchan       = 4,
74                 .i8255_offset   = 0,
75                 .i8254_offset   = 0x04,
76                 .iosize         = 16,           /* unchecked */
77         }, {
78                 /* cio-das08pgx.pdf */
79                 .name           = "das08-pgh",
80                 .ai_nbits       = 12,
81                 .ai_pg          = das08_pgh,
82                 .ai_encoding    = das08_encode12,
83                 .di_nchan       = 3,
84                 .do_nchan       = 4,
85                 .i8254_offset   = 0x04,
86                 .iosize         = 16,           /* unchecked */
87         }, {
88                 /* cio-das08pgx.pdf */
89                 .name           = "das08-pgl",
90                 .ai_nbits       = 12,
91                 .ai_pg          = das08_pgl,
92                 .ai_encoding    = das08_encode12,
93                 .di_nchan       = 3,
94                 .do_nchan       = 4,
95                 .i8254_offset   = 0x04,
96                 .iosize         = 16,           /* unchecked */
97         }, {
98                 /* cio-das08_aox.pdf */
99                 .name           = "das08-aoh",
100                 .ai_nbits       = 12,
101                 .ai_pg          = das08_pgh,
102                 .ai_encoding    = das08_encode12,
103                 .ao_nbits       = 12,
104                 .di_nchan       = 3,
105                 .do_nchan       = 4,
106                 .i8255_offset   = 0x0c,
107                 .i8254_offset   = 0x04,
108                 .iosize         = 16,           /* unchecked */
109         }, {
110                 /* cio-das08_aox.pdf */
111                 .name           = "das08-aol",
112                 .ai_nbits       = 12,
113                 .ai_pg          = das08_pgl,
114                 .ai_encoding    = das08_encode12,
115                 .ao_nbits       = 12,
116                 .di_nchan       = 3,
117                 .do_nchan       = 4,
118                 .i8255_offset   = 0x0c,
119                 .i8254_offset   = 0x04,
120                 .iosize         = 16,           /* unchecked */
121         }, {
122                 /* cio-das08_aox.pdf */
123                 .name           = "das08-aom",
124                 .ai_nbits       = 12,
125                 .ai_pg          = das08_pgm,
126                 .ai_encoding    = das08_encode12,
127                 .ao_nbits       = 12,
128                 .di_nchan       = 3,
129                 .do_nchan       = 4,
130                 .i8255_offset   = 0x0c,
131                 .i8254_offset   = 0x04,
132                 .iosize         = 16,           /* unchecked */
133         }, {
134                 /* cio-das08-jr-ao.pdf */
135                 .name           = "das08/jr-ao",
136                 .is_jr          = true,
137                 .ai_nbits       = 12,
138                 .ai_pg          = das08_pg_none,
139                 .ai_encoding    = das08_encode12,
140                 .ao_nbits       = 12,
141                 .di_nchan       = 8,
142                 .do_nchan       = 8,
143                 .iosize         = 16,           /* unchecked */
144         }, {
145                 /* cio-das08jr-16-ao.pdf */
146                 .name           = "das08jr-16-ao",
147                 .is_jr          = true,
148                 .ai_nbits       = 16,
149                 .ai_pg          = das08_pg_none,
150                 .ai_encoding    = das08_encode16,
151                 .ao_nbits       = 16,
152                 .di_nchan       = 8,
153                 .do_nchan       = 8,
154                 .i8254_offset   = 0x04,
155                 .iosize         = 16,           /* unchecked */
156         }, {
157                 .name           = "pc104-das08",
158                 .ai_nbits       = 12,
159                 .ai_pg          = das08_pg_none,
160                 .ai_encoding    = das08_encode12,
161                 .di_nchan       = 3,
162                 .do_nchan       = 4,
163                 .i8254_offset   = 4,
164                 .iosize         = 16,           /* unchecked */
165         }, {
166                 .name           = "das08jr/16",
167                 .is_jr          = true,
168                 .ai_nbits       = 16,
169                 .ai_pg          = das08_pg_none,
170                 .ai_encoding    = das08_encode16,
171                 .di_nchan       = 8,
172                 .do_nchan       = 8,
173                 .iosize         = 16,           /* unchecked */
174         },
175 };
176
177 static int das08_isa_attach(struct comedi_device *dev,
178                             struct comedi_devconfig *it)
179 {
180         const struct das08_board_struct *thisboard = comedi_board(dev);
181         struct das08_private_struct *devpriv;
182
183         devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
184         if (!devpriv)
185                 return -ENOMEM;
186         dev->private = devpriv;
187
188         if (!request_region(it->options[0], thisboard->iosize,
189                             thisboard->name))
190                 return -EIO;
191
192         return das08_common_attach(dev, it->options[0]);
193 }
194
195 static void das08_isa_detach(struct comedi_device *dev)
196 {
197         const struct das08_board_struct *thisboard = comedi_board(dev);
198
199         das08_common_detach(dev);
200         if (dev->iobase)
201                 release_region(dev->iobase, thisboard->iosize);
202 }
203
204 static struct comedi_driver das08_isa_driver = {
205         .driver_name    = "isa-das08",
206         .module         = THIS_MODULE,
207         .attach         = das08_isa_attach,
208         .detach         = das08_isa_detach,
209         .board_name     = &das08_isa_boards[0].name,
210         .num_names      = ARRAY_SIZE(das08_isa_boards),
211         .offset         = sizeof(das08_isa_boards[0]),
212 };
213 module_comedi_driver(das08_isa_driver);
214
215 MODULE_AUTHOR("Comedi http://www.comedi.org");
216 MODULE_DESCRIPTION("Comedi low-level driver");
217 MODULE_LICENSE("GPL");