Exemple #1
0
/* 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;
}
Exemple #2
0
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;
}
Exemple #3
0
int fmc_device_register(struct fmc_device *fmc)
{
	return fmc_device_register_n(&fmc, 1);
}