Lines Matching +full:fpga +full:- +full:mgr

1 // SPDX-License-Identifier: GPL-2.0
3 * FPGA Region - Support for FPGA programming under Linux
5 * Copyright (C) 2013-2016 Altera Corporation
8 #include <linux/fpga/fpga-bridge.h>
9 #include <linux/fpga/fpga-mgr.h>
10 #include <linux/fpga/fpga-region.h>
36 * fpga_region_get - get an exclusive reference to an fpga region
37 * @region: FPGA Region struct
43 * * -EBUSY if someone already has a reference to the region.
44 * * -ENODEV if can't take parent driver module refcount.
48 struct device *dev = &region->dev; in fpga_region_get()
50 if (!mutex_trylock(&region->mutex)) { in fpga_region_get()
51 dev_dbg(dev, "%s: FPGA Region already in use\n", __func__); in fpga_region_get()
52 return ERR_PTR(-EBUSY); in fpga_region_get()
56 if (!try_module_get(dev->parent->driver->owner)) { in fpga_region_get()
58 mutex_unlock(&region->mutex); in fpga_region_get()
59 return ERR_PTR(-ENODEV); in fpga_region_get()
68 * fpga_region_put - release a reference to a region
70 * @region: FPGA region
74 struct device *dev = &region->dev; in fpga_region_put()
78 module_put(dev->parent->driver->owner); in fpga_region_put()
80 mutex_unlock(&region->mutex); in fpga_region_put()
84 * fpga_region_program_fpga - program FPGA
86 * @region: FPGA region
88 * Program an FPGA using fpga image info (region->info).
99 struct device *dev = &region->dev; in fpga_region_program_fpga()
100 struct fpga_image_info *info = region->info; in fpga_region_program_fpga()
105 dev_err(dev, "failed to get FPGA region\n"); in fpga_region_program_fpga()
109 ret = fpga_mgr_lock(region->mgr); in fpga_region_program_fpga()
111 dev_err(dev, "FPGA manager is busy\n"); in fpga_region_program_fpga()
117 * fpga region struct. Or we don't have any bridges. in fpga_region_program_fpga()
119 if (region->get_bridges) { in fpga_region_program_fpga()
120 ret = region->get_bridges(region); in fpga_region_program_fpga()
122 dev_err(dev, "failed to get fpga region bridges\n"); in fpga_region_program_fpga()
127 ret = fpga_bridges_disable(&region->bridge_list); in fpga_region_program_fpga()
133 ret = fpga_mgr_load(region->mgr, info); in fpga_region_program_fpga()
135 dev_err(dev, "failed to load FPGA image\n"); in fpga_region_program_fpga()
139 ret = fpga_bridges_enable(&region->bridge_list); in fpga_region_program_fpga()
145 fpga_mgr_unlock(region->mgr); in fpga_region_program_fpga()
151 if (region->get_bridges) in fpga_region_program_fpga()
152 fpga_bridges_put(&region->bridge_list); in fpga_region_program_fpga()
154 fpga_mgr_unlock(region->mgr); in fpga_region_program_fpga()
167 if (!region->compat_id) in compat_id_show()
168 return -ENOENT; in compat_id_show()
171 (unsigned long long)region->compat_id->id_h, in compat_id_show()
172 (unsigned long long)region->compat_id->id_l); in compat_id_show()
184 * fpga_region_register_full - create and register an FPGA Region device
186 * @info: parameters for FPGA Region
199 return ERR_PTR(-EINVAL); in fpga_region_register_full()
204 return ERR_PTR(-ENOMEM); in fpga_region_register_full()
212 region->mgr = info->mgr; in fpga_region_register_full()
213 region->compat_id = info->compat_id; in fpga_region_register_full()
214 region->priv = info->priv; in fpga_region_register_full()
215 region->get_bridges = info->get_bridges; in fpga_region_register_full()
217 mutex_init(&region->mutex); in fpga_region_register_full()
218 INIT_LIST_HEAD(&region->bridge_list); in fpga_region_register_full()
220 region->dev.class = &fpga_region_class; in fpga_region_register_full()
221 region->dev.parent = parent; in fpga_region_register_full()
222 region->dev.of_node = parent->of_node; in fpga_region_register_full()
223 region->dev.id = id; in fpga_region_register_full()
225 ret = dev_set_name(&region->dev, "region%d", id); in fpga_region_register_full()
229 ret = device_register(&region->dev); in fpga_region_register_full()
231 put_device(&region->dev); in fpga_region_register_full()
247 * fpga_region_register - create and register an FPGA Region device
249 * @mgr: manager that programs this region
259 fpga_region_register(struct device *parent, struct fpga_manager *mgr, in fpga_region_register() argument
264 info.mgr = mgr; in fpga_region_register()
272 * fpga_region_unregister - unregister an FPGA region
273 * @region: FPGA region
275 * This function is intended for use in an FPGA region driver's remove function.
279 device_unregister(&region->dev); in fpga_region_unregister()
287 ida_free(&fpga_region_ida, region->dev.id); in fpga_region_dev_release()
298 * fpga_region_init - creates the fpga_region class.
316 MODULE_DESCRIPTION("FPGA Region");