| .. | .. |
|---|
| 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) |
|---|