Commit a96c24bc authored by Alessandro Rubini's avatar Alessandro Rubini

fmc_operations: use a different reprogram

parent b966f47a
......@@ -184,7 +184,7 @@ this document):
struct fmc_operations {
uint32_t (*readl)(struct fmc_device *fmc, int offset);
void (*writel)(struct fmc_device *fmc, uint32_t value, int offset);
int (*reprogram)(struct fmc_device *fmc, void *data, int len);
int (*reprogram)(struct fmc_device *fmc, char *gateware);
int (*irq_request)(struct fmc_device *fmc, irq_handler_t h,
char *name, int flags);
void (*irq_ack)(struct fmc_device *fmc);
......@@ -214,10 +214,11 @@ The individual methods perform the following tasks:
The carrier enumerates FMC devices by loading a standard (or
@i{golden} FPGA binary that allows EEPROM access. Each driver, then,
will need to reprogram the FPGA for its own use by calling this
function. If @i{reprogram} is called with NULL arguments, the
carrier will reprogram the golden binary -- which will happen
after @i{remove} time in any case.
will need to reprogram the FPGA by calling this
function. If the name argument is NULL,
the carrier will reprogram the golden binary. If the gateware name
has been overridden through module parameters (in a carrier-specific
way) the file loaded will match the parameters.
@item irq_request
@itemx irq_ack
......
......@@ -2,7 +2,6 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/firmware.h>
#include <linux/fmc.h>
#include "spec.h"
......@@ -21,31 +20,15 @@ irqreturn_t t_handler(int irq, void *dev_id)
int t_probe(struct fmc_device *fmc)
{
int ret;
struct device *dev = fmc->hwdev;
ret = fmc->op->irq_request(fmc, t_handler, "fmc-trivial", 0);
if (ret < 0)
return ret;
if (t_filename) {
const struct firmware *fw;
ret = request_firmware(&fw, t_filename, dev);
if (ret < 0) {
dev_warn(dev, "request firmware \"%s\": error %i\n",
t_filename, ret);
ret = 0; /* not fatal */
} else {
ret = fmc->op->reprogram(fmc, (void *)fw->data,
fw->size);
}
if (ret <0) {
dev_err(dev, "write firmware \"%s\": error %i\n",
t_filename, ret);
ret = 0; /* not fatal, either (lazy me) */
}
release_firmware(fw);
}
/* Reprogram, but only if specified in the arguments */
ret = fmc->op->reprogram(fmc, "");
if (ret < 0)
fmc->op->irq_free(fmc);
return ret;
}
......
......@@ -36,7 +36,7 @@ struct fmc_driver {
struct fmc_operations {
uint32_t (*readl)(struct fmc_device *fmc, int offset);
void (*writel)(struct fmc_device *fmc, uint32_t value, int offset);
int (*reprogram)(struct fmc_device *fmc, void *data, int len);
int (*reprogram)(struct fmc_device *fmc, char *gateware);
int (*irq_request)(struct fmc_device *fmc, irq_handler_t h,
char *name, int flags);
void (*irq_ack)(struct fmc_device *fmc);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment