aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/comedi/drivers/ni_6527.c
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2013-10-01 15:11:00 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-10-03 14:09:53 -0700
commit33b73a35a25152aea0a5df78f2bddcfde3115180 (patch)
tree60c783316c1e76c75c3eaba9936296cc3d3b1bd2 /drivers/staging/comedi/drivers/ni_6527.c
parentstaging: comedi: ni_6527: tidy up ni6527_di_insn_config() (diff)
downloadlinux-dev-33b73a35a25152aea0a5df78f2bddcfde3115180.tar.xz
linux-dev-33b73a35a25152aea0a5df78f2bddcfde3115180.zip
staging: comedi: ni_6527: tidy up ni6527_{di, do}_insn_bits()
The digital input and output ports are different. Split the CamelCase Port_Register() define into separate NI6527_DI_REG() and NI6527_DO_REG() defines to make this clear. Tidy up the functions a bit. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/comedi/drivers/ni_6527.c')
-rw-r--r--drivers/staging/comedi/drivers/ni_6527.c37
1 files changed, 20 insertions, 17 deletions
diff --git a/drivers/staging/comedi/drivers/ni_6527.c b/drivers/staging/comedi/drivers/ni_6527.c
index 65a1ba96fbab..45a6e37744e1 100644
--- a/drivers/staging/comedi/drivers/ni_6527.c
+++ b/drivers/staging/comedi/drivers/ni_6527.c
@@ -42,7 +42,8 @@ Updated: Sat, 25 Jan 2003 13:24:40 -0800
#include "comedi_fc.h"
#include "mite.h"
-#define Port_Register(x) (0x00+(x))
+#define NI6527_DI_REG(x) (0x00 + (x))
+#define NI6527_DO_REG(x) (0x03 + (x))
#define NI6527_ID_REG 0x06
#define Clear_Register 0x07
@@ -157,13 +158,18 @@ static int ni6527_di_insn_config(struct comedi_device *dev,
static int ni6527_di_insn_bits(struct comedi_device *dev,
struct comedi_subdevice *s,
- struct comedi_insn *insn, unsigned int *data)
+ struct comedi_insn *insn,
+ unsigned int *data)
{
struct ni6527_private *devpriv = dev->private;
+ void __iomem *mmio = devpriv->mite->daq_io_addr;
+ unsigned int val;
+
+ val = readb(mmio + NI6527_DI_REG(0));
+ val |= (readb(mmio + NI6527_DI_REG(1)) << 8);
+ val |= (readb(mmio + NI6527_DI_REG(2)) << 16);
- data[1] = readb(devpriv->mite->daq_io_addr + Port_Register(0));
- data[1] |= readb(devpriv->mite->daq_io_addr + Port_Register(1)) << 8;
- data[1] |= readb(devpriv->mite->daq_io_addr + Port_Register(2)) << 16;
+ data[1] = val;
return insn->n;
}
@@ -174,23 +180,20 @@ static int ni6527_do_insn_bits(struct comedi_device *dev,
unsigned int *data)
{
struct ni6527_private *devpriv = dev->private;
+ void __iomem *mmio = devpriv->mite->daq_io_addr;
unsigned int mask;
mask = comedi_dio_update_state(s, data);
if (mask) {
/* Outputs are inverted */
- if (mask & 0x0000ff) {
- writeb(s->state ^ 0xff,
- devpriv->mite->daq_io_addr + Port_Register(3));
- }
- if (mask & 0x00ff00) {
- writeb((s->state >> 8) ^ 0xff,
- devpriv->mite->daq_io_addr + Port_Register(4));
- }
- if (mask & 0xff0000) {
- writeb((s->state >> 16) ^ 0xff,
- devpriv->mite->daq_io_addr + Port_Register(5));
- }
+ unsigned int val = s->state ^ 0xffffff;
+
+ if (mask & 0x0000ff)
+ writeb(val & 0xff, mmio + NI6527_DO_REG(0));
+ if (mask & 0x00ff00)
+ writeb((val >> 8) & 0xff, mmio + NI6527_DO_REG(1));
+ if (mask & 0xff0000)
+ writeb((val >> 16) & 0xff, mmio + NI6527_DO_REG(2));
}
data[1] = s->state;