Загрузка данных


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;
}