]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/staging/comedi/drivers/ni_labpc_cs.c
Merge branch 'master' of ssh://master.kernel.org/pub/scm/linux/kernel/git/linville...
[karo-tx-linux.git] / 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  /* 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
79 static struct pcmcia_device *pcmcia_cur_dev;
80
81 static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it);
82
83 static const struct labpc_board_struct labpc_cs_boards[] = {
84         {
85          .name = "daqcard-1200",
86          .device_id = 0x103,    /* 0x10b is manufacturer id,
87                                    0x103 is device id */
88          .ai_speed = 10000,
89          .bustype = pcmcia_bustype,
90          .register_layout = labpc_1200_layout,
91          .has_ao = 1,
92          .ai_range_table = &range_labpc_1200_ai,
93          .ai_range_code = labpc_1200_ai_gain_bits,
94          .ai_range_is_unipolar = labpc_1200_is_unipolar,
95          .ai_scan_up = 0,
96          .memory_mapped_io = 0,
97          },
98         /* duplicate entry, to support using alternate name */
99         {
100          .name = "ni_labpc_cs",
101          .device_id = 0x103,
102          .ai_speed = 10000,
103          .bustype = pcmcia_bustype,
104          .register_layout = labpc_1200_layout,
105          .has_ao = 1,
106          .ai_range_table = &range_labpc_1200_ai,
107          .ai_range_code = labpc_1200_ai_gain_bits,
108          .ai_range_is_unipolar = labpc_1200_is_unipolar,
109          .ai_scan_up = 0,
110          .memory_mapped_io = 0,
111          },
112 };
113
114 /*
115  * Useful for shorthand access to the particular board structure
116  */
117 #define thisboard ((const struct labpc_board_struct *)dev->board_ptr)
118
119 static struct comedi_driver driver_labpc_cs = {
120         .driver_name = "ni_labpc_cs",
121         .module = THIS_MODULE,
122         .attach = &labpc_attach,
123         .detach = &labpc_common_detach,
124         .num_names = ARRAY_SIZE(labpc_cs_boards),
125         .board_name = &labpc_cs_boards[0].name,
126         .offset = sizeof(struct labpc_board_struct),
127 };
128
129 static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it)
130 {
131         unsigned long iobase = 0;
132         unsigned int irq = 0;
133         struct pcmcia_device *link;
134
135         /* allocate and initialize dev->private */
136         if (alloc_private(dev, sizeof(struct labpc_private)) < 0)
137                 return -ENOMEM;
138
139         /*  get base address, irq etc. based on bustype */
140         switch (thisboard->bustype) {
141         case pcmcia_bustype:
142                 link = pcmcia_cur_dev;  /* XXX hack */
143                 if (!link)
144                         return -EIO;
145                 iobase = link->io.BasePort1;
146                 irq = link->irq.AssignedIRQ;
147                 break;
148         default:
149                 printk("bug! couldn't determine board type\n");
150                 return -EINVAL;
151                 break;
152         }
153         return labpc_common_attach(dev, iobase, irq, 0);
154 }
155
156 /*====================================================================*/
157
158 /*
159    The event() function is this driver's Card Services event handler.
160    It will be called by Card Services when an appropriate card status
161    event is received.  The config() and release() entry points are
162    used to configure or release a socket, in response to card
163    insertion and ejection events.  They are invoked from the dummy
164    event handler.
165
166    Kernel version 2.6.16 upwards uses suspend() and resume() functions
167    instead of an event() function.
168 */
169
170 static void labpc_config(struct pcmcia_device *link);
171 static void labpc_release(struct pcmcia_device *link);
172 static int labpc_cs_suspend(struct pcmcia_device *p_dev);
173 static int labpc_cs_resume(struct pcmcia_device *p_dev);
174
175 /*
176    The attach() and detach() entry points are used to create and destroy
177    "instances" of the driver, where each instance represents everything
178    needed to manage one actual PCMCIA card.
179 */
180
181 static int labpc_cs_attach(struct pcmcia_device *);
182 static void labpc_cs_detach(struct pcmcia_device *);
183
184 /*
185    You'll also need to prototype all the functions that will actually
186    be used to talk to your device.  See 'memory_cs' for a good example
187    of a fully self-sufficient driver; the other drivers rely more or
188    less on other parts of the kernel.
189 */
190
191 /*
192    The dev_info variable is the "key" that is used to match up this
193    device driver with appropriate cards, through the card configuration
194    database.
195 */
196
197 static const dev_info_t dev_info = "daqcard-1200";
198
199 struct local_info_t {
200         struct pcmcia_device *link;
201         dev_node_t node;
202         int stop;
203         struct bus_operations *bus;
204 };
205
206 /*======================================================================
207
208     labpc_cs_attach() creates an "instance" of the driver, allocating
209     local data structures for one device.  The device is registered
210     with Card Services.
211
212     The dev_link structure is initialized, but we don't actually
213     configure the card at this point -- we wait until we receive a
214     card insertion event.
215
216 ======================================================================*/
217
218 static int labpc_cs_attach(struct pcmcia_device *link)
219 {
220         struct local_info_t *local;
221
222         dev_dbg(&link->dev, "labpc_cs_attach()\n");
223
224         /* Allocate space for private device-specific data */
225         local = kzalloc(sizeof(struct local_info_t), GFP_KERNEL);
226         if (!local)
227                 return -ENOMEM;
228         local->link = link;
229         link->priv = local;
230
231         /* Interrupt setup */
232         link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_FORCED_PULSE;
233         link->irq.Handler = NULL;
234
235         /*
236            General socket configuration defaults can go here.  In this
237            client, we assume very little, and rely on the CIS for almost
238            everything.  In most clients, many details (i.e., number, sizes,
239            and attributes of IO windows) are fixed by the nature of the
240            device, and can be hard-wired here.
241          */
242         link->conf.Attributes = 0;
243         link->conf.IntType = INT_MEMORY_AND_IO;
244
245         pcmcia_cur_dev = link;
246
247         labpc_config(link);
248
249         return 0;
250 }                               /* labpc_cs_attach */
251
252 /*======================================================================
253
254     This deletes a driver "instance".  The device is de-registered
255     with Card Services.  If it has been released, all local data
256     structures are freed.  Otherwise, the structures will be freed
257     when the device is released.
258
259 ======================================================================*/
260
261 static void labpc_cs_detach(struct pcmcia_device *link)
262 {
263         dev_dbg(&link->dev, "labpc_cs_detach\n");
264
265         /*
266            If the device is currently configured and active, we won't
267            actually delete it yet.  Instead, it is marked so that when
268            the release() function is called, that will trigger a proper
269            detach().
270          */
271         if (link->dev_node) {
272                 ((struct local_info_t *)link->priv)->stop = 1;
273                 labpc_release(link);
274         }
275
276         /* This points to the parent local_info_t struct (may be null) */
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
289 static 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
355 static 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
415 failed:
416         labpc_release(link);
417
418 }                               /* labpc_config */
419
420 static 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
439 static 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
448 static 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
458 static 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
464 MODULE_DEVICE_TABLE(pcmcia, labpc_cs_ids);
465
466 struct 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
478 static int __init init_labpc_cs(void)
479 {
480         pcmcia_register_driver(&labpc_cs_driver);
481         return 0;
482 }
483
484 static void __exit exit_labpc_cs(void)
485 {
486         pcmcia_unregister_driver(&labpc_cs_driver);
487 }
488
489 int __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
500 void __exit labpc_exit_module(void)
501 {
502         exit_labpc_cs();
503         comedi_driver_unregister(&driver_labpc_cs);
504 }
505
506 MODULE_LICENSE("GPL");
507 module_init(labpc_init_module);
508 module_exit(labpc_exit_module);