Lines Matching refs:region

10 #include <linux/fpga/fpga-region.h>
36 * fpga_region_get - get an exclusive reference to an fpga region
37 * @region: FPGA Region struct
39 * Caller should call fpga_region_put() when done with region.
43 * * -EBUSY if someone already has a reference to the region.
46 static struct fpga_region *fpga_region_get(struct fpga_region *region)
48 struct device *dev = &region->dev;
50 if (!mutex_trylock(&region->mutex)) {
58 mutex_unlock(&region->mutex);
64 return region;
68 * fpga_region_put - release a reference to a region
70 * @region: FPGA region
72 static void fpga_region_put(struct fpga_region *region)
74 struct device *dev = &region->dev;
80 mutex_unlock(&region->mutex);
86 * @region: FPGA region
88 * Program an FPGA using fpga image info (region->info).
89 * If the region has a get_bridges function, the exclusive reference for the
91 * reprogramming the region until the caller considers it safe to do so.
93 * reprogram the region.
97 int fpga_region_program_fpga(struct fpga_region *region)
99 struct device *dev = &region->dev;
100 struct fpga_image_info *info = region->info;
103 region = fpga_region_get(region);
104 if (IS_ERR(region)) {
105 dev_err(dev, "failed to get FPGA region\n");
106 return PTR_ERR(region);
109 ret = fpga_mgr_lock(region->mgr);
117 * fpga region struct. Or we don't have any bridges.
119 if (region->get_bridges) {
120 ret = region->get_bridges(region);
122 dev_err(dev, "failed to get fpga region bridges\n");
127 ret = fpga_bridges_disable(&region->bridge_list);
133 ret = fpga_mgr_load(region->mgr, info);
139 ret = fpga_bridges_enable(&region->bridge_list);
141 dev_err(dev, "failed to enable region bridges\n");
145 fpga_mgr_unlock(region->mgr);
146 fpga_region_put(region);
151 if (region->get_bridges)
152 fpga_bridges_put(&region->bridge_list);
154 fpga_mgr_unlock(region->mgr);
156 fpga_region_put(region);
165 struct fpga_region *region = to_fpga_region(dev);
167 if (!region->compat_id)
171 (unsigned long long)region->compat_id->id_h,
172 (unsigned long long)region->compat_id->id_l);
193 struct fpga_region *region;
202 region = kzalloc(sizeof(*region), GFP_KERNEL);
203 if (!region)
212 region->mgr = info->mgr;
213 region->compat_id = info->compat_id;
214 region->priv = info->priv;
215 region->get_bridges = info->get_bridges;
217 mutex_init(&region->mutex);
218 INIT_LIST_HEAD(&region->bridge_list);
220 region->dev.class = &fpga_region_class;
221 region->dev.parent = parent;
222 region->dev.of_node = parent->of_node;
223 region->dev.id = id;
225 ret = dev_set_name(&region->dev, "region%d", id);
229 ret = device_register(&region->dev);
231 put_device(&region->dev);
235 return region;
240 kfree(region);
249 * @mgr: manager that programs this region
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.
277 void fpga_region_unregister(struct fpga_region *region)
279 device_unregister(&region->dev);
285 struct fpga_region *region = to_fpga_region(dev);
287 ida_free(&fpga_region_ida, region->dev.id);
288 kfree(region);