ni_labpc_cs.c revision 00990e7ce0b0e596fe41d9c64d6933ea70084003
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	/* Finally, report what we've done */
301	dev_info(&link->dev, "index 0x%02x", link->config_index);
302	printk(", irq %d", link->irq);
303	if (link->resource[0])
304		printk(" & %pR", link->resource[0]);
305	if (link->resource[1])
306		printk(" & %pR", link->resource[1]);
307	printk("\n");
308
309	return;
310
311failed:
312	labpc_release(link);
313
314}				/* labpc_config */
315
316static void labpc_release(struct pcmcia_device *link)
317{
318	dev_dbg(&link->dev, "labpc_release\n");
319
320	pcmcia_disable_device(link);
321}				/* labpc_release */
322
323/*======================================================================
324
325    The card status event handler.  Mostly, this schedules other
326    stuff to run after an event is received.
327
328    When a CARD_REMOVAL event is received, we immediately set a
329    private flag to block future accesses to this device.  All the
330    functions that actually access the device should check this flag
331    to make sure the card is still present.
332
333======================================================================*/
334
335static int labpc_cs_suspend(struct pcmcia_device *link)
336{
337	struct local_info_t *local = link->priv;
338
339	/* Mark the device as stopped, to block IO until later */
340	local->stop = 1;
341	return 0;
342}				/* labpc_cs_suspend */
343
344static int labpc_cs_resume(struct pcmcia_device *link)
345{
346	struct local_info_t *local = link->priv;
347
348	local->stop = 0;
349	return 0;
350}				/* labpc_cs_resume */
351
352/*====================================================================*/
353
354static struct pcmcia_device_id labpc_cs_ids[] = {
355	/* N.B. These IDs should match those in labpc_cs_boards (ni_labpc.c) */
356	PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0103),	/* daqcard-1200 */
357	PCMCIA_DEVICE_NULL
358};
359
360MODULE_DEVICE_TABLE(pcmcia, labpc_cs_ids);
361MODULE_AUTHOR("Frank Mori Hess <fmhess@users.sourceforge.net>");
362MODULE_DESCRIPTION("Comedi driver for National Instruments Lab-PC");
363MODULE_LICENSE("GPL");
364
365struct pcmcia_driver labpc_cs_driver = {
366	.probe = labpc_cs_attach,
367	.remove = labpc_cs_detach,
368	.suspend = labpc_cs_suspend,
369	.resume = labpc_cs_resume,
370	.id_table = labpc_cs_ids,
371	.owner = THIS_MODULE,
372	.drv = {
373		.name = "daqcard-1200",
374		},
375};
376
377static int __init init_labpc_cs(void)
378{
379	pcmcia_register_driver(&labpc_cs_driver);
380	return 0;
381}
382
383static void __exit exit_labpc_cs(void)
384{
385	pcmcia_unregister_driver(&labpc_cs_driver);
386}
387
388int __init labpc_init_module(void)
389{
390	int ret;
391
392	ret = init_labpc_cs();
393	if (ret < 0)
394		return ret;
395
396	return comedi_driver_register(&driver_labpc_cs);
397}
398
399void __exit labpc_exit_module(void)
400{
401	exit_labpc_cs();
402	comedi_driver_unregister(&driver_labpc_cs);
403}
404
405module_init(labpc_init_module);
406module_exit(labpc_exit_module);
407