ni_labpc_cs.c revision 92c4bad75cef701af881c8caffa1b02f7891a295
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;
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 (may be null) */
276	kfree(link->priv);
277
278}				/* labpc_cs_detach */
279
280/*======================================================================
281
282    labpc_config() is scheduled to run after a CARD_INSERTION event
283    is received, to configure the PCMCIA socket, and to make the
284    device available to the system.
285
286======================================================================*/
287
288static int labpc_pcmcia_config_loop(struct pcmcia_device *p_dev,
289				cistpl_cftable_entry_t *cfg,
290				cistpl_cftable_entry_t *dflt,
291				unsigned int vcc,
292				void *priv_data)
293{
294	win_req_t *req = priv_data;
295	memreq_t map;
296
297	if (cfg->index == 0)
298		return -ENODEV;
299
300	/* Does this card need audio output? */
301	if (cfg->flags & CISTPL_CFTABLE_AUDIO) {
302		p_dev->conf.Attributes |= CONF_ENABLE_SPKR;
303		p_dev->conf.Status = CCSR_AUDIO_ENA;
304	}
305
306	/* Do we need to allocate an interrupt? */
307	if (cfg->irq.IRQInfo1 || dflt->irq.IRQInfo1)
308		p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
309
310	/* IO window settings */
311	p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
312	if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
313		cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
314		p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
315		if (!(io->flags & CISTPL_IO_8BIT))
316			p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
317		if (!(io->flags & CISTPL_IO_16BIT))
318			p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
319		p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
320		p_dev->io.BasePort1 = io->win[0].base;
321		p_dev->io.NumPorts1 = io->win[0].len;
322		if (io->nwin > 1) {
323			p_dev->io.Attributes2 = p_dev->io.Attributes1;
324			p_dev->io.BasePort2 = io->win[1].base;
325			p_dev->io.NumPorts2 = io->win[1].len;
326		}
327		/* This reserves IO space but doesn't actually enable it */
328		if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
329			return -ENODEV;
330	}
331
332	if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
333		cistpl_mem_t *mem =
334			(cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
335		req->Attributes = WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_CM;
336		req->Attributes |= WIN_ENABLE;
337		req->Base = mem->win[0].host_addr;
338		req->Size = mem->win[0].len;
339		if (req->Size < 0x1000)
340			req->Size = 0x1000;
341		req->AccessSpeed = 0;
342		if (pcmcia_request_window(p_dev, req, &p_dev->win))
343			return -ENODEV;
344		map.Page = 0;
345		map.CardOffset = mem->win[0].card_addr;
346		if (pcmcia_map_mem_page(p_dev, p_dev->win, &map))
347			return -ENODEV;
348	}
349	/* If we got this far, we're cool! */
350	return 0;
351}
352
353
354static void labpc_config(struct pcmcia_device *link)
355{
356	struct local_info_t *dev = link->priv;
357	int ret;
358	win_req_t req;
359
360	dev_dbg(&link->dev, "labpc_config\n");
361
362	ret = pcmcia_loop_config(link, labpc_pcmcia_config_loop, &req);
363	if (ret) {
364		dev_warn(&link->dev, "no configuration found\n");
365		goto failed;
366	}
367
368	/*
369	   Allocate an interrupt line.  Note that this does not assign a
370	   handler to the interrupt, unless the 'Handler' member of the
371	   irq structure is initialized.
372	 */
373	if (link->conf.Attributes & CONF_ENABLE_IRQ) {
374		ret = pcmcia_request_irq(link, &link->irq);
375		if (ret)
376			goto failed;
377	}
378
379	/*
380	   This actually configures the PCMCIA socket -- setting up
381	   the I/O windows and the interrupt mapping, and putting the
382	   card and host interface into "Memory and IO" mode.
383	 */
384	ret = pcmcia_request_configuration(link, &link->conf);
385	if (ret)
386		goto failed;
387
388	/*
389	   At this point, the dev_node_t structure(s) need to be
390	   initialized and arranged in a linked list at link->dev.
391	 */
392	sprintf(dev->node.dev_name, "daqcard-1200");
393	dev->node.major = dev->node.minor = 0;
394	link->dev_node = &dev->node;
395
396	/* Finally, report what we've done */
397	printk(KERN_INFO "%s: index 0x%02x",
398	       dev->node.dev_name, link->conf.ConfigIndex);
399	if (link->conf.Attributes & CONF_ENABLE_IRQ)
400		printk(", irq %d", link->irq.AssignedIRQ);
401	if (link->io.NumPorts1)
402		printk(", io 0x%04x-0x%04x", link->io.BasePort1,
403		       link->io.BasePort1 + link->io.NumPorts1 - 1);
404	if (link->io.NumPorts2)
405		printk(" & 0x%04x-0x%04x", link->io.BasePort2,
406		       link->io.BasePort2 + link->io.NumPorts2 - 1);
407	if (link->win)
408		printk(", mem 0x%06lx-0x%06lx", req.Base,
409		       req.Base + req.Size - 1);
410	printk("\n");
411
412	return;
413
414failed:
415	labpc_release(link);
416
417}				/* labpc_config */
418
419static void labpc_release(struct pcmcia_device *link)
420{
421	dev_dbg(&link->dev, "labpc_release\n");
422
423	pcmcia_disable_device(link);
424}				/* labpc_release */
425
426/*======================================================================
427
428    The card status event handler.  Mostly, this schedules other
429    stuff to run after an event is received.
430
431    When a CARD_REMOVAL event is received, we immediately set a
432    private flag to block future accesses to this device.  All the
433    functions that actually access the device should check this flag
434    to make sure the card is still present.
435
436======================================================================*/
437
438static int labpc_cs_suspend(struct pcmcia_device *link)
439{
440	struct local_info_t *local = link->priv;
441
442	/* Mark the device as stopped, to block IO until later */
443	local->stop = 1;
444	return 0;
445}				/* labpc_cs_suspend */
446
447static int labpc_cs_resume(struct pcmcia_device *link)
448{
449	struct local_info_t *local = link->priv;
450
451	local->stop = 0;
452	return 0;
453}				/* labpc_cs_resume */
454
455/*====================================================================*/
456
457static struct pcmcia_device_id labpc_cs_ids[] = {
458	/* N.B. These IDs should match those in labpc_cs_boards (ni_labpc.c) */
459	PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0103),	/* daqcard-1200 */
460	PCMCIA_DEVICE_NULL
461};
462
463MODULE_DEVICE_TABLE(pcmcia, labpc_cs_ids);
464
465struct pcmcia_driver labpc_cs_driver = {
466	.probe = labpc_cs_attach,
467	.remove = labpc_cs_detach,
468	.suspend = labpc_cs_suspend,
469	.resume = labpc_cs_resume,
470	.id_table = labpc_cs_ids,
471	.owner = THIS_MODULE,
472	.drv = {
473		.name = dev_info,
474		},
475};
476
477static int __init init_labpc_cs(void)
478{
479	pcmcia_register_driver(&labpc_cs_driver);
480	return 0;
481}
482
483static void __exit exit_labpc_cs(void)
484{
485	pcmcia_unregister_driver(&labpc_cs_driver);
486}
487
488int __init labpc_init_module(void)
489{
490	int ret;
491
492	ret = init_labpc_cs();
493	if (ret < 0)
494		return ret;
495
496	return comedi_driver_register(&driver_labpc_cs);
497}
498
499void __exit labpc_exit_module(void)
500{
501	exit_labpc_cs();
502	comedi_driver_unregister(&driver_labpc_cs);
503}
504
505MODULE_LICENSE("GPL");
506module_init(labpc_init_module);
507module_exit(labpc_exit_module);
508