in fsi-master-ast-cf.c [307:342]
static int do_copro_command(struct fsi_master_acf *master, uint32_t op)
{
uint32_t timeout = 10000000;
uint8_t stat;
trace_fsi_master_acf_copro_command(master, op);
/* Send command */
iowrite32be(op, master->sram + CMD_STAT_REG);
/* Ring doorbell if any */
if (master->cvic)
iowrite32(0x2, master->cvic + CVIC_TRIG_REG);
/* Wait for status to indicate completion (or error) */
do {
if (timeout-- == 0) {
dev_warn(master->dev,
"Timeout waiting for coprocessor completion\n");
return -ETIMEDOUT;
}
stat = ioread8(master->sram + CMD_STAT_REG);
} while(stat < STAT_COMPLETE || stat == 0xff);
if (stat == STAT_COMPLETE)
return 0;
switch(stat) {
case STAT_ERR_INVAL_CMD:
return -EINVAL;
case STAT_ERR_INVAL_IRQ:
return -EIO;
case STAT_ERR_MTOE:
return -ESHUTDOWN;
}
return -ENXIO;
}