addi_apci_3xxx.c revision 383390cfd4aefad6e00d4738233aa89901211fdd
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> 271867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten#include <linux/sched.h> 2833782dd5edf8db3cdb7c81a3523bf743dd0209b7H Hartley Sweeten 293d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten#include "../comedidev.h" 303d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten 3198a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweetenstatic const struct comedi_lrange apci3xxx_ai_range = { 3298a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten 8, { 3398a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(10), 3498a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(5), 3598a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(2), 3698a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(1), 3798a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(10), 3898a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(5), 3998a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(2), 4098a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(1) 4198a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten } 4298a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten}; 4398a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten 4498a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweetenstatic const struct comedi_lrange apci3xxx_ao_range = { 4598a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten 2, { 4698a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(10), 4798a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(10) 4898a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten } 4998a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten}; 5098a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten 51dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenenum apci3xxx_boardid { 52dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3000_16, 53dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3000_8, 54dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3000_4, 55dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3006_16, 56dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3006_8, 57dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3006_4, 58dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3010_16, 59dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3010_8, 60dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3010_4, 61dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3016_16, 62dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3016_8, 63dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3016_4, 64dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3100_16_4, 65dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3100_8_4, 66dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3106_16_4, 67dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3106_8_4, 68dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3110_16_4, 69dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3110_8_4, 70dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3116_16_4, 71dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3116_8_4, 72dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3003, 73dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3002_16, 74dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3002_8, 75dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3002_4, 76dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3500, 77dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten}; 78dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 79e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweetenstruct apci3xxx_boardinfo { 80e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten const char *pc_DriverName; 81e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten int i_NbrAiChannel; 82e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten int i_NbrAiChannelDiff; 83e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten int i_AiChannelList; 84e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten int i_NbrAoChannel; 85e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten int i_AiMaxdata; 86e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten unsigned char b_AvailableConvertUnit; 87e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten unsigned int ui_MinAcquisitiontimeNs; 884aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten unsigned int has_dig_in:1; 894aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten unsigned int has_dig_out:1; 900ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten unsigned int has_ttl_io:1; 91e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten}; 92e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten 93e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweetenstatic const struct apci3xxx_boardinfo apci3xxx_boardtypes[] = { 94dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3000_16] = { 95c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3000-16", 96c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 16, 97c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 98c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 16, 99c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 4095, 100c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 101c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 1020ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 103dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 104dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3000_8] = { 105c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3000-8", 106c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 8, 107c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 108c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 8, 109c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 4095, 110c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 111c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 1120ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 113dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 114dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3000_4] = { 115c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3000-4", 116c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 4, 117c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 2, 118c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 4, 119c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 4095, 120c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 121c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 1220ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 123dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 124dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3006_16] = { 125c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3006-16", 126c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 16, 127c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 128c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 16, 129c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 65535, 130c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 131c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 1320ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 133dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 134dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3006_8] = { 135c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3006-8", 136c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 8, 137c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 138c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 8, 139c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 65535, 140c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 141c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 1420ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 143dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 144dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3006_4] = { 145c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3006-4", 146c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 4, 147c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 2, 148c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 4, 149c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 65535, 150c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 151c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 1520ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 153dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 154dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3010_16] = { 155c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3010-16", 156c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 16, 157c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 158c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 16, 159c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 4095, 160c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 161c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 1624aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1634aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1640ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 165dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 166dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3010_8] = { 167c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3010-8", 168c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 8, 169c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 170c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 8, 171c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 4095, 172c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 173c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 1744aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1754aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1760ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 177dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 178dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3010_4] = { 179c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3010-4", 180c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 4, 181c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 2, 182c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 4, 183c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 4095, 184c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 185c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 1864aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1874aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1880ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 189dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 190dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3016_16] = { 191c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3016-16", 192c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 16, 193c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 194c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 16, 195c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 65535, 196c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 197c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 1984aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1994aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2000ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 201dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 202dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3016_8] = { 203c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3016-8", 204c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 8, 205c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 206c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 8, 207c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 65535, 208c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 209c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 2104aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2114aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2120ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 213dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 214dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3016_4] = { 215c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3016-4", 216c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 4, 217c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 2, 218c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 4, 219c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 65535, 220c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 221c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 2224aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2234aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2240ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 225dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 226dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3100_16_4] = { 227c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3100-16-4", 228c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 16, 229c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 230c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 16, 231c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAoChannel = 4, 232c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 4095, 233c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 234c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 2350ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 236dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 237dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3100_8_4] = { 238c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3100-8-4", 239c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 8, 240c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 241c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 8, 242c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAoChannel = 4, 243c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 4095, 244c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 245c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 2460ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 247dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 248dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3106_16_4] = { 249c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3106-16-4", 250c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 16, 251c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 252c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 16, 253c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAoChannel = 4, 254c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 65535, 255c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 256c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 2570ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 258dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 259dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3106_8_4] = { 260c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3106-8-4", 261c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 8, 262c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 263c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 8, 264c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAoChannel = 4, 265c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 65535, 266c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 267c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 10000, 2680ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 269dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 270dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3110_16_4] = { 271c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3110-16-4", 272c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 16, 273c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 274c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 16, 275c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAoChannel = 4, 276c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 4095, 277c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 278c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 2794aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2804aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2810ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 282dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 283dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3110_8_4] = { 284c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3110-8-4", 285c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 8, 286c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 287c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 8, 288c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAoChannel = 4, 289c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 4095, 290c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 291c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 2924aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2934aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2940ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 295dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 296dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3116_16_4] = { 297c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3116-16-4", 298c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 16, 299c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 300c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 16, 301c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAoChannel = 4, 302c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 65535, 303c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 304c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 3054aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3064aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 3070ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 308dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 309dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3116_8_4] = { 310c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3116-8-4", 311c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannel = 8, 312c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 313c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 8, 314c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAoChannel = 4, 315c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 65535, 316c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 317c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 3184aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3194aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 3200ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 321dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 322dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3003] = { 323c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3003", 324c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 325c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 4, 326c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 65535, 327c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 7, 328c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 2500, 3294aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3304aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 331dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 332dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3002_16] = { 333c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3002-16", 334c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 16, 335c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 16, 336c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 65535, 337c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 338c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 3394aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3404aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 341dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 342dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3002_8] = { 343c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3002-8", 344c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 8, 345c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 8, 346c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 65535, 347c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 348c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 3494aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3504aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 351dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 352dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3002_4] = { 353c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3002-4", 354c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAiChannelDiff = 4, 355c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiChannelList = 4, 356c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_AiMaxdata = 65535, 357c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .b_AvailableConvertUnit = 6, 358c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .ui_MinAcquisitiontimeNs = 5000, 3594aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3604aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 361dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 362dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3500] = { 363c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci3500", 364c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrAoChannel = 4, 3650ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 366c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten }, 367c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten}; 368c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten 3691867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweetenstruct apci3xxx_private { 3701867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten int iobase; 3711867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten int i_IobaseReserved; 3721867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten void __iomem *dw_AiBase; 3731867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned char b_AiInitialisation; 3741867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned int ui_AiNbrofChannels; /* how many channels is measured */ 3751867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned int ui_AiReadData[32]; 3761867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned char b_EocEosInterrupt; 3771867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned int ui_EocEosConversionTime; 3781867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned char b_EocEosConversionTimeBase; 3791867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned char b_SingelDiff; 3801867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct task_struct *tsk_Current; 3811867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten unsigned int ul_TTLPortConfiguration[10]; 3821867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten}; 3831867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten 384e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten#include "addi-data/hwdrv_apci3xxx.c" 385e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten 3866c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweetenstatic irqreturn_t apci3xxx_irq_handler(int irq, void *d) 3876c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten{ 3886c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten struct comedi_device *dev = d; 3891867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 3906c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten unsigned int status; 3916c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten int i; 3926c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 3936c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Test if interrupt occur */ 3946c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten status = readl(devpriv->dw_AiBase + 16); 3956c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten if ((status & 0x2) == 0x2) { 3966c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Reset the interrupt */ 3976c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten writel(status, devpriv->dw_AiBase + 16); 3986c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 3996c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Test if interrupt enabled */ 4006c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten if (devpriv->b_EocEosInterrupt == 1) { 4016c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Read all analog inputs value */ 4026c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten for (i = 0; i < devpriv->ui_AiNbrofChannels; i++) { 4036c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten unsigned int val; 4046c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 4056c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten val = readl(devpriv->dw_AiBase + 28); 4066c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten devpriv->ui_AiReadData[i] = val; 4076c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten } 4086c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 4096c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Set the interrupt flag */ 4106c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten devpriv->b_EocEosInterrupt = 2; 4116c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 4126c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Send a signal to from kernel to user space */ 4136c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten send_sig(SIGIO, devpriv->tsk_Current, 0); 4146c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten } 4156c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten } 4166c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten return IRQ_RETVAL(1); 4176c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten} 4186c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 419ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweetenstatic int apci3xxx_di_insn_bits(struct comedi_device *dev, 420ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten struct comedi_subdevice *s, 421ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten struct comedi_insn *insn, 422ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten unsigned int *data) 423ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten{ 4241867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 425ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten 426ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten data[1] = inl(devpriv->iobase + 32) & 0xf; 427ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten 428ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten return insn->n; 429ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten} 430ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten 431c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweetenstatic int apci3xxx_do_insn_bits(struct comedi_device *dev, 432c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten struct comedi_subdevice *s, 433c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten struct comedi_insn *insn, 434c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten unsigned int *data) 435c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten{ 4361867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 437c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten unsigned int mask = data[0]; 438c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten unsigned int bits = data[1]; 439c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 440c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten s->state = inl(devpriv->iobase + 48) & 0xf; 441c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten if (mask) { 442c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten s->state &= ~mask; 443c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten s->state |= (bits & mask); 444c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 445c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten outl(s->state, devpriv->iobase + 48); 446c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten } 447c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 448c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten data[1] = s->state; 449c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 450c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten return insn->n; 451c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten} 452c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 4535e72c7a50709e60663217704b30501bf34afa448H Hartley Sweetenstatic int apci3xxx_reset(struct comedi_device *dev) 45498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{ 4551867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 4565e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten unsigned int val; 4575e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten int i; 4585e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 4595e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Disable the interrupt */ 4605e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten disable_irq(dev->irq); 4615e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 4625e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Reset the interrupt flag */ 4635e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten devpriv->b_EocEosInterrupt = 0; 4645e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 4655e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Clear the start command */ 4665e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten writel(0, devpriv->dw_AiBase + 8); 4675e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 4685e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Reset the interrupt flags */ 4695e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten val = readl(devpriv->dw_AiBase + 16); 4705e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten writel(val, devpriv->dw_AiBase + 16); 4715e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 4725e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* clear the EOS */ 4735e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten readl(devpriv->dw_AiBase + 20); 4745e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 4755e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Clear the FIFO */ 4765e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten for (i = 0; i < 16; i++) 4775e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten val = readl(devpriv->dw_AiBase + 28); 4785e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 4795e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Enable the interrupt */ 4805e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten enable_irq(dev->irq); 48198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 48298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return 0; 48398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten} 48498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 485dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenstatic int apci3xxx_auto_attach(struct comedi_device *dev, 486dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten unsigned long context) 487dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten{ 48898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten struct pci_dev *pcidev = comedi_to_pci_dev(dev); 489e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten const struct apci3xxx_boardinfo *board = NULL; 4901867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv; 49198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten struct comedi_subdevice *s; 49298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten int ret, n_subdevices; 493dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 494dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten if (context < ARRAY_SIZE(apci3xxx_boardtypes)) 495dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten board = &apci3xxx_boardtypes[context]; 496dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten if (!board) 497dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten return -ENODEV; 498dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten dev->board_ptr = board; 49998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten dev->board_name = board->pc_DriverName; 50098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 50198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL); 50298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (!devpriv) 50398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return -ENOMEM; 50498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten dev->private = devpriv; 50598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 50698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten ret = comedi_pci_enable(dev); 50798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret) 50898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return ret; 50998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 5102107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten /* board has an ADDIDATA_9054 eeprom */ 5112107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten dev->iobase = pci_resource_start(pcidev, 2); 5122107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten devpriv->iobase = pci_resource_start(pcidev, 2); 5132107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten devpriv->dw_AiBase = pci_ioremap_bar(pcidev, 3); 51498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten devpriv->i_IobaseReserved = pci_resource_start(pcidev, 3); 51598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 51698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (pcidev->irq > 0) { 5176c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten ret = request_irq(pcidev->irq, apci3xxx_irq_handler, 5186c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten IRQF_SHARED, dev->board_name, dev); 51998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret == 0) 52098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten dev->irq = pcidev->irq; 52198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 52298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 52398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten n_subdevices = 7; 52498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten ret = comedi_alloc_subdevices(dev, n_subdevices); 52598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret) 52698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return ret; 52798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 52898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten /* Allocate and Initialise AI Subdevice Structures */ 52998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[0]; 530f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten if (board->i_NbrAiChannel || board->i_NbrAiChannelDiff) { 53198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten dev->read_subdev = s; 53298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->type = COMEDI_SUBD_AI; 53398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->subdev_flags = SDF_READABLE | SDF_COMMON | SDF_GROUND | 53498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten SDF_DIFF; 535f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten if (board->i_NbrAiChannel) { 536f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten s->n_chan = board->i_NbrAiChannel; 53798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten devpriv->b_SingelDiff = 0; 53898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 53998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->n_chan = board->i_NbrAiChannelDiff; 54098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten devpriv->b_SingelDiff = 1; 54198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 542f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten s->maxdata = board->i_AiMaxdata; 54398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->len_chanlist = board->i_AiChannelList; 54498a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten s->range_table = &apci3xxx_ai_range; 54598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 54698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten /* Set the initialisation flag */ 54798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten devpriv->b_AiInitialisation = 1; 54898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 549b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten s->insn_config = i_APCI3XXX_InsnConfigAnalogInput; 550b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten s->insn_read = i_APCI3XXX_InsnReadAnalogInput; 55198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 55298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 55398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 55498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 55598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 55698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten /* Allocate and Initialise AO Subdevice Structures */ 55798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[1]; 558f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten if (board->i_NbrAoChannel) { 55998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->type = COMEDI_SUBD_AO; 56098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; 561f57b428c006486c951188354732b469b4b4a1af7H Hartley Sweeten s->n_chan = board->i_NbrAoChannel; 562f1861cb0d29cdc0a28fba02a4d84918118a5ea4eH Hartley Sweeten s->maxdata = 0x0fff; 56398a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten s->range_table = &apci3xxx_ao_range; 564b9671585a9974abf448fb349083aea655b9235bfH Hartley Sweeten s->insn_write = i_APCI3XXX_InsnWriteAnalogOutput; 56598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 56698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 56798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 568ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten 569ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten /* Digital Input subdevice */ 57098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[2]; 5714aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten if (board->has_dig_in) { 572ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_DI; 573ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->subdev_flags = SDF_READABLE; 574ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->n_chan = 4; 575ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->maxdata = 1; 576ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->range_table = &range_digital; 577ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->insn_bits = apci3xxx_di_insn_bits; 57898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 579ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 58098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 581ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten 582ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten /* Digital Output subdevice */ 58398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[3]; 5844aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten if (board->has_dig_out) { 585ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_DO; 586ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->subdev_flags = SDF_WRITEABLE; 587ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->n_chan = 4; 588ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->maxdata = 1; 589ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->range_table = &range_digital; 590ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->insn_bits = apci3xxx_do_insn_bits; 59198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 592ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 59398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 59498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 59598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten /* Allocate and Initialise Timer Subdevice Structures */ 59698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[4]; 597178bd8d3a61432ce24399604b13cc756293d1ac8H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 59898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 599383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten /* TTL Digital I/O subdevice */ 60098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[5]; 6010ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten if (board->has_ttl_io) { 602383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->type = COMEDI_SUBD_DIO; 603383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->subdev_flags = SDF_READABLE | SDF_WRITEABLE; 604383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->n_chan = 24; 605383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->maxdata = 1; 606383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->io_bits = 0xff; /* channels 0-7 are always outputs */ 607383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->range_table = &range_digital; 608383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->insn_config = i_APCI3XXX_InsnConfigInitTTLIO; 609383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->insn_bits = i_APCI3XXX_InsnBitsTTLIO; 610383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->insn_read = i_APCI3XXX_InsnReadTTLIO; 611383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->insn_write = i_APCI3XXX_InsnWriteTTLIO; 61298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } else { 61398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 61498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 61598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 61698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten /* EEPROM */ 61798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten s = &dev->subdevices[6]; 61893c0dc284dff2e2fec320662d8ef01b933096e36H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 61998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 6205e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten apci3xxx_reset(dev); 62198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return 0; 62298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten} 62398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 62498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweetenstatic void apci3xxx_detach(struct comedi_device *dev) 62598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{ 6261867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 627dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 62898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (devpriv) { 62998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (dev->iobase) 6305e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten apci3xxx_reset(dev); 63198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (dev->irq) 63298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten free_irq(dev->irq, dev); 63398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (devpriv->dw_AiBase) 63498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten iounmap(devpriv->dw_AiBase); 63598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 63698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten comedi_pci_disable(dev); 637dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten} 638dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 63920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct comedi_driver apci3xxx_driver = { 64020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .driver_name = "addi_apci_3xxx", 64120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .module = THIS_MODULE, 642dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten .auto_attach = apci3xxx_auto_attach, 64398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten .detach = apci3xxx_detach, 64420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}; 64520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten 646a690b7e535f2f97a3a05ee570715abeb60a8910fBill Pembertonstatic int apci3xxx_pci_probe(struct pci_dev *dev, 647b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten const struct pci_device_id *id) 64820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten{ 649b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten return comedi_pci_auto_config(dev, &apci3xxx_driver, id->driver_data); 65020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten} 65120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten 65220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic DEFINE_PCI_DEVICE_TABLE(apci3xxx_pci_table) = { 653dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3010), BOARD_APCI3000_16 }, 654dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300f), BOARD_APCI3000_8 }, 655dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300e), BOARD_APCI3000_4 }, 656dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3013), BOARD_APCI3006_16 }, 657dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3014), BOARD_APCI3006_8 }, 658dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3015), BOARD_APCI3006_4 }, 659dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3016), BOARD_APCI3010_16 }, 660dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3017), BOARD_APCI3010_8 }, 661dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3018), BOARD_APCI3010_4 }, 662dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3019), BOARD_APCI3016_16 }, 663dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301a), BOARD_APCI3016_8 }, 664dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301b), BOARD_APCI3016_4 }, 665dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301c), BOARD_APCI3100_16_4 }, 666dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301d), BOARD_APCI3100_8_4 }, 667dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301e), BOARD_APCI3106_16_4 }, 668dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301f), BOARD_APCI3106_8_4 }, 669dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3020), BOARD_APCI3110_16_4 }, 670dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3021), BOARD_APCI3110_8_4 }, 671dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3022), BOARD_APCI3116_16_4 }, 672dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3023), BOARD_APCI3116_8_4 }, 673dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300B), BOARD_APCI3003 }, 674dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3002), BOARD_APCI3002_16 }, 675dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3003), BOARD_APCI3002_8 }, 676dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3004), BOARD_APCI3002_4 }, 677dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3024), BOARD_APCI3500 }, 678317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten { 0 } 679317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten}; 68020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley SweetenMODULE_DEVICE_TABLE(pci, apci3xxx_pci_table); 681317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten 68220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct pci_driver apci3xxx_pci_driver = { 68320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .name = "addi_apci_3xxx", 68420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .id_table = apci3xxx_pci_table, 68520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .probe = apci3xxx_pci_probe, 6869901a4d75d007686e8f6473189cafc4b216b7449Peter Huewe .remove = comedi_pci_auto_unconfig, 68720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}; 68820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenmodule_comedi_pci_driver(apci3xxx_driver, apci3xxx_pci_driver); 68990f703d30dd3e0c16ff80f35e34e511385a05ad5Arun Thomas 69090f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_AUTHOR("Comedi http://www.comedi.org"); 69190f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_DESCRIPTION("Comedi low-level driver"); 69290f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_LICENSE("GPL"); 693