aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/fpga/fpga-bridge.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/fpga/fpga-bridge.c')
-rw-r--r--drivers/fpga/fpga-bridge.c68
1 files changed, 59 insertions, 9 deletions
diff --git a/drivers/fpga/fpga-bridge.c b/drivers/fpga/fpga-bridge.c
index c983dac97501..80bd8f1b2aa6 100644
--- a/drivers/fpga/fpga-bridge.c
+++ b/drivers/fpga/fpga-bridge.c
@@ -324,6 +324,9 @@ ATTRIBUTE_GROUPS(fpga_bridge);
324 * @br_ops: pointer to structure of fpga bridge ops 324 * @br_ops: pointer to structure of fpga bridge ops
325 * @priv: FPGA bridge private data 325 * @priv: FPGA bridge private data
326 * 326 *
327 * The caller of this function is responsible for freeing the bridge with
328 * fpga_bridge_free(). Using devm_fpga_bridge_create() instead is recommended.
329 *
327 * Return: struct fpga_bridge or NULL 330 * Return: struct fpga_bridge or NULL
328 */ 331 */
329struct fpga_bridge *fpga_bridge_create(struct device *dev, const char *name, 332struct fpga_bridge *fpga_bridge_create(struct device *dev, const char *name,
@@ -378,8 +381,8 @@ error_kfree:
378EXPORT_SYMBOL_GPL(fpga_bridge_create); 381EXPORT_SYMBOL_GPL(fpga_bridge_create);
379 382
380/** 383/**
381 * fpga_bridge_free - free a fpga bridge and its id 384 * fpga_bridge_free - free a fpga bridge created by fpga_bridge_create()
382 * @bridge: FPGA bridge struct created by fpga_bridge_create 385 * @bridge: FPGA bridge struct
383 */ 386 */
384void fpga_bridge_free(struct fpga_bridge *bridge) 387void fpga_bridge_free(struct fpga_bridge *bridge)
385{ 388{
@@ -388,9 +391,56 @@ void fpga_bridge_free(struct fpga_bridge *bridge)
388} 391}
389EXPORT_SYMBOL_GPL(fpga_bridge_free); 392EXPORT_SYMBOL_GPL(fpga_bridge_free);
390 393
394static void devm_fpga_bridge_release(struct device *dev, void *res)
395{
396 struct fpga_bridge *bridge = *(struct fpga_bridge **)res;
397
398 fpga_bridge_free(bridge);
399}
400
391/** 401/**
392 * fpga_bridge_register - register a fpga bridge 402 * devm_fpga_bridge_create - create and init a managed struct fpga_bridge
393 * @bridge: FPGA bridge struct created by fpga_bridge_create 403 * @dev: FPGA bridge device from pdev
404 * @name: FPGA bridge name
405 * @br_ops: pointer to structure of fpga bridge ops
406 * @priv: FPGA bridge private data
407 *
408 * This function is intended for use in a FPGA bridge driver's probe function.
409 * After the bridge driver creates the struct with devm_fpga_bridge_create(), it
410 * should register the bridge with fpga_bridge_register(). The bridge driver's
411 * remove function should call fpga_bridge_unregister(). The bridge struct
412 * allocated with this function will be freed automatically on driver detach.
413 * This includes the case of a probe function returning error before calling
414 * fpga_bridge_register(), the struct will still get cleaned up.
415 *
416 * Return: struct fpga_bridge or NULL
417 */
418struct fpga_bridge
419*devm_fpga_bridge_create(struct device *dev, const char *name,
420 const struct fpga_bridge_ops *br_ops, void *priv)
421{
422 struct fpga_bridge **ptr, *bridge;
423
424 ptr = devres_alloc(devm_fpga_bridge_release, sizeof(*ptr), GFP_KERNEL);
425 if (!ptr)
426 return NULL;
427
428 bridge = fpga_bridge_create(dev, name, br_ops, priv);
429 if (!bridge) {
430 devres_free(ptr);
431 } else {
432 *ptr = bridge;
433 devres_add(dev, ptr);
434 }
435
436 return bridge;
437}
438EXPORT_SYMBOL_GPL(devm_fpga_bridge_create);
439
440/**
441 * fpga_bridge_register - register a FPGA bridge
442 *
443 * @bridge: FPGA bridge struct
394 * 444 *
395 * Return: 0 for success, error code otherwise. 445 * Return: 0 for success, error code otherwise.
396 */ 446 */
@@ -412,8 +462,11 @@ int fpga_bridge_register(struct fpga_bridge *bridge)
412EXPORT_SYMBOL_GPL(fpga_bridge_register); 462EXPORT_SYMBOL_GPL(fpga_bridge_register);
413 463
414/** 464/**
415 * fpga_bridge_unregister - unregister and free a fpga bridge 465 * fpga_bridge_unregister - unregister a FPGA bridge
416 * @bridge: FPGA bridge struct created by fpga_bridge_create 466 *
467 * @bridge: FPGA bridge struct
468 *
469 * This function is intended for use in a FPGA bridge driver's remove function.
417 */ 470 */
418void fpga_bridge_unregister(struct fpga_bridge *bridge) 471void fpga_bridge_unregister(struct fpga_bridge *bridge)
419{ 472{
@@ -430,9 +483,6 @@ EXPORT_SYMBOL_GPL(fpga_bridge_unregister);
430 483
431static void fpga_bridge_dev_release(struct device *dev) 484static void fpga_bridge_dev_release(struct device *dev)
432{ 485{
433 struct fpga_bridge *bridge = to_fpga_bridge(dev);
434
435 fpga_bridge_free(bridge);
436} 486}
437 487
438static int __init fpga_bridge_dev_init(void) 488static int __init fpga_bridge_dev_init(void)