diff options
Diffstat (limited to 'drivers/staging/comedi/drivers/addi_apci_3xxx.c')
-rw-r--r-- | drivers/staging/comedi/drivers/addi_apci_3xxx.c | 40 |
1 files changed, 15 insertions, 25 deletions
diff --git a/drivers/staging/comedi/drivers/addi_apci_3xxx.c b/drivers/staging/comedi/drivers/addi_apci_3xxx.c index 5b37cbf9228e..cf5dd10eaf91 100644 --- a/drivers/staging/comedi/drivers/addi_apci_3xxx.c +++ b/drivers/staging/comedi/drivers/addi_apci_3xxx.c @@ -22,6 +22,7 @@ * more details. */ +#include <linux/module.h> #include <linux/pci.h> #include <linux/interrupt.h> @@ -685,38 +686,28 @@ static int apci3xxx_dio_insn_config(struct comedi_device *dev, unsigned int *data) { unsigned int chan = CR_CHAN(insn->chanspec); - unsigned int mask = 1 << chan; - unsigned int bits; + unsigned int mask; + int ret; /* * Port 0 (channels 0-7) are always inputs * Port 1 (channels 8-15) are always outputs * Port 2 (channels 16-23) are programmable i/o - * - * Changing any channel in port 2 changes the entire port. */ - if (mask & 0xff0000) - bits = 0xff0000; - else - bits = 0; - - switch (data[0]) { - case INSN_CONFIG_DIO_INPUT: - s->io_bits &= ~bits; - break; - case INSN_CONFIG_DIO_OUTPUT: - s->io_bits |= bits; - break; - case INSN_CONFIG_DIO_QUERY: - data[1] = (s->io_bits & bits) ? COMEDI_OUTPUT : COMEDI_INPUT; - return insn->n; - default: - return -EINVAL; + if (chan < 16) { + if (data[0] != INSN_CONFIG_DIO_QUERY) + return -EINVAL; + } else { + /* changing any channel in port 2 changes the entire port */ + mask = 0xff0000; } + ret = comedi_dio_insn_config(dev, s, insn, data, mask); + if (ret) + return ret; + /* update port 2 configuration */ - if (bits) - outl((s->io_bits >> 24) & 0xff, dev->iobase + 224); + outl((s->io_bits >> 24) & 0xff, dev->iobase + 224); return insn->n; } @@ -801,10 +792,9 @@ static int apci3xxx_auto_attach(struct comedi_device *dev, dev->board_ptr = board; dev->board_name = board->name; - devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL); + devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv)); if (!devpriv) return -ENOMEM; - dev->private = devpriv; ret = comedi_pci_enable(dev); if (ret) |