[PATCH 07/15] staging: comedi: hwdrv_apci3501: refactor apci3501_config_insn_timer()
H Hartley Sweeten
hsweeten at visionengravers.com
Wed Aug 12 20:25:42 UTC 2015
The handling for the watchdog and timer modes is very similar. Refactor
this function to use a common code path for both modes.
Signed-off-by: H Hartley Sweeten <hsweeten at visionengravers.com>
Cc: Ian Abbott <abbotti at mev.co.uk>
Cc: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
---
.../comedi/drivers/addi-data/hwdrv_apci3501.c | 59 +++++++++-------------
1 file changed, 23 insertions(+), 36 deletions(-)
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.c b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.c
index 47c6bc1..e5209eb 100644
--- a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.c
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.c
@@ -22,55 +22,42 @@ static int apci3501_config_insn_timer(struct comedi_device *dev,
unsigned int *data)
{
struct apci3501_private *devpriv = dev->private;
- unsigned int ctrl = 0;
+ unsigned int ctrl;
+
+ if (data[0] != ADDIDATA_WATCHDOG &&
+ data[0] != ADDIDATA_TIMER)
+ return -EINVAL;
devpriv->tsk_Current = current;
- if (data[0] == ADDIDATA_WATCHDOG) {
-
- devpriv->timer_mode = ADDIDATA_WATCHDOG;
- /* Disable the watchdog */
- outl(0x0, dev->iobase + APCI3501_TIMER_CTRL_REG);
-
- if (data[1] == 1) {
- /* Enable TIMER int & DISABLE ALL THE OTHER int SOURCES */
- outl(0x02, dev->iobase + APCI3501_TIMER_CTRL_REG);
- } else {
- /* disable Timer interrupt */
- outl(0x0, dev->iobase + APCI3501_TIMER_CTRL_REG);
- }
- outl(data[2], dev->iobase + APCI3501_TIMER_TIMEBASE_REG);
- outl(data[3], dev->iobase + APCI3501_TIMER_RELOAD_REG);
+ devpriv->timer_mode = data[0];
- /* Set the mode (e2->e0) */
+ /* first, disable the watchdog or stop the timer */
+ if (devpriv->timer_mode == ADDIDATA_WATCHDOG) {
+ ctrl = 0;
+ } else {
ctrl = inl(dev->iobase + APCI3501_TIMER_CTRL_REG);
- ctrl |= 0xfff819e0;
- outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
+ ctrl &= 0xfffff9fe;
}
+ outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
- else if (data[0] == ADDIDATA_TIMER) {
- /* First Stop The Timer */
- ctrl = inl(dev->iobase + APCI3501_TIMER_CTRL_REG);
- ctrl &= 0xfffff9fe;
- outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
- devpriv->timer_mode = ADDIDATA_TIMER;
- if (data[1] == 1) {
- /* Enable TIMER int & DISABLE ALL THE OTHER int SOURCES */
- outl(0x02, dev->iobase + APCI3501_TIMER_CTRL_REG);
- } else {
- /* disable Timer interrupt */
- outl(0x0, dev->iobase + APCI3501_TIMER_CTRL_REG);
- }
+ /* enable/disable the timer interrupt */
+ ctrl = (data[1] == 1) ? 0x2 : 0;
+ outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
- outl(data[2], dev->iobase + APCI3501_TIMER_TIMEBASE_REG);
- outl(data[3], dev->iobase + APCI3501_TIMER_RELOAD_REG);
+ outl(data[2], dev->iobase + APCI3501_TIMER_TIMEBASE_REG);
+ outl(data[3], dev->iobase + APCI3501_TIMER_RELOAD_REG);
+ ctrl = inl(dev->iobase + APCI3501_TIMER_CTRL_REG);
+ if (devpriv->timer_mode == ADDIDATA_WATCHDOG) {
+ /* Set the mode (e2->e0) NOTE: this doesn't look correct */
+ ctrl |= 0xfff819e0;
+ } else {
/* mode 2 */
- ctrl = inl(dev->iobase + APCI3501_TIMER_CTRL_REG);
ctrl &= 0xfff719e2;
ctrl |= (2 << 13) | 0x10;
- outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
}
+ outl(ctrl, dev->iobase + APCI3501_TIMER_CTRL_REG);
return insn->n;
}
--
2.4.3
More information about the devel
mailing list