aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/fpga/fpga-bridge.c
diff options
context:
space:
mode:
authorJani Nikula <jani.nikula@intel.com>2018-11-20 06:14:08 -0500
committerJani Nikula <jani.nikula@intel.com>2018-11-20 06:14:08 -0500
commit2ac5e38ea4203852d6e99edd3cf11f044b0a409f (patch)
tree1ef02da98d56309368ad2b6a4e492bafe5bb4faf /drivers/fpga/fpga-bridge.c
parentf48cc647f3e196a3179d695d3c2d56c13e9dec98 (diff)
parent9235dd441af43599b9cdcce599a3da4083fcad3c (diff)
Merge drm/drm-next into drm-intel-next-queued
Pull in v4.20-rc3 via drm-next. Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Diffstat (limited to 'drivers/fpga/fpga-bridge.c')
-rw-r--r--drivers/fpga/fpga-bridge.c70
1 files changed, 60 insertions, 10 deletions
diff --git a/drivers/fpga/fpga-bridge.c b/drivers/fpga/fpga-bridge.c
index 24b8f98b73ec..80bd8f1b2aa6 100644
--- a/drivers/fpga/fpga-bridge.c
+++ b/drivers/fpga/fpga-bridge.c
@@ -125,7 +125,7 @@ static int fpga_bridge_dev_match(struct device *dev, const void *data)
125 * 125 *
126 * Given a device, get an exclusive reference to a fpga bridge. 126 * Given a device, get an exclusive reference to a fpga bridge.
127 * 127 *
128 * Return: fpga manager struct or IS_ERR() condition containing error code. 128 * Return: fpga bridge struct or IS_ERR() condition containing error code.
129 */ 129 */
130struct fpga_bridge *fpga_bridge_get(struct device *dev, 130struct fpga_bridge *fpga_bridge_get(struct device *dev,
131 struct fpga_image_info *info) 131 struct fpga_image_info *info)
@@ -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)