[PATCH 10/21] staging: comedi: c6xdigio: introduce c6xdigio_write_data()

H Hartley Sweeten hsweeten at visionengravers.com
Mon Mar 10 21:07:31 UTC 2014


All writes to the hardware involve writing the the data register then
checking the status register. Introduce a helper function to handle this.

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/c6xdigio.c | 90 +++++++++++--------------------
 1 file changed, 31 insertions(+), 59 deletions(-)

diff --git a/drivers/staging/comedi/drivers/c6xdigio.c b/drivers/staging/comedi/drivers/c6xdigio.c
index d1860f6..2189e5b 100644
--- a/drivers/staging/comedi/drivers/c6xdigio.c
+++ b/drivers/staging/comedi/drivers/c6xdigio.c
@@ -92,19 +92,19 @@ static int c6xdigio_chk_status(struct comedi_device *dev, unsigned long context)
 	return -EBUSY;
 }
 
-static void c6xdigio_pwm_init(struct comedi_device *dev)
+static int c6xdigio_write_data(struct comedi_device *dev,
+			       unsigned int val, unsigned int status)
 {
-	outb_p(0x70, dev->iobase);
-	c6xdigio_chk_status(dev, 0x00);
-
-	outb_p(0x74, dev->iobase);
-	c6xdigio_chk_status(dev, 0x80);
-
-	outb_p(0x70, dev->iobase);
-	c6xdigio_chk_status(dev, 0x00);
+	outb_p(val, dev->iobase);
+	return c6xdigio_chk_status(dev, status);
+}
 
-	outb_p(0x0, dev->iobase);
-	c6xdigio_chk_status(dev, 0x80);
+static void c6xdigio_pwm_init(struct comedi_device *dev)
+{
+	c6xdigio_write_data(dev, 0x70, 0x00);
+	c6xdigio_write_data(dev, 0x74, 0x80);
+	c6xdigio_write_data(dev, 0x70, 0x00);
+	c6xdigio_write_data(dev, 0x00, 0x80);
 }
 
 static void c6xdigio_pwm_write(struct comedi_device *dev,
@@ -124,23 +124,12 @@ static void c6xdigio_pwm_write(struct comedi_device *dev,
 	else
 		ppcmd = 0x30;
 
-	outb_p(ppcmd + pwm.bits.sb0, dev->iobase);
-	c6xdigio_chk_status(dev, 0x00);
-
-	outb_p(ppcmd + pwm.bits.sb1 + 0x4, dev->iobase);
-	c6xdigio_chk_status(dev, 0x80);
-
-	outb_p(ppcmd + pwm.bits.sb2, dev->iobase);
-	c6xdigio_chk_status(dev, 0x00);
-
-	outb_p(ppcmd + pwm.bits.sb3 + 0x4, dev->iobase);
-	c6xdigio_chk_status(dev, 0x80);
-
-	outb_p(ppcmd + pwm.bits.sb4, dev->iobase);
-	c6xdigio_chk_status(dev, 0x00);
-
-	outb_p(0x0, dev->iobase);
-	c6xdigio_chk_status(dev, 0x80);
+	c6xdigio_write_data(dev, ppcmd + pwm.bits.sb0, 0x00);
+	c6xdigio_write_data(dev, ppcmd + pwm.bits.sb1 + 0x4, 0x80);
+	c6xdigio_write_data(dev, ppcmd + pwm.bits.sb2, 0x00);
+	c6xdigio_write_data(dev, ppcmd + pwm.bits.sb3 + 0x4, 0x80);
+	c6xdigio_write_data(dev, ppcmd + pwm.bits.sb4, 0x00);
+	c6xdigio_write_data(dev, 0x00, 0x80);
 }
 
 static int c6xdigio_encoder_read(struct comedi_device *dev,
@@ -155,60 +144,43 @@ static int c6xdigio_encoder_read(struct comedi_device *dev,
 	else
 		ppcmd = 0x50;
 
-	outb_p(ppcmd, dev->iobase);
-	c6xdigio_chk_status(dev, 0x00);
+	c6xdigio_write_data(dev, ppcmd, 0x00);
 
 	enc.bits.sb0 = ((inb(dev->iobase + 1) >> 3) & 0x7);
-	outb_p(ppcmd + 0x4, dev->iobase);
-	c6xdigio_chk_status(dev, 0x80);
+	c6xdigio_write_data(dev, ppcmd + 0x4, 0x80);
 
 	enc.bits.sb1 = ((inb(dev->iobase + 1) >> 3) & 0x7);
-	outb_p(ppcmd, dev->iobase);
-	c6xdigio_chk_status(dev, 0x00);
+	c6xdigio_write_data(dev, ppcmd, 0x00);
 
 	enc.bits.sb2 = ((inb(dev->iobase + 1) >> 3) & 0x7);
-	outb_p(ppcmd + 0x4, dev->iobase);
-	c6xdigio_chk_status(dev, 0x80);
+	c6xdigio_write_data(dev, ppcmd + 0x4, 0x80);
 
 	enc.bits.sb3 = ((inb(dev->iobase + 1) >> 3) & 0x7);
-	outb_p(ppcmd, dev->iobase);
-	c6xdigio_chk_status(dev, 0x00);
+	c6xdigio_write_data(dev, ppcmd, 0x00);
 
 	enc.bits.sb4 = ((inb(dev->iobase + 1) >> 3) & 0x7);
-	outb_p(ppcmd + 0x4, dev->iobase);
-	c6xdigio_chk_status(dev, 0x80);
+	c6xdigio_write_data(dev, ppcmd + 0x4, 0x80);
 
 	enc.bits.sb5 = ((inb(dev->iobase + 1) >> 3) & 0x7);
-	outb_p(ppcmd, dev->iobase);
-	c6xdigio_chk_status(dev, 0x00);
+	c6xdigio_write_data(dev, ppcmd, 0x00);
 
 	enc.bits.sb6 = ((inb(dev->iobase + 1) >> 3) & 0x7);
-	outb_p(ppcmd + 0x4, dev->iobase);
-	c6xdigio_chk_status(dev, 0x80);
+	c6xdigio_write_data(dev, ppcmd + 0x4, 0x80);
 
 	enc.bits.sb7 = ((inb(dev->iobase + 1) >> 3) & 0x7);
-	outb_p(ppcmd, dev->iobase);
-	c6xdigio_chk_status(dev, 0x00);
+	c6xdigio_write_data(dev, ppcmd, 0x00);
 
-	outb_p(0x0, dev->iobase);
-	c6xdigio_chk_status(dev, 0x80);
+	c6xdigio_write_data(dev, 0x00, 0x80);
 
 	return enc.value ^ 0x800000;
 }
 
 static void c6xdigio_encoder_reset(struct comedi_device *dev)
 {
-	outb_p(0x68, dev->iobase);
-	c6xdigio_chk_status(dev, 0x00);
-
-	outb_p(0x6c, dev->iobase);
-	c6xdigio_chk_status(dev, 0x80);
-
-	outb_p(0x68, dev->iobase);
-	c6xdigio_chk_status(dev, 0x00);
-
-	outb_p(0x0, dev->iobase);
-	c6xdigio_chk_status(dev, 0x80);
+	c6xdigio_write_data(dev, 0x68, 0x00);
+	c6xdigio_write_data(dev, 0x6c, 0x80);
+	c6xdigio_write_data(dev, 0x68, 0x00);
+	c6xdigio_write_data(dev, 0x00, 0x80);
 }
 
 static int c6xdigio_pwmo_insn_write(struct comedi_device *dev,
-- 
1.8.5.2



More information about the devel mailing list