diff options
Diffstat (limited to 'drivers/fpga/fpga-mgr.c')
-rw-r--r-- | drivers/fpga/fpga-mgr.c | 52 |
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); | |||
410 | static struct fpga_manager *__fpga_mgr_get(struct device *dev) | 410 | static 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 | ||
430 | err_ll_mod: | ||
431 | mutex_unlock(&mgr->ref_mutex); | ||
432 | err_dev: | 423 | err_dev: |
433 | put_device(dev); | 424 | put_device(dev); |
434 | return ERR_PTR(ret); | 425 | return ERR_PTR(-ENODEV); |
435 | } | 426 | } |
436 | 427 | ||
437 | static int fpga_mgr_dev_match(struct device *dev, const void *data) | 428 | static 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); | |||
491 | void fpga_mgr_put(struct fpga_manager *mgr) | 482 | void 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 | } |
497 | EXPORT_SYMBOL_GPL(fpga_mgr_put); | 487 | EXPORT_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 | */ | ||
498 | int 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 | } | ||
507 | EXPORT_SYMBOL_GPL(fpga_mgr_lock); | ||
508 | |||
509 | /** | ||
510 | * fpga_mgr_unlock - Unlock FPGA manager | ||
511 | * @mgr: fpga manager | ||
512 | */ | ||
513 | void fpga_mgr_unlock(struct fpga_manager *mgr) | ||
514 | { | ||
515 | mutex_unlock(&mgr->ref_mutex); | ||
516 | } | ||
517 | EXPORT_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 |