From c7f499bd03aa735d652e086762e48117d2b197b8 Mon Sep 17 00:00:00 2001 From: H Hartley Sweeten Date: Thu, 4 Sep 2014 12:14:18 -0700 Subject: [PATCH] staging: comedi: adl_pci9118: clarify the digital I/O register The same register is used for both the digital inputs and outputs. Reading the register returns the state of the 4 digtial input channels and the 4 digital output channels. Writing to the register updates the digital outputs. Add some comments to clarify this and use a single define for the register. Signed-off-by: H Hartley Sweeten Reviewed-by: Ian Abbott Signed-off-by: Greg Kroah-Hartman --- drivers/staging/comedi/drivers/adl_pci9118.c | 23 +++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/drivers/staging/comedi/drivers/adl_pci9118.c b/drivers/staging/comedi/drivers/adl_pci9118.c index 4e083159e7cd..6fb46cb03594 100644 --- a/drivers/staging/comedi/drivers/adl_pci9118.c +++ b/drivers/staging/comedi/drivers/adl_pci9118.c @@ -129,9 +129,8 @@ #define PCI9118_AI_CTRL_TMRTR (1 << 2) /* 1=8254 is trigger source */ #define PCI9118_AI_CTRL_INT (1 << 1) /* 1=enable interrupt */ #define PCI9118_AI_CTRL_DMA (1 << 0) /* 1=enable DMA */ +#define PCI9118_DIO_REG 0x1c -#define PCI9118_DI 0x1c /* R: digi input register */ -#define PCI9118_DO 0x1c /* W: digi output register */ #define PCI9118_SOFTTRG 0x20 /* W: soft trigger for A/D */ #define PCI9118_GAIN 0x24 /* W: A/D gain/channel register */ #define PCI9118_BURST 0x28 /* W: A/D burst number register */ @@ -565,9 +564,15 @@ static int pci9118_insn_read_ao(struct comedi_device *dev, static int pci9118_insn_bits_di(struct comedi_device *dev, struct comedi_subdevice *s, - struct comedi_insn *insn, unsigned int *data) + struct comedi_insn *insn, + unsigned int *data) { - data[1] = inl(dev->iobase + PCI9118_DI) & 0xf; + /* + * The digital inputs and outputs share the read register. + * bits [7:4] are the digital outputs + * bits [3:0] are the digital inputs + */ + data[1] = inl(dev->iobase + PCI9118_DIO_REG) & 0xf; return insn->n; } @@ -577,8 +582,14 @@ static int pci9118_insn_bits_do(struct comedi_device *dev, struct comedi_insn *insn, unsigned int *data) { + /* + * The digital outputs are set with the same register that + * the digital inputs and outputs are read from. But the + * outputs are set with bits [3:0] so we can simply write + * the s->state to set them. + */ if (comedi_dio_update_state(s, data)) - outl(s->state & 0x0f, dev->iobase + PCI9118_DO); + outl(s->state, dev->iobase + PCI9118_DIO_REG); data[1] = s->state; @@ -1695,7 +1706,7 @@ static int pci9118_reset(struct comedi_device *dev) outl(devpriv->ao_data[0], dev->iobase + PCI9118_AO_REG(0)); outl(devpriv->ao_data[1], dev->iobase + PCI9118_AO_REG(1)); - outl(0, dev->iobase + PCI9118_DO); /* reset digi outs to L */ + outl(0, dev->iobase + PCI9118_DIO_REG); /* reset digi outs to L */ udelay(10); inl(dev->iobase + PCI9118_AI_FIFO_REG); outl(0, dev->iobase + PCI9118_DELFIFO); /* flush FIFO */ -- 2.30.2