summaryrefslogtreecommitdiff
path: root/drivers/staging/comedi/drivers/ke_counter.c
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2014-03-03 16:47:36 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-03-04 16:40:27 -0800
commit4761fb4e4a97a512983e5cff422ef64e0c164454 (patch)
tree9f88e7b6909973028387688bb4778e903c84bb41 /drivers/staging/comedi/drivers/ke_counter.c
parent8fff5ac61d0e937bfb5bf3d142a4d42f94dc1bf0 (diff)
staging: comedi: ke_counter: define the register map
Define the register map for the board and remove the magic values. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Cc: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/comedi/drivers/ke_counter.c')
-rw-r--r--drivers/staging/comedi/drivers/ke_counter.c43
1 files changed, 28 insertions, 15 deletions
diff --git a/drivers/staging/comedi/drivers/ke_counter.c b/drivers/staging/comedi/drivers/ke_counter.c
index 53687fbe2c4d..17cba90dfb39 100644
--- a/drivers/staging/comedi/drivers/ke_counter.c
+++ b/drivers/staging/comedi/drivers/ke_counter.c
@@ -34,6 +34,21 @@ Kolter Electronic PCI Counter Card.
#include "../comedidev.h"
+/*
+ * PCI BAR 0 Register I/O map
+ */
+#define KE_RESET_REG(x) (0x00 + ((x) * 0x20))
+#define KE_LATCH_REG(x) (0x00 + ((x) * 0x20))
+#define KE_LSB_REG(x) (0x04 + ((x) * 0x20))
+#define KE_MID_REG(x) (0x08 + ((x) * 0x20))
+#define KE_MSB_REG(x) (0x0c + ((x) * 0x20))
+#define KE_SIGN_REG(x) (0x10 + ((x) * 0x20))
+#define KE_OSC_SEL_REG 0xf8
+#define KE_OSC_SEL_EXT (1 << 0)
+#define KE_OSC_SEL_4MHZ (2 << 0)
+#define KE_OSC_SEL_20MHZ (3 << 0)
+#define KE_DO_REG 0xfc
+
/*-- counter write ----------------------------------------------------------*/
/* This should be used only for resetting the counters; maybe it is better
@@ -45,13 +60,13 @@ static int cnt_winsn(struct comedi_device *dev,
int chan = CR_CHAN(insn->chanspec);
outb((unsigned char)((data[0] >> 24) & 0xff),
- dev->iobase + chan * 0x20 + 0x10);
+ dev->iobase + KE_SIGN_REG(chan));
outb((unsigned char)((data[0] >> 16) & 0xff),
- dev->iobase + chan * 0x20 + 0x0c);
+ dev->iobase + KE_MSB_REG(chan));
outb((unsigned char)((data[0] >> 8) & 0xff),
- dev->iobase + chan * 0x20 + 0x08);
+ dev->iobase + KE_MID_REG(chan));
outb((unsigned char)((data[0] >> 0) & 0xff),
- dev->iobase + chan * 0x20 + 0x04);
+ dev->iobase + KE_LSB_REG(chan));
/* return the number of samples written */
return 1;
@@ -67,11 +82,11 @@ static int cnt_rinsn(struct comedi_device *dev,
int chan = CR_CHAN(insn->chanspec);
int result;
- a0 = inb(dev->iobase + chan * 0x20);
- a1 = inb(dev->iobase + chan * 0x20 + 0x04);
- a2 = inb(dev->iobase + chan * 0x20 + 0x08);
- a3 = inb(dev->iobase + chan * 0x20 + 0x0c);
- a4 = inb(dev->iobase + chan * 0x20 + 0x10);
+ a0 = inb(dev->iobase + KE_LATCH_REG(chan));
+ a1 = inb(dev->iobase + KE_LSB_REG(chan));
+ a2 = inb(dev->iobase + KE_MID_REG(chan));
+ a3 = inb(dev->iobase + KE_MSB_REG(chan));
+ a4 = inb(dev->iobase + KE_SIGN_REG(chan));
result = (a1 + (a2 * 256) + (a3 * 65536));
if (a4 > 0)
@@ -109,13 +124,11 @@ static int cnt_auto_attach(struct comedi_device *dev,
s->insn_read = cnt_rinsn;
s->insn_write = cnt_winsn;
- /* select 20MHz clock */
- outb(3, dev->iobase + 248);
+ outb(KE_OSC_SEL_20MHZ, dev->iobase + KE_OSC_SEL_REG);
- /* reset all counters */
- outb(0, dev->iobase);
- outb(0, dev->iobase + 0x20);
- outb(0, dev->iobase + 0x40);
+ outb(0, dev->iobase + KE_RESET_REG(0));
+ outb(0, dev->iobase + KE_RESET_REG(1));
+ outb(0, dev->iobase + KE_RESET_REG(2));
return 0;
}