static int sysconfig_i2c_bitstream_burst_complete(struct sysconfig_priv *priv)
{
struct i2c_client *client = to_i2c_client(priv->dev);
/*
* Реализуем принудительный вызов isc_disable прямо в complete:
* 1. 0x26, 0x00, 0x00, 0x00 -> SYSCONFIG_ISC_DISABLE (из вашего дефайна)
* 2. 0xFF, 0xFF, 0xFF, 0xFF -> Холостые такты для запуска Wake-up автомата ПЛИС
*/
u8 force_finish_seq[] = {
0x26, 0x00, 0x00, 0x00, // Явный вызов ISC_DISABLE
0xFF, 0xFF, 0xFF, 0xFF, // Паддинг и такты холостого хода (32 такта SCL)
0xFF, 0xFF, 0xFF, 0xFF // Еще немного тактов для надежности
};
struct i2c_msg msg;
int ret;
/*
* Отправляем финализацию.
* Строго БЕЗ флага I2C_M_NOSTART, чтобы контроллер i.MX95 сгенерировал
* легитимный STOP-бит на шине в самом конце транзакции.
*/
msg.addr = client->addr;
msg.flags = client->flags & I2C_M_TEN;
msg.len = sizeof(force_finish_seq);
msg.buf = force_finish_seq;
ret = i2c_transfer(client->adapter, &msg, 1);
if (ret < 0) {
dev_err(priv->dev, "Forced ISC_DISABLE transmission failed: %d\n", ret);
return ret;
}
/*
* Даем ПЛИС время (30 мс) на стабилизацию внутренних цепей,
* чтобы к моменту опроса ядром статус DONE уже успел подняться.
*/
msleep(30);
dev_info(priv->dev, "Injected ISC_DISABLE (0x26) and wake-up clocks in complete phase.\n");
return 0;
}