addi_apci_3xxx.c revision 41e043fcfa2236bb2c4a8335eb09f4c8cee224b3
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 25ce157f8032bbd46d9427034c335b0afd751da25dH Hartley Sweeten#include <linux/module.h> 2633782dd5edf8db3cdb7c81a3523bf743dd0209b7H Hartley Sweeten#include <linux/pci.h> 271867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten#include <linux/interrupt.h> 2833782dd5edf8db3cdb7c81a3523bf743dd0209b7H Hartley Sweeten 293d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten#include "../comedidev.h" 303d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten 31f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten#include "comedi_fc.h" 32f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 33a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten#define CONV_UNIT_NS (1 << 0) 34a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten#define CONV_UNIT_US (1 << 1) 35a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten#define CONV_UNIT_MS (1 << 2) 36a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten 3798a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweetenstatic const struct comedi_lrange apci3xxx_ai_range = { 3898a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten 8, { 3998a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(10), 4098a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(5), 4198a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(2), 4298a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(1), 4398a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(10), 4498a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(5), 4598a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(2), 4698a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(1) 4798a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten } 4898a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten}; 4998a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten 5098a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweetenstatic const struct comedi_lrange apci3xxx_ao_range = { 5198a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten 2, { 5298a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten BIP_RANGE(10), 5398a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten UNI_RANGE(10) 5498a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten } 5598a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten}; 5698a856213efb9fec7a45491170d9b589ce55572dH Hartley Sweeten 57dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenenum apci3xxx_boardid { 58dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3000_16, 59dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3000_8, 60dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3000_4, 61dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3006_16, 62dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3006_8, 63dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3006_4, 64dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3010_16, 65dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3010_8, 66dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3010_4, 67dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3016_16, 68dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3016_8, 69dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3016_4, 70dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3100_16_4, 71dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3100_8_4, 72dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3106_16_4, 73dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3106_8_4, 74dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3110_16_4, 75dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3110_8_4, 76dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3116_16_4, 77dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3116_8_4, 78dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3003, 79dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3002_16, 80dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3002_8, 81dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3002_4, 82dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten BOARD_APCI3500, 83dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten}; 84dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 85e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweetenstruct apci3xxx_boardinfo { 866abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten const char *name; 878a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten int ai_subdev_flags; 8847bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten int ai_n_chan; 895469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten unsigned int ai_maxdata; 90a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten unsigned char ai_conv_units; 918edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten unsigned int ai_min_acq_ns; 92fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten unsigned int has_ao:1; 934aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten unsigned int has_dig_in:1; 944aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten unsigned int has_dig_out:1; 950ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten unsigned int has_ttl_io:1; 96e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten}; 97e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten 98e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweetenstatic const struct apci3xxx_boardinfo apci3xxx_boardtypes[] = { 99dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3000_16] = { 1006abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3000-16", 1018a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 10247bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 1035469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 104a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1058edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 1060ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 107dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 108dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3000_8] = { 1096abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3000-8", 1108a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 11147bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 1125469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 113a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1148edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 1150ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 116dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 117dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3000_4] = { 1186abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3000-4", 1198a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 12047bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 4, 1215469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 122a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1238edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 1240ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 125dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 126dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3006_16] = { 1276abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3006-16", 1288a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 12947bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 1305469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 131a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1328edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 1330ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 134dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 135dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3006_8] = { 1366abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3006-8", 1378a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 13847bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 1395469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 140a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1418edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 1420ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 143dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 144dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3006_4] = { 1456abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3006-4", 1468a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 14747bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 4, 1485469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 149a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1508edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 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, 15647bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 1575469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 158a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1598edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 1604aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1614aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1620ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 163dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 164dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3010_8] = { 1656abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3010-8", 1668a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 16747bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 1685469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 169a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1708edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 1714aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1724aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1730ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 174dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 175dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3010_4] = { 1766abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3010-4", 1778a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 17847bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 4, 1795469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 180a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1818edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 1824aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1834aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1840ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 185dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 186dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3016_16] = { 1876abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3016-16", 1888a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 18947bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 1905469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 191a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 1928edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 1934aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 1944aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 1950ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 196dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 197dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3016_8] = { 1986abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3016-8", 1998a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 20047bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 2015469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 202a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2038edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 2044aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2054aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2060ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 207dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 208dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3016_4] = { 2096abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3016-4", 2108a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 21147bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 4, 2125469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 213a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2148edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 2154aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2164aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2170ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 218dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 219dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3100_16_4] = { 2206abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3100-16-4", 2218a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 22247bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 2235469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 224a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2258edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 226fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2270ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 228dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 229dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3100_8_4] = { 2306abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3100-8-4", 2318a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 23247bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 2335469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 234a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2358edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 236fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2370ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 238dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 239dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3106_16_4] = { 2406abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3106-16-4", 2418a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 24247bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 2435469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 244a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2458edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 246fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2470ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 248dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 249dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3106_8_4] = { 2506abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3106-8-4", 2518a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 25247bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 2535469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 254a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2558edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 10000, 256fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2570ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 258dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 259dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3110_16_4] = { 2606abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3110-16-4", 2618a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 26247bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 2635469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 264a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2658edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 266fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 2674aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 2684aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 2690ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 270dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 271dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3110_8_4] = { 2726abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3110-8-4", 2738a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 27447bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 2755469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0x0fff, 276a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2778edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 278fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 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_APCI3116_16_4] = { 2846abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3116-16-4", 2858a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 28647bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 16, 2875469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 288a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 2898edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 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_8_4] = { 2966abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3116-8-4", 2978a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_COMMON | SDF_GROUND | SDF_DIFF, 29847bd1ad800470f4786f7d35379798a7a10aff84cH Hartley Sweeten .ai_n_chan = 8, 2995469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 300a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 3018edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 302fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 3034aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3044aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 3050ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 306dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 307dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3003] = { 3086abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3003", 3098a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_DIFF, 3108d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten .ai_n_chan = 4, 3115469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 312a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US | 313a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten CONV_UNIT_NS, 3148edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 2500, 3154aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3164aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 317dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 318dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3002_16] = { 3196abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3002-16", 3208a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_DIFF, 3218d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten .ai_n_chan = 16, 3225469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 323a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 3248edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 3254aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3264aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 327dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 328dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3002_8] = { 3296abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3002-8", 3308a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_DIFF, 3318d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten .ai_n_chan = 8, 3325469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 333a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 3348edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 3354aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3364aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 337dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 338dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3002_4] = { 3396abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3002-4", 3408a1ec30d75d844d21c5034152242a087230e40e5H Hartley Sweeten .ai_subdev_flags = SDF_DIFF, 3418d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten .ai_n_chan = 4, 3425469d929087c135b5978b1f5628ec897d5c55d9fH Hartley Sweeten .ai_maxdata = 0xffff, 343a67e0cc7aa3f15a4aa3e88945cd1d2476149191fH Hartley Sweeten .ai_conv_units = CONV_UNIT_MS | CONV_UNIT_US, 3448edd44251eb35b92f381b8caf495f6cc8483bc27H Hartley Sweeten .ai_min_acq_ns = 5000, 3454aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_in = 1, 3464aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten .has_dig_out = 1, 347dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten }, 348dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten [BOARD_APCI3500] = { 3496abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten .name = "apci3500", 350fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten .has_ao = 1, 3510ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten .has_ttl_io = 1, 352c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten }, 353c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten}; 354c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten 3551867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweetenstruct apci3xxx_private { 356f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten void __iomem *mmio; 357f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int ai_timer; 358f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned char ai_time_base; 3591867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten}; 3601867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten 3616c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweetenstatic irqreturn_t apci3xxx_irq_handler(int irq, void *d) 3626c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten{ 3636c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten struct comedi_device *dev = d; 3641867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 365f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten struct comedi_subdevice *s = dev->read_subdev; 3666c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten unsigned int status; 367f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int val; 3686c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 3696c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Test if interrupt occur */ 370f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten status = readl(devpriv->mmio + 16); 3716c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten if ((status & 0x2) == 0x2) { 3726c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten /* Reset the interrupt */ 373f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(status, devpriv->mmio + 16); 3746c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 375f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten val = readl(devpriv->mmio + 28); 376f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten comedi_buf_put(s->async, val); 377f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 378f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten s->async->events |= COMEDI_CB_EOA; 379f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten comedi_event(dev, s); 380f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 381f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return IRQ_HANDLED; 382f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten } 383f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return IRQ_NONE; 384f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten} 385f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 386f32376e993a7657198974e713577152ac67833dbH Hartley Sweetenstatic int apci3xxx_ai_started(struct comedi_device *dev) 387f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten{ 388f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 389f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 390f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if ((readl(devpriv->mmio + 8) & 0x80000) == 0x80000) 391f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return 1; 392f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten else 393f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return 0; 394f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 395f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten} 396f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 397f32376e993a7657198974e713577152ac67833dbH Hartley Sweetenstatic int apci3xxx_ai_setup(struct comedi_device *dev, unsigned int chanspec) 398f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten{ 399f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 400f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int chan = CR_CHAN(chanspec); 401f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int range = CR_RANGE(chanspec); 402f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int aref = CR_AREF(chanspec); 403f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int delay_mode; 404f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int val; 405f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 406f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (apci3xxx_ai_started(dev)) 407f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return -EBUSY; 408f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 409f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Clear the FIFO */ 410f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(0x10000, devpriv->mmio + 12); 411f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 412f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Get and save the delay mode */ 413f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten delay_mode = readl(devpriv->mmio + 4); 414f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten delay_mode &= 0xfffffef0; 415f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 416f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Channel configuration selection */ 417f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(delay_mode, devpriv->mmio + 4); 418f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 419f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Make the configuration */ 420f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten val = (range & 3) | ((range >> 2) << 6) | 421f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten ((aref == AREF_DIFF) << 7); 422f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(val, devpriv->mmio + 0); 423f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 424f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Channel selection */ 425f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(delay_mode | 0x100, devpriv->mmio + 4); 426f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(chan, devpriv->mmio + 0); 427f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 428f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Restore delay mode */ 429f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(delay_mode, devpriv->mmio + 4); 430f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 431f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Set the number of sequence to 1 */ 432f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(1, devpriv->mmio + 48); 433f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 434f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return 0; 435f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten} 436f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 437f32376e993a7657198974e713577152ac67833dbH Hartley Sweetenstatic int apci3xxx_ai_insn_read(struct comedi_device *dev, 438f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten struct comedi_subdevice *s, 439f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten struct comedi_insn *insn, 440f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int *data) 441f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten{ 442f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 443f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int val; 444f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten int ret; 445f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten int i; 446f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 447f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten ret = apci3xxx_ai_setup(dev, insn->chanspec); 448f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (ret) 449f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return ret; 450f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 451f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten for (i = 0; i < insn->n; i++) { 452f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Start the conversion */ 453f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(0x80000, devpriv->mmio + 8); 454f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 455f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Wait the EOS */ 456f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten do { 457f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten val = readl(devpriv->mmio + 20); 458f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten val &= 0x1; 459f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten } while (!val); 460f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 461f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Read the analog value */ 462f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten data[i] = readl(devpriv->mmio + 28); 463f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten } 4646c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 465f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return insn->n; 466f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten} 467f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 468f32376e993a7657198974e713577152ac67833dbH Hartley Sweetenstatic int apci3xxx_ai_ns_to_timer(struct comedi_device *dev, 469f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int *ns, int round_mode) 470f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten{ 471f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten const struct apci3xxx_boardinfo *board = comedi_board(dev); 472f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 473f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int base; 474f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int timer; 475f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten int time_base; 476f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 477f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* time_base: 0 = ns, 1 = us, 2 = ms */ 478f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten for (time_base = 0; time_base < 3; time_base++) { 479f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* skip unsupported time bases */ 480f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (!(board->ai_conv_units & (1 << time_base))) 481f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten continue; 482f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 483f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten switch (time_base) { 484f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten case 0: 485f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten base = 1; 486f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten break; 487f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten case 1: 488f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten base = 1000; 489f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten break; 490f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten case 2: 491f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten base = 1000000; 492f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten break; 493f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten } 4946c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 495f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten switch (round_mode) { 496f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten case TRIG_ROUND_NEAREST: 497f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten default: 498f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten timer = (*ns + base / 2) / base; 499f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten break; 500f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten case TRIG_ROUND_DOWN: 501f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten timer = *ns / base; 502f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten break; 503f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten case TRIG_ROUND_UP: 504f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten timer = (*ns + base - 1) / base; 505f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten break; 506f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten } 5076c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 508f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (timer < 0x10000) { 509f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten devpriv->ai_time_base = time_base; 510f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten devpriv->ai_timer = timer; 511f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten *ns = timer * time_base; 512f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return 0; 5136c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten } 5146c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten } 515f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return -EINVAL; 5166c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten} 5176c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 51866573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweetenstatic int apci3xxx_ai_cmdtest(struct comedi_device *dev, 51966573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten struct comedi_subdevice *s, 52066573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten struct comedi_cmd *cmd) 52166573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten{ 522f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten const struct apci3xxx_boardinfo *board = comedi_board(dev); 523f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten int err = 0; 524f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int tmp; 525f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 526f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Step 1 : check if triggers are trivially valid */ 527f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 528f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_src(&cmd->start_src, TRIG_NOW); 529f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_src(&cmd->scan_begin_src, TRIG_FOLLOW); 530f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_src(&cmd->convert_src, TRIG_TIMER); 531f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT); 532f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_src(&cmd->stop_src, TRIG_COUNT | TRIG_NONE); 533f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 534f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (err) 535f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return 1; 536f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 537f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Step 2a : make sure trigger sources are unique */ 538f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 539f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_is_unique(cmd->stop_src); 540f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 541f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Step 2b : and mutually compatible */ 542f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 543f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (err) 544f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return 2; 545f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 546f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Step 3: check if arguments are trivially valid */ 547f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 548f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_arg_is(&cmd->start_arg, 0); 549f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_arg_is(&cmd->scan_begin_arg, 0); 550f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_arg_min(&cmd->convert_arg, 551f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten board->ai_min_acq_ns); 552f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len); 553f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 554f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (cmd->stop_src == TRIG_COUNT) 555f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_arg_min(&cmd->stop_arg, 1); 556f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten else /* TRIG_NONE */ 557f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_arg_is(&cmd->stop_arg, 0); 558f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 559f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (err) 560f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return 3; 561f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 562f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* step 4: fix up any arguments */ 563f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 564f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* 565f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten * FIXME: The hardware supports multiple scan modes but the original 566f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten * addi-data driver only supported reading a single channel with 567f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten * interrupts. Need a proper datasheet to fix this. 568f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten * 569f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten * The following scan modes are supported by the hardware: 570f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten * 1) Single software scan 571f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten * 2) Single hardware triggered scan 572f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten * 3) Continuous software scan 573f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten * 4) Continuous software scan with timer delay 574f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten * 5) Continuous hardware triggered scan 575f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten * 6) Continuous hardware triggered scan with timer delay 576f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten * 577f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten * For now, limit the chanlist to a single channel. 578f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten */ 579f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (cmd->chanlist_len > 1) { 580f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten cmd->chanlist_len = 1; 581f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= -EINVAL; 582f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten } 583f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 584f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten tmp = cmd->convert_arg; 585f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= apci3xxx_ai_ns_to_timer(dev, &cmd->convert_arg, 586f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten cmd->flags & TRIG_ROUND_MASK); 587f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (tmp != cmd->convert_arg) 588f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= -EINVAL; 589f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 590f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (err) 591f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return 4; 592f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 59366573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten return 0; 59466573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten} 59566573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten 59666573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweetenstatic int apci3xxx_ai_cmd(struct comedi_device *dev, 59766573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten struct comedi_subdevice *s) 59866573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten{ 599f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 600f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten struct comedi_cmd *cmd = &s->async->cmd; 601f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten int ret; 602f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 603f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten ret = apci3xxx_ai_setup(dev, cmd->chanlist[0]); 604f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (ret) 605f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return ret; 606f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 607f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Set the convert timing unit */ 608f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(devpriv->ai_time_base, devpriv->mmio + 36); 609f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 610f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Set the convert timing */ 611f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(devpriv->ai_timer, devpriv->mmio + 32); 612f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 613f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Start the conversion */ 614f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(0x180000, devpriv->mmio + 8); 615f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 61666573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten return 0; 61766573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten} 61866573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten 61966573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweetenstatic int apci3xxx_ai_cancel(struct comedi_device *dev, 62066573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten struct comedi_subdevice *s) 62166573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten{ 62266573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten return 0; 62366573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten} 62466573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten 6250e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweetenstatic int apci3xxx_ao_insn_write(struct comedi_device *dev, 6260e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten struct comedi_subdevice *s, 6270e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten struct comedi_insn *insn, 6280e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int *data) 6290e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten{ 6300e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 6310e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int chan = CR_CHAN(insn->chanspec); 6320e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int range = CR_RANGE(insn->chanspec); 6330e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int status; 6340e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten int i; 6350e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 6360e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten for (i = 0; i < insn->n; i++) { 6370e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Set the range selection */ 638f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(range, devpriv->mmio + 96); 6390e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 6400e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Write the analog value to the selected channel */ 641f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel((data[i] << 8) | chan, devpriv->mmio + 100); 6420e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 6430e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Wait the end of transfer */ 6440e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten do { 645f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten status = readl(devpriv->mmio + 96); 6460e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten } while ((status & 0x100) != 0x100); 6470e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten } 6480e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 6490e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten return insn->n; 6500e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten} 6510e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 652ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweetenstatic int apci3xxx_di_insn_bits(struct comedi_device *dev, 653ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten struct comedi_subdevice *s, 654ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten struct comedi_insn *insn, 655ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten unsigned int *data) 656ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten{ 657dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten data[1] = inl(dev->iobase + 32) & 0xf; 658ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten 659ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten return insn->n; 660ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten} 661ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten 662c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweetenstatic int apci3xxx_do_insn_bits(struct comedi_device *dev, 663c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten struct comedi_subdevice *s, 664c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten struct comedi_insn *insn, 665c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten unsigned int *data) 666c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten{ 667dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten s->state = inl(dev->iobase + 48) & 0xf; 668c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 66997f4289ad08cffe55de06d4ac4f89ac540450aeeH Hartley Sweeten if (comedi_dio_update_state(s, data)) 670dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl(s->state, dev->iobase + 48); 671c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 672c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten data[1] = s->state; 673c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 674c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten return insn->n; 675c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten} 676c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 677da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweetenstatic int apci3xxx_dio_insn_config(struct comedi_device *dev, 678da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_subdevice *s, 679da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_insn *insn, 680da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int *data) 681da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten{ 682da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int chan = CR_CHAN(insn->chanspec); 6835dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten unsigned int mask; 6845dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten int ret; 685da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 686da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten /* 687da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 0 (channels 0-7) are always inputs 688da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 1 (channels 8-15) are always outputs 689da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 2 (channels 16-23) are programmable i/o 690da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten */ 6915dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten if (chan < 16) { 6925dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten if (data[0] != INSN_CONFIG_DIO_QUERY) 6935dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten return -EINVAL; 6945dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten } else { 6955dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten /* changing any channel in port 2 changes the entire port */ 6965dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten mask = 0xff0000; 697da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten } 698da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 6995dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten ret = comedi_dio_insn_config(dev, s, insn, data, mask); 7005dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten if (ret) 7015dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten return ret; 7025dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten 703da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten /* update port 2 configuration */ 7045dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten outl((s->io_bits >> 24) & 0xff, dev->iobase + 224); 705da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 706da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return insn->n; 707da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten} 708da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 709da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweetenstatic int apci3xxx_dio_insn_bits(struct comedi_device *dev, 710da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_subdevice *s, 711da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_insn *insn, 712da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int *data) 713da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten{ 714ca5d4a20fb65a2ab2ad3c2797d7639d3dc64c147H Hartley Sweeten unsigned int mask; 715da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int val; 716da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 717ca5d4a20fb65a2ab2ad3c2797d7639d3dc64c147H Hartley Sweeten mask = comedi_dio_update_state(s, data); 718da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask) { 719da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask & 0xff) 720dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl(s->state & 0xff, dev->iobase + 80); 721da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask & 0xff0000) 722dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl((s->state >> 16) & 0xff, dev->iobase + 112); 723da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten } 724da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 725dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val = inl(dev->iobase + 80); 726dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 64) << 8); 727da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (s->io_bits & 0xff0000) 728dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 112) << 16); 729da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten else 730dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 96) << 16); 731da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 732da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten data[1] = val; 733da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 734da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return insn->n; 735da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten} 736da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 7375e72c7a50709e60663217704b30501bf34afa448H Hartley Sweetenstatic int apci3xxx_reset(struct comedi_device *dev) 73898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{ 7391867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 7405e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten unsigned int val; 7415e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten int i; 7425e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7435e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Disable the interrupt */ 7445e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten disable_irq(dev->irq); 7455e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7465e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Clear the start command */ 747f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(0, devpriv->mmio + 8); 7485e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7495e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Reset the interrupt flags */ 750f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten val = readl(devpriv->mmio + 16); 751f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(val, devpriv->mmio + 16); 7525e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7535e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* clear the EOS */ 754f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten readl(devpriv->mmio + 20); 7555e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7565e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Clear the FIFO */ 7575e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten for (i = 0; i < 16; i++) 758f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten val = readl(devpriv->mmio + 28); 7595e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7605e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Enable the interrupt */ 7615e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten enable_irq(dev->irq); 76298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 76398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return 0; 76498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten} 76598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 766dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenstatic int apci3xxx_auto_attach(struct comedi_device *dev, 767dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten unsigned long context) 768dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten{ 76998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten struct pci_dev *pcidev = comedi_to_pci_dev(dev); 770e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten const struct apci3xxx_boardinfo *board = NULL; 7711867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv; 77298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten struct comedi_subdevice *s; 773656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten int n_subdevices; 774656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten int subdev; 775656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten int ret; 776dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 777dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten if (context < ARRAY_SIZE(apci3xxx_boardtypes)) 778dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten board = &apci3xxx_boardtypes[context]; 779dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten if (!board) 780dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten return -ENODEV; 781dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten dev->board_ptr = board; 7826abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten dev->board_name = board->name; 78398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 7840bdab509bf9c6d838dc0a3b1d68bbf841fc20b5aH Hartley Sweeten devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv)); 78598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (!devpriv) 78698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return -ENOMEM; 78798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 78898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten ret = comedi_pci_enable(dev); 78998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret) 79098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return ret; 79198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 7922107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten dev->iobase = pci_resource_start(pcidev, 2); 793f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten devpriv->mmio = pci_ioremap_bar(pcidev, 3); 79498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 79598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (pcidev->irq > 0) { 7966c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten ret = request_irq(pcidev->irq, apci3xxx_irq_handler, 7976c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten IRQF_SHARED, dev->board_name, dev); 79898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret == 0) 79998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten dev->irq = pcidev->irq; 80098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 80198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 802656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten n_subdevices = (board->ai_n_chan ? 0 : 1) + board->has_ao + 803656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten board->has_dig_in + board->has_dig_out + 804656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten board->has_ttl_io; 80598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten ret = comedi_alloc_subdevices(dev, n_subdevices); 80698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret) 80798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return ret; 80898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 809656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev = 0; 810656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten 811308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten /* Analog Input subdevice */ 8128d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten if (board->ai_n_chan) { 813656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten s = &dev->subdevices[subdev]; 814308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->type = COMEDI_SUBD_AI; 815308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->subdev_flags = SDF_READABLE | board->ai_subdev_flags; 816308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->n_chan = board->ai_n_chan; 817308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->maxdata = board->ai_maxdata; 818308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->len_chanlist = s->n_chan; 819308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->range_table = &apci3xxx_ai_range; 820308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->insn_read = apci3xxx_ai_insn_read; 82166573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten if (dev->irq) { 82266573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten dev->read_subdev = s; 82366573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten s->subdev_flags |= SDF_CMD_READ; 82466573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten s->do_cmdtest = apci3xxx_ai_cmdtest; 82566573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten s->do_cmd = apci3xxx_ai_cmd; 82666573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten s->cancel = apci3xxx_ai_cancel; 82766573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten } 828656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten 829656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev++; 83098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 83198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 8320e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Analog Output subdevice */ 833fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten if (board->has_ao) { 834656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten s = &dev->subdevices[subdev]; 8350e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->type = COMEDI_SUBD_AO; 8360e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; 8370e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->n_chan = 4; 8380e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->maxdata = 0x0fff; 8390e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->range_table = &apci3xxx_ao_range; 8400e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->insn_write = apci3xxx_ao_insn_write; 841656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten 842656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev++; 84398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 844ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten 845ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten /* Digital Input subdevice */ 8464aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten if (board->has_dig_in) { 847656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten s = &dev->subdevices[subdev]; 848ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_DI; 849ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->subdev_flags = SDF_READABLE; 850ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->n_chan = 4; 851ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->maxdata = 1; 852ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->range_table = &range_digital; 853ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->insn_bits = apci3xxx_di_insn_bits; 854656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten 855656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev++; 85698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 857ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten 858ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten /* Digital Output subdevice */ 8594aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten if (board->has_dig_out) { 860656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten s = &dev->subdevices[subdev]; 861ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_DO; 862ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->subdev_flags = SDF_WRITEABLE; 863ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->n_chan = 4; 864ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->maxdata = 1; 865ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->range_table = &range_digital; 866ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->insn_bits = apci3xxx_do_insn_bits; 86798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 868656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev++; 869656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten } 87098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 871383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten /* TTL Digital I/O subdevice */ 8720ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten if (board->has_ttl_io) { 873656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten s = &dev->subdevices[subdev]; 874383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->type = COMEDI_SUBD_DIO; 875383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->subdev_flags = SDF_READABLE | SDF_WRITEABLE; 876383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->n_chan = 24; 877383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->maxdata = 1; 878383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->io_bits = 0xff; /* channels 0-7 are always outputs */ 879383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->range_table = &range_digital; 880da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->insn_config = apci3xxx_dio_insn_config; 881da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->insn_bits = apci3xxx_dio_insn_bits; 88298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 883656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev++; 884656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten } 88598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 8865e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten apci3xxx_reset(dev); 88798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return 0; 88898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten} 88998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 89098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweetenstatic void apci3xxx_detach(struct comedi_device *dev) 89198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{ 8921867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 893dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 89498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (devpriv) { 89598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (dev->iobase) 8965e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten apci3xxx_reset(dev); 89798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (dev->irq) 89898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten free_irq(dev->irq, dev); 899f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten if (devpriv->mmio) 900f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten iounmap(devpriv->mmio); 90198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 90298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten comedi_pci_disable(dev); 903dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten} 904dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 90520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct comedi_driver apci3xxx_driver = { 90620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .driver_name = "addi_apci_3xxx", 90720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .module = THIS_MODULE, 908dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten .auto_attach = apci3xxx_auto_attach, 90998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten .detach = apci3xxx_detach, 91020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}; 91120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten 912a690b7e535f2f97a3a05ee570715abeb60a8910fBill Pembertonstatic int apci3xxx_pci_probe(struct pci_dev *dev, 913b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten const struct pci_device_id *id) 91420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten{ 915b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten return comedi_pci_auto_config(dev, &apci3xxx_driver, id->driver_data); 91620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten} 91720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten 91841e043fcfa2236bb2c4a8335eb09f4c8cee224b3Jingoo Hanstatic const struct pci_device_id apci3xxx_pci_table[] = { 919dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3010), BOARD_APCI3000_16 }, 920dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300f), BOARD_APCI3000_8 }, 921dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300e), BOARD_APCI3000_4 }, 922dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3013), BOARD_APCI3006_16 }, 923dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3014), BOARD_APCI3006_8 }, 924dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3015), BOARD_APCI3006_4 }, 925dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3016), BOARD_APCI3010_16 }, 926dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3017), BOARD_APCI3010_8 }, 927dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3018), BOARD_APCI3010_4 }, 928dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3019), BOARD_APCI3016_16 }, 929dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301a), BOARD_APCI3016_8 }, 930dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301b), BOARD_APCI3016_4 }, 931dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301c), BOARD_APCI3100_16_4 }, 932dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301d), BOARD_APCI3100_8_4 }, 933dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301e), BOARD_APCI3106_16_4 }, 934dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301f), BOARD_APCI3106_8_4 }, 935dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3020), BOARD_APCI3110_16_4 }, 936dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3021), BOARD_APCI3110_8_4 }, 937dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3022), BOARD_APCI3116_16_4 }, 938dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3023), BOARD_APCI3116_8_4 }, 939dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300B), BOARD_APCI3003 }, 940dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3002), BOARD_APCI3002_16 }, 941dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3003), BOARD_APCI3002_8 }, 942dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3004), BOARD_APCI3002_4 }, 943dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3024), BOARD_APCI3500 }, 944317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten { 0 } 945317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten}; 94620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley SweetenMODULE_DEVICE_TABLE(pci, apci3xxx_pci_table); 947317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten 94820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct pci_driver apci3xxx_pci_driver = { 94920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .name = "addi_apci_3xxx", 95020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .id_table = apci3xxx_pci_table, 95120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .probe = apci3xxx_pci_probe, 9529901a4d75d007686e8f6473189cafc4b216b7449Peter Huewe .remove = comedi_pci_auto_unconfig, 95320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}; 95420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenmodule_comedi_pci_driver(apci3xxx_driver, apci3xxx_pci_driver); 95590f703d30dd3e0c16ff80f35e34e511385a05ad5Arun Thomas 95690f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_AUTHOR("Comedi http://www.comedi.org"); 95790f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_DESCRIPTION("Comedi low-level driver"); 95890f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_LICENSE("GPL"); 959