Commit 90bc9cb3 authored by Ian Abbott's avatar Ian Abbott Committed by Greg Kroah-Hartman

staging: comedi: daqboard2000: replace daqboard2000_poll_cpld()

`daqboard2000_poll_cpld()` waits for a specified status bit in the CPLD
status register to be set, giving up after 50 tries over a period of
about 5 milliseconds.  It returns 1 if the status bit is set, otherwise
0.  It is only ever called to check the "INIT" status bit.  Replace it
with new function `daqboard2000_wait_cpld_init()`, which returns 0 if
the "INIT" status bit becomes set within 50 tries, or `-ETIMEDOUT` if
not set within 50 tries.  The firmware loading callback
`daqboard2000_load_firmware()` may return the error result from
`daqboard2000_wait_cpld_init()` if it has used up all its firmware
loading attempts and that was the last error.
Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
Reviewed-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 7cff0b77
...@@ -470,17 +470,17 @@ static void daqboard2000_pulse_prog_pin(struct comedi_device *dev) ...@@ -470,17 +470,17 @@ static void daqboard2000_pulse_prog_pin(struct comedi_device *dev)
mdelay(10); /* Not in the original code, but I like symmetry... */ mdelay(10); /* Not in the original code, but I like symmetry... */
} }
static int daqboard2000_poll_cpld(struct comedi_device *dev, u16 mask) static int daqboard2000_wait_cpld_init(struct comedi_device *dev)
{ {
int result = 0; int result = -ETIMEDOUT;
int i; int i;
u16 cpld; u16 cpld;
/* timeout after 50 tries -> 5ms */ /* timeout after 50 tries -> 5ms */
for (i = 0; i < 50; i++) { for (i = 0; i < 50; i++) {
cpld = readw(dev->mmio + DB2K_REG_CPLD_STATUS); cpld = readw(dev->mmio + DB2K_REG_CPLD_STATUS);
if ((cpld & mask) == mask) { if (cpld & DB2K_CPLD_STATUS_INIT) {
result = 1; result = 0;
break; break;
} }
usleep_range(100, 1000); usleep_range(100, 1000);
...@@ -540,21 +540,24 @@ static int daqboard2000_load_firmware(struct comedi_device *dev, ...@@ -540,21 +540,24 @@ static int daqboard2000_load_firmware(struct comedi_device *dev,
daqboard2000_reset_local_bus(dev); daqboard2000_reset_local_bus(dev);
daqboard2000_reload_plx(dev); daqboard2000_reload_plx(dev);
daqboard2000_pulse_prog_pin(dev); daqboard2000_pulse_prog_pin(dev);
if (daqboard2000_poll_cpld(dev, DB2K_CPLD_STATUS_INIT)) { result = daqboard2000_wait_cpld_init(dev);
if (result)
continue;
for (; i < len; i += 2) { for (; i < len; i += 2) {
u16 data = u16 data = (cpld_array[i] << 8) + cpld_array[i + 1];
(cpld_array[i] << 8) + cpld_array[i + 1];
if (!daqboard2000_write_cpld(dev, data)) if (!daqboard2000_write_cpld(dev, data)) {
result = -EIO;
break; break;
} }
if (i >= len) { }
if (result == 0) {
daqboard2000_reset_local_bus(dev); daqboard2000_reset_local_bus(dev);
daqboard2000_reload_plx(dev); daqboard2000_reload_plx(dev);
result = 0;
break; break;
} }
} }
}
return result; return result;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment