.. | .. |
---|
482 | 482 | } |
---|
483 | 483 | EXPORT_SYMBOL_GPL(fpga_mgr_get); |
---|
484 | 484 | |
---|
485 | | -static int fpga_mgr_of_node_match(struct device *dev, const void *data) |
---|
486 | | -{ |
---|
487 | | - return dev->of_node == data; |
---|
488 | | -} |
---|
489 | | - |
---|
490 | 485 | /** |
---|
491 | 486 | * of_fpga_mgr_get - Given a device node, get a reference to a fpga mgr. |
---|
492 | 487 | * |
---|
.. | .. |
---|
498 | 493 | { |
---|
499 | 494 | struct device *dev; |
---|
500 | 495 | |
---|
501 | | - dev = class_find_device(fpga_mgr_class, NULL, node, |
---|
502 | | - fpga_mgr_of_node_match); |
---|
| 496 | + dev = class_find_device_by_of_node(fpga_mgr_class, node); |
---|
503 | 497 | if (!dev) |
---|
504 | 498 | return ERR_PTR(-ENODEV); |
---|
505 | 499 | |
---|
.. | .. |
---|
558 | 552 | * @mops: pointer to structure of fpga manager ops |
---|
559 | 553 | * @priv: fpga manager private data |
---|
560 | 554 | * |
---|
| 555 | + * The caller of this function is responsible for freeing the struct with |
---|
| 556 | + * fpga_mgr_free(). Using devm_fpga_mgr_create() instead is recommended. |
---|
| 557 | + * |
---|
561 | 558 | * Return: pointer to struct fpga_manager or NULL |
---|
562 | 559 | */ |
---|
563 | 560 | struct fpga_manager *fpga_mgr_create(struct device *dev, const char *name, |
---|
.. | .. |
---|
584 | 581 | return NULL; |
---|
585 | 582 | |
---|
586 | 583 | id = ida_simple_get(&fpga_mgr_ida, 0, 0, GFP_KERNEL); |
---|
587 | | - if (id < 0) { |
---|
588 | | - ret = id; |
---|
| 584 | + if (id < 0) |
---|
589 | 585 | goto error_kfree; |
---|
590 | | - } |
---|
591 | 586 | |
---|
592 | 587 | mutex_init(&mgr->ref_mutex); |
---|
593 | 588 | |
---|
.. | .. |
---|
618 | 613 | EXPORT_SYMBOL_GPL(fpga_mgr_create); |
---|
619 | 614 | |
---|
620 | 615 | /** |
---|
621 | | - * fpga_mgr_free - deallocate a FPGA manager |
---|
622 | | - * @mgr: fpga manager struct created by fpga_mgr_create |
---|
| 616 | + * fpga_mgr_free - free a FPGA manager created with fpga_mgr_create() |
---|
| 617 | + * @mgr: fpga manager struct |
---|
623 | 618 | */ |
---|
624 | 619 | void fpga_mgr_free(struct fpga_manager *mgr) |
---|
625 | 620 | { |
---|
.. | .. |
---|
628 | 623 | } |
---|
629 | 624 | EXPORT_SYMBOL_GPL(fpga_mgr_free); |
---|
630 | 625 | |
---|
| 626 | +static void devm_fpga_mgr_release(struct device *dev, void *res) |
---|
| 627 | +{ |
---|
| 628 | + struct fpga_manager *mgr = *(struct fpga_manager **)res; |
---|
| 629 | + |
---|
| 630 | + fpga_mgr_free(mgr); |
---|
| 631 | +} |
---|
| 632 | + |
---|
| 633 | +/** |
---|
| 634 | + * devm_fpga_mgr_create - create and initialize a managed FPGA manager struct |
---|
| 635 | + * @dev: fpga manager device from pdev |
---|
| 636 | + * @name: fpga manager name |
---|
| 637 | + * @mops: pointer to structure of fpga manager ops |
---|
| 638 | + * @priv: fpga manager private data |
---|
| 639 | + * |
---|
| 640 | + * This function is intended for use in a FPGA manager driver's probe function. |
---|
| 641 | + * After the manager driver creates the manager struct with |
---|
| 642 | + * devm_fpga_mgr_create(), it should register it with fpga_mgr_register(). The |
---|
| 643 | + * manager driver's remove function should call fpga_mgr_unregister(). The |
---|
| 644 | + * manager struct allocated with this function will be freed automatically on |
---|
| 645 | + * driver detach. This includes the case of a probe function returning error |
---|
| 646 | + * before calling fpga_mgr_register(), the struct will still get cleaned up. |
---|
| 647 | + * |
---|
| 648 | + * Return: pointer to struct fpga_manager or NULL |
---|
| 649 | + */ |
---|
| 650 | +struct fpga_manager *devm_fpga_mgr_create(struct device *dev, const char *name, |
---|
| 651 | + const struct fpga_manager_ops *mops, |
---|
| 652 | + void *priv) |
---|
| 653 | +{ |
---|
| 654 | + struct fpga_manager **ptr, *mgr; |
---|
| 655 | + |
---|
| 656 | + ptr = devres_alloc(devm_fpga_mgr_release, sizeof(*ptr), GFP_KERNEL); |
---|
| 657 | + if (!ptr) |
---|
| 658 | + return NULL; |
---|
| 659 | + |
---|
| 660 | + mgr = fpga_mgr_create(dev, name, mops, priv); |
---|
| 661 | + if (!mgr) { |
---|
| 662 | + devres_free(ptr); |
---|
| 663 | + } else { |
---|
| 664 | + *ptr = mgr; |
---|
| 665 | + devres_add(dev, ptr); |
---|
| 666 | + } |
---|
| 667 | + |
---|
| 668 | + return mgr; |
---|
| 669 | +} |
---|
| 670 | +EXPORT_SYMBOL_GPL(devm_fpga_mgr_create); |
---|
| 671 | + |
---|
631 | 672 | /** |
---|
632 | 673 | * fpga_mgr_register - register a FPGA manager |
---|
633 | | - * @mgr: fpga manager struct created by fpga_mgr_create |
---|
| 674 | + * @mgr: fpga manager struct |
---|
634 | 675 | * |
---|
635 | 676 | * Return: 0 on success, negative error code otherwise. |
---|
636 | 677 | */ |
---|
.. | .. |
---|
661 | 702 | EXPORT_SYMBOL_GPL(fpga_mgr_register); |
---|
662 | 703 | |
---|
663 | 704 | /** |
---|
664 | | - * fpga_mgr_unregister - unregister and free a FPGA manager |
---|
665 | | - * @mgr: fpga manager struct |
---|
| 705 | + * fpga_mgr_unregister - unregister a FPGA manager |
---|
| 706 | + * @mgr: fpga manager struct |
---|
| 707 | + * |
---|
| 708 | + * This function is intended for use in a FPGA manager driver's remove function. |
---|
666 | 709 | */ |
---|
667 | 710 | void fpga_mgr_unregister(struct fpga_manager *mgr) |
---|
668 | 711 | { |
---|
.. | .. |
---|
681 | 724 | |
---|
682 | 725 | static void fpga_mgr_dev_release(struct device *dev) |
---|
683 | 726 | { |
---|
684 | | - struct fpga_manager *mgr = to_fpga_manager(dev); |
---|
685 | | - |
---|
686 | | - fpga_mgr_free(mgr); |
---|
687 | 727 | } |
---|
688 | 728 | |
---|
689 | 729 | static int __init fpga_mgr_class_init(void) |
---|