• Home
  • Raw
  • Download

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 a fpga region
37 * @region: FPGA Region struct
42 * Return -EBUSY if someone already has a reference to the region.
43 * Return -ENODEV if @np is not a FPGA Region.
47 struct device *dev = &region->dev; in fpga_region_get()
49 if (!mutex_trylock(&region->mutex)) { in fpga_region_get()
50 dev_dbg(dev, "%s: FPGA Region already in use\n", __func__); in fpga_region_get()
51 return ERR_PTR(-EBUSY); in fpga_region_get()
55 if (!try_module_get(dev->parent->driver->owner)) { in fpga_region_get()
57 mutex_unlock(&region->mutex); in fpga_region_get()
58 return ERR_PTR(-ENODEV); in fpga_region_get()
67 * fpga_region_put - release a reference to a region
69 * @region: FPGA region
73 struct device *dev = &region->dev; in fpga_region_put()
77 module_put(dev->parent->driver->owner); in fpga_region_put()
79 mutex_unlock(&region->mutex); in fpga_region_put()
83 * fpga_region_program_fpga - program FPGA
85 * @region: FPGA region
87 * Program an FPGA using fpga image info (region->info).
98 struct device *dev = &region->dev; in fpga_region_program_fpga()
99 struct fpga_image_info *info = region->info; in fpga_region_program_fpga()
104 dev_err(dev, "failed to get FPGA region\n"); in fpga_region_program_fpga()
108 ret = fpga_mgr_lock(region->mgr); in fpga_region_program_fpga()
110 dev_err(dev, "FPGA manager is busy\n"); in fpga_region_program_fpga()
116 * fpga region struct. Or we don't have any bridges. in fpga_region_program_fpga()
118 if (region->get_bridges) { in fpga_region_program_fpga()
119 ret = region->get_bridges(region); in fpga_region_program_fpga()
121 dev_err(dev, "failed to get fpga region bridges\n"); in fpga_region_program_fpga()
126 ret = fpga_bridges_disable(&region->bridge_list); in fpga_region_program_fpga()
132 ret = fpga_mgr_load(region->mgr, info); in fpga_region_program_fpga()
134 dev_err(dev, "failed to load FPGA image\n"); in fpga_region_program_fpga()
138 ret = fpga_bridges_enable(&region->bridge_list); in fpga_region_program_fpga()
144 fpga_mgr_unlock(region->mgr); in fpga_region_program_fpga()
150 if (region->get_bridges) in fpga_region_program_fpga()
151 fpga_bridges_put(&region->bridge_list); in fpga_region_program_fpga()
153 fpga_mgr_unlock(region->mgr); in fpga_region_program_fpga()
166 if (!region->compat_id) in compat_id_show()
167 return -ENOENT; in compat_id_show()
170 (unsigned long long)region->compat_id->id_h, in compat_id_show()
171 (unsigned long long)region->compat_id->id_l); in compat_id_show()
183 * fpga_region_create - alloc and init a struct fpga_region
185 * @mgr: manager that programs this region
196 struct fpga_manager *mgr, in fpga_region_create() argument
210 region->mgr = mgr; in fpga_region_create()
211 region->get_bridges = get_bridges; in fpga_region_create()
212 mutex_init(&region->mutex); in fpga_region_create()
213 INIT_LIST_HEAD(&region->bridge_list); in fpga_region_create()
215 device_initialize(&region->dev); in fpga_region_create()
216 region->dev.class = fpga_region_class; in fpga_region_create()
217 region->dev.parent = dev; in fpga_region_create()
218 region->dev.of_node = dev->of_node; in fpga_region_create()
219 region->dev.id = id; in fpga_region_create()
221 ret = dev_set_name(&region->dev, "region%d", id); in fpga_region_create()
237 * fpga_region_free - free a FPGA region created by fpga_region_create()
238 * @region: FPGA region
242 ida_simple_remove(&fpga_region_ida, region->dev.id); in fpga_region_free()
255 * devm_fpga_region_create - create and initialize a managed FPGA region struct
257 * @mgr: manager that programs this region
260 * This function is intended for use in a FPGA region driver's probe function.
272 struct fpga_manager *mgr, in devm_fpga_region_create() argument
281 region = fpga_region_create(dev, mgr, get_bridges); in devm_fpga_region_create()
294 * fpga_region_register - register a FPGA region
295 * @region: FPGA region
297 * Return: 0 or -errno
301 return device_add(&region->dev); in fpga_region_register()
306 * fpga_region_unregister - unregister a FPGA region
307 * @region: FPGA region
309 * This function is intended for use in a FPGA region driver's remove function.
313 device_unregister(&region->dev); in fpga_region_unregister()
322 * fpga_region_init - init function for fpga_region class
331 fpga_region_class->dev_groups = fpga_region_groups; in fpga_region_init()
332 fpga_region_class->dev_release = fpga_region_dev_release; in fpga_region_init()
346 MODULE_DESCRIPTION("FPGA Region");