// SPDX-License-Identifier: GPL-2.0 /* * FPGA Region - Support for FPGA programming under Linux * * Copyright (C) 2013-2016 Altera Corporation * Copyright (C) 2017 Intel Corporation */ #include <linux/fpga/fpga-bridge.h> #include <linux/fpga/fpga-mgr.h> #include <linux/fpga/fpga-region.h> #include <linux/idr.h> #include <linux/kernel.h> #include <linux/list.h> #include <linux/module.h> #include <linux/slab.h> #include <linux/spinlock.h> static DEFINE_IDA(fpga_region_ida); static const struct class fpga_region_class; struct fpga_region * fpga_region_class_find(struct device *start, const void *data, int (*match)(struct device *, const void *)) { … } EXPORT_SYMBOL_GPL(…); /** * fpga_region_get - get an exclusive reference to an fpga region * @region: FPGA Region struct * * Caller should call fpga_region_put() when done with region. * * Return: * * fpga_region struct if successful. * * -EBUSY if someone already has a reference to the region. * * -ENODEV if can't take parent driver module refcount. */ static struct fpga_region *fpga_region_get(struct fpga_region *region) { … } /** * fpga_region_put - release a reference to a region * * @region: FPGA region */ static void fpga_region_put(struct fpga_region *region) { … } /** * fpga_region_program_fpga - program FPGA * * @region: FPGA region * * Program an FPGA using fpga image info (region->info). * If the region has a get_bridges function, the exclusive reference for the * bridges will be held if programming succeeds. This is intended to prevent * reprogramming the region until the caller considers it safe to do so. * The caller will need to call fpga_bridges_put() before attempting to * reprogram the region. * * Return: 0 for success or negative error code. */ int fpga_region_program_fpga(struct fpga_region *region) { … } EXPORT_SYMBOL_GPL(…); static ssize_t compat_id_show(struct device *dev, struct device_attribute *attr, char *buf) { … } static DEVICE_ATTR_RO(compat_id); static struct attribute *fpga_region_attrs[] = …; ATTRIBUTE_GROUPS(…); /** * __fpga_region_register_full - create and register an FPGA Region device * @parent: device parent * @info: parameters for FPGA Region * @owner: module containing the get_bridges function * * Return: struct fpga_region or ERR_PTR() */ struct fpga_region * __fpga_region_register_full(struct device *parent, const struct fpga_region_info *info, struct module *owner) { … } EXPORT_SYMBOL_GPL(…); /** * __fpga_region_register - create and register an FPGA Region device * @parent: device parent * @mgr: manager that programs this region * @get_bridges: optional function to get bridges to a list * @owner: module containing the get_bridges function * * This simple version of the register function should be sufficient for most users. * The fpga_region_register_full() function is available for users that need to * pass additional, optional parameters. * * Return: struct fpga_region or ERR_PTR() */ struct fpga_region * __fpga_region_register(struct device *parent, struct fpga_manager *mgr, int (*get_bridges)(struct fpga_region *), struct module *owner) { … } EXPORT_SYMBOL_GPL(…); /** * fpga_region_unregister - unregister an FPGA region * @region: FPGA region * * This function is intended for use in an FPGA region driver's remove function. */ void fpga_region_unregister(struct fpga_region *region) { … } EXPORT_SYMBOL_GPL(…); static void fpga_region_dev_release(struct device *dev) { … } static const struct class fpga_region_class = …; /** * fpga_region_init - creates the fpga_region class. * * Return: 0 on success or ERR_PTR() on error. */ static int __init fpga_region_init(void) { … } static void __exit fpga_region_exit(void) { … } subsys_initcall(fpga_region_init); module_exit(fpga_region_exit); MODULE_DESCRIPTION(…) …; MODULE_AUTHOR(…) …; MODULE_LICENSE(…) …;