| Functions Exported by fmc.ko |
| **************************** |
| |
| The FMC core exports the usual 4 functions that are needed for a bus to |
| work, and a few more: |
| |
| int fmc_driver_register(struct fmc_driver *drv); |
| void fmc_driver_unregister(struct fmc_driver *drv); |
| int fmc_device_register(struct fmc_device *fmc); |
| void fmc_device_unregister(struct fmc_device *fmc); |
| |
| int fmc_device_register_n(struct fmc_device **fmc, int n); |
| void fmc_device_unregister_n(struct fmc_device **fmc, int n); |
| |
| uint32_t fmc_readl(struct fmc_device *fmc, int offset); |
| void fmc_writel(struct fmc_device *fmc, uint32_t val, int off); |
| void *fmc_get_drvdata(struct fmc_device *fmc); |
| void fmc_set_drvdata(struct fmc_device *fmc, void *data); |
| |
| int fmc_reprogram(struct fmc_device *f, struct fmc_driver *d, char *gw, |
| int sdb_entry); |
| |
| The data structure that describe a device is detailed in *note FMC |
| Device::, the one that describes a driver is detailed in *note FMC |
| Driver::. Please note that structures of type fmc_device must be |
| allocated by the caller, but must not be released after unregistering. |
| The fmc-bus itself takes care of releasing the structure when their use |
| count reaches zero - actually, the device model does that in lieu of us. |
| |
| The functions to register and unregister n devices are meant to be used |
| by carriers that host more than one mezzanine. The devices must all be |
| registered at the same time because if the FPGA is reprogrammed, all |
| devices in the array are affected. Usually, the driver matching the |
| first device will reprogram the FPGA, so other devices must know they |
| are already driven by a reprogrammed FPGA. |
| |
| If a carrier hosts slots that are driven by different FPGA devices, it |
| should register as a group only mezzanines that are driven by the same |
| FPGA, for the reason outlined above. |
| |
| Finally, the fmc_reprogram function calls the reprogram method (see |
| *note The API Offered by Carriers:: and also scans the memory area for |
| an SDB tree. You can pass -1 as sdb_entry to disable such scan. |
| Otherwise, the function fails if no tree is found at the specified |
| entry point. The function is meant to factorize common code, and by |
| the time you read this it is already used by the spec-sw and fine-delay |
| modules. |