addi_apci_3xxx.c revision ce157f8032bbd46d9427034c335b0afd751da25d
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{ 667c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten unsigned int mask = data[0]; 668c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten unsigned int bits = data[1]; 669c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 670dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten s->state = inl(dev->iobase + 48) & 0xf; 671c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten if (mask) { 672c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten s->state &= ~mask; 673c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten s->state |= (bits & mask); 674c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 675dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl(s->state, dev->iobase + 48); 676c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten } 677c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 678c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten data[1] = s->state; 679c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 680c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten return insn->n; 681c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten} 682c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 683da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweetenstatic int apci3xxx_dio_insn_config(struct comedi_device *dev, 684da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_subdevice *s, 685da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_insn *insn, 686da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int *data) 687da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten{ 688da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int chan = CR_CHAN(insn->chanspec); 689da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int mask = 1 << chan; 690da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int bits; 691da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 692da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten /* 693da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 0 (channels 0-7) are always inputs 694da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 1 (channels 8-15) are always outputs 695da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 2 (channels 16-23) are programmable i/o 696da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * 697da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Changing any channel in port 2 changes the entire port. 698da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten */ 699da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask & 0xff0000) 700da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten bits = 0xff0000; 701da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten else 702da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten bits = 0; 703da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 704da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten switch (data[0]) { 705da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten case INSN_CONFIG_DIO_INPUT: 706da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->io_bits &= ~bits; 707da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten break; 708da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten case INSN_CONFIG_DIO_OUTPUT: 709da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->io_bits |= bits; 710da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten break; 711da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten case INSN_CONFIG_DIO_QUERY: 712da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten data[1] = (s->io_bits & bits) ? COMEDI_OUTPUT : COMEDI_INPUT; 713da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return insn->n; 714da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten default: 715da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return -EINVAL; 716da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten } 717da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 718da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten /* update port 2 configuration */ 719da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (bits) 720dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl((s->io_bits >> 24) & 0xff, dev->iobase + 224); 721da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 722da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return insn->n; 723da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten} 724da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 725da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweetenstatic int apci3xxx_dio_insn_bits(struct comedi_device *dev, 726da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_subdevice *s, 727da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_insn *insn, 728da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int *data) 729da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten{ 730da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int mask = data[0]; 731da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int bits = data[1]; 732da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int val; 733da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 734da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten /* only update output channels */ 735da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten mask &= s->io_bits; 736da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask) { 737da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->state &= ~mask; 738da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->state |= (bits & mask); 739da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 740da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask & 0xff) 741dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl(s->state & 0xff, dev->iobase + 80); 742da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask & 0xff0000) 743dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl((s->state >> 16) & 0xff, dev->iobase + 112); 744da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten } 745da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 746dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val = inl(dev->iobase + 80); 747dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 64) << 8); 748da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (s->io_bits & 0xff0000) 749dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 112) << 16); 750da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten else 751dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 96) << 16); 752da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 753da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten data[1] = val; 754da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 755da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return insn->n; 756da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten} 757da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 7585e72c7a50709e60663217704b30501bf34afa448H Hartley Sweetenstatic int apci3xxx_reset(struct comedi_device *dev) 75998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{ 7601867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 7615e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten unsigned int val; 7625e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten int i; 7635e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7645e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Disable the interrupt */ 7655e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten disable_irq(dev->irq); 7665e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7675e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Clear the start command */ 768f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(0, devpriv->mmio + 8); 7695e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7705e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Reset the interrupt flags */ 771f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten val = readl(devpriv->mmio + 16); 772f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(val, devpriv->mmio + 16); 7735e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7745e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* clear the EOS */ 775f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten readl(devpriv->mmio + 20); 7765e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7775e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Clear the FIFO */ 7785e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten for (i = 0; i < 16; i++) 779f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten val = readl(devpriv->mmio + 28); 7805e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7815e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Enable the interrupt */ 7825e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten enable_irq(dev->irq); 78398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 78498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return 0; 78598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten} 78698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 787dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenstatic int apci3xxx_auto_attach(struct comedi_device *dev, 788dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten unsigned long context) 789dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten{ 79098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten struct pci_dev *pcidev = comedi_to_pci_dev(dev); 791e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten const struct apci3xxx_boardinfo *board = NULL; 7921867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv; 79398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten struct comedi_subdevice *s; 794656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten int n_subdevices; 795656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten int subdev; 796656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten int ret; 797dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 798dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten if (context < ARRAY_SIZE(apci3xxx_boardtypes)) 799dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten board = &apci3xxx_boardtypes[context]; 800dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten if (!board) 801dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten return -ENODEV; 802dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten dev->board_ptr = board; 8036abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten dev->board_name = board->name; 80498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 8050bdab509bf9c6d838dc0a3b1d68bbf841fc20b5aH Hartley Sweeten devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv)); 80698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (!devpriv) 80798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return -ENOMEM; 80898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 80998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten ret = comedi_pci_enable(dev); 81098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret) 81198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return ret; 81298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 8132107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten dev->iobase = pci_resource_start(pcidev, 2); 814f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten devpriv->mmio = pci_ioremap_bar(pcidev, 3); 81598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 81698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (pcidev->irq > 0) { 8176c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten ret = request_irq(pcidev->irq, apci3xxx_irq_handler, 8186c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten IRQF_SHARED, dev->board_name, dev); 81998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret == 0) 82098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten dev->irq = pcidev->irq; 82198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 82298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 823656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten n_subdevices = (board->ai_n_chan ? 0 : 1) + board->has_ao + 824656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten board->has_dig_in + board->has_dig_out + 825656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten board->has_ttl_io; 82698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten ret = comedi_alloc_subdevices(dev, n_subdevices); 82798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret) 82898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return ret; 82998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 830656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev = 0; 831656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten 832308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten /* Analog Input subdevice */ 8338d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten if (board->ai_n_chan) { 834656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten s = &dev->subdevices[subdev]; 835308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->type = COMEDI_SUBD_AI; 836308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->subdev_flags = SDF_READABLE | board->ai_subdev_flags; 837308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->n_chan = board->ai_n_chan; 838308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->maxdata = board->ai_maxdata; 839308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->len_chanlist = s->n_chan; 840308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->range_table = &apci3xxx_ai_range; 841308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->insn_read = apci3xxx_ai_insn_read; 84266573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten if (dev->irq) { 84366573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten dev->read_subdev = s; 84466573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten s->subdev_flags |= SDF_CMD_READ; 84566573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten s->do_cmdtest = apci3xxx_ai_cmdtest; 84666573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten s->do_cmd = apci3xxx_ai_cmd; 84766573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten s->cancel = apci3xxx_ai_cancel; 84866573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten } 849656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten 850656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev++; 85198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 85298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 8530e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Analog Output subdevice */ 854fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten if (board->has_ao) { 855656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten s = &dev->subdevices[subdev]; 8560e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->type = COMEDI_SUBD_AO; 8570e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; 8580e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->n_chan = 4; 8590e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->maxdata = 0x0fff; 8600e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->range_table = &apci3xxx_ao_range; 8610e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->insn_write = apci3xxx_ao_insn_write; 862656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten 863656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev++; 86498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 865ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten 866ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten /* Digital Input subdevice */ 8674aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten if (board->has_dig_in) { 868656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten s = &dev->subdevices[subdev]; 869ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_DI; 870ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->subdev_flags = SDF_READABLE; 871ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->n_chan = 4; 872ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->maxdata = 1; 873ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->range_table = &range_digital; 874ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->insn_bits = apci3xxx_di_insn_bits; 875656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten 876656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev++; 87798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 878ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten 879ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten /* Digital Output subdevice */ 8804aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten if (board->has_dig_out) { 881656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten s = &dev->subdevices[subdev]; 882ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_DO; 883ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->subdev_flags = SDF_WRITEABLE; 884ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->n_chan = 4; 885ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->maxdata = 1; 886ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->range_table = &range_digital; 887ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->insn_bits = apci3xxx_do_insn_bits; 88898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 889656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev++; 890656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten } 89198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 892383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten /* TTL Digital I/O subdevice */ 8930ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten if (board->has_ttl_io) { 894656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten s = &dev->subdevices[subdev]; 895383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->type = COMEDI_SUBD_DIO; 896383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->subdev_flags = SDF_READABLE | SDF_WRITEABLE; 897383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->n_chan = 24; 898383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->maxdata = 1; 899383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->io_bits = 0xff; /* channels 0-7 are always outputs */ 900383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->range_table = &range_digital; 901da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->insn_config = apci3xxx_dio_insn_config; 902da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->insn_bits = apci3xxx_dio_insn_bits; 90398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 904656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev++; 905656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten } 90698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 9075e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten apci3xxx_reset(dev); 90898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return 0; 90998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten} 91098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 91198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweetenstatic void apci3xxx_detach(struct comedi_device *dev) 91298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{ 9131867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 914dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 91598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (devpriv) { 91698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (dev->iobase) 9175e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten apci3xxx_reset(dev); 91898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (dev->irq) 91998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten free_irq(dev->irq, dev); 920f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten if (devpriv->mmio) 921f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten iounmap(devpriv->mmio); 92298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 92398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten comedi_pci_disable(dev); 924dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten} 925dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 92620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct comedi_driver apci3xxx_driver = { 92720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .driver_name = "addi_apci_3xxx", 92820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .module = THIS_MODULE, 929dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten .auto_attach = apci3xxx_auto_attach, 93098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten .detach = apci3xxx_detach, 93120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}; 93220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten 933a690b7e535f2f97a3a05ee570715abeb60a8910fBill Pembertonstatic int apci3xxx_pci_probe(struct pci_dev *dev, 934b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten const struct pci_device_id *id) 93520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten{ 936b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten return comedi_pci_auto_config(dev, &apci3xxx_driver, id->driver_data); 93720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten} 93820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten 93920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic DEFINE_PCI_DEVICE_TABLE(apci3xxx_pci_table) = { 940dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3010), BOARD_APCI3000_16 }, 941dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300f), BOARD_APCI3000_8 }, 942dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300e), BOARD_APCI3000_4 }, 943dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3013), BOARD_APCI3006_16 }, 944dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3014), BOARD_APCI3006_8 }, 945dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3015), BOARD_APCI3006_4 }, 946dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3016), BOARD_APCI3010_16 }, 947dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3017), BOARD_APCI3010_8 }, 948dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3018), BOARD_APCI3010_4 }, 949dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3019), BOARD_APCI3016_16 }, 950dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301a), BOARD_APCI3016_8 }, 951dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301b), BOARD_APCI3016_4 }, 952dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301c), BOARD_APCI3100_16_4 }, 953dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301d), BOARD_APCI3100_8_4 }, 954dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301e), BOARD_APCI3106_16_4 }, 955dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301f), BOARD_APCI3106_8_4 }, 956dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3020), BOARD_APCI3110_16_4 }, 957dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3021), BOARD_APCI3110_8_4 }, 958dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3022), BOARD_APCI3116_16_4 }, 959dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3023), BOARD_APCI3116_8_4 }, 960dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300B), BOARD_APCI3003 }, 961dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3002), BOARD_APCI3002_16 }, 962dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3003), BOARD_APCI3002_8 }, 963dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3004), BOARD_APCI3002_4 }, 964dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3024), BOARD_APCI3500 }, 965317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten { 0 } 966317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten}; 96720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley SweetenMODULE_DEVICE_TABLE(pci, apci3xxx_pci_table); 968317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten 96920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct pci_driver apci3xxx_pci_driver = { 97020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .name = "addi_apci_3xxx", 97120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .id_table = apci3xxx_pci_table, 97220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .probe = apci3xxx_pci_probe, 9739901a4d75d007686e8f6473189cafc4b216b7449Peter Huewe .remove = comedi_pci_auto_unconfig, 97420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}; 97520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenmodule_comedi_pci_driver(apci3xxx_driver, apci3xxx_pci_driver); 97690f703d30dd3e0c16ff80f35e34e511385a05ad5Arun Thomas 97790f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_AUTHOR("Comedi http://www.comedi.org"); 97890f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_DESCRIPTION("Comedi low-level driver"); 97990f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_LICENSE("GPL"); 980