static int load_firmware(struct echoaudio *chip) { const struct firmware *fw; int box_type, err; if (snd_BUG_ON(!chip->comm_page)) return -EPERM; /* */ if (chip->dsp_code) { if ((box_type = check_asic_status(chip)) >= 0) return box_type; /* */ chip->dsp_code = NULL; } err = get_firmware(&fw, chip, chip->dsp_code_to_load); if (err < 0) return err; err = load_dsp(chip, (u16 *)fw->data); free_firmware(fw); if (err < 0) return err; if ((box_type = load_asic(chip)) < 0) return box_type; /* */ return box_type; }
/* load_firmware takes care of loading the DSP and any ASIC code. */ static int load_firmware(struct echoaudio *chip) { const struct firmware *fw; int box_type, err; if (snd_BUG_ON(!chip->comm_page)) return -EPERM; /* See if the ASIC is present and working - only if the DSP is already loaded */ if (chip->dsp_code) { if ((box_type = check_asic_status(chip)) >= 0) return box_type; /* ASIC check failed; force the DSP to reload */ chip->dsp_code = NULL; } err = get_firmware(&fw, chip, chip->dsp_code_to_load); if (err < 0) return err; err = load_dsp(chip, (u16 *)fw->data); free_firmware(fw, chip); if (err < 0) return err; if ((box_type = load_asic(chip)) < 0) return box_type; /* error */ return box_type; }