diff options
Diffstat (limited to 'drivers/fpga/fpga-bridge.c')
-rw-r--r-- | drivers/fpga/fpga-bridge.c | 68 |
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 | */ |
329 | struct fpga_bridge *fpga_bridge_create(struct device *dev, const char *name, | 332 | struct fpga_bridge *fpga_bridge_create(struct device *dev, const char *name, |
@@ -378,8 +381,8 @@ error_kfree: | |||
378 | EXPORT_SYMBOL_GPL(fpga_bridge_create); | 381 | EXPORT_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 | */ |
384 | void fpga_bridge_free(struct fpga_bridge *bridge) | 387 | void fpga_bridge_free(struct fpga_bridge *bridge) |
385 | { | 388 | { |
@@ -388,9 +391,56 @@ void fpga_bridge_free(struct fpga_bridge *bridge) | |||
388 | } | 391 | } |
389 | EXPORT_SYMBOL_GPL(fpga_bridge_free); | 392 | EXPORT_SYMBOL_GPL(fpga_bridge_free); |
390 | 393 | ||
394 | static 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 | */ | ||
418 | struct 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 | } | ||
438 | EXPORT_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) | |||
412 | EXPORT_SYMBOL_GPL(fpga_bridge_register); | 462 | EXPORT_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 | */ |
418 | void fpga_bridge_unregister(struct fpga_bridge *bridge) | 471 | void fpga_bridge_unregister(struct fpga_bridge *bridge) |
419 | { | 472 | { |
@@ -430,9 +483,6 @@ EXPORT_SYMBOL_GPL(fpga_bridge_unregister); | |||
430 | 483 | ||
431 | static void fpga_bridge_dev_release(struct device *dev) | 484 | static 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 | ||
438 | static int __init fpga_bridge_dev_init(void) | 488 | static int __init fpga_bridge_dev_init(void) |