addi_apci_3xxx.c revision 8d4729066cde58c730573d6aad2ea29f8048fcb3
15c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten/* 25c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * addi_apci_3xxx.c 35c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module. 45c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * Project manager: S. Weber 55c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * 65c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * ADDI-DATA GmbH 75c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * Dieselstrasse 3 85c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * D-77833 Ottersweier 95c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * Tel: +19(0)7223/9493-0 105c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * Fax: +49(0)7223/9493-92 115c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * http://www.addi-data.com 125c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * info@addi-data.com 135c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * 145c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * This program is free software; you can redistribute it and/or modify it 155c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * under the terms of the GNU General Public License as published by the 165c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * Free Software Foundation; either version 2 of the License, or (at your 175c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * option) any later version. 185c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * 195c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * This program is distributed in the hope that it will be useful, but WITHOUT 205c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 215c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 225c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten * more details. 235c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten */ 245c70cbfb3a8ebfaac5f3588840fcbf71c3cc02a1H Hartley Sweeten 2533782dd5edf8db3cdb7c81a3523bf743dd0209b7H Hartley Sweeten#include <linux/pci.h> 261867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten#include <linux/interrupt.h> 2733782dd5edf8db3cdb7c81a3523bf743dd0209b7H Hartley Sweeten 283d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten#include "../comedidev.h" 293d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten 30a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten#define CONV_UNIT_NS (1 << 0) 31a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten#define CONV_UNIT_US (1 << 1) 32a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten#define CONV_UNIT_MS (1 << 2) 33a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten 3498a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweetenstatic const struct comedi_lrange apci3xxx_ai_range = { 3598a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten 8, { 3698a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(10), 3798a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(5), 3898a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(2), 3998a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(1), 4098a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(10), 4198a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(5), 4298a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(2), 4398a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(1) 4498a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten } 4598a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten}; 4698a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten 4798a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweetenstatic const struct comedi_lrange apci3xxx_ao_range = { 4898a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten 2, { 4998a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(10), 5098a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(10) 5198a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten } 5298a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten}; 5398a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten 54dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenenum apci3xxx_boardid { 55dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3000_16, 56dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3000_8, 57dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3000_4, 58dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3006_16, 59dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3006_8, 60dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3006_4, 61dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3010_16, 62dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3010_8, 63dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3010_4, 64dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3016_16, 65dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3016_8, 66dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3016_4, 67dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3100_16_4, 68dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3100_8_4, 69dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3106_16_4, 70dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3106_8_4, 71dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3110_16_4, 72dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3110_8_4, 73dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3116_16_4, 74dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3116_8_4, 75dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3003, 76dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3002_16, 77dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3002_8, 78dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3002_4, 79dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3500, 80dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten}; 81dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 82e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweetenstruct apci3xxx_boardinfo { 836abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten const char *name; 848a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten int ai_subdev_flags; 8547bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten int ai_n_chan; 865469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten unsigned int ai_maxdata; 87a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten unsigned char ai_conv_units; 888edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten unsigned int ai_min_acq_ns; 89fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten unsigned int has_ao:1; 904aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten unsigned int has_dig_in:1; 914aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten unsigned int has_dig_out:1; 920ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten unsigned int has_ttl_io:1; 93e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten}; 94e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten 95e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweetenstatic const struct apci3xxx_boardinfo apci3xxx_boardtypes[] = { 96dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3000_16] = { 976abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3000-16", 988a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 9947bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 1005469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 101a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1028edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 1030ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 104dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 105dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3000_8] = { 1066abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3000-8", 1078a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 10847bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 1095469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 110a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1118edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 1120ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 113dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 114dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3000_4] = { 1156abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3000-4", 1168a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 11747bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 4, 1185469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 119a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1208edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 1210ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 122dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 123dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3006_16] = { 1246abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3006-16", 1258a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 12647bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 1275469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 128a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1298edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 1300ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 131dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 132dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3006_8] = { 1336abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3006-8", 1348a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 13547bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 1365469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 137a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1388edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 1390ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 140dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 141dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3006_4] = { 1426abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3006-4", 1438a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 14447bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 4, 1455469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 146a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1478edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 1480ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 149dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 150dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3010_16] = { 1516abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3010-16", 1528a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 15347bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 1545469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 155a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1568edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 1574aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1584aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1590ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 160dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 161dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3010_8] = { 1626abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3010-8", 1638a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 16447bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 1655469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 166a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1678edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 1684aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1694aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1700ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 171dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 172dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3010_4] = { 1736abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3010-4", 1748a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 17547bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 4, 1765469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 177a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1788edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 1794aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1804aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1810ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 182dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 183dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3016_16] = { 1846abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3016-16", 1858a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 18647bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 1875469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 188a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1898edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 1904aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1914aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1920ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 193dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 194dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3016_8] = { 1956abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3016-8", 1968a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 19747bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 1985469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 199a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2008edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 2014aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2024aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2030ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 204dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 205dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3016_4] = { 2066abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3016-4", 2078a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 20847bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 4, 2095469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 210a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2118edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 2124aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2134aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2140ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 215dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 216dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3100_16_4] = { 2176abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3100-16-4", 2188a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 21947bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 2205469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 221a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2228edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 223fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2240ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 225dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 226dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3100_8_4] = { 2276abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3100-8-4", 2288a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 22947bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 2305469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 231a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2328edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 233fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2340ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 235dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 236dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3106_16_4] = { 2376abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3106-16-4", 2388a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 23947bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 2405469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 241a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2428edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 243fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2440ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 245dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 246dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3106_8_4] = { 2476abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3106-8-4", 2488a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 24947bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 2505469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 251a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2528edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 253fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2540ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 255dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 256dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3110_16_4] = { 2576abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3110-16-4", 2588a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 25947bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 2605469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 261a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2628edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 263fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2644aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2654aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2660ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 267dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 268dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3110_8_4] = { 2696abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3110-8-4", 2708a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 27147bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 2725469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 273a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2748edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 275fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2764aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2774aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2780ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 279dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 280dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3116_16_4] = { 2816abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3116-16-4", 2828a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 28347bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 2845469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 285a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2868edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 287fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2884aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2894aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2900ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 291dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 292dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3116_8_4] = { 2936abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3116-8-4", 2948a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 29547bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 2965469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 297a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2988edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 299fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 3004aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3014aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 3020ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 303dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 304dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3003] = { 3056abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3003", 3068a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_DIFF, 3078d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten .ai_n_chan = 4, 3085469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 309a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US | 310a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten CONV_UNIT_NS, 3118edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 2500, 3124aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3134aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 314dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 315dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3002_16] = { 3166abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3002-16", 3178a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_DIFF, 3188d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten .ai_n_chan = 16, 3195469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 320a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 3218edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 3224aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3234aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 324dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 325dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3002_8] = { 3266abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3002-8", 3278a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_DIFF, 3288d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten .ai_n_chan = 8, 3295469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 330a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 3318edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 3324aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3334aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 334dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 335dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3002_4] = { 3366abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3002-4", 3378a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_DIFF, 3388d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten .ai_n_chan = 4, 3395469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 340a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 3418edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 3424aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3434aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 344dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 345dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3500] = { 3466abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3500", 347fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 3480ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 349c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten }, 350c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten}; 351c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten 3521867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweetenstruct apci3xxx_private { 353f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten void __iomem *mmio; 3541867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned int ui_AiNbrofChannels; /* how many channels is measured */ 3551867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned int ui_AiReadData[32]; 3561867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned char b_EocEosInterrupt; 3571867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned int ui_EocEosConversionTime; 3581867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned char b_EocEosConversionTimeBase; 3591867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned char b_SingelDiff; 3601867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten}; 3611867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten 362e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten#include "addi-data/hwdrv_apci3xxx.c" 363e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten 3646c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweetenstatic irqreturn_t apci3xxx_irq_handler(int irq, void *d) 3656c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten{ 3666c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten struct comedi_device *dev = d; 3671867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 3686c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten unsigned int status; 3696c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten int i; 3706c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 3716c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Test if interrupt occur */ 372f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten status = readl(devpriv->mmio + 16); 3736c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten if ((status & 0x2) == 0x2) { 3746c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Reset the interrupt */ 375f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(status, devpriv->mmio + 16); 3766c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 3776c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Test if interrupt enabled */ 3786c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten if (devpriv->b_EocEosInterrupt == 1) { 3796c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Read all analog inputs value */ 3806c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten for (i = 0; i < devpriv->ui_AiNbrofChannels; i++) { 3816c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten unsigned int val; 3826c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 383f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten val = readl(devpriv->mmio + 28); 3846c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten devpriv->ui_AiReadData[i] = val; 3856c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten } 3866c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 3876c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Set the interrupt flag */ 3886c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten devpriv->b_EocEosInterrupt = 2; 3896c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 390283ce669268da5a51eaf62efe92d5dd4625817a2H Hartley Sweeten /* FIXME: comedi_event() */ 3916c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten } 3926c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten } 3936c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten return IRQ_RETVAL(1); 3946c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten} 3956c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 3960e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweetenstatic int apci3xxx_ao_insn_write(struct comedi_device *dev, 3970e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten struct comedi_subdevice *s, 3980e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten struct comedi_insn *insn, 3990e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int *data) 4000e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten{ 4010e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 4020e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int chan = CR_CHAN(insn->chanspec); 4030e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int range = CR_RANGE(insn->chanspec); 4040e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int status; 4050e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten int i; 4060e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 4070e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten for (i = 0; i < insn->n; i++) { 4080e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Set the range selection */ 409f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(range, devpriv->mmio + 96); 4100e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 4110e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Write the analog value to the selected channel */ 412f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel((data[i] << 8) | chan, devpriv->mmio + 100); 4130e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 4140e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Wait the end of transfer */ 4150e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten do { 416f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten status = readl(devpriv->mmio + 96); 4170e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten } while ((status & 0x100) != 0x100); 4180e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten } 4190e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 4200e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten return insn->n; 4210e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten} 4220e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 423ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweetenstatic int apci3xxx_di_insn_bits(struct comedi_device *dev, 424ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten struct comedi_subdevice *s, 425ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten struct comedi_insn *insn, 426ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten unsigned int *data) 427ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten{ 428dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten data[1] = inl(dev->iobase + 32) & 0xf; 429ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten 430ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten return insn->n; 431ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten} 432ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten 433c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweetenstatic int apci3xxx_do_insn_bits(struct comedi_device *dev, 434c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten struct comedi_subdevice *s, 435c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten struct comedi_insn *insn, 436c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten unsigned int *data) 437c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten{ 438c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten unsigned int mask = data[0]; 439c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten unsigned int bits = data[1]; 440c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 441dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten s->state = inl(dev->iobase + 48) & 0xf; 442c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten if (mask) { 443c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten s->state &= ~mask; 444c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten s->state |= (bits & mask); 445c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 446dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl(s->state, dev->iobase + 48); 447c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten } 448c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 449c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten data[1] = s->state; 450c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 451c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten return insn->n; 452c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten} 453c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 454da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweetenstatic int apci3xxx_dio_insn_config(struct comedi_device *dev, 455da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_subdevice *s, 456da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_insn *insn, 457da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int *data) 458da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten{ 459da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int chan = CR_CHAN(insn->chanspec); 460da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int mask = 1 << chan; 461da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int bits; 462da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 463da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten /* 464da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 0 (channels 0-7) are always inputs 465da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 1 (channels 8-15) are always outputs 466da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 2 (channels 16-23) are programmable i/o 467da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * 468da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Changing any channel in port 2 changes the entire port. 469da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten */ 470da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask & 0xff0000) 471da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten bits = 0xff0000; 472da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten else 473da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten bits = 0; 474da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 475da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten switch (data[0]) { 476da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten case INSN_CONFIG_DIO_INPUT: 477da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->io_bits &= ~bits; 478da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten break; 479da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten case INSN_CONFIG_DIO_OUTPUT: 480da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->io_bits |= bits; 481da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten break; 482da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten case INSN_CONFIG_DIO_QUERY: 483da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten data[1] = (s->io_bits & bits) ? COMEDI_OUTPUT : COMEDI_INPUT; 484da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return insn->n; 485da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten default: 486da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return -EINVAL; 487da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten } 488da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 489da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten /* update port 2 configuration */ 490da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (bits) 491dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl((s->io_bits >> 24) & 0xff, dev->iobase + 224); 492da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 493da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return insn->n; 494da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten} 495da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 496da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweetenstatic int apci3xxx_dio_insn_bits(struct comedi_device *dev, 497da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_subdevice *s, 498da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_insn *insn, 499da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int *data) 500da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten{ 501da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int mask = data[0]; 502da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int bits = data[1]; 503da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int val; 504da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 505da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten /* only update output channels */ 506da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten mask &= s->io_bits; 507da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask) { 508da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->state &= ~mask; 509da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->state |= (bits & mask); 510da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 511da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask & 0xff) 512dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl(s->state & 0xff, dev->iobase + 80); 513da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask & 0xff0000) 514dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl((s->state >> 16) & 0xff, dev->iobase + 112); 515da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten } 516da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 517dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val = inl(dev->iobase + 80); 518dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 64) << 8); 519da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (s->io_bits & 0xff0000) 520dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 112) << 16); 521da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten else 522dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 96) << 16); 523da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 524da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten data[1] = val; 525da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 526da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return insn->n; 527da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten} 528da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 5295e72c7a50709e60663217704b30501bf34afa448H Hartley Sweetenstatic int apci3xxx_reset(struct comedi_device *dev) 53098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{ 5311867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 5325e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten unsigned int val; 5335e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten int i; 5345e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5355e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Disable the interrupt */ 5365e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten disable_irq(dev->irq); 5375e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5385e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Reset the interrupt flag */ 5395e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten devpriv->b_EocEosInterrupt = 0; 5405e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5415e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Clear the start command */ 542f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(0, devpriv->mmio + 8); 5435e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5445e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Reset the interrupt flags */ 545f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten val = readl(devpriv->mmio + 16); 546f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(val, devpriv->mmio + 16); 5475e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5485e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* clear the EOS */ 549f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten readl(devpriv->mmio + 20); 5505e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5515e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Clear the FIFO */ 5525e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten for (i = 0; i < 16; i++) 553f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten val = readl(devpriv->mmio + 28); 5545e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5555e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Enable the interrupt */ 5565e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten enable_irq(dev->irq); 55798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 55898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return 0; 55998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten} 56098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 561dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenstatic int apci3xxx_auto_attach(struct comedi_device *dev, 562dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten unsigned long context) 563dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten{ 56498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten struct pci_dev *pcidev = comedi_to_pci_dev(dev); 565e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten const struct apci3xxx_boardinfo *board = NULL; 5661867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv; 56798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten struct comedi_subdevice *s; 56898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten int ret, n_subdevices; 569dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 570dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten if (context < ARRAY_SIZE(apci3xxx_boardtypes)) 571dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten board = &apci3xxx_boardtypes[context]; 572dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten if (!board) 573dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten return -ENODEV; 574dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten dev->board_ptr = board; 5756abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten dev->board_name = board->name; 57698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 57798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL); 57898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (!devpriv) 57998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return -ENOMEM; 58098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten dev->private = devpriv; 58198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 58298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten ret = comedi_pci_enable(dev); 58398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret) 58498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return ret; 58598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 5862107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten dev->iobase = pci_resource_start(pcidev, 2); 587f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten devpriv->mmio = pci_ioremap_bar(pcidev, 3); 58898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 58998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (pcidev->irq > 0) { 5906c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten ret = request_irq(pcidev->irq, apci3xxx_irq_handler, 5916c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten IRQF_SHARED, dev->board_name, dev); 59298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret == 0) 59398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten dev->irq = pcidev->irq; 59498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 59598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 59698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten n_subdevices = 7; 59798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten ret = comedi_alloc_subdevices(dev, n_subdevices); 59898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret) 59998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return ret; 60098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 60198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten /* Allocate and Initialise AI Subdevice Structures */ 60298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[0]; 6038d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten if (board->ai_n_chan) { 60498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten dev->read_subdev = s; 60598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->type = COMEDI_SUBD_AI; 6068a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten s->subdev_flags = SDF_READABLE | board->ai_subdev_flags; 6078d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten s->n_chan = board->ai_n_chan; 6085469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten s->maxdata = board->ai_maxdata; 60979518d9f9c2025449e66a9f00f18d6962f859627H Hartley Sweeten s->len_chanlist = s->n_chan; 61098a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten s->range_table = &apci3xxx_ai_range; 61146572bad94f97cbd16097a7b807f418c474d4ebeH Hartley Sweeten s->insn_config = apci3xxx_ai_insn_config; 612088e2e053d285553cb988ca50177d266d5494243H Hartley Sweeten s->insn_read = apci3xxx_ai_insn_read; 61398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 6148d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten if ((board->ai_subdev_flags & (SDF_COMMON | SDF_GROUND)) == 0) 6158d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten devpriv->b_SingelDiff = 1; 6168d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten 61798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 61898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 61998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 62098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 6210e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Analog Output subdevice */ 62298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[1]; 623fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten if (board->has_ao) { 6240e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->type = COMEDI_SUBD_AO; 6250e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; 6260e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->n_chan = 4; 6270e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->maxdata = 0x0fff; 6280e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->range_table = &apci3xxx_ao_range; 6290e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->insn_write = apci3xxx_ao_insn_write; 63098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 6310e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 63298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 633ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten 634ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten /* Digital Input subdevice */ 63598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[2]; 6364aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten if (board->has_dig_in) { 637ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_DI; 638ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->subdev_flags = SDF_READABLE; 639ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->n_chan = 4; 640ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->maxdata = 1; 641ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->range_table = &range_digital; 642ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->insn_bits = apci3xxx_di_insn_bits; 64398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 644ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 64598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 646ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten 647ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten /* Digital Output subdevice */ 64898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[3]; 6494aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten if (board->has_dig_out) { 650ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_DO; 651ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->subdev_flags = SDF_WRITEABLE; 652ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->n_chan = 4; 653ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->maxdata = 1; 654ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->range_table = &range_digital; 655ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->insn_bits = apci3xxx_do_insn_bits; 65698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 657ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 65898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 65998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 66098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten /* Allocate and Initialise Timer Subdevice Structures */ 66198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[4]; 662178bd8d3a61432ce24399604b13cc756293d1ac8H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 66398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 664383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten /* TTL Digital I/O subdevice */ 66598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[5]; 6660ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten if (board->has_ttl_io) { 667383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->type = COMEDI_SUBD_DIO; 668383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->subdev_flags = SDF_READABLE | SDF_WRITEABLE; 669383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->n_chan = 24; 670383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->maxdata = 1; 671383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->io_bits = 0xff; /* channels 0-7 are always outputs */ 672383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->range_table = &range_digital; 673da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->insn_config = apci3xxx_dio_insn_config; 674da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->insn_bits = apci3xxx_dio_insn_bits; 67598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 67698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 67798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 67898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 67998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten /* EEPROM */ 68098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[6]; 68193c0dc284dff2e2fec320662d8ef01b933096e36H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 68298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 6835e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten apci3xxx_reset(dev); 68498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return 0; 68598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten} 68698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 68798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweetenstatic void apci3xxx_detach(struct comedi_device *dev) 68898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{ 6891867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 690dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 69198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (devpriv) { 69298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (dev->iobase) 6935e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten apci3xxx_reset(dev); 69498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (dev->irq) 69598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten free_irq(dev->irq, dev); 696f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten if (devpriv->mmio) 697f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten iounmap(devpriv->mmio); 69898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 69998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten comedi_pci_disable(dev); 700dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten} 701dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 70220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct comedi_driver apci3xxx_driver = { 70320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .driver_name = "addi_apci_3xxx", 70420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .module = THIS_MODULE, 705dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten .auto_attach = apci3xxx_auto_attach, 70698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten .detach = apci3xxx_detach, 70720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}; 70820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten 709a690b7e535f2f97a3a05ee570715abeb60a8910fBill Pembertonstatic int apci3xxx_pci_probe(struct pci_dev *dev, 710b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten const struct pci_device_id *id) 71120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten{ 712b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten return comedi_pci_auto_config(dev, &apci3xxx_driver, id->driver_data); 71320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten} 71420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten 71520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic DEFINE_PCI_DEVICE_TABLE(apci3xxx_pci_table) = { 716dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3010), BOARD_APCI3000_16 }, 717dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300f), BOARD_APCI3000_8 }, 718dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300e), BOARD_APCI3000_4 }, 719dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3013), BOARD_APCI3006_16 }, 720dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3014), BOARD_APCI3006_8 }, 721dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3015), BOARD_APCI3006_4 }, 722dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3016), BOARD_APCI3010_16 }, 723dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3017), BOARD_APCI3010_8 }, 724dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3018), BOARD_APCI3010_4 }, 725dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3019), BOARD_APCI3016_16 }, 726dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301a), BOARD_APCI3016_8 }, 727dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301b), BOARD_APCI3016_4 }, 728dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301c), BOARD_APCI3100_16_4 }, 729dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301d), BOARD_APCI3100_8_4 }, 730dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301e), BOARD_APCI3106_16_4 }, 731dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301f), BOARD_APCI3106_8_4 }, 732dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3020), BOARD_APCI3110_16_4 }, 733dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3021), BOARD_APCI3110_8_4 }, 734dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3022), BOARD_APCI3116_16_4 }, 735dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3023), BOARD_APCI3116_8_4 }, 736dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300B), BOARD_APCI3003 }, 737dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3002), BOARD_APCI3002_16 }, 738dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3003), BOARD_APCI3002_8 }, 739dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3004), BOARD_APCI3002_4 }, 740dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3024), BOARD_APCI3500 }, 741317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten { 0 } 742317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten}; 74320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley SweetenMODULE_DEVICE_TABLE(pci, apci3xxx_pci_table); 744317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten 74520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct pci_driver apci3xxx_pci_driver = { 74620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .name = "addi_apci_3xxx", 74720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .id_table = apci3xxx_pci_table, 74820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .probe = apci3xxx_pci_probe, 7499901a4d75d007686e8f6473189cafc4b216b7449Peter Huewe .remove = comedi_pci_auto_unconfig, 75020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}; 75120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenmodule_comedi_pci_driver(apci3xxx_driver, apci3xxx_pci_driver); 75290f703d30dd3e0c16ff80f35e34e511385a05ad5Arun Thomas 75390f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_AUTHOR("Comedi http://www.comedi.org"); 75490f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_DESCRIPTION("Comedi low-level driver"); 75590f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_LICENSE("GPL"); 756