Unverified Commit 59194fd6 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!10103 v2 fpga: region: add owner module and take its refcount

parents 21a89fd3 b5b1c6cb
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -46,13 +46,16 @@ API to add a new FPGA region
----------------------------

* struct fpga_region - The FPGA region struct
* struct fpga_region_info - Parameter structure for fpga_region_register_full()
* fpga_region_register_full() -  Create and register an FPGA region using the
* struct fpga_region_info - Parameter structure for __fpga_region_register_full()
* __fpga_region_register_full() -  Create and register an FPGA region using the
  fpga_region_info structure to provide the full flexibility of options
* fpga_region_register() -  Create and register an FPGA region using standard
* __fpga_region_register() -  Create and register an FPGA region using standard
  arguments
* fpga_region_unregister() -  Unregister an FPGA region

Helper macros ``fpga_region_register()`` and ``fpga_region_register_full()``
automatically set the module that registers the FPGA region as the owner.

The FPGA region's probe function will need to get a reference to the FPGA
Manager it will be using to do the programming.  This usually would happen
during the region's probe function.
@@ -82,10 +85,10 @@ following APIs to handle building or tearing down that list.
   :functions: fpga_region_info

.. kernel-doc:: drivers/fpga/fpga-region.c
   :functions: fpga_region_register_full
   :functions: __fpga_region_register_full

.. kernel-doc:: drivers/fpga/fpga-region.c
   :functions: fpga_region_register
   :functions: __fpga_region_register

.. kernel-doc:: drivers/fpga/fpga-region.c
   :functions: fpga_region_unregister
+14 −10
Original line number Diff line number Diff line
@@ -53,7 +53,7 @@ static struct fpga_region *fpga_region_get(struct fpga_region *region)
	}

	get_device(dev);
	if (!try_module_get(dev->parent->driver->owner)) {
	if (!try_module_get(region->ops_owner)) {
		put_device(dev);
		mutex_unlock(&region->mutex);
		return ERR_PTR(-ENODEV);
@@ -75,7 +75,7 @@ static void fpga_region_put(struct fpga_region *region)

	dev_dbg(dev, "put\n");

	module_put(dev->parent->driver->owner);
	module_put(region->ops_owner);
	put_device(dev);
	mutex_unlock(&region->mutex);
}
@@ -181,14 +181,16 @@ static struct attribute *fpga_region_attrs[] = {
ATTRIBUTE_GROUPS(fpga_region);

/**
 * fpga_region_register_full - create and register an FPGA Region device
 * __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)
__fpga_region_register_full(struct device *parent, const struct fpga_region_info *info,
			    struct module *owner)
{
	struct fpga_region *region;
	int id, ret = 0;
@@ -213,6 +215,7 @@ fpga_region_register_full(struct device *parent, const struct fpga_region_info *
	region->compat_id = info->compat_id;
	region->priv = info->priv;
	region->get_bridges = info->get_bridges;
	region->ops_owner = owner;

	mutex_init(&region->mutex);
	INIT_LIST_HEAD(&region->bridge_list);
@@ -241,13 +244,14 @@ fpga_region_register_full(struct device *parent, const struct fpga_region_info *

	return ERR_PTR(ret);
}
EXPORT_SYMBOL_GPL(fpga_region_register_full);
EXPORT_SYMBOL_GPL(__fpga_region_register_full);

/**
 * fpga_region_register - create and register an FPGA Region device
 * __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
@@ -256,17 +260,17 @@ EXPORT_SYMBOL_GPL(fpga_region_register_full);
 * 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 *))
__fpga_region_register(struct device *parent, struct fpga_manager *mgr,
		       int (*get_bridges)(struct fpga_region *), struct module *owner)
{
	struct fpga_region_info info = { 0 };

	info.mgr = mgr;
	info.get_bridges = get_bridges;

	return fpga_region_register_full(parent, &info);
	return __fpga_region_register_full(parent, &info, owner);
}
EXPORT_SYMBOL_GPL(fpga_region_register);
EXPORT_SYMBOL_GPL(__fpga_region_register);

/**
 * fpga_region_unregister - unregister an FPGA region
+10 −3
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ struct fpga_region_info {
 * @mgr: FPGA manager
 * @info: FPGA image info
 * @compat_id: FPGA region id for compatibility check.
 * @ops_owner: module containing the get_bridges function
 * @priv: private data
 * @get_bridges: optional function to get bridges to a list
 */
@@ -46,6 +47,7 @@ struct fpga_region {
	struct fpga_manager *mgr;
	struct fpga_image_info *info;
	struct fpga_compat_id *compat_id;
	struct module *ops_owner;
	void *priv;
	int (*get_bridges)(struct fpga_region *region);
};
@@ -58,12 +60,17 @@ fpga_region_class_find(struct device *start, const void *data,

int fpga_region_program_fpga(struct fpga_region *region);

#define fpga_region_register_full(parent, info) \
	__fpga_region_register_full(parent, info, THIS_MODULE)
struct fpga_region *
fpga_region_register_full(struct device *parent, const struct fpga_region_info *info);
__fpga_region_register_full(struct device *parent, const struct fpga_region_info *info,
			    struct module *owner);

#define fpga_region_register(parent, mgr, get_bridges) \
	__fpga_region_register(parent, mgr, get_bridges, THIS_MODULE)
struct fpga_region *
fpga_region_register(struct device *parent, struct fpga_manager *mgr,
		     int (*get_bridges)(struct fpga_region *));
__fpga_region_register(struct device *parent, struct fpga_manager *mgr,
		       int (*get_bridges)(struct fpga_region *), struct module *owner);
void fpga_region_unregister(struct fpga_region *region);

#endif /* _FPGA_REGION_H */