|  | 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. |