Commit cd5d0ae4 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman

staging: comedi: addi_apci_3501: use addi_tcw.h for the timer registers

The APCI3501_TIMER_* register defines in this driver are that same as
the ADDI_TCW_* defines with an additional offset.

Add a 'tcw' (timer/counter/watchdog) member to the private data to
hold the address for the iobase of the registers. Use that and the
defines from addi_tcw.h to address the registers.
Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent f821bf57
......@@ -36,19 +36,19 @@ static int apci3501_config_insn_timer(struct comedi_device *dev,
if (devpriv->timer_mode == ADDIDATA_WATCHDOG) {
ctrl = 0;
} else {
ctrl = inl(dev->iobase + APCI3501_TIMER_CTRL_REG);
ctrl = inl(devpriv->tcw + ADDI_TCW_CTRL_REG);
ctrl &= 0xfffff9fe;
}
outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
outl(ctrl, devpriv->tcw + ADDI_TCW_CTRL_REG);
/* enable/disable the timer interrupt */
ctrl = (data[1] == 1) ? 0x2 : 0;
outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
outl(ctrl, devpriv->tcw + ADDI_TCW_CTRL_REG);
outl(data[2], dev->iobase + APCI3501_TIMER_TIMEBASE_REG);
outl(data[3], dev->iobase + APCI3501_TIMER_RELOAD_REG);
outl(data[2], devpriv->tcw + ADDI_TCW_TIMEBASE_REG);
outl(data[3], devpriv->tcw + ADDI_TCW_RELOAD_REG);
ctrl = inl(dev->iobase + APCI3501_TIMER_CTRL_REG);
ctrl = inl(devpriv->tcw + ADDI_TCW_CTRL_REG);
if (devpriv->timer_mode == ADDIDATA_WATCHDOG) {
/* Set the mode (e2->e0) NOTE: this doesn't look correct */
ctrl |= 0xfff819e0;
......@@ -57,7 +57,7 @@ static int apci3501_config_insn_timer(struct comedi_device *dev,
ctrl &= 0xfff719e2;
ctrl |= (2 << 13) | 0x10;
}
outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
outl(ctrl, devpriv->tcw + ADDI_TCW_CTRL_REG);
return insn->n;
}
......@@ -84,7 +84,7 @@ static int apci3501_write_insn_timer(struct comedi_device *dev,
if (devpriv->timer_mode == ADDIDATA_WATCHDOG ||
devpriv->timer_mode == ADDIDATA_TIMER) {
ctrl = inl(dev->iobase + APCI3501_TIMER_CTRL_REG);
ctrl = inl(devpriv->tcw + ADDI_TCW_CTRL_REG);
ctrl &= 0xfffff9ff;
if (data[1] == 1) { /* enable */
......@@ -97,10 +97,10 @@ static int apci3501_write_insn_timer(struct comedi_device *dev,
} else if (data[1] == 2) { /* trigger */
ctrl |= 0x200;
}
outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
outl(ctrl, devpriv->tcw + ADDI_TCW_CTRL_REG);
}
inl(dev->iobase + APCI3501_TIMER_STATUS_REG);
inl(devpriv->tcw + ADDI_TCW_STATUS_REG);
return insn->n;
}
......@@ -125,8 +125,8 @@ static int apci3501_read_insn_timer(struct comedi_device *dev,
devpriv->timer_mode != ADDIDATA_WATCHDOG)
return -EINVAL;
data[0] = inl(dev->iobase + APCI3501_TIMER_STATUS_REG) & 0x1;
data[1] = inl(dev->iobase + APCI3501_TIMER_SYNC_REG);
data[0] = inl(devpriv->tcw + ADDI_TCW_STATUS_REG) & 0x1;
data[1] = inl(devpriv->tcw + ADDI_TCW_VAL_REG);
return insn->n;
}
......@@ -27,6 +27,7 @@
#include <linux/sched.h>
#include "../comedi_pci.h"
#include "addi_tcw.h"
#include "amcc_s5933.h"
/*
......@@ -40,14 +41,7 @@
#define APCI3501_AO_DATA_VAL(x) ((x) << 8)
#define APCI3501_AO_DATA_BIPOLAR BIT(31)
#define APCI3501_AO_TRIG_SCS_REG 0x08
#define APCI3501_TIMER_SYNC_REG 0x20
#define APCI3501_TIMER_RELOAD_REG 0x24
#define APCI3501_TIMER_TIMEBASE_REG 0x28
#define APCI3501_TIMER_CTRL_REG 0x2c
#define APCI3501_TIMER_STATUS_REG 0x30
#define APCI3501_TIMER_IRQ_REG 0x34
#define APCI3501_TIMER_WARN_RELOAD_REG 0x38
#define APCI3501_TIMER_WARN_TIMEBASE_REG 0x3c
#define APCI3501_TIMER_BASE 0x20
#define APCI3501_DO_REG 0x40
#define APCI3501_DI_REG 0x50
......@@ -73,6 +67,7 @@
struct apci3501_private {
unsigned long amcc;
unsigned long tcw;
struct task_struct *tsk_Current;
unsigned char timer_mode;
};
......@@ -266,11 +261,11 @@ static irqreturn_t apci3501_interrupt(int irq, void *d)
unsigned int ctrl;
/* Disable Interrupt */
ctrl = inl(dev->iobase + APCI3501_TIMER_CTRL_REG);
ctrl = inl(devpriv->tcw + ADDI_TCW_CTRL_REG);
ctrl &= 0xfffff9fd;
outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
outl(ctrl, devpriv->tcw + ADDI_TCW_CTRL_REG);
status = inl(dev->iobase + APCI3501_TIMER_IRQ_REG) & 0x1;
status = inl(devpriv->tcw + ADDI_TCW_IRQ_REG) & 0x1;
if (!status) {
dev_err(dev->class_dev, "IRQ from unknown source\n");
return IRQ_NONE;
......@@ -278,11 +273,11 @@ static irqreturn_t apci3501_interrupt(int irq, void *d)
/* Enable Interrupt Send a signal to from kernel to user space */
send_sig(SIGIO, devpriv->tsk_Current, 0);
ctrl = inl(dev->iobase + APCI3501_TIMER_CTRL_REG);
ctrl = inl(devpriv->tcw + ADDI_TCW_CTRL_REG);
ctrl &= 0xfffff9fd;
ctrl |= 1 << 1;
outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
inl(dev->iobase + APCI3501_TIMER_STATUS_REG);
outl(ctrl, devpriv->tcw + ADDI_TCW_CTRL_REG);
inl(devpriv->tcw + ADDI_TCW_STATUS_REG);
return IRQ_HANDLED;
}
......@@ -334,8 +329,9 @@ static int apci3501_auto_attach(struct comedi_device *dev,
if (ret)
return ret;
dev->iobase = pci_resource_start(pcidev, 1);
devpriv->amcc = pci_resource_start(pcidev, 0);
dev->iobase = pci_resource_start(pcidev, 1);
devpriv->tcw = dev->iobase + APCI3501_TIMER_BASE;
ao_n_chan = apci3501_eeprom_get_ao_n_chan(dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment