ni_labpc_cs.c revision b79eb4c113b539c23d5bac8d58b55690892e31e5
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
68#include "8253.h"
69#include "8255.h"
70#include "comedi_fc.h"
71#include "ni_labpc.h"
72
73#include <pcmcia/cs_types.h>
74#include <pcmcia/cs.h>
75#include <pcmcia/cistpl.h>
76#include <pcmcia/cisreg.h>
77#include <pcmcia/ds.h>
78
79static struct pcmcia_device *pcmcia_cur_dev = NULL;
80
81static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it);
82
83static const struct labpc_board_struct labpc_cs_boards[] = {
84	{
85	 .name = "daqcard-1200",
86	 .device_id = 0x103,	/*  0x10b is manufacturer id, 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->io.BasePort1;
145		irq = link->irq.AssignedIRQ;
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
190/*
191   The dev_info variable is the "key" that is used to match up this
192   device driver with appropriate cards, through the card configuration
193   database.
194*/
195
196static const dev_info_t dev_info = "daqcard-1200";
197
198struct local_info_t {
199	struct pcmcia_device *link;
200	dev_node_t node;
201	int stop;
202	struct bus_operations *bus;
203};
204
205/*======================================================================
206
207    labpc_cs_attach() creates an "instance" of the driver, allocating
208    local data structures for one device.  The device is registered
209    with Card Services.
210
211    The dev_link structure is initialized, but we don't actually
212    configure the card at this point -- we wait until we receive a
213    card insertion event.
214
215======================================================================*/
216
217static int labpc_cs_attach(struct pcmcia_device *link)
218{
219	struct local_info_t *local;
220
221	dev_dbg(&link->dev, "labpc_cs_attach()\n");
222
223	/* Allocate space for private device-specific data */
224	local = kzalloc(sizeof(struct local_info_t), GFP_KERNEL);
225	if (!local)
226		return -ENOMEM;
227	local->link = link;
228	link->priv = local;
229
230	/* Interrupt setup */
231	link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_FORCED_PULSE;
232	link->irq.Handler = NULL;
233
234	/*
235	   General socket configuration defaults can go here.  In this
236	   client, we assume very little, and rely on the CIS for almost
237	   everything.  In most clients, many details (i.e., number, sizes,
238	   and attributes of IO windows) are fixed by the nature of the
239	   device, and can be hard-wired here.
240	 */
241	link->conf.Attributes = 0;
242	link->conf.IntType = INT_MEMORY_AND_IO;
243
244	pcmcia_cur_dev = link;
245
246	labpc_config(link);
247
248	return 0;
249}				/* labpc_cs_attach */
250
251/*======================================================================
252
253    This deletes a driver "instance".  The device is de-registered
254    with Card Services.  If it has been released, all local data
255    structures are freed.  Otherwise, the structures will be freed
256    when the device is released.
257
258======================================================================*/
259
260static void labpc_cs_detach(struct pcmcia_device *link)
261{
262	dev_dbg(&link->dev, "labpc_cs_detach\n");
263
264	/*
265	   If the device is currently configured and active, we won't
266	   actually delete it yet.  Instead, it is marked so that when
267	   the release() function is called, that will trigger a proper
268	   detach().
269	 */
270	if (link->dev_node) {
271		((struct local_info_t *)link->priv)->stop = 1;
272		labpc_release(link);
273	}
274
275	/* This points to the parent local_info_t struct */
276	if (link->priv)
277		kfree(link->priv);
278
279}				/* labpc_cs_detach */
280
281/*======================================================================
282
283    labpc_config() is scheduled to run after a CARD_INSERTION event
284    is received, to configure the PCMCIA socket, and to make the
285    device available to the system.
286
287======================================================================*/
288
289static int labpc_pcmcia_config_loop(struct pcmcia_device *p_dev,
290				cistpl_cftable_entry_t *cfg,
291				cistpl_cftable_entry_t *dflt,
292				unsigned int vcc,
293				void *priv_data)
294{
295	win_req_t *req = priv_data;
296	memreq_t map;
297
298	if (cfg->index == 0)
299		return -ENODEV;
300
301	/* Does this card need audio output? */
302	if (cfg->flags & CISTPL_CFTABLE_AUDIO) {
303		p_dev->conf.Attributes |= CONF_ENABLE_SPKR;
304		p_dev->conf.Status = CCSR_AUDIO_ENA;
305	}
306
307	/* Do we need to allocate an interrupt? */
308	if (cfg->irq.IRQInfo1 || dflt->irq.IRQInfo1)
309		p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
310
311	/* IO window settings */
312	p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
313	if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
314		cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
315		p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
316		if (!(io->flags & CISTPL_IO_8BIT))
317			p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
318		if (!(io->flags & CISTPL_IO_16BIT))
319			p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
320		p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
321		p_dev->io.BasePort1 = io->win[0].base;
322		p_dev->io.NumPorts1 = io->win[0].len;
323		if (io->nwin > 1) {
324			p_dev->io.Attributes2 = p_dev->io.Attributes1;
325			p_dev->io.BasePort2 = io->win[1].base;
326			p_dev->io.NumPorts2 = io->win[1].len;
327		}
328		/* This reserves IO space but doesn't actually enable it */
329		if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
330			return -ENODEV;
331	}
332
333	if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
334		cistpl_mem_t *mem =
335			(cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
336		req->Attributes = WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_CM;
337		req->Attributes |= WIN_ENABLE;
338		req->Base = mem->win[0].host_addr;
339		req->Size = mem->win[0].len;
340		if (req->Size < 0x1000)
341			req->Size = 0x1000;
342		req->AccessSpeed = 0;
343		if (pcmcia_request_window(p_dev, req, &p_dev->win))
344			return -ENODEV;
345		map.Page = 0;
346		map.CardOffset = mem->win[0].card_addr;
347		if (pcmcia_map_mem_page(p_dev, p_dev->win, &map))
348			return -ENODEV;
349	}
350	/* If we got this far, we're cool! */
351	return 0;
352}
353
354
355static void labpc_config(struct pcmcia_device *link)
356{
357	struct local_info_t *dev = link->priv;
358	int ret;
359	win_req_t req;
360
361	dev_dbg(&link->dev, "labpc_config\n");
362
363	ret = pcmcia_loop_config(link, labpc_pcmcia_config_loop, &req);
364	if (ret) {
365		dev_warn(&link->dev, "no configuration found\n");
366		goto failed;
367	}
368
369	/*
370	   Allocate an interrupt line.  Note that this does not assign a
371	   handler to the interrupt, unless the 'Handler' member of the
372	   irq structure is initialized.
373	 */
374	if (link->conf.Attributes & CONF_ENABLE_IRQ) {
375		ret = pcmcia_request_irq(link, &link->irq);
376		if (ret)
377			goto failed;
378	}
379
380	/*
381	   This actually configures the PCMCIA socket -- setting up
382	   the I/O windows and the interrupt mapping, and putting the
383	   card and host interface into "Memory and IO" mode.
384	 */
385	ret = pcmcia_request_configuration(link, &link->conf);
386	if (ret)
387		goto failed;
388
389	/*
390	   At this point, the dev_node_t structure(s) need to be
391	   initialized and arranged in a linked list at link->dev.
392	 */
393	sprintf(dev->node.dev_name, "daqcard-1200");
394	dev->node.major = dev->node.minor = 0;
395	link->dev_node = &dev->node;
396
397	/* Finally, report what we've done */
398	printk(KERN_INFO "%s: index 0x%02x",
399	       dev->node.dev_name, link->conf.ConfigIndex);
400	if (link->conf.Attributes & CONF_ENABLE_IRQ)
401		printk(", irq %d", link->irq.AssignedIRQ);
402	if (link->io.NumPorts1)
403		printk(", io 0x%04x-0x%04x", link->io.BasePort1,
404		       link->io.BasePort1 + link->io.NumPorts1 - 1);
405	if (link->io.NumPorts2)
406		printk(" & 0x%04x-0x%04x", link->io.BasePort2,
407		       link->io.BasePort2 + link->io.NumPorts2 - 1);
408	if (link->win)
409		printk(", mem 0x%06lx-0x%06lx", req.Base,
410		       req.Base + req.Size - 1);
411	printk("\n");
412
413	return;
414
415failed:
416	labpc_release(link);
417
418}				/* labpc_config */
419
420static void labpc_release(struct pcmcia_device *link)
421{
422	dev_dbg(&link->dev, "labpc_release\n");
423
424	pcmcia_disable_device(link);
425}				/* labpc_release */
426
427/*======================================================================
428
429    The card status event handler.  Mostly, this schedules other
430    stuff to run after an event is received.
431
432    When a CARD_REMOVAL event is received, we immediately set a
433    private flag to block future accesses to this device.  All the
434    functions that actually access the device should check this flag
435    to make sure the card is still present.
436
437======================================================================*/
438
439static int labpc_cs_suspend(struct pcmcia_device *link)
440{
441	struct local_info_t *local = link->priv;
442
443	/* Mark the device as stopped, to block IO until later */
444	local->stop = 1;
445	return 0;
446}				/* labpc_cs_suspend */
447
448static int labpc_cs_resume(struct pcmcia_device *link)
449{
450	struct local_info_t *local = link->priv;
451
452	local->stop = 0;
453	return 0;
454}				/* labpc_cs_resume */
455
456/*====================================================================*/
457
458static struct pcmcia_device_id labpc_cs_ids[] = {
459	/* N.B. These IDs should match those in labpc_cs_boards (ni_labpc.c) */
460	PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0103),	/* daqcard-1200 */
461	PCMCIA_DEVICE_NULL
462};
463
464MODULE_DEVICE_TABLE(pcmcia, labpc_cs_ids);
465
466struct pcmcia_driver labpc_cs_driver = {
467	.probe = labpc_cs_attach,
468	.remove = labpc_cs_detach,
469	.suspend = labpc_cs_suspend,
470	.resume = labpc_cs_resume,
471	.id_table = labpc_cs_ids,
472	.owner = THIS_MODULE,
473	.drv = {
474		.name = dev_info,
475		},
476};
477
478static int __init init_labpc_cs(void)
479{
480	pcmcia_register_driver(&labpc_cs_driver);
481	return 0;
482}
483
484static void __exit exit_labpc_cs(void)
485{
486	pcmcia_unregister_driver(&labpc_cs_driver);
487}
488
489int __init labpc_init_module(void)
490{
491	int ret;
492
493	ret = init_labpc_cs();
494	if (ret < 0)
495		return ret;
496
497	return comedi_driver_register(&driver_labpc_cs);
498}
499
500void __exit labpc_exit_module(void)
501{
502	exit_labpc_cs();
503	comedi_driver_unregister(&driver_labpc_cs);
504}
505
506MODULE_LICENSE("GPL");
507module_init(labpc_init_module);
508module_exit(labpc_exit_module);
509