ni_labpc_cs.c revision 440eed43e2a95bb842488755683716814da10f2b
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#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/cistpl.h> 75#include <pcmcia/cisreg.h> 76#include <pcmcia/ds.h> 77 78static struct pcmcia_device *pcmcia_cur_dev; 79 80static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it); 81 82static const struct labpc_board_struct labpc_cs_boards[] = { 83 { 84 .name = "daqcard-1200", 85 .device_id = 0x103, /* 0x10b is manufacturer id, 86 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->resource[0]->start; 145 irq = link->irq; 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 190struct local_info_t { 191 struct pcmcia_device *link; 192 int stop; 193 struct bus_operations *bus; 194}; 195 196/*====================================================================== 197 198 labpc_cs_attach() creates an "instance" of the driver, allocating 199 local data structures for one device. The device is registered 200 with Card Services. 201 202 The dev_link structure is initialized, but we don't actually 203 configure the card at this point -- we wait until we receive a 204 card insertion event. 205 206======================================================================*/ 207 208static int labpc_cs_attach(struct pcmcia_device *link) 209{ 210 struct local_info_t *local; 211 212 dev_dbg(&link->dev, "labpc_cs_attach()\n"); 213 214 /* Allocate space for private device-specific data */ 215 local = kzalloc(sizeof(struct local_info_t), GFP_KERNEL); 216 if (!local) 217 return -ENOMEM; 218 local->link = link; 219 link->priv = local; 220 221 pcmcia_cur_dev = link; 222 223 labpc_config(link); 224 225 return 0; 226} /* labpc_cs_attach */ 227 228/*====================================================================== 229 230 This deletes a driver "instance". The device is de-registered 231 with Card Services. If it has been released, all local data 232 structures are freed. Otherwise, the structures will be freed 233 when the device is released. 234 235======================================================================*/ 236 237static void labpc_cs_detach(struct pcmcia_device *link) 238{ 239 dev_dbg(&link->dev, "labpc_cs_detach\n"); 240 241 /* 242 If the device is currently configured and active, we won't 243 actually delete it yet. Instead, it is marked so that when 244 the release() function is called, that will trigger a proper 245 detach(). 246 */ 247 ((struct local_info_t *)link->priv)->stop = 1; 248 labpc_release(link); 249 250 /* This points to the parent local_info_t struct (may be null) */ 251 kfree(link->priv); 252 253} /* labpc_cs_detach */ 254 255/*====================================================================== 256 257 labpc_config() is scheduled to run after a CARD_INSERTION event 258 is received, to configure the PCMCIA socket, and to make the 259 device available to the system. 260 261======================================================================*/ 262 263static int labpc_pcmcia_config_loop(struct pcmcia_device *p_dev, 264 cistpl_cftable_entry_t *cfg, 265 cistpl_cftable_entry_t *dflt, 266 void *priv_data) 267{ 268 if (cfg->index == 0) 269 return -ENODEV; 270 271 /* IO window settings */ 272 p_dev->resource[0]->end = p_dev->resource[1]->end = 0; 273 if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { 274 cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; 275 p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; 276 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; 277 p_dev->resource[0]->flags |= 278 pcmcia_io_cfg_data_width(io->flags); 279 p_dev->resource[0]->start = io->win[0].base; 280 p_dev->resource[0]->end = io->win[0].len; 281 if (io->nwin > 1) { 282 p_dev->resource[1]->flags = p_dev->resource[0]->flags; 283 p_dev->resource[1]->start = io->win[1].base; 284 p_dev->resource[1]->end = io->win[1].len; 285 } 286 /* This reserves IO space but doesn't actually enable it */ 287 if (pcmcia_request_io(p_dev) != 0) 288 return -ENODEV; 289 } 290 291 /* If we got this far, we're cool! */ 292 return 0; 293} 294 295 296static void labpc_config(struct pcmcia_device *link) 297{ 298 int ret; 299 300 dev_dbg(&link->dev, "labpc_config\n"); 301 302 link->config_flags |= CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ | 303 CONF_AUTO_AUDIO; 304 305 ret = pcmcia_loop_config(link, labpc_pcmcia_config_loop, NULL); 306 if (ret) { 307 dev_warn(&link->dev, "no configuration found\n"); 308 goto failed; 309 } 310 311 if (!link->irq) 312 goto failed; 313 314 /* 315 This actually configures the PCMCIA socket -- setting up 316 the I/O windows and the interrupt mapping, and putting the 317 card and host interface into "Memory and IO" mode. 318 */ 319 p_dev->config_flags |= CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ; 320 ret = pcmcia_enable_device(link); 321 if (ret) 322 goto failed; 323 324 /* Finally, report what we've done */ 325 dev_info(&link->dev, "index 0x%02x", link->config_index); 326 printk(", irq %d", link->irq); 327 if (link->resource[0]) 328 printk(" & %pR", link->resource[0]); 329 if (link->resource[1]) 330 printk(" & %pR", link->resource[1]); 331 printk("\n"); 332 333 return; 334 335failed: 336 labpc_release(link); 337 338} /* labpc_config */ 339 340static void labpc_release(struct pcmcia_device *link) 341{ 342 dev_dbg(&link->dev, "labpc_release\n"); 343 344 pcmcia_disable_device(link); 345} /* labpc_release */ 346 347/*====================================================================== 348 349 The card status event handler. Mostly, this schedules other 350 stuff to run after an event is received. 351 352 When a CARD_REMOVAL event is received, we immediately set a 353 private flag to block future accesses to this device. All the 354 functions that actually access the device should check this flag 355 to make sure the card is still present. 356 357======================================================================*/ 358 359static int labpc_cs_suspend(struct pcmcia_device *link) 360{ 361 struct local_info_t *local = link->priv; 362 363 /* Mark the device as stopped, to block IO until later */ 364 local->stop = 1; 365 return 0; 366} /* labpc_cs_suspend */ 367 368static int labpc_cs_resume(struct pcmcia_device *link) 369{ 370 struct local_info_t *local = link->priv; 371 372 local->stop = 0; 373 return 0; 374} /* labpc_cs_resume */ 375 376/*====================================================================*/ 377 378static struct pcmcia_device_id labpc_cs_ids[] = { 379 /* N.B. These IDs should match those in labpc_cs_boards (ni_labpc.c) */ 380 PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0103), /* daqcard-1200 */ 381 PCMCIA_DEVICE_NULL 382}; 383 384MODULE_DEVICE_TABLE(pcmcia, labpc_cs_ids); 385MODULE_AUTHOR("Frank Mori Hess <fmhess@users.sourceforge.net>"); 386MODULE_DESCRIPTION("Comedi driver for National Instruments Lab-PC"); 387MODULE_LICENSE("GPL"); 388 389struct pcmcia_driver labpc_cs_driver = { 390 .probe = labpc_cs_attach, 391 .remove = labpc_cs_detach, 392 .suspend = labpc_cs_suspend, 393 .resume = labpc_cs_resume, 394 .id_table = labpc_cs_ids, 395 .owner = THIS_MODULE, 396 .drv = { 397 .name = "daqcard-1200", 398 }, 399}; 400 401static int __init init_labpc_cs(void) 402{ 403 pcmcia_register_driver(&labpc_cs_driver); 404 return 0; 405} 406 407static void __exit exit_labpc_cs(void) 408{ 409 pcmcia_unregister_driver(&labpc_cs_driver); 410} 411 412int __init labpc_init_module(void) 413{ 414 int ret; 415 416 ret = init_labpc_cs(); 417 if (ret < 0) 418 return ret; 419 420 return comedi_driver_register(&driver_labpc_cs); 421} 422 423void __exit labpc_exit_module(void) 424{ 425 exit_labpc_cs(); 426 comedi_driver_unregister(&driver_labpc_cs); 427} 428 429module_init(labpc_init_module); 430module_exit(labpc_exit_module); 431