ni_labpc_cs.c revision 1cc745d1cdca8086b472a06671f0830fc0e98861
1/*
2    comedi/drivers/ni_labpc_cs.c
3    Driver for National Instruments daqcard-1200 boards
4    Copyright (C) 2001, 2002, 2003 Frank Mori Hess <fmhess@users.sourceforge.net>
5
6    PCMCIA crap is adapted from dummy_cs.c 1.31 2001/08/24 12:13:13
7    from the pcmcia package.
8    The initial developer of the pcmcia dummy_cs.c code is David A. Hinds
9    <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
10    are Copyright (C) 1999 David A. Hinds.
11
12    This program is free software; you can redistribute it and/or modify
13    it under the terms of the GNU General Public License as published by
14    the Free Software Foundation; either version 2 of the License, or
15    (at your option) any later version.
16
17    This program is distributed in the hope that it will be useful,
18    but WITHOUT ANY WARRANTY; without even the implied warranty of
19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20    GNU General Public License for more details.
21
22    You should have received a copy of the GNU General Public License
23    along with this program; if not, write to the Free Software
24    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25
26************************************************************************
27*/
28/*
29Driver: ni_labpc_cs
30Description: National Instruments Lab-PC (& compatibles)
31Author: Frank Mori Hess <fmhess@users.sourceforge.net>
32Devices: [National Instruments] DAQCard-1200 (daqcard-1200)
33Status: works
34
35Thanks go to Fredrik Lingvall for much testing and perseverance in
36helping to debug daqcard-1200 support.
37
38The 1200 series boards have onboard calibration dacs for correcting
39analog input/output offsets and gains.  The proper settings for these
40caldacs are stored on the board's eeprom.  To read the caldac values
41from the eeprom and store them into a file that can be then be used by
42comedilib, use the comedi_calibrate program.
43
44Configuration options:
45  none
46
47The daqcard-1200 has quirky chanlist requirements
48when scanning multiple channels.  Multiple channel scan
49sequence must start at highest channel, then decrement down to
50channel 0.  Chanlists consisting of all one channel
51are also legal, and allow you to pace conversions in bursts.
52
53*/
54
55/*
56
57NI manuals:
58340988a (daqcard-1200)
59
60*/
61
62#undef LABPC_DEBUG  /* debugging messages */
63
64#include "../comedidev.h"
65
66#include <linux/delay.h>
67#include <linux/slab.h>
68
69#include "8253.h"
70#include "8255.h"
71#include "comedi_fc.h"
72#include "ni_labpc.h"
73
74#include <pcmcia/cistpl.h>
75#include <pcmcia/cisreg.h>
76#include <pcmcia/ds.h>
77
78static struct pcmcia_device *pcmcia_cur_dev;
79
80static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it);
81
82static const struct labpc_board_struct labpc_cs_boards[] = {
83	{
84	 .name = "daqcard-1200",
85	 .device_id = 0x103,	/* 0x10b is manufacturer id,
86				   0x103 is device id */
87	 .ai_speed = 10000,
88	 .bustype = pcmcia_bustype,
89	 .register_layout = labpc_1200_layout,
90	 .has_ao = 1,
91	 .ai_range_table = &range_labpc_1200_ai,
92	 .ai_range_code = labpc_1200_ai_gain_bits,
93	 .ai_range_is_unipolar = labpc_1200_is_unipolar,
94	 .ai_scan_up = 0,
95	 .memory_mapped_io = 0,
96	 },
97	/* duplicate entry, to support using alternate name */
98	{
99	 .name = "ni_labpc_cs",
100	 .device_id = 0x103,
101	 .ai_speed = 10000,
102	 .bustype = pcmcia_bustype,
103	 .register_layout = labpc_1200_layout,
104	 .has_ao = 1,
105	 .ai_range_table = &range_labpc_1200_ai,
106	 .ai_range_code = labpc_1200_ai_gain_bits,
107	 .ai_range_is_unipolar = labpc_1200_is_unipolar,
108	 .ai_scan_up = 0,
109	 .memory_mapped_io = 0,
110	 },
111};
112
113/*
114 * Useful for shorthand access to the particular board structure
115 */
116#define thisboard ((const struct labpc_board_struct *)dev->board_ptr)
117
118static struct comedi_driver driver_labpc_cs = {
119	.driver_name = "ni_labpc_cs",
120	.module = THIS_MODULE,
121	.attach = &labpc_attach,
122	.detach = &labpc_common_detach,
123	.num_names = ARRAY_SIZE(labpc_cs_boards),
124	.board_name = &labpc_cs_boards[0].name,
125	.offset = sizeof(struct labpc_board_struct),
126};
127
128static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it)
129{
130	unsigned long iobase = 0;
131	unsigned int irq = 0;
132	struct pcmcia_device *link;
133
134	/* allocate and initialize dev->private */
135	if (alloc_private(dev, sizeof(struct labpc_private)) < 0)
136		return -ENOMEM;
137
138	/*  get base address, irq etc. based on bustype */
139	switch (thisboard->bustype) {
140	case pcmcia_bustype:
141		link = pcmcia_cur_dev;	/* XXX hack */
142		if (!link)
143			return -EIO;
144		iobase = link->resource[0]->start;
145		irq = link->irq;
146		break;
147	default:
148		printk("bug! couldn't determine board type\n");
149		return -EINVAL;
150		break;
151	}
152	return labpc_common_attach(dev, iobase, irq, 0);
153}
154
155/*====================================================================*/
156
157/*
158   The event() function is this driver's Card Services event handler.
159   It will be called by Card Services when an appropriate card status
160   event is received.  The config() and release() entry points are
161   used to configure or release a socket, in response to card
162   insertion and ejection events.  They are invoked from the dummy
163   event handler.
164
165   Kernel version 2.6.16 upwards uses suspend() and resume() functions
166   instead of an event() function.
167*/
168
169static void labpc_config(struct pcmcia_device *link);
170static void labpc_release(struct pcmcia_device *link);
171static int labpc_cs_suspend(struct pcmcia_device *p_dev);
172static int labpc_cs_resume(struct pcmcia_device *p_dev);
173
174/*
175   The attach() and detach() entry points are used to create and destroy
176   "instances" of the driver, where each instance represents everything
177   needed to manage one actual PCMCIA card.
178*/
179
180static int labpc_cs_attach(struct pcmcia_device *);
181static void labpc_cs_detach(struct pcmcia_device *);
182
183/*
184   You'll also need to prototype all the functions that will actually
185   be used to talk to your device.  See 'memory_cs' for a good example
186   of a fully self-sufficient driver; the other drivers rely more or
187   less on other parts of the kernel.
188*/
189
190struct local_info_t {
191	struct pcmcia_device *link;
192	int stop;
193	struct bus_operations *bus;
194};
195
196/*======================================================================
197
198    labpc_cs_attach() creates an "instance" of the driver, allocating
199    local data structures for one device.  The device is registered
200    with Card Services.
201
202    The dev_link structure is initialized, but we don't actually
203    configure the card at this point -- we wait until we receive a
204    card insertion event.
205
206======================================================================*/
207
208static int labpc_cs_attach(struct pcmcia_device *link)
209{
210	struct local_info_t *local;
211
212	dev_dbg(&link->dev, "labpc_cs_attach()\n");
213
214	/* Allocate space for private device-specific data */
215	local = kzalloc(sizeof(struct local_info_t), GFP_KERNEL);
216	if (!local)
217		return -ENOMEM;
218	local->link = link;
219	link->priv = local;
220
221	pcmcia_cur_dev = link;
222
223	labpc_config(link);
224
225	return 0;
226}				/* labpc_cs_attach */
227
228/*======================================================================
229
230    This deletes a driver "instance".  The device is de-registered
231    with Card Services.  If it has been released, all local data
232    structures are freed.  Otherwise, the structures will be freed
233    when the device is released.
234
235======================================================================*/
236
237static void labpc_cs_detach(struct pcmcia_device *link)
238{
239	dev_dbg(&link->dev, "labpc_cs_detach\n");
240
241	/*
242	   If the device is currently configured and active, we won't
243	   actually delete it yet.  Instead, it is marked so that when
244	   the release() function is called, that will trigger a proper
245	   detach().
246	 */
247	((struct local_info_t *)link->priv)->stop = 1;
248	labpc_release(link);
249
250	/* This points to the parent local_info_t struct (may be null) */
251	kfree(link->priv);
252
253}				/* labpc_cs_detach */
254
255/*======================================================================
256
257    labpc_config() is scheduled to run after a CARD_INSERTION event
258    is received, to configure the PCMCIA socket, and to make the
259    device available to the system.
260
261======================================================================*/
262
263static int labpc_pcmcia_config_loop(struct pcmcia_device *p_dev,
264				void *priv_data)
265{
266	if (p_dev->config_index == 0)
267		return -EINVAL;
268
269	return pcmcia_request_io(p_dev);
270}
271
272
273static void labpc_config(struct pcmcia_device *link)
274{
275	int ret;
276
277	dev_dbg(&link->dev, "labpc_config\n");
278
279	link->config_flags |= CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ |
280		CONF_AUTO_AUDIO | CONF_AUTO_SET_IO;
281
282	ret = pcmcia_loop_config(link, labpc_pcmcia_config_loop, NULL);
283	if (ret) {
284		dev_warn(&link->dev, "no configuration found\n");
285		goto failed;
286	}
287
288	if (!link->irq)
289		goto failed;
290
291	/*
292	   This actually configures the PCMCIA socket -- setting up
293	   the I/O windows and the interrupt mapping, and putting the
294	   card and host interface into "Memory and IO" mode.
295	 */
296	ret = pcmcia_enable_device(link);
297	if (ret)
298		goto failed;
299
300	return;
301
302failed:
303	labpc_release(link);
304
305}				/* labpc_config */
306
307static void labpc_release(struct pcmcia_device *link)
308{
309	dev_dbg(&link->dev, "labpc_release\n");
310
311	pcmcia_disable_device(link);
312}				/* labpc_release */
313
314/*======================================================================
315
316    The card status event handler.  Mostly, this schedules other
317    stuff to run after an event is received.
318
319    When a CARD_REMOVAL event is received, we immediately set a
320    private flag to block future accesses to this device.  All the
321    functions that actually access the device should check this flag
322    to make sure the card is still present.
323
324======================================================================*/
325
326static int labpc_cs_suspend(struct pcmcia_device *link)
327{
328	struct local_info_t *local = link->priv;
329
330	/* Mark the device as stopped, to block IO until later */
331	local->stop = 1;
332	return 0;
333}				/* labpc_cs_suspend */
334
335static int labpc_cs_resume(struct pcmcia_device *link)
336{
337	struct local_info_t *local = link->priv;
338
339	local->stop = 0;
340	return 0;
341}				/* labpc_cs_resume */
342
343/*====================================================================*/
344
345static struct pcmcia_device_id labpc_cs_ids[] = {
346	/* N.B. These IDs should match those in labpc_cs_boards (ni_labpc.c) */
347	PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0103),	/* daqcard-1200 */
348	PCMCIA_DEVICE_NULL
349};
350
351MODULE_DEVICE_TABLE(pcmcia, labpc_cs_ids);
352MODULE_AUTHOR("Frank Mori Hess <fmhess@users.sourceforge.net>");
353MODULE_DESCRIPTION("Comedi driver for National Instruments Lab-PC");
354MODULE_LICENSE("GPL");
355
356struct pcmcia_driver labpc_cs_driver = {
357	.probe = labpc_cs_attach,
358	.remove = labpc_cs_detach,
359	.suspend = labpc_cs_suspend,
360	.resume = labpc_cs_resume,
361	.id_table = labpc_cs_ids,
362	.owner = THIS_MODULE,
363	.drv = {
364		.name = "daqcard-1200",
365		},
366};
367
368static int __init init_labpc_cs(void)
369{
370	pcmcia_register_driver(&labpc_cs_driver);
371	return 0;
372}
373
374static void __exit exit_labpc_cs(void)
375{
376	pcmcia_unregister_driver(&labpc_cs_driver);
377}
378
379int __init labpc_init_module(void)
380{
381	int ret;
382
383	ret = init_labpc_cs();
384	if (ret < 0)
385		return ret;
386
387	return comedi_driver_register(&driver_labpc_cs);
388}
389
390void __exit labpc_exit_module(void)
391{
392	exit_labpc_cs();
393	comedi_driver_unregister(&driver_labpc_cs);
394}
395
396module_init(labpc_init_module);
397module_exit(labpc_exit_module);
398