1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * das08_isa.c 4 * comedi driver for DAS08 ISA/PC-104 boards 5 * 6 * COMEDI - Linux Control and Measurement Device Interface 7 * Copyright (C) 2000 David A. Schleef <ds@schleef.org> 8 * Copyright (C) 2001,2002,2003 Frank Mori Hess <fmhess@users.sourceforge.net> 9 * Copyright (C) 2004 Salvador E. Tropea <set@users.sf.net> <set@ieee.org> 10 */ 11 12 /* 13 * Driver: das08_isa 14 * Description: DAS-08 ISA/PC-104 compatible boards 15 * Devices: [Keithley Metrabyte] DAS08 (isa-das08), 16 * [ComputerBoards] DAS08 (isa-das08), DAS08-PGM (das08-pgm), 17 * DAS08-PGH (das08-pgh), DAS08-PGL (das08-pgl), DAS08-AOH (das08-aoh), 18 * DAS08-AOL (das08-aol), DAS08-AOM (das08-aom), DAS08/JR-AO (das08/jr-ao), 19 * DAS08/JR-16-AO (das08jr-16-ao), PC104-DAS08 (pc104-das08), 20 * DAS08/JR/16 (das08jr/16) 21 * Author: Warren Jasper, ds, Frank Hess 22 * Updated: Fri, 31 Aug 2012 19:19:06 +0100 23 * Status: works 24 * 25 * This is the ISA/PC-104-specific support split off from the das08 driver. 26 * 27 * Configuration Options: 28 * [0] - base io address 29 */ 30 31 #include <linux/module.h> 32 #include <linux/comedi/comedidev.h> 33 34 #include "das08.h" 35 36 static const struct das08_board_struct das08_isa_boards[] = { 37 { 38 /* cio-das08.pdf */ 39 .name = "isa-das08", 40 .ai_nbits = 12, 41 .ai_pg = das08_pg_none, 42 .ai_encoding = das08_encode12, 43 .di_nchan = 3, 44 .do_nchan = 4, 45 .i8255_offset = 8, 46 .i8254_offset = 4, 47 .iosize = 16, /* unchecked */ 48 }, { 49 /* cio-das08pgx.pdf */ 50 .name = "das08-pgm", 51 .ai_nbits = 12, 52 .ai_pg = das08_pgm, 53 .ai_encoding = das08_encode12, 54 .di_nchan = 3, 55 .do_nchan = 4, 56 .i8255_offset = 0, 57 .i8254_offset = 0x04, 58 .iosize = 16, /* unchecked */ 59 }, { 60 /* cio-das08pgx.pdf */ 61 .name = "das08-pgh", 62 .ai_nbits = 12, 63 .ai_pg = das08_pgh, 64 .ai_encoding = das08_encode12, 65 .di_nchan = 3, 66 .do_nchan = 4, 67 .i8254_offset = 0x04, 68 .iosize = 16, /* unchecked */ 69 }, { 70 /* cio-das08pgx.pdf */ 71 .name = "das08-pgl", 72 .ai_nbits = 12, 73 .ai_pg = das08_pgl, 74 .ai_encoding = das08_encode12, 75 .di_nchan = 3, 76 .do_nchan = 4, 77 .i8254_offset = 0x04, 78 .iosize = 16, /* unchecked */ 79 }, { 80 /* cio-das08_aox.pdf */ 81 .name = "das08-aoh", 82 .ai_nbits = 12, 83 .ai_pg = das08_pgh, 84 .ai_encoding = das08_encode12, 85 .ao_nbits = 12, 86 .di_nchan = 3, 87 .do_nchan = 4, 88 .i8255_offset = 0x0c, 89 .i8254_offset = 0x04, 90 .iosize = 16, /* unchecked */ 91 }, { 92 /* cio-das08_aox.pdf */ 93 .name = "das08-aol", 94 .ai_nbits = 12, 95 .ai_pg = das08_pgl, 96 .ai_encoding = das08_encode12, 97 .ao_nbits = 12, 98 .di_nchan = 3, 99 .do_nchan = 4, 100 .i8255_offset = 0x0c, 101 .i8254_offset = 0x04, 102 .iosize = 16, /* unchecked */ 103 }, { 104 /* cio-das08_aox.pdf */ 105 .name = "das08-aom", 106 .ai_nbits = 12, 107 .ai_pg = das08_pgm, 108 .ai_encoding = das08_encode12, 109 .ao_nbits = 12, 110 .di_nchan = 3, 111 .do_nchan = 4, 112 .i8255_offset = 0x0c, 113 .i8254_offset = 0x04, 114 .iosize = 16, /* unchecked */ 115 }, { 116 /* cio-das08-jr-ao.pdf */ 117 .name = "das08/jr-ao", 118 .is_jr = true, 119 .ai_nbits = 12, 120 .ai_pg = das08_pg_none, 121 .ai_encoding = das08_encode12, 122 .ao_nbits = 12, 123 .di_nchan = 8, 124 .do_nchan = 8, 125 .iosize = 16, /* unchecked */ 126 }, { 127 /* cio-das08jr-16-ao.pdf */ 128 .name = "das08jr-16-ao", 129 .is_jr = true, 130 .ai_nbits = 16, 131 .ai_pg = das08_pg_none, 132 .ai_encoding = das08_encode16, 133 .ao_nbits = 16, 134 .di_nchan = 8, 135 .do_nchan = 8, 136 .i8254_offset = 0x04, 137 .iosize = 16, /* unchecked */ 138 }, { 139 .name = "pc104-das08", 140 .ai_nbits = 12, 141 .ai_pg = das08_pg_none, 142 .ai_encoding = das08_encode12, 143 .di_nchan = 3, 144 .do_nchan = 4, 145 .i8254_offset = 4, 146 .iosize = 16, /* unchecked */ 147 }, { 148 .name = "das08jr/16", 149 .is_jr = true, 150 .ai_nbits = 16, 151 .ai_pg = das08_pg_none, 152 .ai_encoding = das08_encode16, 153 .di_nchan = 8, 154 .do_nchan = 8, 155 .iosize = 16, /* unchecked */ 156 }, 157 }; 158 159 static int das08_isa_attach(struct comedi_device *dev, 160 struct comedi_devconfig *it) 161 { 162 const struct das08_board_struct *board = dev->board_ptr; 163 struct das08_private_struct *devpriv; 164 int ret; 165 166 devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv)); 167 if (!devpriv) 168 return -ENOMEM; 169 170 ret = comedi_request_region(dev, it->options[0], board->iosize); 171 if (ret) 172 return ret; 173 174 return das08_common_attach(dev, dev->iobase); 175 } 176 177 static struct comedi_driver das08_isa_driver = { 178 .driver_name = "isa-das08", 179 .module = THIS_MODULE, 180 .attach = das08_isa_attach, 181 .detach = comedi_legacy_detach, 182 .board_name = &das08_isa_boards[0].name, 183 .num_names = ARRAY_SIZE(das08_isa_boards), 184 .offset = sizeof(das08_isa_boards[0]), 185 }; 186 module_comedi_driver(das08_isa_driver); 187 188 MODULE_AUTHOR("Comedi https://www.comedi.org"); 189 MODULE_DESCRIPTION("Comedi low-level driver"); 190 MODULE_LICENSE("GPL"); 191