static int sysconfig_i2c_bitstream_burst_write(struct sysconfig_priv *priv,
const char *buf, size_t len)
{
struct i2c_client *client = to_i2c_client(priv->dev);
struct i2c_msg msg;
size_t chunk_size = 512; /* Safe size for CrossLink-NX internal buffer */
size_t bytes_written = 0;
int ret;
while (bytes_written < len) {
size_t to_write = min(chunk_size, len - bytes_written);
msg.addr = client->addr;
/*
* STRICTLY NO I2C_M_NOSTART!
* Every chunk is sent as a clean, standard I2C write transaction.
*/
msg.flags = client->flags & I2C_M_TEN;
msg.len = to_write;
msg.buf = (u8 *)(buf + bytes_written);
ret = i2c_transfer(client->adapter, &msg, 1);
if (ret < 0)
return ret;
if (ret != 1)
return -EIO;
bytes_written += to_write;
/* Small delay to let the FPGA controller clear its internal input FIFO */
udelay(100);
}
return 0;
}