diff options
author | H Hartley Sweeten <hsweeten@visionengravers.com> | 2013-01-23 12:44:40 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-01-25 12:00:30 -0800 |
commit | 5458f3e7b5a8707a49948857d69b2eb2fa5931ac (patch) | |
tree | 055072e33cf40c5f5c669cfcddf4e7feb48436d5 /drivers/staging/comedi/drivers/addi_apci_3501.c | |
parent | 99c9fa48b6bbc640066c414d6b413a1f1b4aa857 (diff) |
staging: comedi: addi_apci_3501: introduce apci3501_wait_for_dac()
Refactor the code that waits for the DAC to be ready into a helper
function.
A timeout of some sort should be added to this helper so code the
users to expect the error condition. In i_APCI3501_WriteAnalogOutput()
just return the error and don't actually write the new value to the
DAC. In apci3501_reset() output a dev_warn() that the DAC was not
ready.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/comedi/drivers/addi_apci_3501.c')
-rw-r--r-- | drivers/staging/comedi/drivers/addi_apci_3501.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/drivers/staging/comedi/drivers/addi_apci_3501.c b/drivers/staging/comedi/drivers/addi_apci_3501.c index b4679b24dd7b..906c37a34c37 100644 --- a/drivers/staging/comedi/drivers/addi_apci_3501.c +++ b/drivers/staging/comedi/drivers/addi_apci_3501.c @@ -47,6 +47,17 @@ static struct comedi_lrange apci3501_ao_range = { } }; +static int apci3501_wait_for_dac(struct comedi_device *dev) +{ + unsigned int status; + + do { + status = inl(dev->iobase + APCI3501_AO_CTRL_STATUS_REG); + } while (!(status & APCI3501_AO_STATUS_READY)); + + return 0; +} + #include "addi-data/hwdrv_apci3501.c" static int apci3501_di_insn_bits(struct comedi_device *dev, @@ -209,7 +220,8 @@ static irqreturn_t apci3501_interrupt(int irq, void *d) static int apci3501_reset(struct comedi_device *dev) { int i_Count = 0, i_temp = 0; - unsigned int ul_Command1 = 0, ul_Polarity, ul_DAC_Ready = 0; + unsigned int ul_Command1 = 0, ul_Polarity; + int ret; outl(0x0, dev->iobase + APCI3501_DO_REG); outl(1, dev->iobase + APCI3501_AO_CTRL_STATUS_REG); @@ -217,15 +229,12 @@ static int apci3501_reset(struct comedi_device *dev) ul_Polarity = 0x80000000; for (i_Count = 0; i_Count <= 7; i_Count++) { - ul_DAC_Ready = inl(dev->iobase + APCI3501_AO_CTRL_STATUS_REG); - - while (ul_DAC_Ready == 0) { - ul_DAC_Ready = - inl(dev->iobase + APCI3501_AO_CTRL_STATUS_REG); - ul_DAC_Ready = (ul_DAC_Ready >> 8) & 1; - } - - if (ul_DAC_Ready) { + ret = apci3501_wait_for_dac(dev); + if (ret) { + dev_warn(dev->class_dev, + "%s: DAC not-ready for channel %i\n", + __func__, i_Count); + } else { /* Output the Value on the output channels. */ ul_Command1 = (unsigned int) ((unsigned int) (i_Count & 0xFF) | |