summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2014-03-10 21:07:34 (GMT)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-03-17 21:03:59 (GMT)
commit19d0a872841a2714444af0ccd2a3e1d7281ef357 (patch)
tree6980153887f0b4bece4c0080ceab8c3ee8f2f089 /drivers
parentbea8052074691c70526ae6a555d25f111c0aad0a (diff)
downloadlinux-19d0a872841a2714444af0ccd2a3e1d7281ef357.tar.xz
staging: comedi: c6xdigio: tidy up c6xdigio_pwm_write()
The 10-bit pwm value (2-498) is written by banging 2-bits in the data register. Refactor this function to remove the need for the union pcmcmdtype and struct pwmbitstype. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/staging/comedi/drivers/c6xdigio.c41
1 files changed, 17 insertions, 24 deletions
diff --git a/drivers/staging/comedi/drivers/c6xdigio.c b/drivers/staging/comedi/drivers/c6xdigio.c
index 7c2c19f..a9066d6 100644
--- a/drivers/staging/comedi/drivers/c6xdigio.c
+++ b/drivers/staging/comedi/drivers/c6xdigio.c
@@ -50,18 +50,6 @@ http://robot0.ge.uiuc.edu/~spong/mecha/
#define C6XDIGIO_STATUS_REG 0x01
#define C6XDIGIO_CTRL_REG 0x02
-struct pwmbitstype {
- unsigned sb0:2;
- unsigned sb1:2;
- unsigned sb2:2;
- unsigned sb3:2;
- unsigned sb4:2;
-};
-union pwmcmdtype {
- unsigned cmd; /* assuming here that int is 32bit */
- struct pwmbitstype bits;
-};
-
#define C6XDIGIO_TIME_OUT 20
static int c6xdigio_chk_status(struct comedi_device *dev, unsigned long context)
@@ -113,25 +101,30 @@ static void c6xdigio_pwm_init(struct comedi_device *dev)
static void c6xdigio_pwm_write(struct comedi_device *dev,
unsigned int chan, unsigned int val)
{
+ unsigned int bits;
unsigned ppcmd;
- union pwmcmdtype pwm;
-
- pwm.cmd = val;
- if (pwm.cmd > 498)
- pwm.cmd = 498;
- if (pwm.cmd < 2)
- pwm.cmd = 2;
if (chan == 0)
ppcmd = 0x28;
else
ppcmd = 0x30;
- 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);
+ if (val > 498)
+ val = 498;
+ if (val < 2)
+ val = 2;
+
+ bits = (val >> 0) & 0x03;
+ c6xdigio_write_data(dev, ppcmd + bits, 0x00);
+ bits = (val >> 2) & 0x03;
+ c6xdigio_write_data(dev, ppcmd + bits + 0x4, 0x80);
+ bits = (val >> 4) & 0x03;
+ c6xdigio_write_data(dev, ppcmd + bits, 0x00);
+ bits = (val >> 6) & 0x03;
+ c6xdigio_write_data(dev, ppcmd + bits + 0x4, 0x80);
+ bits = (val >> 8) & 0x03;
+ c6xdigio_write_data(dev, ppcmd + bits, 0x00);
+
c6xdigio_write_data(dev, 0x00, 0x80);
}