in fsi-master-ast-cf.c [925:1000]
static int fsi_master_acf_setup(struct fsi_master_acf *master)
{
int timeout, rc;
uint32_t val;
/* Make sure the ColdFire is stopped */
reset_cf(master);
/*
* Clear SRAM. This needs to happen before we setup the GPIOs
* as we might start trying to arbitrate as soon as that happens.
*/
memset_io(master->sram, 0, SRAM_SIZE);
/* Configure GPIOs */
rc = setup_gpios_for_copro(master);
if (rc)
return rc;
/* Load the firmware into the reserved memory */
rc = load_copro_firmware(master);
if (rc)
return rc;
/* Read signature and check versions */
rc = check_firmware_image(master);
if (rc)
return rc;
/* Setup coldfire memory map */
if (master->is_ast2500) {
setup_ast2500_cf_maps(master);
setup_ast2500_fw_config(master);
} else {
setup_ast2400_cf_maps(master);
setup_ast2400_fw_config(master);
}
/* Start the ColdFire */
start_cf(master);
/* Wait for status register to indicate command completion
* which signals the initialization is complete
*/
for (timeout = 0; timeout < 10; timeout++) {
val = ioread8(master->sram + CF_STARTED);
if (val)
break;
msleep(1);
}
if (!val) {
dev_err(master->dev, "Coprocessor startup timeout !\n");
rc = -ENODEV;
goto err;
}
/* Configure echo & send delay */
iowrite8(master->t_send_delay, master->sram + SEND_DLY_REG);
iowrite8(master->t_echo_delay, master->sram + ECHO_DLY_REG);
/* Enable SW interrupt to copro if any */
if (master->cvic) {
rc = copro_enable_sw_irq(master);
if (rc)
goto err;
}
return 0;
err:
/* An error occurred, don't leave the coprocessor running */
reset_cf(master);
/* Release the GPIOs */
release_copro_gpios(master);
return rc;
}