addi_apci_3xxx.c revision a207c12f62e8b53e1e1600ca384b13a39a9feed2
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); 3763672effdeae5395d661a2103f69082146ef949fcIan Abbott comedi_buf_put(s, 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 3939ed221faae72ab1ad16e5f51d9f290e77af2c795H Hartley Sweeten return 0; 394f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten} 395f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 396f32376e993a7657198974e713577152ac67833dbH Hartley Sweetenstatic int apci3xxx_ai_setup(struct comedi_device *dev, unsigned int chanspec) 397f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten{ 398f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 399f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int chan = CR_CHAN(chanspec); 400f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int range = CR_RANGE(chanspec); 401f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int aref = CR_AREF(chanspec); 402f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int delay_mode; 403f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int val; 404f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 405f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (apci3xxx_ai_started(dev)) 406f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return -EBUSY; 407f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 408f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Clear the FIFO */ 409f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(0x10000, devpriv->mmio + 12); 410f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 411f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Get and save the delay mode */ 412f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten delay_mode = readl(devpriv->mmio + 4); 413f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten delay_mode &= 0xfffffef0; 414f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 415f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Channel configuration selection */ 416f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(delay_mode, devpriv->mmio + 4); 417f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 418f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Make the configuration */ 419f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten val = (range & 3) | ((range >> 2) << 6) | 420f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten ((aref == AREF_DIFF) << 7); 421f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(val, devpriv->mmio + 0); 422f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 423f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Channel selection */ 424f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(delay_mode | 0x100, devpriv->mmio + 4); 425f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(chan, devpriv->mmio + 0); 426f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 427f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Restore delay mode */ 428f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(delay_mode, devpriv->mmio + 4); 429f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 430f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Set the number of sequence to 1 */ 431f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(1, devpriv->mmio + 48); 432f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 433f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return 0; 434f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten} 435f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 43667562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweetenstatic int apci3xxx_ai_eoc(struct comedi_device *dev, 43767562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten struct comedi_subdevice *s, 43867562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten struct comedi_insn *insn, 43967562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten unsigned long context) 44067562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten{ 44167562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 44267562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten unsigned int status; 44367562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten 44467562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten status = readl(devpriv->mmio + 20); 44567562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten if (status & 0x1) 44667562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten return 0; 44767562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten return -EBUSY; 44867562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten} 44967562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten 450f32376e993a7657198974e713577152ac67833dbH Hartley Sweetenstatic int apci3xxx_ai_insn_read(struct comedi_device *dev, 451f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten struct comedi_subdevice *s, 452f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten struct comedi_insn *insn, 453f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int *data) 454f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten{ 455f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 456f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten int ret; 457f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten int i; 458f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 459f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten ret = apci3xxx_ai_setup(dev, insn->chanspec); 460f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (ret) 461f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return ret; 462f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 463f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten for (i = 0; i < insn->n; i++) { 464f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Start the conversion */ 465f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(0x80000, devpriv->mmio + 8); 466f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 467f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Wait the EOS */ 46867562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten ret = comedi_timeout(dev, s, insn, apci3xxx_ai_eoc, 0); 46967562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten if (ret) 47067562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten return ret; 471f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 472f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Read the analog value */ 473f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten data[i] = readl(devpriv->mmio + 28); 474f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten } 4756c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 476f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return insn->n; 477f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten} 478f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 479f32376e993a7657198974e713577152ac67833dbH Hartley Sweetenstatic int apci3xxx_ai_ns_to_timer(struct comedi_device *dev, 480a207c12f62e8b53e1e1600ca384b13a39a9feed2H Hartley Sweeten unsigned int *ns, unsigned int flags) 481f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten{ 482f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten const struct apci3xxx_boardinfo *board = comedi_board(dev); 483f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 484f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int base; 485f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten unsigned int timer; 486f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten int time_base; 487f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 488f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* time_base: 0 = ns, 1 = us, 2 = ms */ 489f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten for (time_base = 0; time_base < 3; time_base++) { 490f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* skip unsupported time bases */ 491f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (!(board->ai_conv_units & (1 << time_base))) 492f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten continue; 493f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 494f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten switch (time_base) { 495f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten case 0: 496f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten base = 1; 497f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten break; 498f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten case 1: 499f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten base = 1000; 500f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten break; 501f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten case 2: 502f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten base = 1000000; 503f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten break; 504f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten } 5056c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 506a207c12f62e8b53e1e1600ca384b13a39a9feed2H Hartley Sweeten switch (flags & TRIG_ROUND_MASK) { 507f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten case TRIG_ROUND_NEAREST: 508f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten default: 509f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten timer = (*ns + base / 2) / base; 510f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten break; 511f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten case TRIG_ROUND_DOWN: 512f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten timer = *ns / base; 513f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten break; 514f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten case TRIG_ROUND_UP: 515f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten timer = (*ns + base - 1) / base; 516f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten break; 517f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten } 5186c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 519f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (timer < 0x10000) { 520f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten devpriv->ai_time_base = time_base; 521f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten devpriv->ai_timer = timer; 522f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten *ns = timer * time_base; 523f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return 0; 5246c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten } 5256c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten } 526f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return -EINVAL; 5276c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten} 5286c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten 52966573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweetenstatic int apci3xxx_ai_cmdtest(struct comedi_device *dev, 53066573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten struct comedi_subdevice *s, 53166573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten struct comedi_cmd *cmd) 53266573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten{ 533f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten const struct apci3xxx_boardinfo *board = comedi_board(dev); 534f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten int err = 0; 53566e3015f6ec84f7143af0f01ce096b6cd9e1a4b9H Hartley Sweeten unsigned int arg; 536f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 537f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Step 1 : check if triggers are trivially valid */ 538f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 539f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_src(&cmd->start_src, TRIG_NOW); 540f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_src(&cmd->scan_begin_src, TRIG_FOLLOW); 541f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_src(&cmd->convert_src, TRIG_TIMER); 542f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT); 543f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_src(&cmd->stop_src, TRIG_COUNT | TRIG_NONE); 544f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 545f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (err) 546f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return 1; 547f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 548f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Step 2a : make sure trigger sources are unique */ 549f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 550f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_is_unique(cmd->stop_src); 551f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 552f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Step 2b : and mutually compatible */ 553f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 554f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (err) 555f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return 2; 556f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 557f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Step 3: check if arguments are trivially valid */ 558f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 559f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_arg_is(&cmd->start_arg, 0); 560f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_arg_is(&cmd->scan_begin_arg, 0); 561f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_arg_min(&cmd->convert_arg, 562f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten board->ai_min_acq_ns); 563f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len); 564f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 565f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (cmd->stop_src == TRIG_COUNT) 566f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_arg_min(&cmd->stop_arg, 1); 567f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten else /* TRIG_NONE */ 568f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten err |= cfc_check_trigger_arg_is(&cmd->stop_arg, 0); 569f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 570f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (err) 571f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return 3; 572f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 573f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* step 4: fix up any arguments */ 574f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 57566e3015f6ec84f7143af0f01ce096b6cd9e1a4b9H Hartley Sweeten arg = cmd->convert_arg; 576a207c12f62e8b53e1e1600ca384b13a39a9feed2H Hartley Sweeten err |= apci3xxx_ai_ns_to_timer(dev, &arg, cmd->flags); 57766e3015f6ec84f7143af0f01ce096b6cd9e1a4b9H Hartley Sweeten err |= cfc_check_trigger_arg_is(&cmd->convert_arg, arg); 578f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 579f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (err) 580f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return 4; 581f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 58266573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten return 0; 58366573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten} 58466573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten 58566573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweetenstatic int apci3xxx_ai_cmd(struct comedi_device *dev, 58666573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten struct comedi_subdevice *s) 58766573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten{ 588f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 589f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten struct comedi_cmd *cmd = &s->async->cmd; 590f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten int ret; 591f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 592f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten ret = apci3xxx_ai_setup(dev, cmd->chanlist[0]); 593f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten if (ret) 594f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten return ret; 595f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 596f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Set the convert timing unit */ 597f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(devpriv->ai_time_base, devpriv->mmio + 36); 598f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 599f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Set the convert timing */ 600f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(devpriv->ai_timer, devpriv->mmio + 32); 601f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 602f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten /* Start the conversion */ 603f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten writel(0x180000, devpriv->mmio + 8); 604f32376e993a7657198974e713577152ac67833dbH Hartley Sweeten 60566573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten return 0; 60666573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten} 60766573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten 60866573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweetenstatic int apci3xxx_ai_cancel(struct comedi_device *dev, 60966573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten struct comedi_subdevice *s) 61066573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten{ 61166573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten return 0; 61266573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten} 61366573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten 61467562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweetenstatic int apci3xxx_ao_eoc(struct comedi_device *dev, 61567562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten struct comedi_subdevice *s, 61667562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten struct comedi_insn *insn, 61767562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten unsigned long context) 61867562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten{ 61967562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 62067562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten unsigned int status; 62167562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten 62267562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten status = readl(devpriv->mmio + 96); 62367562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten if (status & 0x100) 62467562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten return 0; 62567562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten return -EBUSY; 62667562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten} 62767562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten 6280e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweetenstatic int apci3xxx_ao_insn_write(struct comedi_device *dev, 6290e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten struct comedi_subdevice *s, 6300e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten struct comedi_insn *insn, 6310e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int *data) 6320e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten{ 6330e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 6340e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int chan = CR_CHAN(insn->chanspec); 6350e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten unsigned int range = CR_RANGE(insn->chanspec); 63667562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten int ret; 6370e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten int i; 6380e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 6390e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten for (i = 0; i < insn->n; i++) { 6400e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Set the range selection */ 641f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(range, devpriv->mmio + 96); 6420e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 6430e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Write the analog value to the selected channel */ 644f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel((data[i] << 8) | chan, devpriv->mmio + 100); 6450e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 6460e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Wait the end of transfer */ 64767562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten ret = comedi_timeout(dev, s, insn, apci3xxx_ao_eoc, 0); 64867562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten if (ret) 64967562be5054f325324197cfd0f478cdc76ed57e8H Hartley Sweeten return ret; 6500e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten } 6510e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 6520e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten return insn->n; 6530e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten} 6540e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten 655ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweetenstatic int apci3xxx_di_insn_bits(struct comedi_device *dev, 656ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten struct comedi_subdevice *s, 657ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten struct comedi_insn *insn, 658ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten unsigned int *data) 659ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten{ 660dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten data[1] = inl(dev->iobase + 32) & 0xf; 661ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten 662ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten return insn->n; 663ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten} 664ae57b69639bcbd653821f7a4a14b87f6fa6743c0H Hartley Sweeten 665c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweetenstatic int apci3xxx_do_insn_bits(struct comedi_device *dev, 666c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten struct comedi_subdevice *s, 667c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten struct comedi_insn *insn, 668c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten unsigned int *data) 669c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten{ 670dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten s->state = inl(dev->iobase + 48) & 0xf; 671c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 67297f4289ad08cffe55de06d4ac4f89ac540450aeeH Hartley Sweeten if (comedi_dio_update_state(s, data)) 673dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl(s->state, dev->iobase + 48); 674c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 675c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten data[1] = s->state; 676c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 677c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten return insn->n; 678c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten} 679c3d8605fca03adb70f712512b3df0e0311ac9b61H Hartley Sweeten 680da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweetenstatic int apci3xxx_dio_insn_config(struct comedi_device *dev, 681da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_subdevice *s, 682da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_insn *insn, 683da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int *data) 684da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten{ 685da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int chan = CR_CHAN(insn->chanspec); 686b0377d4bd438d00310005190a46920cb0279106fChase Southwood unsigned int mask = 0; 6875dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten int ret; 688da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 689da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten /* 690da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 0 (channels 0-7) are always inputs 691da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 1 (channels 8-15) are always outputs 692da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten * Port 2 (channels 16-23) are programmable i/o 693da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten */ 694b0377d4bd438d00310005190a46920cb0279106fChase Southwood if (data[0] != INSN_CONFIG_DIO_QUERY) { 695b0377d4bd438d00310005190a46920cb0279106fChase Southwood /* ignore all other instructions for ports 0 and 1 */ 696b0377d4bd438d00310005190a46920cb0279106fChase Southwood if (chan < 16) 6975dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten return -EINVAL; 6989ed221faae72ab1ad16e5f51d9f290e77af2c795H Hartley Sweeten 6999ed221faae72ab1ad16e5f51d9f290e77af2c795H Hartley Sweeten /* changing any channel in port 2 changes the entire port */ 7009ed221faae72ab1ad16e5f51d9f290e77af2c795H Hartley Sweeten mask = 0xff0000; 701da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten } 702da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 7035dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten ret = comedi_dio_insn_config(dev, s, insn, data, mask); 7045dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten if (ret) 7055dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten return ret; 7065dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten 707da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten /* update port 2 configuration */ 7085dacadcca3176e2b1f8db662e503c080484d71faH Hartley Sweeten outl((s->io_bits >> 24) & 0xff, dev->iobase + 224); 709da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 710da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return insn->n; 711da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten} 712da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 713da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweetenstatic int apci3xxx_dio_insn_bits(struct comedi_device *dev, 714da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_subdevice *s, 715da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten struct comedi_insn *insn, 716da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int *data) 717da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten{ 718ca5d4a20fb65a2ab2ad3c2797d7639d3dc64c147H Hartley Sweeten unsigned int mask; 719da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten unsigned int val; 720da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 721ca5d4a20fb65a2ab2ad3c2797d7639d3dc64c147H Hartley Sweeten mask = comedi_dio_update_state(s, data); 722da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask) { 723da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask & 0xff) 724dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl(s->state & 0xff, dev->iobase + 80); 725da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (mask & 0xff0000) 726dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten outl((s->state >> 16) & 0xff, dev->iobase + 112); 727da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten } 728da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 729dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val = inl(dev->iobase + 80); 730dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 64) << 8); 731da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten if (s->io_bits & 0xff0000) 732dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 112) << 16); 733da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten else 734dc63364691322014e313d1eb740df1ade2a3b13dH Hartley Sweeten val |= (inl(dev->iobase + 96) << 16); 735da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 736da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten data[1] = val; 737da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 738da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten return insn->n; 739da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten} 740da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten 7415e72c7a50709e60663217704b30501bf34afa448H Hartley Sweetenstatic int apci3xxx_reset(struct comedi_device *dev) 74298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{ 7431867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 7445e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten unsigned int val; 7455e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten int i; 7465e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7475e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Disable the interrupt */ 7485e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten disable_irq(dev->irq); 7495e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7505e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Clear the start command */ 751f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(0, devpriv->mmio + 8); 7525e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7535e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Reset the interrupt flags */ 754f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten val = readl(devpriv->mmio + 16); 755f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten writel(val, devpriv->mmio + 16); 7565e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7575e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* clear the EOS */ 758f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten readl(devpriv->mmio + 20); 7595e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7605e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Clear the FIFO */ 7615e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten for (i = 0; i < 16; i++) 762f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten val = readl(devpriv->mmio + 28); 7635e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten 7645e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten /* Enable the interrupt */ 7655e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten enable_irq(dev->irq); 76698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 76798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return 0; 76898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten} 76998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 770dbae4575661da840353f12dd76499ad587c92519H Hartley Sweetenstatic int apci3xxx_auto_attach(struct comedi_device *dev, 771dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten unsigned long context) 772dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten{ 77398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten struct pci_dev *pcidev = comedi_to_pci_dev(dev); 774e053b2419f5f0cff8ced6a8e39a93d113d9cd86aH Hartley Sweeten const struct apci3xxx_boardinfo *board = NULL; 7751867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv; 77698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten struct comedi_subdevice *s; 777656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten int n_subdevices; 778656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten int subdev; 779656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten int ret; 780dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 781dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten if (context < ARRAY_SIZE(apci3xxx_boardtypes)) 782dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten board = &apci3xxx_boardtypes[context]; 783dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten if (!board) 784dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten return -ENODEV; 785dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten dev->board_ptr = board; 7866abeba097bb32e82a8b9e0a748224574b588d3a3H Hartley Sweeten dev->board_name = board->name; 78798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 7880bdab509bf9c6d838dc0a3b1d68bbf841fc20b5aH Hartley Sweeten devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv)); 78998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (!devpriv) 79098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return -ENOMEM; 79198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 79298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten ret = comedi_pci_enable(dev); 79398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret) 79498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return ret; 79598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 7962107347327f7bfd47e6af9fe0510a1750f10f884H Hartley Sweeten dev->iobase = pci_resource_start(pcidev, 2); 797f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten devpriv->mmio = pci_ioremap_bar(pcidev, 3); 79898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 79998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (pcidev->irq > 0) { 8006c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten ret = request_irq(pcidev->irq, apci3xxx_irq_handler, 8016c5b0fff8eb76913f0d38e72f4e68e19ea91de04H Hartley Sweeten IRQF_SHARED, dev->board_name, dev); 80298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret == 0) 80398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten dev->irq = pcidev->irq; 80498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 80598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 806656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten n_subdevices = (board->ai_n_chan ? 0 : 1) + board->has_ao + 807656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten board->has_dig_in + board->has_dig_out + 808656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten board->has_ttl_io; 80998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten ret = comedi_alloc_subdevices(dev, n_subdevices); 81098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (ret) 81198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return ret; 81298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 813656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev = 0; 814656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten 815308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten /* Analog Input subdevice */ 8168d4729066cde58c730573d6aad2ea29f8048fcb3H Hartley Sweeten if (board->ai_n_chan) { 817656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten s = &dev->subdevices[subdev]; 818308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->type = COMEDI_SUBD_AI; 819308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->subdev_flags = SDF_READABLE | board->ai_subdev_flags; 820308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->n_chan = board->ai_n_chan; 821308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->maxdata = board->ai_maxdata; 822308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->range_table = &apci3xxx_ai_range; 823308380e69625c347f88ba23da9dc0e9a58918838H Hartley Sweeten s->insn_read = apci3xxx_ai_insn_read; 82466573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten if (dev->irq) { 8257c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten /* 8267c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten * FIXME: The hardware supports multiple scan modes 8277c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten * but the original addi-data driver only supported 8287c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten * reading a single channel with interrupts. Need a 8297c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten * proper datasheet to fix this. 8307c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten * 8317c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten * The following scan modes are supported by the 8327c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten * hardware: 8337c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten * 1) Single software scan 8347c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten * 2) Single hardware triggered scan 8357c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten * 3) Continuous software scan 8367c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten * 4) Continuous software scan with timer delay 8377c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten * 5) Continuous hardware triggered scan 8387c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten * 6) Continuous hardware triggered scan with timer 8397c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten * delay 8407c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten * 8417c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten * For now, limit the chanlist to a single channel. 8427c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten */ 84366573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten dev->read_subdev = s; 84466573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten s->subdev_flags |= SDF_CMD_READ; 8457c9fc34ea3ed02d7d8356094ac179e1c63ae443bH Hartley Sweeten s->len_chanlist = 1; 84666573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten s->do_cmdtest = apci3xxx_ai_cmdtest; 84766573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten s->do_cmd = apci3xxx_ai_cmd; 84866573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten s->cancel = apci3xxx_ai_cancel; 84966573991c47f3e826f294b6ab4aa1cf967d5f426H Hartley Sweeten } 850656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten 851656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev++; 85298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 85398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 8540e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten /* Analog Output subdevice */ 855fa81e2f186fb95dac1641e1e8d6740ed559e5204H Hartley Sweeten if (board->has_ao) { 856656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten s = &dev->subdevices[subdev]; 8570e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->type = COMEDI_SUBD_AO; 8580e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; 8590e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->n_chan = 4; 8600e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->maxdata = 0x0fff; 8610e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->range_table = &apci3xxx_ao_range; 8620e771e49fc2174054bbb4927f9afe8db4e16ae0bH Hartley Sweeten s->insn_write = apci3xxx_ao_insn_write; 863656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten 864656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev++; 86598d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 866ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten 867ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten /* Digital Input subdevice */ 8684aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten if (board->has_dig_in) { 869656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten s = &dev->subdevices[subdev]; 870ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_DI; 871ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->subdev_flags = SDF_READABLE; 872ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->n_chan = 4; 873ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->maxdata = 1; 874ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->range_table = &range_digital; 875ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->insn_bits = apci3xxx_di_insn_bits; 876656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten 877656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev++; 87898d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 879ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten 880ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten /* Digital Output subdevice */ 8814aab8bfd1db3455c062c332e56790e6f046284c7H Hartley Sweeten if (board->has_dig_out) { 882656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten s = &dev->subdevices[subdev]; 883ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->type = COMEDI_SUBD_DO; 884ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->subdev_flags = SDF_WRITEABLE; 885ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->n_chan = 4; 886ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->maxdata = 1; 887ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->range_table = &range_digital; 888ca1cc85b0ea5d1c9de91ffebf4d5272bb5a61deeH Hartley Sweeten s->insn_bits = apci3xxx_do_insn_bits; 88998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 890656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev++; 891656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten } 89298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 893383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten /* TTL Digital I/O subdevice */ 8940ed9f25fbc94e8cfe6f5929e6cafa98944d51617H Hartley Sweeten if (board->has_ttl_io) { 895656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten s = &dev->subdevices[subdev]; 896383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->type = COMEDI_SUBD_DIO; 897383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->subdev_flags = SDF_READABLE | SDF_WRITEABLE; 898383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->n_chan = 24; 899383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->maxdata = 1; 900383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->io_bits = 0xff; /* channels 0-7 are always outputs */ 901383390cfd4aefad6e00d4738233aa89901211fddH Hartley Sweeten s->range_table = &range_digital; 902da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->insn_config = apci3xxx_dio_insn_config; 903da6578abd7c7535e59cae5eb0c54f5cd13902a6dH Hartley Sweeten s->insn_bits = apci3xxx_dio_insn_bits; 90498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 905656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten subdev++; 906656e39fedcf01b688a2aa1dca78c6c2a571264f1H Hartley Sweeten } 90798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 9085e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten apci3xxx_reset(dev); 90998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten return 0; 91098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten} 91198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten 91298d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweetenstatic void apci3xxx_detach(struct comedi_device *dev) 91398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten{ 9141867add98e44d4bec01572b4cfd4becd11297e5dH Hartley Sweeten struct apci3xxx_private *devpriv = dev->private; 915dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 91698d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (devpriv) { 91798d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (dev->iobase) 9185e72c7a50709e60663217704b30501bf34afa448H Hartley Sweeten apci3xxx_reset(dev); 91998d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten if (dev->irq) 92098d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten free_irq(dev->irq, dev); 921f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten if (devpriv->mmio) 922f43abbb4ff4bbe7f92c1293c3aa06c1e43da7695H Hartley Sweeten iounmap(devpriv->mmio); 92398d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten } 92498d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten comedi_pci_disable(dev); 925dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten} 926dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten 92720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct comedi_driver apci3xxx_driver = { 92820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .driver_name = "addi_apci_3xxx", 92920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .module = THIS_MODULE, 930dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten .auto_attach = apci3xxx_auto_attach, 93198d3385dd68381dd2738a825f8513366c44018b2H Hartley Sweeten .detach = apci3xxx_detach, 93220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}; 93320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten 934a690b7e535f2f97a3a05ee570715abeb60a8910fBill Pembertonstatic int apci3xxx_pci_probe(struct pci_dev *dev, 935b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten const struct pci_device_id *id) 93620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten{ 937b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten return comedi_pci_auto_config(dev, &apci3xxx_driver, id->driver_data); 93820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten} 93920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten 94041e043fcfa2236bb2c4a8335eb09f4c8cee224b3Jingoo Hanstatic const struct pci_device_id apci3xxx_pci_table[] = { 941dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3010), BOARD_APCI3000_16 }, 942dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300f), BOARD_APCI3000_8 }, 943dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300e), BOARD_APCI3000_4 }, 944dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3013), BOARD_APCI3006_16 }, 945dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3014), BOARD_APCI3006_8 }, 946dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3015), BOARD_APCI3006_4 }, 947dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3016), BOARD_APCI3010_16 }, 948dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3017), BOARD_APCI3010_8 }, 949dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3018), BOARD_APCI3010_4 }, 950dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3019), BOARD_APCI3016_16 }, 951dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301a), BOARD_APCI3016_8 }, 952dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301b), BOARD_APCI3016_4 }, 953dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301c), BOARD_APCI3100_16_4 }, 954dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301d), BOARD_APCI3100_8_4 }, 955dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301e), BOARD_APCI3106_16_4 }, 956dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x301f), BOARD_APCI3106_8_4 }, 957dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3020), BOARD_APCI3110_16_4 }, 958dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3021), BOARD_APCI3110_8_4 }, 959dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3022), BOARD_APCI3116_16_4 }, 960dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3023), BOARD_APCI3116_8_4 }, 961dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x300B), BOARD_APCI3003 }, 962dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3002), BOARD_APCI3002_16 }, 963dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3003), BOARD_APCI3002_8 }, 964dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3004), BOARD_APCI3002_4 }, 965dbae4575661da840353f12dd76499ad587c92519H Hartley Sweeten { PCI_VDEVICE(ADDIDATA, 0x3024), BOARD_APCI3500 }, 966317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten { 0 } 967317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten}; 96820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley SweetenMODULE_DEVICE_TABLE(pci, apci3xxx_pci_table); 969317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten 97020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct pci_driver apci3xxx_pci_driver = { 97120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .name = "addi_apci_3xxx", 97220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .id_table = apci3xxx_pci_table, 97320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .probe = apci3xxx_pci_probe, 9749901a4d75d007686e8f6473189cafc4b216b7449Peter Huewe .remove = comedi_pci_auto_unconfig, 97520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}; 97620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenmodule_comedi_pci_driver(apci3xxx_driver, apci3xxx_pci_driver); 97790f703d30dd3e0c16ff80f35e34e511385a05ad5Arun Thomas 97890f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_AUTHOR("Comedi http://www.comedi.org"); 97990f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_DESCRIPTION("Comedi low-level driver"); 98090f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_LICENSE("GPL"); 981