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
21/*
22 * Driver: das08_isa
23 * Description: DAS-08 ISA/PC-104 compatible boards
24 * Devices: (Keithley Metrabyte) DAS08 [isa-das08],
25 *	    (ComputerBoards) DAS08 [isa-das08]
26 *	    (ComputerBoards) DAS08-PGM [das08-pgm]
27 *	    (ComputerBoards) DAS08-PGH [das08-pgh]
28 *	    (ComputerBoards) DAS08-PGL [das08-pgl]
29 *	    (ComputerBoards) DAS08-AOH [das08-aoh]
30 *	    (ComputerBoards) DAS08-AOL [das08-aol]
31 *	    (ComputerBoards) DAS08-AOM [das08-aom]
32 *	    (ComputerBoards) DAS08/JR-AO [das08/jr-ao]
33 *	    (ComputerBoards) DAS08/JR-16-AO [das08jr-16-ao]
34 *	    (ComputerBoards) PC104-DAS08 [pc104-das08]
35 *	    (ComputerBoards) DAS08/JR/16 [das08jr/16]
36 * Author: Warren Jasper, ds, Frank Hess
37 * Updated: Fri, 31 Aug 2012 19:19:06 +0100
38 * Status: works
39 *
40 * This is the ISA/PC-104-specific support split off from the das08 driver.
41 *
42 * Configuration Options:
43 *	[0] - base io address
44 */
45
46#include <linux/module.h>
47#include "../comedidev.h"
48
49#include "das08.h"
50
51static const struct das08_board_struct das08_isa_boards[] = {
52	{
53		/* cio-das08.pdf */
54		.name		= "isa-das08",
55		.ai_nbits	= 12,
56		.ai_pg		= das08_pg_none,
57		.ai_encoding	= das08_encode12,
58		.di_nchan	= 3,
59		.do_nchan	= 4,
60		.i8255_offset	= 8,
61		.i8254_offset	= 4,
62		.iosize		= 16,		/* unchecked */
63	}, {
64		/* cio-das08pgx.pdf */
65		.name		= "das08-pgm",
66		.ai_nbits	= 12,
67		.ai_pg		= das08_pgm,
68		.ai_encoding	= das08_encode12,
69		.di_nchan	= 3,
70		.do_nchan	= 4,
71		.i8255_offset	= 0,
72		.i8254_offset	= 0x04,
73		.iosize		= 16,		/* unchecked */
74	}, {
75		/* cio-das08pgx.pdf */
76		.name		= "das08-pgh",
77		.ai_nbits	= 12,
78		.ai_pg		= das08_pgh,
79		.ai_encoding	= das08_encode12,
80		.di_nchan	= 3,
81		.do_nchan	= 4,
82		.i8254_offset	= 0x04,
83		.iosize		= 16,		/* unchecked */
84	}, {
85		/* cio-das08pgx.pdf */
86		.name		= "das08-pgl",
87		.ai_nbits	= 12,
88		.ai_pg		= das08_pgl,
89		.ai_encoding	= das08_encode12,
90		.di_nchan	= 3,
91		.do_nchan	= 4,
92		.i8254_offset	= 0x04,
93		.iosize		= 16,		/* unchecked */
94	}, {
95		/* cio-das08_aox.pdf */
96		.name		= "das08-aoh",
97		.ai_nbits	= 12,
98		.ai_pg		= das08_pgh,
99		.ai_encoding	= das08_encode12,
100		.ao_nbits	= 12,
101		.di_nchan	= 3,
102		.do_nchan	= 4,
103		.i8255_offset	= 0x0c,
104		.i8254_offset	= 0x04,
105		.iosize		= 16,		/* unchecked */
106	}, {
107		/* cio-das08_aox.pdf */
108		.name		= "das08-aol",
109		.ai_nbits	= 12,
110		.ai_pg		= das08_pgl,
111		.ai_encoding	= das08_encode12,
112		.ao_nbits	= 12,
113		.di_nchan	= 3,
114		.do_nchan	= 4,
115		.i8255_offset	= 0x0c,
116		.i8254_offset	= 0x04,
117		.iosize		= 16,		/* unchecked */
118	}, {
119		/* cio-das08_aox.pdf */
120		.name		= "das08-aom",
121		.ai_nbits	= 12,
122		.ai_pg		= das08_pgm,
123		.ai_encoding	= das08_encode12,
124		.ao_nbits	= 12,
125		.di_nchan	= 3,
126		.do_nchan	= 4,
127		.i8255_offset	= 0x0c,
128		.i8254_offset	= 0x04,
129		.iosize		= 16,		/* unchecked */
130	}, {
131		/* cio-das08-jr-ao.pdf */
132		.name		= "das08/jr-ao",
133		.is_jr		= true,
134		.ai_nbits	= 12,
135		.ai_pg		= das08_pg_none,
136		.ai_encoding	= das08_encode12,
137		.ao_nbits	= 12,
138		.di_nchan	= 8,
139		.do_nchan	= 8,
140		.iosize		= 16,		/* unchecked */
141	}, {
142		/* cio-das08jr-16-ao.pdf */
143		.name		= "das08jr-16-ao",
144		.is_jr		= true,
145		.ai_nbits	= 16,
146		.ai_pg		= das08_pg_none,
147		.ai_encoding	= das08_encode16,
148		.ao_nbits	= 16,
149		.di_nchan	= 8,
150		.do_nchan	= 8,
151		.i8254_offset	= 0x04,
152		.iosize		= 16,		/* unchecked */
153	}, {
154		.name		= "pc104-das08",
155		.ai_nbits	= 12,
156		.ai_pg		= das08_pg_none,
157		.ai_encoding	= das08_encode12,
158		.di_nchan	= 3,
159		.do_nchan	= 4,
160		.i8254_offset	= 4,
161		.iosize		= 16,		/* unchecked */
162	}, {
163		.name		= "das08jr/16",
164		.is_jr		= true,
165		.ai_nbits	= 16,
166		.ai_pg		= das08_pg_none,
167		.ai_encoding	= das08_encode16,
168		.di_nchan	= 8,
169		.do_nchan	= 8,
170		.iosize		= 16,		/* unchecked */
171	},
172};
173
174static int das08_isa_attach(struct comedi_device *dev,
175			    struct comedi_devconfig *it)
176{
177	const struct das08_board_struct *thisboard = dev->board_ptr;
178	struct das08_private_struct *devpriv;
179	int ret;
180
181	devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv));
182	if (!devpriv)
183		return -ENOMEM;
184
185	ret = comedi_request_region(dev, it->options[0], thisboard->iosize);
186	if (ret)
187		return ret;
188
189	return das08_common_attach(dev, dev->iobase);
190}
191
192static struct comedi_driver das08_isa_driver = {
193	.driver_name	= "isa-das08",
194	.module		= THIS_MODULE,
195	.attach		= das08_isa_attach,
196	.detach		= comedi_legacy_detach,
197	.board_name	= &das08_isa_boards[0].name,
198	.num_names	= ARRAY_SIZE(das08_isa_boards),
199	.offset		= sizeof(das08_isa_boards[0]),
200};
201module_comedi_driver(das08_isa_driver);
202
203MODULE_AUTHOR("Comedi http://www.comedi.org");
204MODULE_DESCRIPTION("Comedi low-level driver");
205MODULE_LICENSE("GPL");
206