static int sysconfig_isc_finish(struct sysconfig_priv *priv)
{
struct gpio_desc *done_gpio = priv->done;
u64 status;
int ret;
printk("%s(%d) done_gpio=%p\n",__FUNCTION__,__LINE__,done_gpio);
if (done_gpio) {
ret = sysconfig_poll_status(priv, &status);
printk("%s(%d) ret=%d status=0x%llX\n",__FUNCTION__,__LINE__,ret,status);
if (ret)
return ret;
ret = sysconfig_isc_disable(priv);
if (ret)
return ret;
return sysconfig_poll_gpio(done_gpio, true);
}
printk("%s(%d) Try use timeout for status done\n",__FUNCTION__,__LINE__);
msleep(100);
ret = sysconfig_poll_status(priv, &status);
printk("%s(%d) ret=%d status=0x%llX\n",__FUNCTION__,__LINE__,ret,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;
}
это оригинальный кусок кода lattice-sysconfig.c. Последовательность тут именно такая: если в системе есть gpio done, то надо чтобы он взвёлся, дальше вызываеь isc_disable. Если нету gpio done - смотрим статус, если в статусе есть bit done - вызываем isc disable. Я не уверен, что это правильно, но в оригинале написано так....