Staging: comedi: add ni_labpc drivers
[safe/jmp/linux-2.6] / drivers / staging / comedi / drivers / ni_labpc_cs.c
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 /*
29 Driver: ni_labpc_cs
30 Description: National Instruments Lab-PC (& compatibles)
31 Author: Frank Mori Hess <fmhess@users.sourceforge.net>
32 Devices: [National Instruments] DAQCard-1200 (daqcard-1200)
33 Status: works
34
35 Thanks go to Fredrik Lingvall for much testing and perseverance in
36 helping to debug daqcard-1200 support.
37
38 The 1200 series boards have onboard calibration dacs for correcting
39 analog input/output offsets and gains.  The proper settings for these
40 caldacs are stored on the board's eeprom.  To read the caldac values
41 from the eeprom and store them into a file that can be then be used by
42 comedilib, use the comedi_calibrate program.
43
44 Configuration options:
45   none
46
47 The daqcard-1200 has quirky chanlist requirements
48 when scanning multiple channels.  Multiple channel scan
49 sequence must start at highest channel, then decrement down to
50 channel 0.  Chanlists consisting of all one channel
51 are also legal, and allow you to pace conversions in bursts.
52
53 */
54
55 /*
56
57 NI manuals:
58 340988a (daqcard-1200)
59
60 */
61
62 #undef LABPC_DEBUG
63 //#define LABPC_DEBUG   // enable debugging messages
64
65 #include "../comedidev.h"
66
67 #include <linux/delay.h>
68 #include <linux/version.h>
69
70 #include "8253.h"
71 #include "8255.h"
72 #include "comedi_fc.h"
73 #include "ni_labpc.h"
74
75 #include <pcmcia/cs_types.h>
76 #include <pcmcia/cs.h>
77 #include <pcmcia/cistpl.h>
78 #include <pcmcia/cisreg.h>
79 #include <pcmcia/ds.h>
80
81 static struct pcmcia_device *pcmcia_cur_dev = NULL;
82
83 static int labpc_attach(comedi_device * dev, comedi_devconfig * it);
84
85 static const labpc_board labpc_cs_boards[] = {
86         {
87               name:     "daqcard-1200",
88               device_id:0x103,  // 0x10b is manufacturer id, 0x103 is device id
89               ai_speed:10000,
90               bustype:  pcmcia_bustype,
91               register_layout:labpc_1200_layout,
92               has_ao:   1,
93               ai_range_table:&range_labpc_1200_ai,
94               ai_range_code:labpc_1200_ai_gain_bits,
95               ai_range_is_unipolar:labpc_1200_is_unipolar,
96               ai_scan_up:0,
97               memory_mapped_io:0,
98                 },
99         /* duplicate entry, to support using alternate name */
100         {
101               name:     "ni_labpc_cs",
102               device_id:0x103,
103               ai_speed:10000,
104               bustype:  pcmcia_bustype,
105               register_layout:labpc_1200_layout,
106               has_ao:   1,
107               ai_range_table:&range_labpc_1200_ai,
108               ai_range_code:labpc_1200_ai_gain_bits,
109               ai_range_is_unipolar:labpc_1200_is_unipolar,
110               ai_scan_up:0,
111               memory_mapped_io:0,
112                 },
113 };
114
115 /*
116  * Useful for shorthand access to the particular board structure
117  */
118 #define thisboard ((const labpc_board *)dev->board_ptr)
119
120 static comedi_driver driver_labpc_cs = {
121         .driver_name = "ni_labpc_cs",
122         .module = THIS_MODULE,
123         .attach = &labpc_attach,
124         .detach = &labpc_common_detach,
125         .num_names = sizeof(labpc_cs_boards) / sizeof(labpc_board),
126         .board_name = &labpc_cs_boards[0].name,
127         .offset = sizeof(labpc_board),
128 };
129
130 static int labpc_attach(comedi_device * dev, comedi_devconfig * it)
131 {
132         unsigned long iobase = 0;
133         unsigned int irq = 0;
134         struct pcmcia_device *link;
135
136         /* allocate and initialize dev->private */
137         if (alloc_private(dev, sizeof(labpc_private)) < 0)
138                 return -ENOMEM;
139
140         // get base address, irq etc. based on bustype
141         switch (thisboard->bustype) {
142         case pcmcia_bustype:
143                 link = pcmcia_cur_dev;  /* XXX hack */
144                 if (!link)
145                         return -EIO;
146                 iobase = link->io.BasePort1;
147                 irq = link->irq.AssignedIRQ;
148                 break;
149         default:
150                 printk("bug! couldn't determine board type\n");
151                 return -EINVAL;
152                 break;
153         }
154         return labpc_common_attach(dev, iobase, irq, 0);
155 }
156
157 /*
158    All the PCMCIA modules use PCMCIA_DEBUG to control debugging.  If
159    you do not define PCMCIA_DEBUG at all, all the debug code will be
160    left out.  If you compile with PCMCIA_DEBUG=0, the debug code will
161    be present but disabled -- but it can then be enabled for specific
162    modules at load time with a 'pc_debug=#' option to insmod.
163 */
164 #ifdef PCMCIA_DEBUG
165 static int pc_debug = PCMCIA_DEBUG;
166 module_param(pc_debug, int, 0644);
167 #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
168 static const char *version =
169         "ni_labpc.c, based on dummy_cs.c 1.31 2001/08/24 12:13:13";
170 #else
171 #define DEBUG(n, args...)
172 #endif
173
174 /*====================================================================*/
175
176 /*
177    The event() function is this driver's Card Services event handler.
178    It will be called by Card Services when an appropriate card status
179    event is received.  The config() and release() entry points are
180    used to configure or release a socket, in response to card
181    insertion and ejection events.  They are invoked from the dummy
182    event handler.
183
184    Kernel version 2.6.16 upwards uses suspend() and resume() functions
185    instead of an event() function.
186 */
187
188 static void labpc_config(struct pcmcia_device *link);
189 static void labpc_release(struct pcmcia_device *link);
190 static int labpc_cs_suspend(struct pcmcia_device *p_dev);
191 static int labpc_cs_resume(struct pcmcia_device *p_dev);
192
193 /*
194    The attach() and detach() entry points are used to create and destroy
195    "instances" of the driver, where each instance represents everything
196    needed to manage one actual PCMCIA card.
197 */
198
199 static int labpc_cs_attach(struct pcmcia_device *);
200 static void labpc_cs_detach(struct pcmcia_device *);
201
202 /*
203    You'll also need to prototype all the functions that will actually
204    be used to talk to your device.  See 'memory_cs' for a good example
205    of a fully self-sufficient driver; the other drivers rely more or
206    less on other parts of the kernel.
207 */
208
209 /*
210    The dev_info variable is the "key" that is used to match up this
211    device driver with appropriate cards, through the card configuration
212    database.
213 */
214
215 static const dev_info_t dev_info = "daqcard-1200";
216
217 typedef struct local_info_t {
218         struct pcmcia_device *link;
219         dev_node_t node;
220         int stop;
221         struct bus_operations *bus;
222 } local_info_t;
223
224 /*======================================================================
225
226     labpc_cs_attach() creates an "instance" of the driver, allocating
227     local data structures for one device.  The device is registered
228     with Card Services.
229
230     The dev_link structure is initialized, but we don't actually
231     configure the card at this point -- we wait until we receive a
232     card insertion event.
233
234 ======================================================================*/
235
236 static int labpc_cs_attach(struct pcmcia_device *link)
237 {
238         local_info_t *local;
239
240         DEBUG(0, "labpc_cs_attach()\n");
241
242         /* Allocate space for private device-specific data */
243         local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
244         if (!local)
245                 return -ENOMEM;
246         local->link = link;
247         link->priv = local;
248
249         /* Interrupt setup */
250         link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_FORCED_PULSE;
251         link->irq.IRQInfo1 = IRQ_INFO2_VALID | IRQ_PULSE_ID;
252         link->irq.Handler = NULL;
253
254         /*
255            General socket configuration defaults can go here.  In this
256            client, we assume very little, and rely on the CIS for almost
257            everything.  In most clients, many details (i.e., number, sizes,
258            and attributes of IO windows) are fixed by the nature of the
259            device, and can be hard-wired here.
260          */
261         link->conf.Attributes = 0;
262         link->conf.IntType = INT_MEMORY_AND_IO;
263
264         pcmcia_cur_dev = link;
265
266         labpc_config(link);
267
268         return 0;
269 }                               /* labpc_cs_attach */
270
271 /*======================================================================
272
273     This deletes a driver "instance".  The device is de-registered
274     with Card Services.  If it has been released, all local data
275     structures are freed.  Otherwise, the structures will be freed
276     when the device is released.
277
278 ======================================================================*/
279
280 static void labpc_cs_detach(struct pcmcia_device *link)
281 {
282         DEBUG(0, "labpc_cs_detach(0x%p)\n", link);
283
284         /*
285            If the device is currently configured and active, we won't
286            actually delete it yet.  Instead, it is marked so that when
287            the release() function is called, that will trigger a proper
288            detach().
289          */
290         if (link->dev_node) {
291                 ((local_info_t *) link->priv)->stop = 1;
292                 labpc_release(link);
293         }
294
295         /* This points to the parent local_info_t struct */
296         if (link->priv)
297                 kfree(link->priv);
298
299 }                               /* labpc_cs_detach */
300
301 /*======================================================================
302
303     labpc_config() is scheduled to run after a CARD_INSERTION event
304     is received, to configure the PCMCIA socket, and to make the
305     device available to the system.
306
307 ======================================================================*/
308
309 static void labpc_config(struct pcmcia_device *link)
310 {
311         local_info_t *dev = link->priv;
312         tuple_t tuple;
313         cisparse_t parse;
314         int last_ret;
315         u_char buf[64];
316         win_req_t req;
317         memreq_t map;
318         cistpl_cftable_entry_t dflt = { 0 };
319
320         DEBUG(0, "labpc_config(0x%p)\n", link);
321
322         /*
323            This reads the card's CONFIG tuple to find its configuration
324            registers.
325          */
326         tuple.DesiredTuple = CISTPL_CONFIG;
327         tuple.Attributes = 0;
328         tuple.TupleData = buf;
329         tuple.TupleDataMax = sizeof(buf);
330         tuple.TupleOffset = 0;
331         if ((last_ret = pcmcia_get_first_tuple(link, &tuple))) {
332                 cs_error(link, GetFirstTuple, last_ret);
333                 goto cs_failed;
334         }
335         if ((last_ret = pcmcia_get_tuple_data(link, &tuple))) {
336                 cs_error(link, GetTupleData, last_ret);
337                 goto cs_failed;
338         }
339         if ((last_ret = pcmcia_parse_tuple(&tuple, &parse))) {
340                 cs_error(link, ParseTuple, last_ret);
341                 goto cs_failed;
342         }
343         link->conf.ConfigBase = parse.config.base;
344         link->conf.Present = parse.config.rmask[0];
345
346         /*
347            In this loop, we scan the CIS for configuration table entries,
348            each of which describes a valid card configuration, including
349            voltage, IO window, memory window, and interrupt settings.
350
351            We make no assumptions about the card to be configured: we use
352            just the information available in the CIS.  In an ideal world,
353            this would work for any PCMCIA card, but it requires a complete
354            and accurate CIS.  In practice, a driver usually "knows" most of
355            these things without consulting the CIS, and most client drivers
356            will only use the CIS to fill in implementation-defined details.
357          */
358         tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
359         if ((last_ret = pcmcia_get_first_tuple(link, &tuple))) {
360                 cs_error(link, GetFirstTuple, last_ret);
361                 goto cs_failed;
362         }
363         while (1) {
364                 cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
365                 if (pcmcia_get_tuple_data(link, &tuple))
366                         goto next_entry;
367                 if (pcmcia_parse_tuple(&tuple, &parse))
368                         goto next_entry;
369
370                 if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
371                         dflt = *cfg;
372                 if (cfg->index == 0)
373                         goto next_entry;
374                 link->conf.ConfigIndex = cfg->index;
375
376                 /* Does this card need audio output? */
377                 if (cfg->flags & CISTPL_CFTABLE_AUDIO) {
378                         link->conf.Attributes |= CONF_ENABLE_SPKR;
379                         link->conf.Status = CCSR_AUDIO_ENA;
380                 }
381
382                 /* Do we need to allocate an interrupt? */
383                 if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1)
384                         link->conf.Attributes |= CONF_ENABLE_IRQ;
385
386                 /* IO window settings */
387                 link->io.NumPorts1 = link->io.NumPorts2 = 0;
388                 if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) {
389                         cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io;
390                         link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
391                         link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
392                         link->io.BasePort1 = io->win[0].base;
393                         link->io.NumPorts1 = io->win[0].len;
394                         if (io->nwin > 1) {
395                                 link->io.Attributes2 = link->io.Attributes1;
396                                 link->io.BasePort2 = io->win[1].base;
397                                 link->io.NumPorts2 = io->win[1].len;
398                         }
399                         /* This reserves IO space but doesn't actually enable it */
400                         if (pcmcia_request_io(link, &link->io))
401                                 goto next_entry;
402                 }
403
404                 if ((cfg->mem.nwin > 0) || (dflt.mem.nwin > 0)) {
405                         cistpl_mem_t *mem =
406                                 (cfg->mem.nwin) ? &cfg->mem : &dflt.mem;
407                         req.Attributes = WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_CM;
408                         req.Attributes |= WIN_ENABLE;
409                         req.Base = mem->win[0].host_addr;
410                         req.Size = mem->win[0].len;
411                         if (req.Size < 0x1000)
412                                 req.Size = 0x1000;
413                         req.AccessSpeed = 0;
414                         link->win = (window_handle_t) link;
415                         if (pcmcia_request_window(&link, &req, &link->win))
416                                 goto next_entry;
417                         map.Page = 0;
418                         map.CardOffset = mem->win[0].card_addr;
419                         if (pcmcia_map_mem_page(link->win, &map))
420                                 goto next_entry;
421                 }
422                 /* If we got this far, we're cool! */
423                 break;
424
425               next_entry:
426                 if ((last_ret = pcmcia_get_next_tuple(link, &tuple))) {
427                         cs_error(link, GetNextTuple, last_ret);
428                         goto cs_failed;
429                 }
430         }
431
432         /*
433            Allocate an interrupt line.  Note that this does not assign a
434            handler to the interrupt, unless the 'Handler' member of the
435            irq structure is initialized.
436          */
437         if (link->conf.Attributes & CONF_ENABLE_IRQ)
438                 if ((last_ret = pcmcia_request_irq(link, &link->irq))) {
439                         cs_error(link, RequestIRQ, last_ret);
440                         goto cs_failed;
441                 }
442
443         /*
444            This actually configures the PCMCIA socket -- setting up
445            the I/O windows and the interrupt mapping, and putting the
446            card and host interface into "Memory and IO" mode.
447          */
448         if ((last_ret = pcmcia_request_configuration(link, &link->conf))) {
449                 cs_error(link, RequestConfiguration, last_ret);
450                 goto cs_failed;
451         }
452
453         /*
454            At this point, the dev_node_t structure(s) need to be
455            initialized and arranged in a linked list at link->dev.
456          */
457         sprintf(dev->node.dev_name, "daqcard-1200");
458         dev->node.major = dev->node.minor = 0;
459         link->dev_node = &dev->node;
460
461         /* Finally, report what we've done */
462         printk(KERN_INFO "%s: index 0x%02x",
463                 dev->node.dev_name, link->conf.ConfigIndex);
464         if (link->conf.Attributes & CONF_ENABLE_IRQ)
465                 printk(", irq %d", link->irq.AssignedIRQ);
466         if (link->io.NumPorts1)
467                 printk(", io 0x%04x-0x%04x", link->io.BasePort1,
468                         link->io.BasePort1 + link->io.NumPorts1 - 1);
469         if (link->io.NumPorts2)
470                 printk(" & 0x%04x-0x%04x", link->io.BasePort2,
471                         link->io.BasePort2 + link->io.NumPorts2 - 1);
472         if (link->win)
473                 printk(", mem 0x%06lx-0x%06lx", req.Base,
474                         req.Base + req.Size - 1);
475         printk("\n");
476
477         return;
478
479       cs_failed:
480         labpc_release(link);
481
482 }                               /* labpc_config */
483
484 static void labpc_release(struct pcmcia_device *link)
485 {
486         DEBUG(0, "labpc_release(0x%p)\n", link);
487
488         pcmcia_disable_device(link);
489 }                               /* labpc_release */
490
491 /*======================================================================
492
493     The card status event handler.  Mostly, this schedules other
494     stuff to run after an event is received.
495
496     When a CARD_REMOVAL event is received, we immediately set a
497     private flag to block future accesses to this device.  All the
498     functions that actually access the device should check this flag
499     to make sure the card is still present.
500
501 ======================================================================*/
502
503 static int labpc_cs_suspend(struct pcmcia_device *link)
504 {
505         local_info_t *local = link->priv;
506
507         /* Mark the device as stopped, to block IO until later */
508         local->stop = 1;
509         return 0;
510 }                               /* labpc_cs_suspend */
511
512 static int labpc_cs_resume(struct pcmcia_device *link)
513 {
514         local_info_t *local = link->priv;
515
516         local->stop = 0;
517         return 0;
518 }                               /* labpc_cs_resume */
519
520 /*====================================================================*/
521
522 static struct pcmcia_device_id labpc_cs_ids[] = {
523         /* N.B. These IDs should match those in labpc_cs_boards (ni_labpc.c) */
524         PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0103),        /* daqcard-1200 */
525         PCMCIA_DEVICE_NULL
526 };
527
528 MODULE_DEVICE_TABLE(pcmcia, labpc_cs_ids);
529
530 struct pcmcia_driver labpc_cs_driver = {
531         .probe = labpc_cs_attach,
532         .remove = labpc_cs_detach,
533         .suspend = labpc_cs_suspend,
534         .resume = labpc_cs_resume,
535         .id_table = labpc_cs_ids,
536         .owner = THIS_MODULE,
537         .drv = {
538                         .name = dev_info,
539                 },
540 };
541
542 static int __init init_labpc_cs(void)
543 {
544         DEBUG(0, "%s\n", version);
545         pcmcia_register_driver(&labpc_cs_driver);
546         return 0;
547 }
548
549 static void __exit exit_labpc_cs(void)
550 {
551         DEBUG(0, "ni_labpc: unloading\n");
552         pcmcia_unregister_driver(&labpc_cs_driver);
553 }
554
555 int __init labpc_init_module(void)
556 {
557         int ret;
558
559         ret = init_labpc_cs();
560         if (ret < 0)
561                 return ret;
562
563         return comedi_driver_register(&driver_labpc_cs);
564 }
565
566 void __exit labpc_exit_module(void)
567 {
568         exit_labpc_cs();
569         comedi_driver_unregister(&driver_labpc_cs);
570 }
571
572 MODULE_LICENSE("GPL");
573 module_init(labpc_init_module);
574 module_exit(labpc_exit_module);