addi_apci_3xxx.c revision 47bd1ad800470f4786f7d35379798a7a10aff84c
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; 86e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten int i_NbrAiChannelDiff; 875469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten unsigned int ai_maxdata; 88a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten unsigned char ai_conv_units; 898edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten unsigned int ai_min_acq_ns; 90fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten unsigned int has_ao:1; 914aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten unsigned int has_dig_in:1; 924aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten unsigned int has_dig_out:1; 930ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten unsigned int has_ttl_io:1; 94e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten}; 95e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten 96e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweetenstatic const struct apci3xxx_boardinfo apci3xxx_boardtypes[] = { 97dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3000_16] = { 986abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3000-16", 998a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 10047bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 101c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 1025469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 103a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1048edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 1050ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 106dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 107dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3000_8] = { 1086abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3000-8", 1098a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 11047bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 111c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 1125469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 113a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1148edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 1150ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 116dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 117dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3000_4] = { 1186abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3000-4", 1198a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 12047bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 4, 121c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 2, 1225469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 123a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1248edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 1250ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 126dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 127dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3006_16] = { 1286abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3006-16", 1298a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 13047bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 131c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 1325469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 133a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1348edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 1350ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 136dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 137dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3006_8] = { 1386abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3006-8", 1398a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 14047bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 141c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 1425469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 143a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1448edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 1450ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 146dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 147dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3006_4] = { 1486abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3006-4", 1498a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 15047bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 4, 151c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 2, 1525469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 153a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1548edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 1550ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 156dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 157dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3010_16] = { 1586abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3010-16", 1598a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 16047bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 161c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 1625469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 163a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1648edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 1654aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1664aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1670ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 168dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 169dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3010_8] = { 1706abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3010-8", 1718a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 17247bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 173c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 1745469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 175a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1768edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 1774aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1784aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1790ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 180dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 181dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3010_4] = { 1826abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3010-4", 1838a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 18447bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 4, 185c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 2, 1865469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 187a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1888edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 1894aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1904aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1910ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 192dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 193dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3016_16] = { 1946abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3016-16", 1958a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 19647bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 197c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 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_8] = { 2066abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3016-8", 2078a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 20847bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 209c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 2105469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 211a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2128edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 2134aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2144aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2150ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 216dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 217dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3016_4] = { 2186abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3016-4", 2198a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 22047bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 4, 221c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 2, 2225469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 223a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2248edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 2254aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2264aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2270ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 228dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 229dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3100_16_4] = { 2306abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3100-16-4", 2318a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 23247bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 233c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 2345469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 235a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2368edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 237fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2380ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 239dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 240dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3100_8_4] = { 2416abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3100-8-4", 2428a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 24347bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 244c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 2455469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 246a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2478edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 248fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2490ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 250dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 251dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3106_16_4] = { 2526abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3106-16-4", 2538a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 25447bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 255c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 2565469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 257a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2588edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 259fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2600ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 261dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 262dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3106_8_4] = { 2636abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3106-8-4", 2648a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 26547bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 266c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 2675469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 268a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2698edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 270fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2710ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 272dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 273dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3110_16_4] = { 2746abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3110-16-4", 2758a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 27647bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 277c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 2785469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 279a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2808edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 281fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2824aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2834aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2840ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 285dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 286dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3110_8_4] = { 2876abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3110-8-4", 2888a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 28947bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 290c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 2915469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 292a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2938edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 294fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2954aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2964aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2970ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 298dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 299dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3116_16_4] = { 3006abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3116-16-4", 3018a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 30247bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 303c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 3045469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 305a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 3068edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 307fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 3084aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3094aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 3100ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 311dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 312dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3116_8_4] = { 3136abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3116-8-4", 3148a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 31547bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 316c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 3175469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 318a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 3198edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 320fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 3214aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3224aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 3230ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 324dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 325dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3003] = { 3266abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3003", 3278a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_DIFF, 328c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 3295469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 330a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US | 331a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten CONV_UNIT_NS, 3328edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 2500, 3334aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3344aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 335dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 336dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3002_16] = { 3376abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3002-16", 3388a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_DIFF, 339c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 16, 3405469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 341a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 3428edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 3434aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3444aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 345dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 346dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3002_8] = { 3476abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3002-8", 3488a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_DIFF, 349c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 3505469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 351a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 3528edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 3534aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3544aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 355dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 356dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3002_4] = { 3576abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3002-4", 3588a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_DIFF, 359c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 3605469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 361a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 3628edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 3634aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3644aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 365dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 366dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3500] = { 3676abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3500", 368fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 3690ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 370c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten }, 371c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten}; 372c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten 3731867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweetenstruct apci3xxx_private { 374f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten void __iomem *mmio; 3751867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned int ui_AiNbrofChannels; /* how many channels is measured */ 3761867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned int ui_AiReadData[32]; 3771867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned char b_EocEosInterrupt; 3781867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned int ui_EocEosConversionTime; 3791867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned char b_EocEosConversionTimeBase; 3801867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned char b_SingelDiff; 3811867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten}; 3821867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten 383e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten#include "addi-data/hwdrv_apci3xxx.c" 384e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten 3856c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweetenstatic irqreturn_t apci3xxx_irq_handler(int irq, void *d) 3866c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten{ 3876c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten struct comedi_device *dev = d; 3881867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 3896c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten unsigned int status; 3906c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten int i; 3916c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 3926c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Test if interrupt occur */ 393f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten status = readl(devpriv->mmio + 16); 3946c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten if ((status & 0x2) == 0x2) { 3956c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Reset the interrupt */ 396f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(status, devpriv->mmio + 16); 3976c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 3986c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Test if interrupt enabled */ 3996c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten if (devpriv->b_EocEosInterrupt == 1) { 4006c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Read all analog inputs value */ 4016c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten for (i = 0; i < devpriv->ui_AiNbrofChannels; i++) { 4026c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten unsigned int val; 4036c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 404f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten val = readl(devpriv->mmio + 28); 4056c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten devpriv->ui_AiReadData[i] = val; 4066c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten } 4076c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 4086c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Set the interrupt flag */ 4096c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten devpriv->b_EocEosInterrupt = 2; 4106c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 411283ce669268da5a51eaf62efe92d5dd4625817a2H Hartley Sweeten /* FIXME: comedi_event() */ 4126c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten } 4136c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten } 4146c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten return IRQ_RETVAL(1); 4156c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten} 4166c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 4170e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweetenstatic int apci3xxx_ao_insn_write(struct comedi_device *dev, 4180e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten struct comedi_subdevice *s, 4190e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten struct comedi_insn *insn, 4200e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int *data) 4210e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten{ 4220e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 4230e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int chan = CR_CHAN(insn->chanspec); 4240e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int range = CR_RANGE(insn->chanspec); 4250e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int status; 4260e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten int i; 4270e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 4280e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten for (i = 0; i < insn->n; i++) { 4290e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Set the range selection */ 430f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(range, devpriv->mmio + 96); 4310e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 4320e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Write the analog value to the selected channel */ 433f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel((data[i] << 8) | chan, devpriv->mmio + 100); 4340e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 4350e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Wait the end of transfer */ 4360e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten do { 437f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten status = readl(devpriv->mmio + 96); 4380e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten } while ((status & 0x100) != 0x100); 4390e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten } 4400e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 4410e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten return insn->n; 4420e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten} 4430e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 444ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweetenstatic int apci3xxx_di_insn_bits(struct comedi_device *dev, 445ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten struct comedi_subdevice *s, 446ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten struct comedi_insn *insn, 447ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten unsigned int *data) 448ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten{ 449dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten data[1] = inl(dev->iobase + 32) & 0xf; 450ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten 451ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten return insn->n; 452ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten} 453ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten 454c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweetenstatic int apci3xxx_do_insn_bits(struct comedi_device *dev, 455c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten struct comedi_subdevice *s, 456c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten struct comedi_insn *insn, 457c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten unsigned int *data) 458c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten{ 459c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten unsigned int mask = data[0]; 460c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten unsigned int bits = data[1]; 461c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 462dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten s->state = inl(dev->iobase + 48) & 0xf; 463c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten if (mask) { 464c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten s->state &= ~mask; 465c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten s->state |= (bits & mask); 466c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 467dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl(s->state, dev->iobase + 48); 468c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten } 469c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 470c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten data[1] = s->state; 471c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 472c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten return insn->n; 473c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten} 474c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 475da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweetenstatic int apci3xxx_dio_insn_config(struct comedi_device *dev, 476da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_subdevice *s, 477da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_insn *insn, 478da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int *data) 479da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten{ 480da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int chan = CR_CHAN(insn->chanspec); 481da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int mask = 1 << chan; 482da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int bits; 483da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 484da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten /* 485da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 0 (channels 0-7) are always inputs 486da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 1 (channels 8-15) are always outputs 487da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 2 (channels 16-23) are programmable i/o 488da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * 489da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Changing any channel in port 2 changes the entire port. 490da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten */ 491da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask & 0xff0000) 492da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten bits = 0xff0000; 493da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten else 494da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten bits = 0; 495da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 496da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten switch (data[0]) { 497da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten case INSN_CONFIG_DIO_INPUT: 498da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->io_bits &= ~bits; 499da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten break; 500da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten case INSN_CONFIG_DIO_OUTPUT: 501da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->io_bits |= bits; 502da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten break; 503da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten case INSN_CONFIG_DIO_QUERY: 504da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten data[1] = (s->io_bits & bits) ? COMEDI_OUTPUT : COMEDI_INPUT; 505da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return insn->n; 506da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten default: 507da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return -EINVAL; 508da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten } 509da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 510da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten /* update port 2 configuration */ 511da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (bits) 512dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl((s->io_bits >> 24) & 0xff, dev->iobase + 224); 513da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 514da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return insn->n; 515da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten} 516da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 517da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweetenstatic int apci3xxx_dio_insn_bits(struct comedi_device *dev, 518da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_subdevice *s, 519da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_insn *insn, 520da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int *data) 521da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten{ 522da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int mask = data[0]; 523da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int bits = data[1]; 524da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int val; 525da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 526da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten /* only update output channels */ 527da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten mask &= s->io_bits; 528da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask) { 529da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->state &= ~mask; 530da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->state |= (bits & mask); 531da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 532da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask & 0xff) 533dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl(s->state & 0xff, dev->iobase + 80); 534da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask & 0xff0000) 535dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl((s->state >> 16) & 0xff, dev->iobase + 112); 536da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten } 537da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 538dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val = inl(dev->iobase + 80); 539dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 64) << 8); 540da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (s->io_bits & 0xff0000) 541dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 112) << 16); 542da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten else 543dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 96) << 16); 544da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 545da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten data[1] = val; 546da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 547da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return insn->n; 548da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten} 549da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 5505e72c7a50709e60663217704b30501bf34afa448H Hartley Sweetenstatic int apci3xxx_reset(struct comedi_device *dev) 55198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{ 5521867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 5535e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten unsigned int val; 5545e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten int i; 5555e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5565e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Disable the interrupt */ 5575e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten disable_irq(dev->irq); 5585e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5595e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Reset the interrupt flag */ 5605e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten devpriv->b_EocEosInterrupt = 0; 5615e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5625e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Clear the start command */ 563f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(0, devpriv->mmio + 8); 5645e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5655e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Reset the interrupt flags */ 566f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten val = readl(devpriv->mmio + 16); 567f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(val, devpriv->mmio + 16); 5685e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5695e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* clear the EOS */ 570f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten readl(devpriv->mmio + 20); 5715e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5725e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Clear the FIFO */ 5735e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten for (i = 0; i < 16; i++) 574f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten val = readl(devpriv->mmio + 28); 5755e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5765e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Enable the interrupt */ 5775e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten enable_irq(dev->irq); 57898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 57998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return 0; 58098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten} 58198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 582dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenstatic int apci3xxx_auto_attach(struct comedi_device *dev, 583dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten unsigned long context) 584dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten{ 58598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten struct pci_dev *pcidev = comedi_to_pci_dev(dev); 586e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten const struct apci3xxx_boardinfo *board = NULL; 5871867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv; 58898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten struct comedi_subdevice *s; 58998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten int ret, n_subdevices; 590dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 591dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten if (context < ARRAY_SIZE(apci3xxx_boardtypes)) 592dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten board = &apci3xxx_boardtypes[context]; 593dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten if (!board) 594dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten return -ENODEV; 595dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten dev->board_ptr = board; 5966abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten dev->board_name = board->name; 59798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 59898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL); 59998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (!devpriv) 60098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return -ENOMEM; 60198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten dev->private = devpriv; 60298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 60398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten ret = comedi_pci_enable(dev); 60498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret) 60598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return ret; 60698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 6072107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten dev->iobase = pci_resource_start(pcidev, 2); 608f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten devpriv->mmio = pci_ioremap_bar(pcidev, 3); 60998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 61098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (pcidev->irq > 0) { 6116c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten ret = request_irq(pcidev->irq, apci3xxx_irq_handler, 6126c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten IRQF_SHARED, dev->board_name, dev); 61398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret == 0) 61498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten dev->irq = pcidev->irq; 61598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 61698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 61798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten n_subdevices = 7; 61898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten ret = comedi_alloc_subdevices(dev, n_subdevices); 61998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret) 62098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return ret; 62198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 62298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten /* Allocate and Initialise AI Subdevice Structures */ 62398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[0]; 62447bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten if (board->ai_n_chan || board->i_NbrAiChannelDiff) { 62598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten dev->read_subdev = s; 62698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->type = COMEDI_SUBD_AI; 6278a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten s->subdev_flags = SDF_READABLE | board->ai_subdev_flags; 62847bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten if (board->ai_n_chan) { 62947bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten s->n_chan = board->ai_n_chan; 63098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten devpriv->b_SingelDiff = 0; 63198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 63298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->n_chan = board->i_NbrAiChannelDiff; 63398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten devpriv->b_SingelDiff = 1; 63498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 6355469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten s->maxdata = board->ai_maxdata; 63679518d9f9c2025449e66a9f00f18d6962f859627H Hartley Sweeten s->len_chanlist = s->n_chan; 63798a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten s->range_table = &apci3xxx_ai_range; 63898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 63946572bad94f97cbd16097a7b807f418c474d4ebeH Hartley Sweeten s->insn_config = apci3xxx_ai_insn_config; 640088e2e053d285553cb988ca50177d266d5494243H Hartley Sweeten s->insn_read = apci3xxx_ai_insn_read; 64198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 64298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 64398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 64498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 64598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 6460e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Analog Output subdevice */ 64798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[1]; 648fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten if (board->has_ao) { 6490e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->type = COMEDI_SUBD_AO; 6500e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; 6510e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->n_chan = 4; 6520e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->maxdata = 0x0fff; 6530e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->range_table = &apci3xxx_ao_range; 6540e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->insn_write = apci3xxx_ao_insn_write; 65598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 6560e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 65798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 658ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten 659ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten /* Digital Input subdevice */ 66098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[2]; 6614aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten if (board->has_dig_in) { 662ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_DI; 663ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->subdev_flags = SDF_READABLE; 664ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->n_chan = 4; 665ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->maxdata = 1; 666ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->range_table = &range_digital; 667ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->insn_bits = apci3xxx_di_insn_bits; 66898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 669ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 67098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 671ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten 672ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten /* Digital Output subdevice */ 67398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[3]; 6744aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten if (board->has_dig_out) { 675ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_DO; 676ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->subdev_flags = SDF_WRITEABLE; 677ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->n_chan = 4; 678ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->maxdata = 1; 679ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->range_table = &range_digital; 680ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->insn_bits = apci3xxx_do_insn_bits; 68198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 682ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 68398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 68498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 68598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten /* Allocate and Initialise Timer Subdevice Structures */ 68698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[4]; 687178bd8d3a61432ce24399604b13cc756293d1ac8H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 68898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 689383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten /* TTL Digital I/O subdevice */ 69098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[5]; 6910ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten if (board->has_ttl_io) { 692383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->type = COMEDI_SUBD_DIO; 693383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->subdev_flags = SDF_READABLE | SDF_WRITEABLE; 694383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->n_chan = 24; 695383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->maxdata = 1; 696383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->io_bits = 0xff; /* channels 0-7 are always outputs */ 697383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->range_table = &range_digital; 698da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->insn_config = apci3xxx_dio_insn_config; 699da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->insn_bits = apci3xxx_dio_insn_bits; 70098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 70198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 70298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 70398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 70498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten /* EEPROM */ 70598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[6]; 70693c0dc284dff2e2fec320662d8ef01b933096e36H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 70798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 7085e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten apci3xxx_reset(dev); 70998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return 0; 71098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten} 71198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 71298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweetenstatic void apci3xxx_detach(struct comedi_device *dev) 71398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{ 7141867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 715dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 71698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (devpriv) { 71798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (dev->iobase) 7185e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten apci3xxx_reset(dev); 71998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (dev->irq) 72098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten free_irq(dev->irq, dev); 721f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten if (devpriv->mmio) 722f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten iounmap(devpriv->mmio); 72398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 72498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten comedi_pci_disable(dev); 725dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten} 726dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 72720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct comedi_driver apci3xxx_driver = { 72820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .driver_name = "addi_apci_3xxx", 72920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .module = THIS_MODULE, 730dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten .auto_attach = apci3xxx_auto_attach, 73198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten .detach = apci3xxx_detach, 73220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}; 73320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten 734a690b7e535f2f97a3a05ee570715abeb60a8910fBill Pembertonstatic int apci3xxx_pci_probe(struct pci_dev *dev, 735b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten const struct pci_device_id *id) 73620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten{ 737b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten return comedi_pci_auto_config(dev, &apci3xxx_driver, id->driver_data); 73820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten} 73920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten 74020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic DEFINE_PCI_DEVICE_TABLE(apci3xxx_pci_table) = { 741dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3010), BOARD_APCI3000_16 }, 742dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300f), BOARD_APCI3000_8 }, 743dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300e), BOARD_APCI3000_4 }, 744dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3013), BOARD_APCI3006_16 }, 745dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3014), BOARD_APCI3006_8 }, 746dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3015), BOARD_APCI3006_4 }, 747dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3016), BOARD_APCI3010_16 }, 748dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3017), BOARD_APCI3010_8 }, 749dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3018), BOARD_APCI3010_4 }, 750dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3019), BOARD_APCI3016_16 }, 751dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301a), BOARD_APCI3016_8 }, 752dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301b), BOARD_APCI3016_4 }, 753dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301c), BOARD_APCI3100_16_4 }, 754dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301d), BOARD_APCI3100_8_4 }, 755dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301e), BOARD_APCI3106_16_4 }, 756dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301f), BOARD_APCI3106_8_4 }, 757dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3020), BOARD_APCI3110_16_4 }, 758dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3021), BOARD_APCI3110_8_4 }, 759dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3022), BOARD_APCI3116_16_4 }, 760dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3023), BOARD_APCI3116_8_4 }, 761dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300B), BOARD_APCI3003 }, 762dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3002), BOARD_APCI3002_16 }, 763dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3003), BOARD_APCI3002_8 }, 764dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3004), BOARD_APCI3002_4 }, 765dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3024), BOARD_APCI3500 }, 766317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten { 0 } 767317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten}; 76820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley SweetenMODULE_DEVICE_TABLE(pci, apci3xxx_pci_table); 769317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten 77020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct pci_driver apci3xxx_pci_driver = { 77120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .name = "addi_apci_3xxx", 77220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .id_table = apci3xxx_pci_table, 77320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .probe = apci3xxx_pci_probe, 7749901a4d75d007686e8f6473189cafc4b216b7449Peter Huewe .remove = comedi_pci_auto_unconfig, 77520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}; 77620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenmodule_comedi_pci_driver(apci3xxx_driver, apci3xxx_pci_driver); 77790f703d30dd3e0c16ff80f35e34e511385a05ad5Arun Thomas 77890f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_AUTHOR("Comedi http://www.comedi.org"); 77990f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_DESCRIPTION("Comedi low-level driver"); 78090f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_LICENSE("GPL"); 781