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

staging: comedi: daqboard2000: check result of FPGA programming

According to an old, GPL'ed Linux driver at
<ftp://ftp.mccdaq.com/downloads/iotech_software/DaqBoard_1000_2000_Series/Linux_driver_kernelv2.4.x/>,
after programming the FPGA, the General Purpose Input (USERI) of the PLX
PCI-9080 should go high shortly after a valid FPGA bitstream has been
loaded.  Add a new function `daqboard2000_wait_fpga_programmed()` to
wait for that, performing up to 200 checks over a 20 ms period (this is
loosely based on `pollFPGADone()` in the above-mentioned old driver).
Return 0 if the FPGA appears to have loaded successfully, or
`-ETIMEDOUT` if it runs out of checks.  Call it from the firmware
loading callback `daqboard2000_load_firmware()` after writing the
firmware to the FPGA to check it is programmed successfully.
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 7680a227
...@@ -501,6 +501,23 @@ static int daqboard2000_write_cpld(struct comedi_device *dev, u16 data) ...@@ -501,6 +501,23 @@ static int daqboard2000_write_cpld(struct comedi_device *dev, u16 data)
return result; return result;
} }
static int daqboard2000_wait_fpga_programmed(struct comedi_device *dev)
{
struct daqboard2000_private *devpriv = dev->private;
int i;
/* Time out after 200 tries -> 20ms */
for (i = 0; i < 200; i++) {
u32 cntrl = readl(devpriv->plx + PLX_REG_CNTRL);
/* General Purpose Input (USERI) set on FPGA "DONE". */
if (cntrl & PLX_CNTRL_USERI)
return 0;
usleep_range(100, 1000);
}
return -ETIMEDOUT;
}
static int daqboard2000_load_firmware(struct comedi_device *dev, static int daqboard2000_load_firmware(struct comedi_device *dev,
const u8 *cpld_array, size_t len, const u8 *cpld_array, size_t len,
unsigned long context) unsigned long context)
...@@ -551,6 +568,8 @@ static int daqboard2000_load_firmware(struct comedi_device *dev, ...@@ -551,6 +568,8 @@ static int daqboard2000_load_firmware(struct comedi_device *dev,
if (result) if (result)
break; break;
} }
if (result == 0)
result = daqboard2000_wait_fpga_programmed(dev);
if (result == 0) { if (result == 0) {
daqboard2000_reset_local_bus(dev); daqboard2000_reset_local_bus(dev);
daqboard2000_reload_plx(dev); daqboard2000_reload_plx(dev);
......
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