/* init and exit */ static int ff_init(void) { struct ff_dev *ff; const struct firmware *fw; int i, len, ret = 0; /* Replicate the default eeprom for the max number of mezzanines */ for (i = 1; i < FF_MAX_MEZZANINES; i++) memcpy(ff_eeimg[i], ff_eeimg[0], sizeof(ff_eeimg[0])); if (ff_nr_eeprom > ff_nr_dev) ff_nr_dev = ff_nr_eeprom; ff = ff_dev_create(); if (IS_ERR(ff)) return PTR_ERR(ff); /* If the user passed "eeprom=" as a parameter, fetch them */ for (i = 0; i < ff_nr_eeprom; i++) { if (!strlen(ff_eeprom[i])) continue; ret = request_firmware(&fw, ff_eeprom[i], &ff->dev); if (ret < 0) { dev_err(&ff->dev, "Mezzanine %i: can't load \"%s\" " "(error %i)\n", i, ff_eeprom[i], -ret); } else { len = min_t(size_t, fw->size, (size_t)FF_EEPROM_SIZE); memcpy(ff_eeimg[i], fw->data, len); release_firmware(fw); dev_info(&ff->dev, "Mezzanine %i: eeprom \"%s\"\n", i, ff_eeprom[i]); } } ret = fmc_device_register_n(ff->fmc, ff_nr_dev); if (ret) { device_unregister(&ff->dev); return ret; } ff_current_dev = ff; return ret; }
static void ff_work_fn(struct work_struct *work) { struct ff_dev *ff = ff_current_dev; int ret; fmc_device_unregister_n(ff->fmc, ff_nr_dev); device_unregister(&ff->dev); ff_current_dev = NULL; ff = ff_dev_create(); if (IS_ERR(ff)) { pr_warning("%s: can't re-create FMC devices\n", __func__); return; } ret = fmc_device_register_n(ff->fmc, ff_nr_dev); if (ret < 0) { dev_warn(&ff->dev, "can't re-register FMC devices\n"); device_unregister(&ff->dev); return; } ff_current_dev = ff; }
int fmc_device_register(struct fmc_device *fmc) { return fmc_device_register_n(&fmc, 1); }