aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/fpga/fpga-mgr.c
diff options
context:
space:
mode:
authorAlan Tull <atull@kernel.org>2017-11-15 15:20:13 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-11-28 10:30:37 -0500
commitebf877a51ad7b65e4ab024f021b60a4f7928864a (patch)
treecca7dfc760c45f32bdbd9e6f69106dd24651d468 /drivers/fpga/fpga-mgr.c
parent5cf0c7f6502f26332b46fa87914553a4d6ae75ac (diff)
fpga: mgr: separate getting/locking FPGA manager
Previously when the user gets a FPGA manager, it was locked and nobody else could use it for programming. This commit makes it straightforward to save a reference to an FPGA manager and only lock it when programming the FPGA. Add functions that get an FPGA manager's mutex for exclusive use: * fpga_mgr_lock * fpga_mgr_unlock The following functions no longer lock an FPGA manager's mutex: * of_fpga_mgr_get * fpga_mgr_get * fpga_mgr_put Signed-off-by: Alan Tull <atull@kernel.org> Acked-by: Moritz Fischer <mdf@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/fpga/fpga-mgr.c')
-rw-r--r--drivers/fpga/fpga-mgr.c52
1 files changed, 36 insertions, 16 deletions
diff --git a/drivers/fpga/fpga-mgr.c b/drivers/fpga/fpga-mgr.c
index a8dd54945470..d27e8d2a149c 100644
--- a/drivers/fpga/fpga-mgr.c
+++ b/drivers/fpga/fpga-mgr.c
@@ -410,28 +410,19 @@ ATTRIBUTE_GROUPS(fpga_mgr);
410static struct fpga_manager *__fpga_mgr_get(struct device *dev) 410static struct fpga_manager *__fpga_mgr_get(struct device *dev)
411{ 411{
412 struct fpga_manager *mgr; 412 struct fpga_manager *mgr;
413 int ret = -ENODEV;
414 413
415 mgr = to_fpga_manager(dev); 414 mgr = to_fpga_manager(dev);
416 if (!mgr) 415 if (!mgr)
417 goto err_dev; 416 goto err_dev;
418 417
419 /* Get exclusive use of fpga manager */
420 if (!mutex_trylock(&mgr->ref_mutex)) {
421 ret = -EBUSY;
422 goto err_dev;
423 }
424
425 if (!try_module_get(dev->parent->driver->owner)) 418 if (!try_module_get(dev->parent->driver->owner))
426 goto err_ll_mod; 419 goto err_dev;
427 420
428 return mgr; 421 return mgr;
429 422
430err_ll_mod:
431 mutex_unlock(&mgr->ref_mutex);
432err_dev: 423err_dev:
433 put_device(dev); 424 put_device(dev);
434 return ERR_PTR(ret); 425 return ERR_PTR(-ENODEV);
435} 426}
436 427
437static int fpga_mgr_dev_match(struct device *dev, const void *data) 428static int fpga_mgr_dev_match(struct device *dev, const void *data)
@@ -440,10 +431,10 @@ static int fpga_mgr_dev_match(struct device *dev, const void *data)
440} 431}
441 432
442/** 433/**
443 * fpga_mgr_get - get an exclusive reference to a fpga mgr 434 * fpga_mgr_get - get a reference to a fpga mgr
444 * @dev: parent device that fpga mgr was registered with 435 * @dev: parent device that fpga mgr was registered with
445 * 436 *
446 * Given a device, get an exclusive reference to a fpga mgr. 437 * Given a device, get a reference to a fpga mgr.
447 * 438 *
448 * Return: fpga manager struct or IS_ERR() condition containing error code. 439 * Return: fpga manager struct or IS_ERR() condition containing error code.
449 */ 440 */
@@ -464,10 +455,10 @@ static int fpga_mgr_of_node_match(struct device *dev, const void *data)
464} 455}
465 456
466/** 457/**
467 * of_fpga_mgr_get - get an exclusive reference to a fpga mgr 458 * of_fpga_mgr_get - get a reference to a fpga mgr
468 * @node: device node 459 * @node: device node
469 * 460 *
470 * Given a device node, get an exclusive reference to a fpga mgr. 461 * Given a device node, get a reference to a fpga mgr.
471 * 462 *
472 * Return: fpga manager struct or IS_ERR() condition containing error code. 463 * Return: fpga manager struct or IS_ERR() condition containing error code.
473 */ 464 */
@@ -491,12 +482,41 @@ EXPORT_SYMBOL_GPL(of_fpga_mgr_get);
491void fpga_mgr_put(struct fpga_manager *mgr) 482void fpga_mgr_put(struct fpga_manager *mgr)
492{ 483{
493 module_put(mgr->dev.parent->driver->owner); 484 module_put(mgr->dev.parent->driver->owner);
494 mutex_unlock(&mgr->ref_mutex);
495 put_device(&mgr->dev); 485 put_device(&mgr->dev);
496} 486}
497EXPORT_SYMBOL_GPL(fpga_mgr_put); 487EXPORT_SYMBOL_GPL(fpga_mgr_put);
498 488
499/** 489/**
490 * fpga_mgr_lock - Lock FPGA manager for exclusive use
491 * @mgr: fpga manager
492 *
493 * Given a pointer to FPGA Manager (from fpga_mgr_get() or
494 * of_fpga_mgr_put()) attempt to get the mutex.
495 *
496 * Return: 0 for success or -EBUSY
497 */
498int fpga_mgr_lock(struct fpga_manager *mgr)
499{
500 if (!mutex_trylock(&mgr->ref_mutex)) {
501 dev_err(&mgr->dev, "FPGA manager is in use.\n");
502 return -EBUSY;
503 }
504
505 return 0;
506}
507EXPORT_SYMBOL_GPL(fpga_mgr_lock);
508
509/**
510 * fpga_mgr_unlock - Unlock FPGA manager
511 * @mgr: fpga manager
512 */
513void fpga_mgr_unlock(struct fpga_manager *mgr)
514{
515 mutex_unlock(&mgr->ref_mutex);
516}
517EXPORT_SYMBOL_GPL(fpga_mgr_unlock);
518
519/**
500 * fpga_mgr_register - register a low level fpga manager driver 520 * fpga_mgr_register - register a low level fpga manager driver
501 * @dev: fpga manager device from pdev 521 * @dev: fpga manager device from pdev
502 * @name: fpga manager name 522 * @name: fpga manager name