static int multiq3_do_insn_bits(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { if (comedi_dio_update_state(s, data)) outw(s->state, dev->iobase + MULTIQ3_DIGOUT_PORT); data[1] = s->state; return insn->n; }
static int parport_data_reg_insn_bits(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { if (comedi_dio_update_state(s, data)) outb(s->state, dev->iobase + PARPORT_DATA_REG); data[1] = inb(dev->iobase + PARPORT_DATA_REG); return insn->n; }
static int ke_counter_do_insn_bits(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { if (comedi_dio_update_state(s, data)) outb(s->state, dev->iobase + KE_DO_REG); data[1] = s->state; return insn->n; }
static int pci6208_do_insn_bits(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { if (comedi_dio_update_state(s, data)) outw(s->state, dev->iobase + PCI6208_DIO); data[1] = s->state; return insn->n; }
static int apci3501_do_insn_bits(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { s->state = inl(dev->iobase + APCI3501_DO_REG); if (comedi_dio_update_state(s, data)) outl(s->state, dev->iobase + APCI3501_DO_REG); data[1] = s->state; return insn->n; }
static int dyna_pci10xx_do_insn_bits(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { struct dyna_pci10xx_private *devpriv = dev->private; mutex_lock(&devpriv->mutex); if (comedi_dio_update_state(s, data)) { smp_mb(); outw_p(s->state, devpriv->BADR3); udelay(10); } data[1] = s->state; mutex_unlock(&devpriv->mutex); return insn->n; }
static int daq700_dio_insn_bits(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { unsigned int mask; unsigned int val; mask = comedi_dio_update_state(s, data); if (mask) { if (mask & 0xff) outb(s->state & 0xff, dev->iobase + DIO_W); } val = s->state & 0xff; val |= inb(dev->iobase + DIO_R) << 8; data[1] = val; return insn->n; }
static int usbduxsigma_dio_insn_bits(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { struct usbduxsigma_private *devpriv = dev->private; int ret; down(&devpriv->sem); comedi_dio_update_state(s, data); /* Always update the hardware. See the (*insn_config). */ devpriv->dux_commands[1] = s->io_bits & 0xff; devpriv->dux_commands[4] = s->state & 0xff; devpriv->dux_commands[2] = (s->io_bits >> 8) & 0xff; devpriv->dux_commands[5] = (s->state >> 8) & 0xff; devpriv->dux_commands[3] = (s->io_bits >> 16) & 0xff; devpriv->dux_commands[6] = (s->state >> 16) & 0xff; ret = usbbuxsigma_send_cmd(dev, USBDUXSIGMA_DIO_BITS_CMD); if (ret < 0) goto done; ret = usbduxsigma_receive_cmd(dev, USBDUXSIGMA_DIO_BITS_CMD); if (ret < 0) goto done; s->state = devpriv->insn_buf[1] | (devpriv->insn_buf[2] << 8) | (devpriv->insn_buf[3] << 16); data[1] = s->state; ret = insn->n; done: up(&devpriv->sem); return ret; }
static int dnp_dio_insn_bits(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { unsigned int mask; unsigned int val; /* * Ports A and B are straight forward: each bit corresponds to an * output pin with the same order. Port C is different: bits 0...3 * correspond to bits 4...7 of the output register (PCDR). */ mask = comedi_dio_update_state(s, data); if (mask) { outb(PADR, CSCIR); outb(s->state & 0xff, CSCDR); outb(PBDR, CSCIR); outb((s->state >> 8) & 0xff, CSCDR); outb(PCDR, CSCIR); val = inb(CSCDR) & 0x0f; outb(((s->state >> 12) & 0xf0) | val, CSCDR); } outb(PADR, CSCIR); val = inb(CSCDR); outb(PBDR, CSCIR); val |= (inb(CSCDR) << 8); outb(PCDR, CSCIR); val |= ((inb(CSCDR) & 0xf0) << 12); data[1] = val; return insn->n; }