[PATCH 35/40] staging: comedi: me4000: use the 8253 helper functions

H Hartley Sweeten hartleys at visionengravers.com
Sat Sep 8 00:49:21 UTC 2012


The counter subdevice of this board is a standard 8254 compatible
counter/timer. Instead of open-coding the 8254 timer io, use the
helper functions provided by 8253.h.

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>
---
 drivers/staging/comedi/drivers/me4000.c | 130 ++------------------------------
 1 file changed, 7 insertions(+), 123 deletions(-)

diff --git a/drivers/staging/comedi/drivers/me4000.c b/drivers/staging/comedi/drivers/me4000.c
index 8f8e0b8..27535cc 100644
--- a/drivers/staging/comedi/drivers/me4000.c
+++ b/drivers/staging/comedi/drivers/me4000.c
@@ -52,6 +52,7 @@ broken.
 #include <linux/list.h>
 #include <linux/spinlock.h>
 
+#include "8253.h"
 #include "me4000.h"
 #if 0
 /* file removed due to GPL incompatibility */
@@ -1513,28 +1514,8 @@ static int cnt_reset(struct comedi_device *dev, unsigned int channel)
 {
 	struct me4000_info *info = dev->private;
 
-	switch (channel) {
-	case 0:
-		outb(0x30, info->timer_regbase + ME4000_CNT_CTRL_REG);
-		outb(0x00, info->timer_regbase + ME4000_CNT_COUNTER_0_REG);
-		outb(0x00, info->timer_regbase + ME4000_CNT_COUNTER_0_REG);
-		break;
-	case 1:
-		outb(0x70, info->timer_regbase + ME4000_CNT_CTRL_REG);
-		outb(0x00, info->timer_regbase + ME4000_CNT_COUNTER_1_REG);
-		outb(0x00, info->timer_regbase + ME4000_CNT_COUNTER_1_REG);
-		break;
-	case 2:
-		outb(0xB0, info->timer_regbase + ME4000_CNT_CTRL_REG);
-		outb(0x00, info->timer_regbase + ME4000_CNT_COUNTER_2_REG);
-		outb(0x00, info->timer_regbase + ME4000_CNT_COUNTER_2_REG);
-		break;
-	default:
-		printk(KERN_ERR
-		       "comedi%d: me4000: cnt_reset(): Invalid channel\n",
-		       dev->minor);
-		return -EINVAL;
-	}
+	i8254_load(info->timer_regbase, 0, channel, 0,
+			I8254_MODE0 | I8254_BINARY);
 
 	return 0;
 }
@@ -1543,54 +1524,9 @@ static int cnt_config(struct comedi_device *dev, unsigned int channel,
 		      unsigned int mode)
 {
 	struct me4000_info *info = dev->private;
-	int tmp = 0;
-
-	switch (channel) {
-	case 0:
-		tmp |= ME4000_CNT_COUNTER_0;
-		break;
-	case 1:
-		tmp |= ME4000_CNT_COUNTER_1;
-		break;
-	case 2:
-		tmp |= ME4000_CNT_COUNTER_2;
-		break;
-	default:
-		printk(KERN_ERR
-		       "comedi%d: me4000: cnt_config(): Invalid channel\n",
-		       dev->minor);
-		return -EINVAL;
-	}
-
-	switch (mode) {
-	case 0:
-		tmp |= ME4000_CNT_MODE_0;
-		break;
-	case 1:
-		tmp |= ME4000_CNT_MODE_1;
-		break;
-	case 2:
-		tmp |= ME4000_CNT_MODE_2;
-		break;
-	case 3:
-		tmp |= ME4000_CNT_MODE_3;
-		break;
-	case 4:
-		tmp |= ME4000_CNT_MODE_4;
-		break;
-	case 5:
-		tmp |= ME4000_CNT_MODE_5;
-		break;
-	default:
-		printk(KERN_ERR
-		       "comedi%d: me4000: cnt_config(): Invalid counter mode\n",
-		       dev->minor);
-		return -EINVAL;
-	}
 
-	/* Write the control word */
-	tmp |= 0x30;
-	outb(tmp, info->timer_regbase + ME4000_CNT_CTRL_REG);
+	i8254_set_mode(info->timer_regbase, 0, channel,
+			(mode << 1) | I8254_BINARY);
 
 	return 0;
 }
@@ -1644,7 +1580,6 @@ static int me4000_cnt_insn_read(struct comedi_device *dev,
 				struct comedi_insn *insn, unsigned int *data)
 {
 	struct me4000_info *info = dev->private;
-	unsigned short tmp;
 
 	if (insn->n == 0)
 		return 0;
@@ -1657,32 +1592,7 @@ static int me4000_cnt_insn_read(struct comedi_device *dev,
 		return -EINVAL;
 	}
 
-	switch (insn->chanspec) {
-	case 0:
-		tmp = inb(info->timer_regbase + ME4000_CNT_COUNTER_0_REG);
-		data[0] = tmp;
-		tmp = inb(info->timer_regbase + ME4000_CNT_COUNTER_0_REG);
-		data[0] |= tmp << 8;
-		break;
-	case 1:
-		tmp = inb(info->timer_regbase + ME4000_CNT_COUNTER_1_REG);
-		data[0] = tmp;
-		tmp = inb(info->timer_regbase + ME4000_CNT_COUNTER_1_REG);
-		data[0] |= tmp << 8;
-		break;
-	case 2:
-		tmp = inb(info->timer_regbase + ME4000_CNT_COUNTER_2_REG);
-		data[0] = tmp;
-		tmp = inb(info->timer_regbase + ME4000_CNT_COUNTER_2_REG);
-		data[0] |= tmp << 8;
-		break;
-	default:
-		printk(KERN_ERR
-		       "comedi%d: me4000: me4000_cnt_insn_read(): "
-		       "Invalid channel %d\n",
-		       dev->minor, insn->chanspec);
-		return -EINVAL;
-	}
+	data[0] = i8254_read(info->timer_regbase, 0, insn->chanspec);
 
 	return 1;
 }
@@ -1692,7 +1602,6 @@ static int me4000_cnt_insn_write(struct comedi_device *dev,
 				 struct comedi_insn *insn, unsigned int *data)
 {
 	struct me4000_info *info = dev->private;
-	unsigned short tmp;
 
 	if (insn->n == 0) {
 		return 0;
@@ -1704,32 +1613,7 @@ static int me4000_cnt_insn_write(struct comedi_device *dev,
 		return -EINVAL;
 	}
 
-	switch (insn->chanspec) {
-	case 0:
-		tmp = data[0] & 0xFF;
-		outb(tmp, info->timer_regbase + ME4000_CNT_COUNTER_0_REG);
-		tmp = (data[0] >> 8) & 0xFF;
-		outb(tmp, info->timer_regbase + ME4000_CNT_COUNTER_0_REG);
-		break;
-	case 1:
-		tmp = data[0] & 0xFF;
-		outb(tmp, info->timer_regbase + ME4000_CNT_COUNTER_1_REG);
-		tmp = (data[0] >> 8) & 0xFF;
-		outb(tmp, info->timer_regbase + ME4000_CNT_COUNTER_1_REG);
-		break;
-	case 2:
-		tmp = data[0] & 0xFF;
-		outb(tmp, info->timer_regbase + ME4000_CNT_COUNTER_2_REG);
-		tmp = (data[0] >> 8) & 0xFF;
-		outb(tmp, info->timer_regbase + ME4000_CNT_COUNTER_2_REG);
-		break;
-	default:
-		printk(KERN_ERR
-		       "comedi%d: me4000: me4000_cnt_insn_write(): "
-		       "Invalid channel %d\n",
-		       dev->minor, insn->chanspec);
-		return -EINVAL;
-	}
+	i8254_write(info->timer_regbase, 0, insn->chanspec, data[0]);
 
 	return 1;
 }
-- 
1.7.11




More information about the devel mailing list