addi_apci_3xxx.c revision 8a1ec30d75d844d21c5034152242a087230e40e5
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 3098a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweetenstatic const struct comedi_lrange apci3xxx_ai_range = { 3198a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten 8, { 3298a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(10), 3398a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(5), 3498a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(2), 3598a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(1), 3698a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(10), 3798a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(5), 3898a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(2), 3998a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(1) 4098a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten } 4198a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten}; 4298a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten 4398a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweetenstatic const struct comedi_lrange apci3xxx_ao_range = { 4498a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten 2, { 4598a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(10), 4698a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(10) 4798a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten } 4898a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten}; 4998a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten 50dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenenum apci3xxx_boardid { 51dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3000_16, 52dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3000_8, 53dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3000_4, 54dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3006_16, 55dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3006_8, 56dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3006_4, 57dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3010_16, 58dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3010_8, 59dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3010_4, 60dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3016_16, 61dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3016_8, 62dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3016_4, 63dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3100_16_4, 64dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3100_8_4, 65dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3106_16_4, 66dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3106_8_4, 67dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3110_16_4, 68dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3110_8_4, 69dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3116_16_4, 70dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3116_8_4, 71dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3003, 72dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3002_16, 73dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3002_8, 74dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3002_4, 75dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3500, 76dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten}; 77dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 78e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweetenstruct apci3xxx_boardinfo { 796abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten const char *name; 808a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten int ai_subdev_flags; 81e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten int i_NbrAiChannel; 82e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten int i_NbrAiChannelDiff; 835469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten unsigned int ai_maxdata; 84e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten unsigned char b_AvailableConvertUnit; 85e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten unsigned int ui_MinAcquisitiontimeNs; 86fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten unsigned int has_ao:1; 874aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten unsigned int has_dig_in:1; 884aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten unsigned int has_dig_out:1; 890ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten unsigned int has_ttl_io:1; 90e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten}; 91e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten 92e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweetenstatic const struct apci3xxx_boardinfo apci3xxx_boardtypes[] = { 93dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3000_16] = { 946abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3000-16", 958a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 96c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 16, 97c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 985469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 99c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 100c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 1010ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 102dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 103dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3000_8] = { 1046abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3000-8", 1058a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 106c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 8, 107c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 1085469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 109c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 110c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 1110ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 112dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 113dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3000_4] = { 1146abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3000-4", 1158a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 116c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 4, 117c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 2, 1185469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 119c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 120c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 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, 126c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 16, 127c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 1285469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 129c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 130c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 1310ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 132dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 133dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3006_8] = { 1346abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3006-8", 1358a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 136c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 8, 137c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 1385469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 139c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 140c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 1410ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 142dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 143dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3006_4] = { 1446abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3006-4", 1458a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 146c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 4, 147c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 2, 1485469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 149c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 150c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 1510ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 152dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 153dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3010_16] = { 1546abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3010-16", 1558a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 156c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 16, 157c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 1585469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 159c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 160c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 1614aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1624aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1630ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 164dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 165dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3010_8] = { 1666abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3010-8", 1678a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 168c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 8, 169c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 1705469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 171c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 172c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 1734aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1744aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1750ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 176dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 177dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3010_4] = { 1786abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3010-4", 1798a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 180c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 4, 181c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 2, 1825469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 183c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 184c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 1854aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1864aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1870ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 188dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 189dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3016_16] = { 1906abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3016-16", 1918a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 192c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 16, 193c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 1945469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 195c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 196c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 1974aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1984aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1990ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 200dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 201dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3016_8] = { 2026abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3016-8", 2038a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 204c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 8, 205c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 2065469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 207c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 208c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 2094aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2104aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2110ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 212dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 213dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3016_4] = { 2146abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3016-4", 2158a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 216c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 4, 217c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 2, 2185469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 219c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 220c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 2214aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2224aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2230ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 224dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 225dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3100_16_4] = { 2266abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3100-16-4", 2278a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 228c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 16, 229c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 2305469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 231c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 232c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 233fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2340ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 235dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 236dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3100_8_4] = { 2376abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3100-8-4", 2388a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 239c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 8, 240c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 2415469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 242c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 243c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 244fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2450ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 246dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 247dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3106_16_4] = { 2486abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3106-16-4", 2498a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 250c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 16, 251c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 2525469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 253c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 254c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 255fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2560ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 257dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 258dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3106_8_4] = { 2596abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3106-8-4", 2608a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 261c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 8, 262c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 2635469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 264c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 265c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 266fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2670ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 268dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 269dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3110_16_4] = { 2706abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3110-16-4", 2718a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 272c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 16, 273c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 2745469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 275c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 276c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 277fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2784aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2794aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2800ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 281dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 282dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3110_8_4] = { 2836abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3110-8-4", 2848a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 285c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 8, 286c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 2875469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 288c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 289c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 290fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2914aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2924aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2930ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 294dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 295dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3116_16_4] = { 2966abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3116-16-4", 2978a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 298c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 16, 299c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 3005469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 301c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 302c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 303fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 3044aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3054aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 3060ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 307dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 308dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3116_8_4] = { 3096abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3116-8-4", 3108a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 311c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 8, 312c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 3135469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 314c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 315c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 316fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 3174aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3184aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 3190ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 320dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 321dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3003] = { 3226abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3003", 3238a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_DIFF, 324c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 3255469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 326c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 7, 327c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 2500, 3284aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3294aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 330dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 331dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3002_16] = { 3326abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3002-16", 3338a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_DIFF, 334c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 16, 3355469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 336c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 337c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 3384aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3394aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 340dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 341dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3002_8] = { 3426abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3002-8", 3438a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_DIFF, 344c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 3455469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 346c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 347c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 3484aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3494aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 350dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 351dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3002_4] = { 3526abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3002-4", 3538a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_DIFF, 354c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 3555469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 356c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 357c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 3584aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3594aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 360dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 361dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3500] = { 3626abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3500", 363fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 3640ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 365c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten }, 366c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten}; 367c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten 3681867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweetenstruct apci3xxx_private { 369f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten void __iomem *mmio; 3701867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned int ui_AiNbrofChannels; /* how many channels is measured */ 3711867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned int ui_AiReadData[32]; 3721867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned char b_EocEosInterrupt; 3731867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned int ui_EocEosConversionTime; 3741867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned char b_EocEosConversionTimeBase; 3751867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned char b_SingelDiff; 3761867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten}; 3771867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten 378e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten#include "addi-data/hwdrv_apci3xxx.c" 379e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten 3806c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweetenstatic irqreturn_t apci3xxx_irq_handler(int irq, void *d) 3816c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten{ 3826c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten struct comedi_device *dev = d; 3831867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 3846c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten unsigned int status; 3856c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten int i; 3866c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 3876c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Test if interrupt occur */ 388f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten status = readl(devpriv->mmio + 16); 3896c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten if ((status & 0x2) == 0x2) { 3906c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Reset the interrupt */ 391f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(status, devpriv->mmio + 16); 3926c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 3936c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Test if interrupt enabled */ 3946c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten if (devpriv->b_EocEosInterrupt == 1) { 3956c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Read all analog inputs value */ 3966c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten for (i = 0; i < devpriv->ui_AiNbrofChannels; i++) { 3976c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten unsigned int val; 3986c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 399f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten val = readl(devpriv->mmio + 28); 4006c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten devpriv->ui_AiReadData[i] = val; 4016c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten } 4026c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 4036c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Set the interrupt flag */ 4046c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten devpriv->b_EocEosInterrupt = 2; 4056c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 406283ce669268da5a51eaf62efe92d5dd4625817a2H Hartley Sweeten /* FIXME: comedi_event() */ 4076c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten } 4086c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten } 4096c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten return IRQ_RETVAL(1); 4106c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten} 4116c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 4120e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweetenstatic int apci3xxx_ao_insn_write(struct comedi_device *dev, 4130e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten struct comedi_subdevice *s, 4140e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten struct comedi_insn *insn, 4150e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int *data) 4160e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten{ 4170e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 4180e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int chan = CR_CHAN(insn->chanspec); 4190e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int range = CR_RANGE(insn->chanspec); 4200e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int status; 4210e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten int i; 4220e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 4230e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten for (i = 0; i < insn->n; i++) { 4240e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Set the range selection */ 425f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(range, devpriv->mmio + 96); 4260e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 4270e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Write the analog value to the selected channel */ 428f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel((data[i] << 8) | chan, devpriv->mmio + 100); 4290e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 4300e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Wait the end of transfer */ 4310e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten do { 432f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten status = readl(devpriv->mmio + 96); 4330e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten } while ((status & 0x100) != 0x100); 4340e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten } 4350e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 4360e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten return insn->n; 4370e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten} 4380e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 439ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweetenstatic int apci3xxx_di_insn_bits(struct comedi_device *dev, 440ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten struct comedi_subdevice *s, 441ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten struct comedi_insn *insn, 442ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten unsigned int *data) 443ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten{ 444dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten data[1] = inl(dev->iobase + 32) & 0xf; 445ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten 446ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten return insn->n; 447ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten} 448ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten 449c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweetenstatic int apci3xxx_do_insn_bits(struct comedi_device *dev, 450c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten struct comedi_subdevice *s, 451c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten struct comedi_insn *insn, 452c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten unsigned int *data) 453c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten{ 454c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten unsigned int mask = data[0]; 455c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten unsigned int bits = data[1]; 456c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 457dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten s->state = inl(dev->iobase + 48) & 0xf; 458c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten if (mask) { 459c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten s->state &= ~mask; 460c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten s->state |= (bits & mask); 461c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 462dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl(s->state, dev->iobase + 48); 463c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten } 464c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 465c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten data[1] = s->state; 466c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 467c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten return insn->n; 468c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten} 469c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 470da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweetenstatic int apci3xxx_dio_insn_config(struct comedi_device *dev, 471da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_subdevice *s, 472da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_insn *insn, 473da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int *data) 474da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten{ 475da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int chan = CR_CHAN(insn->chanspec); 476da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int mask = 1 << chan; 477da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int bits; 478da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 479da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten /* 480da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 0 (channels 0-7) are always inputs 481da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 1 (channels 8-15) are always outputs 482da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 2 (channels 16-23) are programmable i/o 483da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * 484da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Changing any channel in port 2 changes the entire port. 485da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten */ 486da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask & 0xff0000) 487da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten bits = 0xff0000; 488da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten else 489da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten bits = 0; 490da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 491da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten switch (data[0]) { 492da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten case INSN_CONFIG_DIO_INPUT: 493da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->io_bits &= ~bits; 494da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten break; 495da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten case INSN_CONFIG_DIO_OUTPUT: 496da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->io_bits |= bits; 497da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten break; 498da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten case INSN_CONFIG_DIO_QUERY: 499da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten data[1] = (s->io_bits & bits) ? COMEDI_OUTPUT : COMEDI_INPUT; 500da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return insn->n; 501da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten default: 502da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return -EINVAL; 503da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten } 504da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 505da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten /* update port 2 configuration */ 506da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (bits) 507dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl((s->io_bits >> 24) & 0xff, dev->iobase + 224); 508da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 509da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return insn->n; 510da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten} 511da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 512da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweetenstatic int apci3xxx_dio_insn_bits(struct comedi_device *dev, 513da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_subdevice *s, 514da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_insn *insn, 515da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int *data) 516da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten{ 517da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int mask = data[0]; 518da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int bits = data[1]; 519da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int val; 520da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 521da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten /* only update output channels */ 522da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten mask &= s->io_bits; 523da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask) { 524da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->state &= ~mask; 525da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->state |= (bits & mask); 526da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 527da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask & 0xff) 528dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl(s->state & 0xff, dev->iobase + 80); 529da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask & 0xff0000) 530dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl((s->state >> 16) & 0xff, dev->iobase + 112); 531da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten } 532da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 533dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val = inl(dev->iobase + 80); 534dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 64) << 8); 535da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (s->io_bits & 0xff0000) 536dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 112) << 16); 537da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten else 538dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 96) << 16); 539da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 540da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten data[1] = val; 541da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 542da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return insn->n; 543da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten} 544da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 5455e72c7a50709e60663217704b30501bf34afa448H Hartley Sweetenstatic int apci3xxx_reset(struct comedi_device *dev) 54698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{ 5471867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 5485e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten unsigned int val; 5495e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten int i; 5505e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5515e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Disable the interrupt */ 5525e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten disable_irq(dev->irq); 5535e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5545e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Reset the interrupt flag */ 5555e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten devpriv->b_EocEosInterrupt = 0; 5565e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5575e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Clear the start command */ 558f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(0, devpriv->mmio + 8); 5595e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5605e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Reset the interrupt flags */ 561f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten val = readl(devpriv->mmio + 16); 562f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(val, devpriv->mmio + 16); 5635e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5645e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* clear the EOS */ 565f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten readl(devpriv->mmio + 20); 5665e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5675e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Clear the FIFO */ 5685e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten for (i = 0; i < 16; i++) 569f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten val = readl(devpriv->mmio + 28); 5705e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 5715e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Enable the interrupt */ 5725e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten enable_irq(dev->irq); 57398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 57498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return 0; 57598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten} 57698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 577dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenstatic int apci3xxx_auto_attach(struct comedi_device *dev, 578dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten unsigned long context) 579dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten{ 58098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten struct pci_dev *pcidev = comedi_to_pci_dev(dev); 581e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten const struct apci3xxx_boardinfo *board = NULL; 5821867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv; 58398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten struct comedi_subdevice *s; 58498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten int ret, n_subdevices; 585dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 586dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten if (context < ARRAY_SIZE(apci3xxx_boardtypes)) 587dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten board = &apci3xxx_boardtypes[context]; 588dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten if (!board) 589dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten return -ENODEV; 590dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten dev->board_ptr = board; 5916abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten dev->board_name = board->name; 59298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 59398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL); 59498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (!devpriv) 59598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return -ENOMEM; 59698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten dev->private = devpriv; 59798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 59898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten ret = comedi_pci_enable(dev); 59998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret) 60098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return ret; 60198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 6022107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten dev->iobase = pci_resource_start(pcidev, 2); 603f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten devpriv->mmio = pci_ioremap_bar(pcidev, 3); 60498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 60598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (pcidev->irq > 0) { 6066c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten ret = request_irq(pcidev->irq, apci3xxx_irq_handler, 6076c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten IRQF_SHARED, dev->board_name, dev); 60898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret == 0) 60998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten dev->irq = pcidev->irq; 61098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 61198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 61298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten n_subdevices = 7; 61398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten ret = comedi_alloc_subdevices(dev, n_subdevices); 61498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret) 61598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return ret; 61698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 61798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten /* Allocate and Initialise AI Subdevice Structures */ 61898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[0]; 619f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten if (board->i_NbrAiChannel || board->i_NbrAiChannelDiff) { 62098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten dev->read_subdev = s; 62198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->type = COMEDI_SUBD_AI; 6228a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten s->subdev_flags = SDF_READABLE | board->ai_subdev_flags; 623f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten if (board->i_NbrAiChannel) { 624f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten s->n_chan = board->i_NbrAiChannel; 62598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten devpriv->b_SingelDiff = 0; 62698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 62798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->n_chan = board->i_NbrAiChannelDiff; 62898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten devpriv->b_SingelDiff = 1; 62998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 6305469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten s->maxdata = board->ai_maxdata; 63179518d9f9c2025449e66a9f00f18d6962f859627H Hartley Sweeten s->len_chanlist = s->n_chan; 63298a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten s->range_table = &apci3xxx_ai_range; 63398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 634b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten s->insn_config = i_APCI3XXX_InsnConfigAnalogInput; 635088e2e053d285553cb988ca50177d266d5494243H Hartley Sweeten s->insn_read = apci3xxx_ai_insn_read; 63698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 63798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 63898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 63998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 64098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 6410e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Analog Output subdevice */ 64298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[1]; 643fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten if (board->has_ao) { 6440e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->type = COMEDI_SUBD_AO; 6450e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; 6460e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->n_chan = 4; 6470e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->maxdata = 0x0fff; 6480e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->range_table = &apci3xxx_ao_range; 6490e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->insn_write = apci3xxx_ao_insn_write; 65098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 6510e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 65298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 653ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten 654ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten /* Digital Input subdevice */ 65598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[2]; 6564aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten if (board->has_dig_in) { 657ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_DI; 658ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->subdev_flags = SDF_READABLE; 659ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->n_chan = 4; 660ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->maxdata = 1; 661ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->range_table = &range_digital; 662ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->insn_bits = apci3xxx_di_insn_bits; 66398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 664ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 66598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 666ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten 667ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten /* Digital Output subdevice */ 66898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[3]; 6694aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten if (board->has_dig_out) { 670ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_DO; 671ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->subdev_flags = SDF_WRITEABLE; 672ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->n_chan = 4; 673ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->maxdata = 1; 674ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->range_table = &range_digital; 675ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->insn_bits = apci3xxx_do_insn_bits; 67698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 677ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 67898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 67998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 68098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten /* Allocate and Initialise Timer Subdevice Structures */ 68198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[4]; 682178bd8d3a61432ce24399604b13cc756293d1ac8H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 68398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 684383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten /* TTL Digital I/O subdevice */ 68598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[5]; 6860ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten if (board->has_ttl_io) { 687383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->type = COMEDI_SUBD_DIO; 688383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->subdev_flags = SDF_READABLE | SDF_WRITEABLE; 689383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->n_chan = 24; 690383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->maxdata = 1; 691383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->io_bits = 0xff; /* channels 0-7 are always outputs */ 692383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->range_table = &range_digital; 693da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->insn_config = apci3xxx_dio_insn_config; 694da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->insn_bits = apci3xxx_dio_insn_bits; 69598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 69698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 69798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 69898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 69998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten /* EEPROM */ 70098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[6]; 70193c0dc284dff2e2fec320662d8ef01b933096e36H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 70298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 7035e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten apci3xxx_reset(dev); 70498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return 0; 70598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten} 70698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 70798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweetenstatic void apci3xxx_detach(struct comedi_device *dev) 70898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{ 7091867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 710dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 71198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (devpriv) { 71298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (dev->iobase) 7135e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten apci3xxx_reset(dev); 71498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (dev->irq) 71598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten free_irq(dev->irq, dev); 716f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten if (devpriv->mmio) 717f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten iounmap(devpriv->mmio); 71898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 71998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten comedi_pci_disable(dev); 720dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten} 721dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 72220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct comedi_driver apci3xxx_driver = { 72320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .driver_name = "addi_apci_3xxx", 72420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .module = THIS_MODULE, 725dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten .auto_attach = apci3xxx_auto_attach, 72698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten .detach = apci3xxx_detach, 72720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}; 72820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten 729a690b7e535f2f97a3a05ee570715abeb60a8910fBill Pembertonstatic int apci3xxx_pci_probe(struct pci_dev *dev, 730b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten const struct pci_device_id *id) 73120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten{ 732b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten return comedi_pci_auto_config(dev, &apci3xxx_driver, id->driver_data); 73320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten} 73420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten 73520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic DEFINE_PCI_DEVICE_TABLE(apci3xxx_pci_table) = { 736dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3010), BOARD_APCI3000_16 }, 737dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300f), BOARD_APCI3000_8 }, 738dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300e), BOARD_APCI3000_4 }, 739dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3013), BOARD_APCI3006_16 }, 740dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3014), BOARD_APCI3006_8 }, 741dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3015), BOARD_APCI3006_4 }, 742dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3016), BOARD_APCI3010_16 }, 743dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3017), BOARD_APCI3010_8 }, 744dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3018), BOARD_APCI3010_4 }, 745dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3019), BOARD_APCI3016_16 }, 746dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301a), BOARD_APCI3016_8 }, 747dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301b), BOARD_APCI3016_4 }, 748dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301c), BOARD_APCI3100_16_4 }, 749dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301d), BOARD_APCI3100_8_4 }, 750dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301e), BOARD_APCI3106_16_4 }, 751dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301f), BOARD_APCI3106_8_4 }, 752dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3020), BOARD_APCI3110_16_4 }, 753dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3021), BOARD_APCI3110_8_4 }, 754dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3022), BOARD_APCI3116_16_4 }, 755dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3023), BOARD_APCI3116_8_4 }, 756dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300B), BOARD_APCI3003 }, 757dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3002), BOARD_APCI3002_16 }, 758dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3003), BOARD_APCI3002_8 }, 759dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3004), BOARD_APCI3002_4 }, 760dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3024), BOARD_APCI3500 }, 761317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten { 0 } 762317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten}; 76320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley SweetenMODULE_DEVICE_TABLE(pci, apci3xxx_pci_table); 764317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten 76520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct pci_driver apci3xxx_pci_driver = { 76620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .name = "addi_apci_3xxx", 76720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .id_table = apci3xxx_pci_table, 76820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .probe = apci3xxx_pci_probe, 7699901a4d75d007686e8f6473189cafc4b216b7449Peter Huewe .remove = comedi_pci_auto_unconfig, 77020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}; 77120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenmodule_comedi_pci_driver(apci3xxx_driver, apci3xxx_pci_driver); 77290f703d30dd3e0c16ff80f35e34e511385a05ad5Arun Thomas 77390f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_AUTHOR("Comedi http://www.comedi.org"); 77490f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_DESCRIPTION("Comedi low-level driver"); 77590f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_LICENSE("GPL"); 776