diff --git a/kernel/spec-fmc.c b/kernel/spec-fmc.c index 5e2015d5b1e711fb71a5c499273d9ab2c2edca7f..8ef65e4e9958bd1deac1af41648d5e9f899ce80c 100644 --- a/kernel/spec-fmc.c +++ b/kernel/spec-fmc.c @@ -55,11 +55,16 @@ static int spec_reprogram(struct fmc_device *fmc, char *gw) goto out; } fmc_free_sdb_tree(fmc); + fmc->flags &= ~(FMC_DEVICE_HAS_GOLDEN | FMC_DEVICE_HAS_CUSTOM); ret = spec_load_fpga(spec, fw->data, fw->size); if (ret <0) { dev_err(dev, "write firmware \"%s\": error %i\n", gw, ret); goto out; } + if (gw == spec_fw_name) + fmc->flags |= FMC_DEVICE_HAS_GOLDEN; + else + fmc->flags |= FMC_DEVICE_HAS_CUSTOM; /* FIXME: load lm32 */ out: @@ -132,12 +137,16 @@ static int spec_irq_free(struct fmc_device *fmc) /* The engines for this live in spec-i2c.c, we only shape arguments */ static int spec_read_ee(struct fmc_device *fmc, int pos, void *data, int len) { + if (!(fmc->flags & FMC_DEVICE_HAS_GOLDEN)) + return -ENOTSUPP; return spec_eeprom_read(fmc, SPEC_I2C_EEPROM_ADDR, pos, data, len); } static int spec_write_ee(struct fmc_device *fmc, int pos, const void *data, int len) { + if (!(fmc->flags & FMC_DEVICE_HAS_GOLDEN)) + return -ENOTSUPP; return spec_eeprom_write(fmc, SPEC_I2C_EEPROM_ADDR, pos, data, len); } diff --git a/kernel/spec-i2c.c b/kernel/spec-i2c.c index 215f7f14b7b951c966dd19399b6da4184ac71a37..ec27da6e5f27c3b6ebe16e718f00f2b0ac7ad742 100644 --- a/kernel/spec-i2c.c +++ b/kernel/spec-i2c.c @@ -205,7 +205,7 @@ int spec_i2c_init(struct fmc_device *fmc) found = mi2c_scan(fmc); if (!found) { - dev_err(&spec->pdev->dev, "Empty mezzanine?\n"); + fmc->flags |= FMC_DEVICE_NO_MEZZANINE; return 0; }