diff options
Diffstat (limited to 'drivers/staging/comedi')
22 files changed, 610 insertions, 99 deletions
diff --git a/drivers/staging/comedi/Kconfig b/drivers/staging/comedi/Kconfig index 20008a4376e..5e65dde5845 100644 --- a/drivers/staging/comedi/Kconfig +++ b/drivers/staging/comedi/Kconfig @@ -841,6 +841,16 @@ config COMEDI_DT3000 To compile this driver as a module, choose M here: the module will be called dt3000. +config COMEDI_DYNA_PCI10XX + tristate "Dynalog PCI DAQ series support" + default N + ---help--- + Enable support for Dynalog PCI DAQ series + PCI-1050 + + To compile this driver as a module, choose M here: the module will be + called dyna_pci10xx. + config COMEDI_UNIOXX5 tristate "Fastwel UNIOxx-5 analog and digital io board support" default N diff --git a/drivers/staging/comedi/comedi.h b/drivers/staging/comedi/comedi.h index 6c900e2756f..14ea35ac015 100644 --- a/drivers/staging/comedi/comedi.h +++ b/drivers/staging/comedi/comedi.h @@ -514,12 +514,16 @@ return 0x1 + pfi_channel; else return 0xb + pfi_channel; - } static inline unsigned NI_USUAL_RTSI_SELECT(unsigned rtsi_channel) { + } + + static inline unsigned NI_USUAL_RTSI_SELECT(unsigned rtsi_channel) + { if (rtsi_channel < 7) return 0xb + rtsi_channel; else return 0x1b; } + /* mode bits for NI general-purpose counters, set with * INSN_CONFIG_SET_COUNTER_MODE */ #define NI_GPCT_COUNTING_MODE_SHIFT 16 diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c index e7e72b8d8cd..e90e3cceb5f 100644 --- a/drivers/staging/comedi/comedi_fops.c +++ b/drivers/staging/comedi/comedi_fops.c @@ -383,8 +383,8 @@ static int do_devinfo_ioctl(struct comedi_device *dev, /* fill devinfo structure */ devinfo.version_code = COMEDI_VERSION_CODE; devinfo.n_subdevs = dev->n_subdevices; - memcpy(devinfo.driver_name, dev->driver->driver_name, COMEDI_NAMELEN); - memcpy(devinfo.board_name, dev->board_name, COMEDI_NAMELEN); + strlcpy(devinfo.driver_name, dev->driver->driver_name, COMEDI_NAMELEN); + strlcpy(devinfo.board_name, dev->board_name, COMEDI_NAMELEN); if (read_subdev) devinfo.read_subdevice = read_subdev - dev->subdevices; @@ -1291,10 +1291,10 @@ static int do_lock_ioctl(struct comedi_device *dev, unsigned int arg, s->lock = file; spin_unlock_irqrestore(&s->spin_lock, flags); +#if 0 if (ret < 0) return ret; -#if 0 if (s->lock_f) ret = s->lock_f(dev, s); #endif @@ -2175,9 +2175,8 @@ int comedi_alloc_board_minor(struct device *hardware_device) return -EBUSY; } info->device->minor = i; - csdev = COMEDI_DEVICE_CREATE(comedi_class, NULL, - MKDEV(COMEDI_MAJOR, i), NULL, - hardware_device, "comedi%i", i); + csdev = device_create(comedi_class, hardware_device, + MKDEV(COMEDI_MAJOR, i), NULL, "comedi%i", i); if (!IS_ERR(csdev)) info->device->class_dev = csdev; dev_set_drvdata(csdev, info); @@ -2276,10 +2275,9 @@ int comedi_alloc_subdevice_minor(struct comedi_device *dev, return -EBUSY; } s->minor = i; - csdev = COMEDI_DEVICE_CREATE(comedi_class, dev->class_dev, - MKDEV(COMEDI_MAJOR, i), NULL, NULL, - "comedi%i_subd%i", dev->minor, - (int)(s - dev->subdevices)); + csdev = device_create(comedi_class, dev->class_dev, + MKDEV(COMEDI_MAJOR, i), NULL, "comedi%i_subd%i", + dev->minor, (int)(s - dev->subdevices)); if (!IS_ERR(csdev)) s->class_dev = csdev; dev_set_drvdata(csdev, info); diff --git a/drivers/staging/comedi/comedidev.h b/drivers/staging/comedi/comedidev.h index 68aa9176d24..7a0d4bcbc35 100644 --- a/drivers/staging/comedi/comedidev.h +++ b/drivers/staging/comedi/comedidev.h @@ -61,9 +61,6 @@ #define COMEDI_NUM_BOARD_MINORS 0x30 #define COMEDI_FIRST_SUBDEVICE_MINOR COMEDI_NUM_BOARD_MINORS -#define COMEDI_DEVICE_CREATE(cs, parent, devt, drvdata, device, fmt...) \ - device_create(cs, ((parent) ? (parent) : (device)), devt, drvdata, fmt) - struct comedi_subdevice { struct comedi_device *device; int type; diff --git a/drivers/staging/comedi/drivers.c b/drivers/staging/comedi/drivers.c index 6d60e91b3a8..db1fd63aaab 100644 --- a/drivers/staging/comedi/drivers.c +++ b/drivers/staging/comedi/drivers.c @@ -502,7 +502,11 @@ int comedi_buf_alloc(struct comedi_device *dev, struct comedi_subdevice *s, } if (i == n_pages) { async->prealloc_buf = +#ifdef PAGE_KERNEL_NOCACHE vmap(pages, n_pages, VM_MAP, PAGE_KERNEL_NOCACHE); +#else + vmap(pages, n_pages, VM_MAP, PAGE_KERNEL); +#endif } vfree(pages); diff --git a/drivers/staging/comedi/drivers/Makefile b/drivers/staging/comedi/drivers/Makefile index 354fb7d2984..33bf1f5aad4 100644 --- a/drivers/staging/comedi/drivers/Makefile +++ b/drivers/staging/comedi/drivers/Makefile @@ -86,6 +86,7 @@ obj-$(CONFIG_COMEDI_AMPLC_PCI224) += amplc_pci224.o obj-$(CONFIG_COMEDI_AMPLC_PCI230) += amplc_pci230.o obj-$(CONFIG_COMEDI_CONTEC_PCI_DIO) += contec_pci_dio.o obj-$(CONFIG_COMEDI_DT3000) += dt3000.o +obj-$(CONFIG_COMEDI_DYNA_PCI10XX) += dyna_pci10xx.o obj-$(CONFIG_COMEDI_UNIOXX5) += unioxx5.o obj-$(CONFIG_COMEDI_GSC_HPDI) += gsc_hpdi.o obj-$(CONFIG_COMEDI_ICP_MULTI) += icp_multi.o diff --git a/drivers/staging/comedi/drivers/addi-data/addi_common.c b/drivers/staging/comedi/drivers/addi-data/addi_common.c index 6cf19ed683a..6fb7594319c 100644 --- a/drivers/staging/comedi/drivers/addi-data/addi_common.c +++ b/drivers/staging/comedi/drivers/addi-data/addi_common.c @@ -58,8 +58,8 @@ You should also find the complete GPL in the COPYING file accompanying this sour #include <linux/timer.h> #include <linux/pci.h> #include <linux/gfp.h> +#include <linux/io.h> #include "../../comedidev.h" -#include <asm/io.h> #if defined(CONFIG_APCI_1710) || defined(CONFIG_APCI_3200) || defined(CONFIG_APCI_3300) #include <asm/i387.h> #endif diff --git a/drivers/staging/comedi/drivers/adl_pci9118.c b/drivers/staging/comedi/drivers/adl_pci9118.c index 08b71d9974b..f17654e44ae 100644 --- a/drivers/staging/comedi/drivers/adl_pci9118.c +++ b/drivers/staging/comedi/drivers/adl_pci9118.c @@ -67,6 +67,7 @@ Configuration options: #include <linux/delay.h> #include <linux/gfp.h> #include <linux/interrupt.h> +#include <linux/io.h> #include "amcc_s5933.h" #include "8253.h" diff --git a/drivers/staging/comedi/drivers/adv_pci1723.c b/drivers/staging/comedi/drivers/adv_pci1723.c index 1b5682104a0..29455a8e88b 100644 --- a/drivers/staging/comedi/drivers/adv_pci1723.c +++ b/drivers/staging/comedi/drivers/adv_pci1723.c @@ -234,7 +234,7 @@ static int pci1723_insn_read_ao(struct comedi_device *dev, int n, chan; chan = CR_CHAN(insn->chanspec); - DPRINTK(" adv_PCI1723 DEBUG: pci1723_insn_read_ao() ----- \n"); + DPRINTK(" adv_PCI1723 DEBUG: pci1723_insn_read_ao() -----\n"); for (n = 0; n < insn->n; n++) data[n] = devpriv->ao_data[chan]; diff --git a/drivers/staging/comedi/drivers/das1800.c b/drivers/staging/comedi/drivers/das1800.c index 60c2b12d6ff..a6df30b7fd7 100644 --- a/drivers/staging/comedi/drivers/das1800.c +++ b/drivers/staging/comedi/drivers/das1800.c @@ -102,6 +102,7 @@ TODO: #include <linux/interrupt.h> #include <linux/slab.h> +#include <linux/io.h> #include "../comedidev.h" #include <linux/ioport.h> @@ -198,7 +199,7 @@ static void das1800_flush_dma(struct comedi_device *dev, struct comedi_subdevice *s); static void das1800_flush_dma_channel(struct comedi_device *dev, struct comedi_subdevice *s, - unsigned int channel, uint16_t * buffer); + unsigned int channel, uint16_t *buffer); static void das1800_handle_fifo_half_full(struct comedi_device *dev, struct comedi_subdevice *s); static void das1800_handle_fifo_not_empty(struct comedi_device *dev, @@ -1050,9 +1051,8 @@ static void munge_data(struct comedi_device *dev, uint16_t * array, /* convert to unsigned type if we are in a bipolar mode */ if (!unipolar) { - for (i = 0; i < num_elements; i++) { + for (i = 0; i < num_elements; i++) array[i] = munge_bipolar_sample(dev, array[i]); - } } } @@ -1060,7 +1060,7 @@ static void munge_data(struct comedi_device *dev, uint16_t * array, * Assumes dma lock is held */ static void das1800_flush_dma_channel(struct comedi_device *dev, struct comedi_subdevice *s, - unsigned int channel, uint16_t * buffer) + unsigned int channel, uint16_t *buffer) { unsigned int num_bytes, num_samples; struct comedi_cmd *cmd = &s->async->cmd; @@ -1153,7 +1153,8 @@ static void das1800_handle_fifo_not_empty(struct comedi_device *dev, break; dpnt = inw(dev->iobase + DAS1800_FIFO); /* convert to unsigned type if we are in a bipolar mode */ - if (!unipolar) ; + if (!unipolar) + ; dpnt = munge_bipolar_sample(dev, dpnt); cfc_write_to_buffer(s, dpnt); if (cmd->stop_src == TRIG_COUNT) @@ -1364,9 +1365,8 @@ static int control_a_bits(struct comedi_cmd cmd) int control_a; control_a = FFEN; /* enable fifo */ - if (cmd.stop_src == TRIG_EXT) { + if (cmd.stop_src == TRIG_EXT) control_a |= ATEN; - } switch (cmd.start_src) { case TRIG_EXT: control_a |= TGEN | CGSL; @@ -1443,9 +1443,8 @@ static int setup_counters(struct comedi_device *dev, struct comedi_cmd cmd) &(cmd.convert_arg), cmd. flags & TRIG_ROUND_MASK); - if (das1800_set_frequency(dev) < 0) { + if (das1800_set_frequency(dev) < 0) return -1; - } } break; case TRIG_TIMER: /* in burst mode */ @@ -1454,9 +1453,8 @@ static int setup_counters(struct comedi_device *dev, struct comedi_cmd cmd) &(devpriv->divisor2), &(cmd.scan_begin_arg), cmd.flags & TRIG_ROUND_MASK); - if (das1800_set_frequency(dev) < 0) { + if (das1800_set_frequency(dev) < 0) return -1; - } break; default: break; @@ -1553,11 +1551,10 @@ static int das1800_ai_do_cmd(struct comedi_device *dev, /* disable dma on TRIG_WAKE_EOS, or TRIG_RT * (because dma in handler is unsafe at hard real-time priority) */ - if (cmd.flags & (TRIG_WAKE_EOS | TRIG_RT)) { + if (cmd.flags & (TRIG_WAKE_EOS | TRIG_RT)) devpriv->irq_dma_bits &= ~DMA_ENABLED; - } else { + else devpriv->irq_dma_bits |= devpriv->dma_bits; - } /* interrupt on end of conversion for TRIG_WAKE_EOS */ if (cmd.flags & TRIG_WAKE_EOS) { /* interrupt fifo not empty */ @@ -1567,9 +1564,8 @@ static int das1800_ai_do_cmd(struct comedi_device *dev, devpriv->irq_dma_bits |= FIMD; } /* determine how many conversions we need */ - if (cmd.stop_src == TRIG_COUNT) { + if (cmd.stop_src == TRIG_COUNT) devpriv->count = cmd.stop_arg * cmd.chanlist_len; - } das1800_cancel(dev, s); diff --git a/drivers/staging/comedi/drivers/dt282x.c b/drivers/staging/comedi/drivers/dt282x.c index 8cea9dca3d7..95ebc267bb7 100644 --- a/drivers/staging/comedi/drivers/dt282x.c +++ b/drivers/staging/comedi/drivers/dt282x.c @@ -61,6 +61,7 @@ Notes: #include <linux/gfp.h> #include <linux/ioport.h> #include <linux/interrupt.h> +#include <linux/io.h> #include <asm/dma.h> #include "comedi_fc.h" diff --git a/drivers/staging/comedi/drivers/dyna_pci10xx.c b/drivers/staging/comedi/drivers/dyna_pci10xx.c new file mode 100644 index 00000000000..da8a2bf3165 --- /dev/null +++ b/drivers/staging/comedi/drivers/dyna_pci10xx.c @@ -0,0 +1,462 @@ +/* + * comedi/drivers/dyna_pci10xx.c + * Copyright (C) 2011 Prashant Shah, pshah.mumbai@gmail.com + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + Driver: dyna_pci10xx + Devices: Dynalog India PCI DAQ Cards, http://www.dynalogindia.com/ + Author: Prashant Shah <pshah.mumbai@gmail.com> + Developed at Automation Labs, Chemical Dept., IIT Bombay, India. + Prof. Kannan Moudgalya <kannan@iitb.ac.in> + http://www.iitb.ac.in + Status: Stable + Version: 1.0 + Device Supported : + - Dynalog PCI 1050 + + Notes : + - Dynalog India Pvt. Ltd. does not have a registered PCI Vendor ID and + they are using the PLX Technlogies Vendor ID since that is the PCI Chip used + in the card. + - Dynalog India Pvt. Ltd. has provided the internal register specification for + their cards in their manuals. +*/ + +#include "../comedidev.h" +#include "comedi_pci.h" +#include <linux/mutex.h> + +#define PCI_VENDOR_ID_DYNALOG 0x10b5 +#define DRV_NAME "dyna_pci10xx" + +#define READ_TIMEOUT 50 + +static DEFINE_MUTEX(start_stop_sem); + +static DEFINE_PCI_DEVICE_TABLE(dyna_pci10xx_pci_table) = { + { PCI_DEVICE(PCI_VENDOR_ID_DYNALOG, 0x1050) }, + { 0 } +}; + +MODULE_DEVICE_TABLE(pci, dyna_pci10xx_pci_table); + +static int dyna_pci10xx_attach(struct comedi_device *dev, + struct comedi_devconfig *it); +static int dyna_pci10xx_detach(struct comedi_device *dev); + +static const struct comedi_lrange range_pci1050_ai = { 3, { + BIP_RANGE(10), + BIP_RANGE(5), + UNI_RANGE(10) + } +}; + +static const char range_codes_pci1050_ai[] = { 0x00, 0x10, 0x30 }; + +static const struct comedi_lrange range_pci1050_ao = { 1, { + UNI_RANGE(10) + } +}; + +static const char range_codes_pci1050_ao[] = { 0x00 }; + +struct boardtype { + const char *name; + int device_id; + int ai_chans; + int ai_bits; + int ao_chans; + int ao_bits; + int di_chans; + int di_bits; + int do_chans; + int do_bits; + const struct comedi_lrange *range_ai; + const char *range_codes_ai; + const struct comedi_lrange *range_ao; + const char *range_codes_ao; +}; + +static const struct boardtype boardtypes[] = { + { + .name = "dyna_pci1050", + .device_id = 0x1050, + .ai_chans = 16, + .ai_bits = 12, + .ao_chans = 16, + .ao_bits = 12, + .di_chans = 16, + .di_bits = 16, + .do_chans = 16, + .do_bits = 16, + .range_ai = &range_pci1050_ai, + .range_codes_ai = range_codes_pci1050_ai, + .range_ao = &range_pci1050_ao, + .range_codes_ao = range_codes_pci1050_ao, + }, + /* dummy entry corresponding to driver name */ + {.name = DRV_NAME}, +}; + +static struct comedi_driver driver_dyna_pci10xx = { + .driver_name = DRV_NAME, + .module = THIS_MODULE, + .attach = dyna_pci10xx_attach, + .detach = dyna_pci10xx_detach, + .board_name = &boardtypes[0].name, + .offset = sizeof(struct boardtype), + .num_names = ARRAY_SIZE(boardtypes), +}; + +struct dyna_pci10xx_private { + struct pci_dev *pci_dev; /* ptr to PCI device */ + char valid; /* card is usable */ + struct mutex mutex; + + /* device base address registers */ + unsigned long BADR0, BADR1, BADR2, BADR3, BADR4, BADR5; +}; + +#define thisboard ((const struct boardtype *)dev->board_ptr) +#define devpriv ((struct dyna_pci10xx_private *)dev->private) + +/******************************************************************************/ +/************************** READ WRITE FUNCTIONS ******************************/ +/******************************************************************************/ + +/* analog input callback */ +static int dyna_pci10xx_insn_read_ai(struct comedi_device *dev, + struct comedi_subdevice *s, + struct comedi_insn *insn, unsigned int *data) +{ + int n, counter; + u16 d = 0; + unsigned int chan, range; + + /* get the channel number and range */ + chan = CR_CHAN(insn->chanspec); + range = thisboard->range_codes_ai[CR_RANGE((insn->chanspec))]; + + mutex_lock(&devpriv->mutex); + /* convert n samples */ + for (n = 0; n < insn->n; n++) { + /* trigger conversion */ + smp_mb(); + outw_p(0x0000 + range + chan, devpriv->BADR2 + 2); + udelay(10); + /* read data */ + for (counter = 0; counter < READ_TIMEOUT; counter++) { + d = inw_p(devpriv->BADR2); + + /* check if read is successfull if the EOC bit is set */ + if (d & (1 << 15)) + goto conv_finish; + } + data[n] = 0; + printk(KERN_DEBUG "comedi: dyna_pci10xx: " + "timeout reading analog input\n"); + continue; +conv_finish: + /* mask the first 4 bits - EOC bits */ + d &= 0x0FFF; + data[n] = d; + } + mutex_unlock(&devpriv->mutex); + + /* return the number of samples read/written */ + return n; +} + +/* analog output callback */ +static int dyna_pci10xx_insn_write_ao(struct comedi_device *dev, + struct comedi_subdevice *s, + struct comedi_insn *insn, unsigned int *data) +{ + int n; + unsigned int chan, range; + + chan = CR_CHAN(insn->chanspec); + range = thisboard->range_codes_ai[CR_RANGE((insn->chanspec))]; + + mutex_lock(&devpriv->mutex); + for (n = 0; n < insn->n; n++) { + smp_mb(); + /* trigger conversion and write data */ + outw_p(data[n], devpriv->BADR2); + udelay(10); + } + mutex_unlock(&devpriv->mutex); + return n; +} + +/* digital input bit interface */ +static int dyna_pci10xx_di_insn_bits(struct comedi_device *dev, + struct comedi_subdevice *s, + struct comedi_insn *insn, unsigned int *data) +{ + u16 d = 0; + + if (insn->n != 2) + return -EINVAL; + + mutex_lock(&devpriv->mutex); + smp_mb(); + d = inw_p(devpriv->BADR3); + udelay(10); + + /* on return the data[0] contains output and data[1] contains input */ + data[1] = d; + data[0] = s->state; + mutex_unlock(&devpriv->mutex); + return 2; +} + +/* digital output bit interface */ +static int dyna_pci10xx_do_insn_bits(struct comedi_device *dev, + struct comedi_subdevice *s, + struct comedi_insn *insn, unsigned int *data) +{ + if (insn->n != 2) + return -EINVAL; + + /* The insn data is a mask in data[0] and the new data + * in data[1], each channel cooresponding to a bit. + * s->state contains the previous write data + */ + mutex_lock(&devpriv->mutex); + if (data[0]) { + s->state &= ~data[0]; + s->state |= (data[0] & data[1]); + smp_mb(); + outw_p(s->state, devpriv->BADR3); + udelay(10); + } + + /* + * On return, data[1] contains the value of the digital + * input and output lines. We just return the software copy of the + * output values if it was a purely digital output subdevice. + */ + data[1] = s->state; + mutex_unlock(&devpriv->mutex); + return 2; +} + +/******************************************************************************/ +/*********************** INITIALIZATION FUNCTIONS *****************************/ +/******************************************************************************/ + +static int dyna_pci10xx_attach(struct comedi_device *dev, + struct comedi_devconfig *it) +{ + struct comedi_subdevice *s; + struct pci_dev *pcidev; + unsigned int opt_bus, opt_slot; + int board_index, i; + + mutex_lock(&start_stop_sem); + + if (alloc_private(dev, sizeof(struct dyna_pci10xx_private)) < 0) { + printk(KERN_ERR "comedi: dyna_pci10xx: " + "failed to allocate memory!\n"); + mutex_unlock(&start_stop_sem); + return -ENOMEM; + } + + opt_bus = it->options[0]; + opt_slot = it->options[1]; + dev->board_name = thisboard->name; + dev->irq = 0; + + /* + * Probe the PCI bus and located the matching device + */ + for (pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); + pcidev != NULL; + pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) { + + board_index = -1; + for (i = 0; i < ARRAY_SIZE(boardtypes); ++i) { + if ((pcidev->vendor == PCI_VENDOR_ID_DYNALOG) && + (pcidev->device == boardtypes[i].device_id)) { + board_index = i; + break; + } + } + if (board_index < 0) + continue; + + /* Found matching vendor/device. */ + if (opt_bus || opt_slot) { + /* Check bus/slot. */ + if (opt_bus != pcidev->bus->number + || opt_slot != PCI_SLOT(pcidev->devfn)) + continue; /* no match */ + } + + goto found; + } + printk(KERN_ERR "comedi: dyna_pci10xx: no supported device found!\n"); + mutex_unlock(&start_stop_sem); + return -EIO; + +found: + + if (!pcidev) { + if (opt_bus || opt_slot) { + printk(KERN_ERR "comedi: dyna_pci10xx: " + "invalid PCI device at b:s %d:%d\n", + opt_bus, opt_slot); + } else { + printk(KERN_ERR "comedi: dyna_pci10xx: " + "invalid PCI device\n"); + } + mutex_unlock(&start_stop_sem); + return -EIO; + } + + if (comedi_pci_enable(pcidev, DRV_NAME)) { + printk(KERN_ERR "comedi: dyna_pci10xx: " + "failed to enable PCI device and request regions!"); + mutex_unlock(&start_stop_sem); + return -EIO; + } + + mutex_init(&devpriv->mutex); + dev->board_ptr = &boardtypes[board_index]; + devpriv->pci_dev = pcidev; + + printk(KERN_INFO "comedi: dyna_pci10xx: device found!\n"); + + /* initialize device base address registers */ + devpriv->BADR0 = pci_resource_start(pcidev, 0); + devpriv->BADR1 = pci_resource_start(pcidev, 1); + devpriv->BADR2 = pci_resource_start(pcidev, 2); + devpriv->BADR3 = pci_resource_start(pcidev, 3); + devpriv->BADR4 = pci_resource_start(pcidev, 4); + devpriv->BADR5 = pci_resource_start(pcidev, 5); + + if (alloc_subdevices(dev, 4) < 0) { + printk(KERN_ERR "comedi: dyna_pci10xx: " + "failed allocating subdevices\n"); + mutex_unlock(&start_stop_sem); + return -ENOMEM; + } + + /* analog input */ + s = dev->subdevices + 0; + s->type = COMEDI_SUBD_AI; + s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DIFF; + s->n_chan = thisboard->ai_chans; + s->maxdata = 0x0FFF; + s->range_table = thisboard->range_ai; + s->len_chanlist = 16; + s->insn_read = dyna_pci10xx_insn_read_ai; + + /* analog output */ + s = dev->subdevices + 1; + s->type = COMEDI_SUBD_AO; + s->subdev_flags = SDF_WRITABLE; + s->n_chan = thisboard->ao_chans; + s->maxdata = 0x0FFF; + s->range_table = thisboard->range_ao; + s->len_chanlist = 16; + s->insn_write = dyna_pci10xx_insn_write_ao; + + /* digital input */ + s = dev->subdevices + 2; + s->type = COMEDI_SUBD_DI; + s->subdev_flags = SDF_READABLE | SDF_GROUND; + s->n_chan = thisboard->di_chans; + s->maxdata = 1; + s->range_table = &range_digital; + s->len_chanlist = thisboard->di_chans; + s->insn_bits = dyna_pci10xx_di_insn_bits; + + /* digital output */ + s = dev->subdevices + 3; + s->type = COMEDI_SUBD_DO; + s->subdev_flags = SDF_WRITABLE | SDF_GROUND; + s->n_chan = thisboard->do_chans; + s->maxdata = 1; + s->range_table = &range_digital; + s->len_chanlist = thisboard->do_chans; + s->state = 0; + s->insn_bits = dyna_pci10xx_do_insn_bits; + + devpriv->valid = 1; + mutex_unlock(&start_stop_sem); + + printk(KERN_INFO "comedi: dyna_pci10xx: %s - device setup completed!\n", + boardtypes[board_index].name); + + return 1; +} + +static int dyna_pci10xx_detach(struct comedi_device *dev) +{ + if (devpriv && devpriv->pci_dev) { + comedi_pci_disable(devpriv->pci_dev); + mutex_destroy(&devpriv->mutex); + } + + return 0; +} + +static int __devinit driver_dyna_pci10xx_pci_probe(struct pci_dev *dev, + const struct pci_device_id *ent) +{ + return comedi_pci_auto_config(dev, driver_dyna_pci10xx.driver_name); +} + +static void __devexit driver_dyna_pci10xx_pci_remove(struct pci_dev *dev) +{ + comedi_pci_auto_unconfig(dev); +} + +static struct pci_driver driver_dyna_pci10xx_pci_driver = { + .id_table = dyna_pci10xx_pci_table, + .probe = &driver_dyna_pci10xx_pci_probe, + .remove = __devexit_p(&driver_dyna_pci10xx_pci_remove) +}; + +static int __init driver_dyna_pci10xx_init_module(void) +{ + int retval; + + retval = comedi_driver_register(&driver_dyna_pci10xx); + if (retval < 0) + return retval; + + driver_dyna_pci10xx_pci_driver.name = + (char *)driver_dyna_pci10xx.driver_name; + return pci_register_driver(&driver_dyna_pci10xx_pci_driver); +} + +static void __exit driver_dyna_pci10xx_cleanup_module(void) +{ + pci_unregister_driver(&driver_dyna_pci10xx_pci_driver); + comedi_driver_unregister(&driver_dyna_pci10xx); +} + +module_init(driver_dyna_pci10xx_init_module); +module_exit(driver_dyna_pci10xx_cleanup_module); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Prashant Shah <pshah.mumbai@gmail.com>"); +MODULE_DESCRIPTION("Comedi based drivers for Dynalog PCI DAQ cards"); diff --git a/drivers/staging/comedi/drivers/ni_at_a2150.c b/drivers/staging/comedi/drivers/ni_at_a2150.c index c192b71ec04..32e675e3f0b 100644 --- a/drivers/staging/comedi/drivers/ni_at_a2150.c +++ b/drivers/staging/comedi/drivers/ni_at_a2150.c @@ -69,6 +69,7 @@ TRIG_WAKE_EOS #include "../comedidev.h" #include <linux/ioport.h> +#include <linux/io.h> #include <asm/dma.h> #include "8253.h" diff --git a/drivers/staging/comedi/drivers/ni_daq_700.c b/drivers/staging/comedi/drivers/ni_daq_700.c index 2672629e9ff..e2420123db8 100644 --- a/drivers/staging/comedi/drivers/ni_daq_700.c +++ b/drivers/staging/comedi/drivers/ni_daq_700.c @@ -51,7 +51,7 @@ IRQ is assigned but not used. #include <pcmcia/cisreg.h> #include <pcmcia/ds.h> -static struct pcmcia_device *pcmcia_cur_dev = NULL; +static struct pcmcia_device *pcmcia_cur_dev; #define DIO700_SIZE 8 /* size of io region used by board */ @@ -381,11 +381,11 @@ static int dio700_attach(struct comedi_device *dev, struct comedi_devconfig *it) #endif break; default: - printk("bug! couldn't determine board type\n"); + printk(KERN_ERR "bug! couldn't determine board type\n"); return -EINVAL; break; } - printk("comedi%d: ni_daq_700: %s, io 0x%lx", dev->minor, + printk(KERN_ERR "comedi%d: ni_daq_700: %s, io 0x%lx", dev->minor, thisboard->name, iobase); #ifdef incomplete if (irq) @@ -396,7 +396,7 @@ static int dio700_attach(struct comedi_device *dev, struct comedi_devconfig *it) printk("\n"); if (iobase == 0) { - printk("io base address is zero!\n"); + printk(KERN_ERR "io base address is zero!\n"); return -EINVAL; } @@ -421,7 +421,7 @@ static int dio700_attach(struct comedi_device *dev, struct comedi_devconfig *it) static int dio700_detach(struct comedi_device *dev) { - printk("comedi%d: ni_daq_700: cs-remove\n", dev->minor); + printk(KERN_ERR "comedi%d: ni_daq_700: cs-remove\n", dev->minor); if (dev->subdevices) subdev_700_cleanup(dev, dev->subdevices + 0); diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c index ab8f37022a3..6859af0778c 100644 --- a/drivers/staging/comedi/drivers/ni_labpc.c +++ b/drivers/staging/comedi/drivers/ni_labpc.c @@ -78,6 +78,7 @@ NI manuals: #include <linux/interrupt.h> #include <linux/slab.h> +#include <linux/io.h> #include "../comedidev.h" #include <linux/delay.h> @@ -212,8 +213,10 @@ static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it); static int labpc_cancel(struct comedi_device *dev, struct comedi_subdevice *s); static irqreturn_t labpc_interrupt(int irq, void *d); static int labpc_drain_fifo(struct comedi_device *dev); +#ifdef CONFIG_ISA_DMA_API static void labpc_drain_dma(struct comedi_device *dev); static void handle_isa_dma(struct comedi_device *dev); +#endif static void labpc_drain_dregs(struct comedi_device *dev); static int labpc_ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_cmd *cmd); @@ -237,9 +240,9 @@ static int labpc_eeprom_write_insn(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data); -static unsigned int labpc_suggest_transfer_size(struct comedi_cmd cmd); static void labpc_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd); #ifdef CONFIG_COMEDI_PCI +static unsigned int labpc_suggest_transfer_size(struct comedi_cmd cmd); static int labpc_find_device(struct comedi_device *dev, int bus, int slot); #endif static int labpc_dio_mem_callback(int dir, int port, int data, @@ -526,7 +529,10 @@ int labpc_common_attach(struct comedi_device *dev, unsigned long iobase, { struct comedi_subdevice *s; int i; - unsigned long dma_flags, isr_flags; + unsigned long isr_flags; +#ifdef CONFIG_ISA_DMA_API + unsigned long dma_flags; +#endif short lsb, msb; printk(KERN_ERR "comedi%d: ni_labpc: %s, io 0x%lx", dev->minor, @@ -586,6 +592,7 @@ int labpc_common_attach(struct comedi_device *dev, unsigned long iobase, } dev->irq = irq; +#ifdef CONFIG_ISA_DMA_API /* grab dma channel */ if (dma_chan > 3) { printk(KERN_ERR " invalid dma channel %u\n", dma_chan); @@ -609,6 +616,7 @@ int labpc_common_attach(struct comedi_device *dev, unsigned long iobase, set_dma_mode(devpriv->dma_chan, DMA_MODE_READ); release_dma_lock(dma_flags); } +#endif dev->board_name = thisboard->name; @@ -723,9 +731,15 @@ static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it) /* get base address, irq etc. based on bustype */ switch (thisboard->bustype) { case isa_bustype: +#ifdef CONFIG_ISA_DMA_API iobase = it->options[0]; irq = it->options[1]; dma_chan = it->options[2]; +#else + printk(KERN_ERR " this driver has not been built with ISA DMA " + "support.\n"); + return -EINVAL; +#endif break; case pci_bustype: #ifdef CONFIG_COMEDI_PCI @@ -796,10 +810,12 @@ int labpc_common_detach(struct comedi_device *dev) if (dev->subdevices) subdev_8255_cleanup(dev, dev->subdevices + 2); +#ifdef CONFIG_ISA_DMA_API /* only free stuff if it has been allocated by _attach */ kfree(devpriv->dma_buffer); if (devpriv->dma_chan) free_dma(devpriv->dma_chan); +#endif if (dev->irq) free_irq(dev->irq, dev); if (thisboard->bustype == isa_bustype && dev->iobase) @@ -1134,7 +1150,9 @@ static int labpc_ai_cmdtest(struct comedi_device *dev, static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) { int channel, range, aref; +#ifdef CONFIG_ISA_DMA_API unsigned long irq_flags; +#endif int ret; struct comedi_async *async = s->async; struct comedi_cmd *cmd = &async->cmd; @@ -1181,6 +1199,7 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) devpriv->write_byte(INIT_A1_BITS, dev->iobase + COUNTER_A_CONTROL_REG); +#ifdef CONFIG_ISA_DMA_API /* figure out what method we will use to transfer data */ if (devpriv->dma_chan && /* need a dma channel allocated */ /* @@ -1192,7 +1211,9 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) thisboard->bustype == isa_bustype) { xfer = isa_dma_transfer; /* pc-plus has no fifo-half full interrupt */ - } else if (thisboard->register_layout == labpc_1200_layout && + } else +#endif + if (thisboard->register_layout == labpc_1200_layout && /* wake-end-of-scan should interrupt on fifo not empty */ (cmd->flags & TRIG_WAKE_EOS) == 0 && /* make sure we are taking more than just a few points */ @@ -1316,6 +1337,7 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) labpc_clear_adc_fifo(dev); +#ifdef CONFIG_ISA_DMA_API /* set up dma transfer */ if (xfer == isa_dma_transfer) { irq_flags = claim_dma_lock(); @@ -1339,6 +1361,7 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) devpriv->command3_bits |= DMA_EN_BIT | DMATC_INTR_EN_BIT; } else devpriv->command3_bits &= ~DMA_EN_BIT & ~DMATC_INTR_EN_BIT; +#endif /* enable error interrupts */ devpriv->command3_bits |= ERR_INTR_EN_BIT; @@ -1425,6 +1448,7 @@ static irqreturn_t labpc_interrupt(int irq, void *d) return IRQ_HANDLED; } +#ifdef CONFIG_ISA_DMA_API if (devpriv->current_transfer == isa_dma_transfer) { /* * if a dma terminal count of external stop trigger @@ -1436,6 +1460,7 @@ static irqreturn_t labpc_interrupt(int irq, void *d) handle_isa_dma(dev); } } else +#endif labpc_drain_fifo(dev); if (devpriv->status1_bits & TIMER_BIT) { @@ -1508,6 +1533,7 @@ static int labpc_drain_fifo(struct comedi_device *dev) return 0; } +#ifdef CONFIG_ISA_DMA_API static void labpc_drain_dma(struct comedi_device *dev) { struct comedi_subdevice *s = dev->read_subdev; @@ -1570,13 +1596,16 @@ static void handle_isa_dma(struct comedi_device *dev) /* clear dma tc interrupt */ devpriv->write_byte(0x1, dev->iobase + DMATC_CLEAR_REG); } +#endif /* makes sure all data acquired by board is transferred to comedi (used * when acquisition is terminated by stop_src == TRIG_EXT). */ static void labpc_drain_dregs(struct comedi_device *dev) { +#ifdef CONFIG_ISA_DMA_API if (devpriv->current_transfer == isa_dma_transfer) labpc_drain_dma(dev); +#endif labpc_drain_fifo(dev); } @@ -1768,6 +1797,7 @@ static int labpc_eeprom_write_insn(struct comedi_device *dev, return 1; } +#ifdef CONFIG_ISA_DMA_API /* utility function that suggests a dma transfer size in bytes */ static unsigned int labpc_suggest_transfer_size(struct comedi_cmd cmd) { @@ -1791,6 +1821,7 @@ static unsigned int labpc_suggest_transfer_size(struct comedi_cmd cmd) return size; } +#endif /* figures out what counter values to use based on command */ static void labpc_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd) diff --git a/drivers/staging/comedi/drivers/pcl812.c b/drivers/staging/comedi/drivers/pcl812.c index 09ff4723b22..6fc74645af2 100644 --- a/drivers/staging/comedi/drivers/pcl812.c +++ b/drivers/staging/comedi/drivers/pcl812.c @@ -114,6 +114,7 @@ #include <linux/delay.h> #include <linux/ioport.h> +#include <linux/io.h> #include <asm/dma.h> #include "8253.h" diff --git a/drivers/staging/comedi/drivers/pcl816.c b/drivers/staging/comedi/drivers/pcl816.c index 8f3fc6ee088..0b9bee36eb5 100644 --- a/drivers/staging/comedi/drivers/pcl816.c +++ b/drivers/staging/comedi/drivers/pcl816.c @@ -38,6 +38,7 @@ Configuration Options: #include <linux/mc146818rtc.h> #include <linux/gfp.h> #include <linux/delay.h> +#include <linux/io.h> #include <asm/dma.h> #include "8253.h" diff --git a/drivers/staging/comedi/drivers/pcl818.c b/drivers/staging/comedi/drivers/pcl818.c index 8933e5089bd..b45a9bd8b48 100644 --- a/drivers/staging/comedi/drivers/pcl818.c +++ b/drivers/staging/comedi/drivers/pcl818.c @@ -104,6 +104,7 @@ A word or two about DMA. Driver support DMA operations at two ways: #include <linux/mc146818rtc.h> #include <linux/gfp.h> #include <linux/delay.h> +#include <linux/io.h> #include <asm/dma.h> #include "8253.h" diff --git a/drivers/staging/comedi/drivers/rtd520.c b/drivers/staging/comedi/drivers/rtd520.c index 7f09ed755fe..13844196050 100644 --- a/drivers/staging/comedi/drivers/rtd520.c +++ b/drivers/staging/comedi/drivers/rtd520.c @@ -29,8 +29,8 @@ Status: Works. Only tested on DM7520-8. Not SMP safe. Configuration options: [0] - PCI bus of device (optional) - If bus/slot is not specified, the first available PCI - device will be used. + If bus / slot is not specified, the first available PCI + device will be used. [1] - PCI slot of device (optional) */ /* @@ -186,7 +186,7 @@ Configuration options: | PLX_DEMAND_MODE_BIT) #define DMA_TRANSFER_BITS (\ -/* descriptors in PCI memory*/ PLX_DESC_IN_PCI_BIT \ +/* descriptors in PCI memory*/ PLX_DESC_IN_PCI_BIT \ /* interrupt at end of block */ | PLX_INTR_TERM_COUNT \ /* from board to PCI */ | PLX_XFER_LOCAL_TO_PCI) @@ -869,7 +869,7 @@ static int rtd_attach(struct comedi_device *dev, struct comedi_devconfig *it) } /* Show board configuration */ - printk("%s:", dev->board_name); + printk(KERN_INFO "%s:", dev->board_name); /* * Allocate the subdevice structures. alloc_subdevice() is a @@ -958,7 +958,7 @@ static int rtd_attach(struct comedi_device *dev, struct comedi_devconfig *it) return ret; } dev->irq = devpriv->pci_dev->irq; - printk("( irq=%u )", dev->irq); + printk(KERN_INFO "( irq=%u )", dev->irq); ret = rtd520_probe_fifo_depth(dev); if (ret < 0) @@ -1026,7 +1026,8 @@ static int rtd_attach(struct comedi_device *dev, struct comedi_devconfig *it) } RtdDma0Mode(dev, DMA_MODE_BITS); - RtdDma0Source(dev, DMAS_ADFIFO_HALF_FULL); /* set DMA trigger source */ + /* set DMA trigger source */ + RtdDma0Source(dev, DMAS_ADFIFO_HALF_FULL); } else { printk(KERN_INFO "( no IRQ->no DMA )"); } @@ -1202,11 +1203,13 @@ static unsigned short rtdConvertChanGain(struct comedi_device *dev, CHAN_ARRAY_SET(devpriv->chanBipolar, chanIndex); } else if (range < thisboard->rangeUniStart) { /* second batch are +-10 */ r |= 0x100; /* +-10 range */ - r |= ((range - thisboard->range10Start) & 0x7) << 4; /* gain */ + /* gain */ + r |= ((range - thisboard->range10Start) & 0x7) << 4; CHAN_ARRAY_SET(devpriv->chanBipolar, chanIndex); } else { /* last batch is +10 */ r |= 0x200; /* +10 range */ - r |= ((range - thisboard->rangeUniStart) & 0x7) << 4; /* gain */ + /* gain */ + r |= ((range - thisboard->rangeUniStart) & 0x7) << 4; CHAN_ARRAY_CLEAR(devpriv->chanBipolar, chanIndex); } @@ -1336,7 +1339,8 @@ static int rtd_ai_rinsn(struct comedi_device *dev, /*printk ("rtd520: Got 0x%x after %d usec\n", d, ii+1); */ d = d >> 3; /* low 3 bits are marker lines */ if (CHAN_ARRAY_TEST(devpriv->chanBipolar, 0)) - data[n] = d + 2048; /* convert to comedi unsigned data */ + /* convert to comedi unsigned data */ + data[n] = d + 2048; else data[n] = d; } diff --git a/drivers/staging/comedi/drivers/serial2002.c b/drivers/staging/comedi/drivers/serial2002.c index ebfce33f0b4..ade2202b623 100644 --- a/drivers/staging/comedi/drivers/serial2002.c +++ b/drivers/staging/comedi/drivers/serial2002.c @@ -38,7 +38,7 @@ Status: in development #include <linux/sched.h> #include <linux/slab.h> -#include <asm/termios.h> +#include <linux/termios.h> #include <asm/ioctls.h> #include <linux/serial.h> #include <linux/poll.h> @@ -192,9 +192,8 @@ static int tty_read(struct file *f, int timeout) elapsed = (1000000 * (now.tv_sec - start.tv_sec) + now.tv_usec - start.tv_usec); - if (elapsed > timeout) { + if (elapsed > timeout) break; - } set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(((timeout - elapsed) * HZ) / 10000); @@ -204,9 +203,8 @@ static int tty_read(struct file *f, int timeout) unsigned char ch; f->f_pos = 0; - if (f->f_op->read(f, &ch, 1, &f->f_pos) == 1) { + if (f->f_op->read(f, &ch, 1, &f->f_pos) == 1) result = ch; - } } } else { /* Device does not support poll, busy wait */ @@ -215,9 +213,8 @@ static int tty_read(struct file *f, int timeout) unsigned char ch; retries++; - if (retries >= timeout) { + if (retries >= timeout) break; - } f->f_pos = 0; if (f->f_op->read(f, &ch, 1, &f->f_pos) == 1) { @@ -329,7 +326,7 @@ static struct serial_data serial_read(struct file *f, int timeout) length++; if (data < 0) { - printk("serial2002 error\n"); + printk(KERN_ERR "serial2002 error\n"); break; } else if (data & 0x80) { result.value = (result.value << 7) | (data & 0x7f); @@ -402,7 +399,7 @@ static int serial_2002_open(struct comedi_device *dev) devpriv->tty = filp_open(port, O_RDWR, 0); if (IS_ERR(devpriv->tty)) { result = (int)PTR_ERR(devpriv->tty); - printk("serial_2002: file open error = %d\n", result); + printk(KERN_ERR "serial_2002: file open error = %d\n", result); } else { struct config_t { @@ -516,9 +513,8 @@ static int serial_2002_open(struct comedi_device *dev) } break; } - if (sign) { + if (sign) min = -min; - } cur_config[channel].min = min; } @@ -557,9 +553,8 @@ static int serial_2002_open(struct comedi_device *dev) } break; } - if (sign) { + if (sign) max = -max; - } cur_config[channel].max = max; } @@ -622,9 +617,8 @@ static int serial_2002_open(struct comedi_device *dev) int j, chan; for (chan = 0, j = 0; j < 32; j++) { - if (c[j].kind == kind) { + if (c[j].kind == kind) chan++; - } } s = &dev->subdevices[i]; s->n_chan = chan; @@ -649,9 +643,8 @@ static int serial_2002_open(struct comedi_device *dev) } for (chan = 0, j = 0; j < 32; j++) { if (c[j].kind == kind) { - if (mapping) { + if (mapping) mapping[chan] = j; - } if (range) { range[j].length = 1; range[j].range.min = @@ -704,9 +697,8 @@ err_alloc_configs: static void serial_2002_close(struct comedi_device *dev) { - if (!IS_ERR(devpriv->tty) && (devpriv->tty != 0)) { + if (!IS_ERR(devpriv->tty) && (devpriv->tty != 0)) filp_close(devpriv->tty, 0); - } } static int serial2002_di_rinsn(struct comedi_device *dev, @@ -723,9 +715,8 @@ static int serial2002_di_rinsn(struct comedi_device *dev, poll_digital(devpriv->tty, chan); while (1) { read = serial_read(devpriv->tty, 1000); - if (read.kind != is_digital || read.index == chan) { + if (read.kind != is_digital || read.index == chan) break; - } } data[n] = read.value; } @@ -765,9 +756,8 @@ static int serial2002_ai_rinsn(struct comedi_device *dev, poll_channel(devpriv->tty, chan); while (1) { read = serial_read(devpriv->tty, 1000); - if (read.kind != is_channel || read.index == chan) { + if (read.kind != is_channel || read.index == chan) break; - } } data[n] = read.value; } @@ -801,9 +791,8 @@ static int serial2002_ao_rinsn(struct comedi_device *dev, int n; int chan = CR_CHAN(insn->chanspec); - for (n = 0; n < insn->n; n++) { + for (n = 0; n < insn->n; n++) data[n] = devpriv->ao_readback[chan]; - } return n; } @@ -822,9 +811,8 @@ static int serial2002_ei_rinsn(struct comedi_device *dev, poll_channel(devpriv->tty, chan); while (1) { read = serial_read(devpriv->tty, 1000); - if (read.kind != is_channel || read.index == chan) { + if (read.kind != is_channel || read.index == chan) break; - } } data[n] = read.value; } @@ -838,9 +826,8 @@ static int serial2002_attach(struct comedi_device *dev, printk("comedi%d: serial2002: ", dev->minor); dev->board_name = thisboard->name; - if (alloc_private(dev, sizeof(struct serial2002_private)) < 0) { + if (alloc_private(dev, sizeof(struct serial2002_private)) < 0) return -ENOMEM; - } dev->open = serial_2002_open; dev->close = serial_2002_close; devpriv->port = it->options[0]; diff --git a/drivers/staging/comedi/drivers/unioxx5.c b/drivers/staging/comedi/drivers/unioxx5.c index 598884ec3ed..89e62aa134b 100644 --- a/drivers/staging/comedi/drivers/unioxx5.c +++ b/drivers/staging/comedi/drivers/unioxx5.c @@ -75,8 +75,10 @@ Devices: [Fastwel] UNIOxx-5 (unioxx5), /* 'private' structure for each subdevice */ struct unioxx5_subd_priv { int usp_iobase; - unsigned char usp_module_type[12]; /* 12 modules. each can be 70L or 73L */ - unsigned char usp_extra_data[12][4]; /* for saving previous written value for analog modules */ + /* 12 modules. each can be 70L or 73L */ + unsigned char usp_module_type[12]; + /* for saving previous written value for analog modules */ + unsigned char usp_extra_data[12][4]; unsigned char usp_prev_wr_val[3]; /* previous written value */ unsigned char usp_prev_cn_val[3]; /* previous channel value */ }; @@ -169,7 +171,7 @@ static int unioxx5_attach(struct comedi_device *dev, return -1; } - printk("attached\n"); + printk(KERN_INFO "attached\n"); return 0; } @@ -181,7 +183,8 @@ static int unioxx5_subdev_read(struct comedi_device *dev, int channel, type; channel = CR_CHAN(insn->chanspec); - type = usp->usp_module_type[channel / 2]; /* defining module type(analog or digital) */ + /* defining module type(analog or digital) */ + type = usp->usp_module_type[channel / 2]; if (type == MODULE_DIGITAL) { if (!__unioxx5_digital_read(usp, data, channel, dev->minor)) @@ -202,7 +205,8 @@ static int unioxx5_subdev_write(struct comedi_device *dev, int channel, type; channel = CR_CHAN(insn->chanspec); - type = usp->usp_module_type[channel / 2]; /* defining module type(analog or digital) */ + /* defining module type(analog or digital) */ + type = usp->usp_module_type[channel / 2]; if (type == MODULE_DIGITAL) { if (!__unioxx5_digital_write(usp, data, channel, dev->minor)) @@ -261,9 +265,12 @@ static int unioxx5_insn_config(struct comedi_device *dev, * change channel type on input or output) * \* */ outb(1, usp->usp_iobase + 0); - outb(flags, usp->usp_iobase + channel_offset); /* changes type of _one_ channel */ - outb(0, usp->usp_iobase + 0); /* sets channels bank to 0(allows directly input/output) */ - usp->usp_prev_cn_val[channel_offset - 1] = flags; /* saves written value */ + /* changes type of _one_ channel */ + outb(flags, usp->usp_iobase + channel_offset); + /* sets channels bank to 0(allows directly input/output) */ + outb(0, usp->usp_iobase + 0); + /* saves written value */ + usp->usp_prev_cn_val[channel_offset - 1] = flags; return 0; } @@ -304,14 +311,15 @@ static int __unioxx5_subdev_init(struct comedi_subdevice *subdev, } usp->usp_iobase = subdev_iobase; - printk("comedi%d: |", minor); + printk(KERN_INFO "comedi%d: |", minor); /* defining modules types */ for (i = 0; i < 12; i++) { to = 10000; __unioxx5_analog_config(usp, i * 2); - outb(i + 1, subdev_iobase + 5); /* sends channel number to card */ + /* sends channel number to card */ + outb(i + 1, subdev_iobase + 5); outb('H', subdev_iobase + 6); /* requests EEPROM world */ while (!(inb(subdev_iobase + 0) & TxBE)) ; /* waits while writting will be allowed */ @@ -346,9 +354,10 @@ static int __unioxx5_subdev_init(struct comedi_subdevice *subdev, subdev->range_table = &range_digital; subdev->insn_read = unioxx5_subdev_read; subdev->insn_write = unioxx5_subdev_write; - subdev->insn_config = unioxx5_insn_config; /* for digital modules only!!! */ + /* for digital modules only!!! */ + subdev->insn_config = unioxx5_insn_config; - printk("subdevice configured\n"); + printk(KERN_INFO "subdevice configured\n"); return 0; } @@ -367,7 +376,8 @@ static int __unioxx5_digital_write(struct unioxx5_subd_priv *usp, return 0; } - val = usp->usp_prev_wr_val[channel_offset - 1]; /* getting previous written value */ + /* getting previous written value */ + val = usp->usp_prev_wr_val[channel_offset - 1]; if (*data) val |= mask; @@ -375,7 +385,8 @@ static int __unioxx5_digital_write(struct unioxx5_subd_priv *usp, val &= ~mask; outb(val, usp->usp_iobase + channel_offset); - usp->usp_prev_wr_val[channel_offset - 1] = val; /* saving new written value */ + /* saving new written value */ + usp->usp_prev_wr_val[channel_offset - 1] = val; return 1; } @@ -399,7 +410,6 @@ static int __unioxx5_digital_read(struct unioxx5_subd_priv *usp, if (channel_offset > 1) channel -= 2 << channel_offset; /* this operation is created for correct readed value to 0 or 1 */ - *data >>= channel; return 1; } @@ -444,7 +454,8 @@ static int __unioxx5_analog_write(struct unioxx5_subd_priv *usp, usp->usp_extra_data[module][i] = (unsigned char)((*data & 0xFF00) >> 8); /* while(!((inb(usp->usp_iobase + 0)) & TxBE)); */ - outb(module + 1, usp->usp_iobase + 5); /* sending module number to card(1 .. 12) */ + /* sending module number to card(1 .. 12) */ + outb(module + 1, usp->usp_iobase + 5); outb('W', usp->usp_iobase + 6); /* sends (W)rite command to module */ /* sending for bytes to module(one byte per cycle iteration) */ @@ -475,7 +486,8 @@ static int __unioxx5_analog_read(struct unioxx5_subd_priv *usp, } __unioxx5_analog_config(usp, channel); - outb(module_no + 1, usp->usp_iobase + 5); /* sends module number to card(1 .. 12) */ + /* sends module number to card(1 .. 12) */ + outb(module_no + 1, usp->usp_iobase + 5); outb('V', usp->usp_iobase + 6); /* sends to module (V)erify command */ control = inb(usp->usp_iobase); /* get control register byte */ diff --git a/drivers/staging/comedi/drivers/usbdux.c b/drivers/staging/comedi/drivers/usbdux.c index 1d09bfa2edf..bf62e0dd6f6 100644 --- a/drivers/staging/comedi/drivers/usbdux.c +++ b/drivers/staging/comedi/drivers/usbdux.c @@ -1465,6 +1465,7 @@ static int usbdux_ao_inttrig(struct comedi_device *dev, dev_err(&this_usbduxsub->interface->dev, "comedi%d: usbdux_ao_inttrig: invalid trignum\n", dev->minor); + up(&this_usbduxsub->sem); return -EINVAL; } if (!(this_usbduxsub->ao_cmd_running)) { @@ -1935,11 +1936,8 @@ static int usbdux_pwm_cancel(struct comedi_device *dev, dev_dbg(&this_usbduxsub->interface->dev, "comedi %d: sending pwm off command to the usb device.\n", dev->minor); - res = send_dux_commands(this_usbduxsub, SENDPWMOFF); - if (res < 0) - return res; - return res; + return send_dux_commands(this_usbduxsub, SENDPWMOFF); } static void usbduxsub_pwm_irq(struct urb *urb) @@ -2674,6 +2672,7 @@ static int usbdux_attach(struct comedi_device *dev, struct comedi_devconfig *it) if (ret < 0) { dev_err(&udev->interface->dev, "comedi%d: error alloc space for subdev\n", dev->minor); + up(&udev->sem); up(&start_stop_sem); return ret; } |