Lines Matching full:bridge
3 * FPGA Bridge Framework Driver
8 #include <linux/fpga/fpga-bridge.h>
23 * fpga_bridge_enable - Enable transactions on the bridge
25 * @bridge: FPGA bridge
29 int fpga_bridge_enable(struct fpga_bridge *bridge) in fpga_bridge_enable() argument
31 dev_dbg(&bridge->dev, "enable\n"); in fpga_bridge_enable()
33 if (bridge->br_ops && bridge->br_ops->enable_set) in fpga_bridge_enable()
34 return bridge->br_ops->enable_set(bridge, 1); in fpga_bridge_enable()
41 * fpga_bridge_disable - Disable transactions on the bridge
43 * @bridge: FPGA bridge
47 int fpga_bridge_disable(struct fpga_bridge *bridge) in fpga_bridge_disable() argument
49 dev_dbg(&bridge->dev, "disable\n"); in fpga_bridge_disable()
51 if (bridge->br_ops && bridge->br_ops->enable_set) in fpga_bridge_disable()
52 return bridge->br_ops->enable_set(bridge, 0); in fpga_bridge_disable()
61 struct fpga_bridge *bridge; in __fpga_bridge_get() local
63 bridge = to_fpga_bridge(bridge_dev); in __fpga_bridge_get()
65 bridge->info = info; in __fpga_bridge_get()
67 if (!mutex_trylock(&bridge->mutex)) in __fpga_bridge_get()
70 if (!try_module_get(bridge->br_ops_owner)) { in __fpga_bridge_get()
71 mutex_unlock(&bridge->mutex); in __fpga_bridge_get()
75 dev_dbg(&bridge->dev, "get\n"); in __fpga_bridge_get()
77 return bridge; in __fpga_bridge_get()
81 * of_fpga_bridge_get - get an exclusive reference to an fpga bridge
83 * @np: node pointer of an FPGA bridge.
88 * * -EBUSY if someone already has a reference to the bridge.
89 * * -ENODEV if @np is not an FPGA Bridge or can't take parent driver refcount.
94 struct fpga_bridge *bridge; in of_fpga_bridge_get() local
101 bridge = __fpga_bridge_get(bridge_dev, info); in of_fpga_bridge_get()
102 if (IS_ERR(bridge)) in of_fpga_bridge_get()
105 return bridge; in of_fpga_bridge_get()
115 * fpga_bridge_get - get an exclusive reference to an fpga bridge
116 * @dev: parent device that fpga bridge was registered with
119 * Given a device, get an exclusive reference to an fpga bridge.
121 * Return: fpga bridge struct or IS_ERR() condition containing error code.
126 struct fpga_bridge *bridge; in fpga_bridge_get() local
134 bridge = __fpga_bridge_get(bridge_dev, info); in fpga_bridge_get()
135 if (IS_ERR(bridge)) in fpga_bridge_get()
138 return bridge; in fpga_bridge_get()
143 * fpga_bridge_put - release a reference to a bridge
145 * @bridge: FPGA bridge
147 void fpga_bridge_put(struct fpga_bridge *bridge) in fpga_bridge_put() argument
149 dev_dbg(&bridge->dev, "put\n"); in fpga_bridge_put()
151 bridge->info = NULL; in fpga_bridge_put()
152 module_put(bridge->br_ops_owner); in fpga_bridge_put()
153 mutex_unlock(&bridge->mutex); in fpga_bridge_put()
154 put_device(&bridge->dev); in fpga_bridge_put()
162 * Enable each bridge in the list. If list is empty, do nothing.
164 * Return: 0 for success or empty bridge list or an error code otherwise.
168 struct fpga_bridge *bridge; in fpga_bridges_enable() local
171 list_for_each_entry(bridge, bridge_list, node) { in fpga_bridges_enable()
172 ret = fpga_bridge_enable(bridge); in fpga_bridges_enable()
186 * Disable each bridge in the list. If list is empty, do nothing.
188 * Return: 0 for success or empty bridge list or an error code otherwise.
192 struct fpga_bridge *bridge; in fpga_bridges_disable() local
195 list_for_each_entry(bridge, bridge_list, node) { in fpga_bridges_disable()
196 ret = fpga_bridge_disable(bridge); in fpga_bridges_disable()
210 * For each bridge in the list, put the bridge and remove it from the list.
215 struct fpga_bridge *bridge, *next; in fpga_bridges_put() local
218 list_for_each_entry_safe(bridge, next, bridge_list, node) { in fpga_bridges_put()
219 fpga_bridge_put(bridge); in fpga_bridges_put()
222 list_del(&bridge->node); in fpga_bridges_put()
229 * of_fpga_bridge_get_to_list - get a bridge, add it to a list
231 * @np: node pointer of an FPGA bridge
235 * Get an exclusive reference to the bridge and it to the list.
243 struct fpga_bridge *bridge; in of_fpga_bridge_get_to_list() local
246 bridge = of_fpga_bridge_get(np, info); in of_fpga_bridge_get_to_list()
247 if (IS_ERR(bridge)) in of_fpga_bridge_get_to_list()
248 return PTR_ERR(bridge); in of_fpga_bridge_get_to_list()
251 list_add(&bridge->node, bridge_list); in of_fpga_bridge_get_to_list()
259 * fpga_bridge_get_to_list - given device, get a bridge, add it to a list
261 * @dev: FPGA bridge device
265 * Get an exclusive reference to the bridge and it to the list.
273 struct fpga_bridge *bridge; in fpga_bridge_get_to_list() local
276 bridge = fpga_bridge_get(dev, info); in fpga_bridge_get_to_list()
277 if (IS_ERR(bridge)) in fpga_bridge_get_to_list()
278 return PTR_ERR(bridge); in fpga_bridge_get_to_list()
281 list_add(&bridge->node, bridge_list); in fpga_bridge_get_to_list()
291 struct fpga_bridge *bridge = to_fpga_bridge(dev); in name_show() local
293 return sprintf(buf, "%s\n", bridge->name); in name_show()
299 struct fpga_bridge *bridge = to_fpga_bridge(dev); in state_show() local
302 if (bridge->br_ops && bridge->br_ops->enable_show) { in state_show()
303 state = bridge->br_ops->enable_show(bridge); in state_show()
322 * __fpga_bridge_register - create and register an FPGA Bridge device
323 * @parent: FPGA bridge device from pdev
324 * @name: FPGA bridge name
325 * @br_ops: pointer to structure of fpga bridge ops
326 * @priv: FPGA bridge private data
336 struct fpga_bridge *bridge; in __fpga_bridge_register() local
349 bridge = kzalloc(sizeof(*bridge), GFP_KERNEL); in __fpga_bridge_register()
350 if (!bridge) in __fpga_bridge_register()
359 mutex_init(&bridge->mutex); in __fpga_bridge_register()
360 INIT_LIST_HEAD(&bridge->node); in __fpga_bridge_register()
362 bridge->name = name; in __fpga_bridge_register()
363 bridge->br_ops = br_ops; in __fpga_bridge_register()
364 bridge->br_ops_owner = owner; in __fpga_bridge_register()
365 bridge->priv = priv; in __fpga_bridge_register()
367 bridge->dev.groups = br_ops->groups; in __fpga_bridge_register()
368 bridge->dev.class = &fpga_bridge_class; in __fpga_bridge_register()
369 bridge->dev.parent = parent; in __fpga_bridge_register()
370 bridge->dev.of_node = parent->of_node; in __fpga_bridge_register()
371 bridge->dev.id = id; in __fpga_bridge_register()
373 ret = dev_set_name(&bridge->dev, "br%d", id); in __fpga_bridge_register()
377 ret = device_register(&bridge->dev); in __fpga_bridge_register()
379 put_device(&bridge->dev); in __fpga_bridge_register()
383 of_platform_populate(bridge->dev.of_node, NULL, NULL, &bridge->dev); in __fpga_bridge_register()
385 return bridge; in __fpga_bridge_register()
390 kfree(bridge); in __fpga_bridge_register()
397 * fpga_bridge_unregister - unregister an FPGA bridge
399 * @bridge: FPGA bridge struct
401 * This function is intended for use in an FPGA bridge driver's remove function.
403 void fpga_bridge_unregister(struct fpga_bridge *bridge) in fpga_bridge_unregister() argument
406 * If the low level driver provides a method for putting bridge into in fpga_bridge_unregister()
409 if (bridge->br_ops && bridge->br_ops->fpga_bridge_remove) in fpga_bridge_unregister()
410 bridge->br_ops->fpga_bridge_remove(bridge); in fpga_bridge_unregister()
412 device_unregister(&bridge->dev); in fpga_bridge_unregister()
418 struct fpga_bridge *bridge = to_fpga_bridge(dev); in fpga_bridge_dev_release() local
420 ida_free(&fpga_bridge_ida, bridge->dev.id); in fpga_bridge_dev_release()
421 kfree(bridge); in fpga_bridge_dev_release()
441 MODULE_DESCRIPTION("FPGA Bridge Driver");