static int sysconfig_burst_write_complete(struct sysconfig_priv *priv)
{
return priv->bitstream_burst_write_complete(priv);
}
static int sysconfig_isc_disable(struct sysconfig_priv *priv)
{
const u8 isc_disable[] = SYSCONFIG_ISC_DISABLE;
return sysconfig_cmd_write(priv, isc_disable, sizeof(isc_disable));
}
static int sysconfig_isc_finish(struct sysconfig_priv *priv)
{
struct gpio_desc *done_gpio = priv->done;
u32 status;
int ret;
if (done_gpio) {
ret = sysconfig_isc_disable(priv);
if (ret)
return ret;
return sysconfig_poll_gpio(done_gpio, true);
}
ret = sysconfig_poll_status(priv, &status);
if (ret)
return ret;
if ((status & SYSCONFIG_STATUS_DONE) &&
!(status & SYSCONFIG_STATUS_BUSY) &&
!(status & SYSCONFIG_STATUS_ERR))
return sysconfig_isc_disable(priv);
return -EFAULT;
}
static int sysconfig_ops_write_complete(struct fpga_manager *mgr,
struct fpga_image_info *info)
{
struct sysconfig_priv *priv = mgr->priv;
struct device *dev = &mgr->dev;
int ret;
ret = sysconfig_burst_write_complete(priv);
printk("%s(%d) ret=%d\n",__FUNCTION__,__LINE__,ret);
if (!ret)
ret = sysconfig_poll_busy(priv);
if (ret) {
dev_err(dev, "Error while waiting bitstream write to finish\n");
goto fail;
}
ret = sysconfig_isc_finish(priv);
printk("%s(%d) ret=%d\n",__FUNCTION__,__LINE__,ret);
fail:
if (ret)
sysconfig_cleanup(priv);
return ret;
}