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