Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

fpga: mgr: Use standard dev_release for class driver

The FPGA manager class driver data structure is being treated as a
managed resource instead of using the standard dev_release call-back
function to release the class data structure. This change removes
the managed resource code for the freeing of the class data structure
and combines the create() and register() functions into a single
register() or register_full() function.

The register_full() function accepts an info data structure to provide
flexibility in passing optional parameters. The register() function
supports the current parameter list for users that don't require the
use of optional parameters.

The devm_fpga_mgr_register() function is retained, and the
devm_fpga_mgr_register_full() function is added.

Signed-off-by: Russ Weight <russell.h.weight@intel.com>
Reviewed-by: Xu Yilun <yilun.xu@intel.com>
Acked-by: Xu Yilun <yilun.xu@intel.com>
Signed-off-by: Moritz Fischer <mdf@kernel.org>

authored by

Russ Weight and committed by
Moritz Fischer
4ba0b2c2 fa55b7dc

+226 -270
+29 -9
Documentation/driver-api/fpga/fpga-mgr.rst
··· 24 24 -------------------------------- 25 25 26 26 To add another FPGA manager, write a driver that implements a set of ops. The 27 - probe function calls fpga_mgr_register(), such as:: 27 + probe function calls fpga_mgr_register() or fpga_mgr_register_full(), such as:: 28 28 29 29 static const struct fpga_manager_ops socfpga_fpga_ops = { 30 30 .write_init = socfpga_fpga_ops_configure_init, ··· 49 49 * them in priv 50 50 */ 51 51 52 - mgr = devm_fpga_mgr_create(dev, "Altera SOCFPGA FPGA Manager", 53 - &socfpga_fpga_ops, priv); 54 - if (!mgr) 55 - return -ENOMEM; 52 + mgr = fpga_mgr_register(dev, "Altera SOCFPGA FPGA Manager", 53 + &socfpga_fpga_ops, priv); 54 + if (IS_ERR(mgr)) 55 + return PTR_ERR(mgr); 56 56 57 57 platform_set_drvdata(pdev, mgr); 58 58 59 - return fpga_mgr_register(mgr); 59 + return 0; 60 60 } 61 61 62 62 static int socfpga_fpga_remove(struct platform_device *pdev) ··· 68 68 return 0; 69 69 } 70 70 71 + Alternatively, the probe function could call one of the resource managed 72 + register functions, devm_fpga_mgr_register() or devm_fpga_mgr_register_full(). 73 + When these functions are used, the parameter syntax is the same, but the call 74 + to fpga_mgr_unregister() should be removed. In the above example, the 75 + socfpga_fpga_remove() function would not be required. 71 76 72 77 The ops will implement whatever device specific register writes are needed to 73 78 do the programming sequence for this particular FPGA. These ops return 0 for ··· 109 104 * ``fpga_mgr_states`` - Values for :c:expr:`fpga_manager->state`. 110 105 * struct fpga_manager - the FPGA manager struct 111 106 * struct fpga_manager_ops - Low level FPGA manager driver ops 112 - * devm_fpga_mgr_create() - Allocate and init a manager struct 113 - * fpga_mgr_register() - Register an FPGA manager 107 + * struct fpga_manager_info - Parameter structure for fpga_mgr_register_full() 108 + * fpga_mgr_register_full() - Create and register an FPGA manager using the 109 + fpga_mgr_info structure to provide the full flexibility of options 110 + * fpga_mgr_register() - Create and register an FPGA manager using standard 111 + arguments 112 + * devm_fpga_mgr_register_full() - Resource managed version of 113 + fpga_mgr_register_full() 114 + * devm_fpga_mgr_register() - Resource managed version of fpga_mgr_register() 114 115 * fpga_mgr_unregister() - Unregister an FPGA manager 115 116 116 117 .. kernel-doc:: include/linux/fpga/fpga-mgr.h ··· 128 117 .. kernel-doc:: include/linux/fpga/fpga-mgr.h 129 118 :functions: fpga_manager_ops 130 119 120 + .. kernel-doc:: include/linux/fpga/fpga-mgr.h 121 + :functions: fpga_manager_info 122 + 131 123 .. kernel-doc:: drivers/fpga/fpga-mgr.c 132 - :functions: devm_fpga_mgr_create 124 + :functions: fpga_mgr_register_full 133 125 134 126 .. kernel-doc:: drivers/fpga/fpga-mgr.c 135 127 :functions: fpga_mgr_register 128 + 129 + .. kernel-doc:: drivers/fpga/fpga-mgr.c 130 + :functions: devm_fpga_mgr_register_full 131 + 132 + .. kernel-doc:: drivers/fpga/fpga-mgr.c 133 + :functions: devm_fpga_mgr_register 136 134 137 135 .. kernel-doc:: drivers/fpga/fpga-mgr.c 138 136 :functions: fpga_mgr_unregister
+4 -8
drivers/fpga/altera-cvp.c
··· 652 652 snprintf(conf->mgr_name, sizeof(conf->mgr_name), "%s @%s", 653 653 ALTERA_CVP_MGR_NAME, pci_name(pdev)); 654 654 655 - mgr = devm_fpga_mgr_create(&pdev->dev, conf->mgr_name, 656 - &altera_cvp_ops, conf); 657 - if (!mgr) { 658 - ret = -ENOMEM; 655 + mgr = fpga_mgr_register(&pdev->dev, conf->mgr_name, 656 + &altera_cvp_ops, conf); 657 + if (IS_ERR(mgr)) { 658 + ret = PTR_ERR(mgr); 659 659 goto err_unmap; 660 660 } 661 661 662 662 pci_set_drvdata(pdev, mgr); 663 - 664 - ret = fpga_mgr_register(mgr); 665 - if (ret) 666 - goto err_unmap; 667 663 668 664 return 0; 669 665
+2 -5
drivers/fpga/altera-pr-ip-core.c
··· 191 191 (val & ALT_PR_CSR_STATUS_MSK) >> ALT_PR_CSR_STATUS_SFT, 192 192 (int)(val & ALT_PR_CSR_PR_START)); 193 193 194 - mgr = devm_fpga_mgr_create(dev, dev_name(dev), &alt_pr_ops, priv); 195 - if (!mgr) 196 - return -ENOMEM; 197 - 198 - return devm_fpga_mgr_register(dev, mgr); 194 + mgr = devm_fpga_mgr_register(dev, dev_name(dev), &alt_pr_ops, priv); 195 + return PTR_ERR_OR_ZERO(mgr); 199 196 } 200 197 EXPORT_SYMBOL_GPL(alt_pr_register); 201 198
+3 -6
drivers/fpga/altera-ps-spi.c
··· 302 302 snprintf(conf->mgr_name, sizeof(conf->mgr_name), "%s %s", 303 303 dev_driver_string(&spi->dev), dev_name(&spi->dev)); 304 304 305 - mgr = devm_fpga_mgr_create(&spi->dev, conf->mgr_name, 306 - &altera_ps_ops, conf); 307 - if (!mgr) 308 - return -ENOMEM; 309 - 310 - return devm_fpga_mgr_register(&spi->dev, mgr); 305 + mgr = devm_fpga_mgr_register(&spi->dev, conf->mgr_name, 306 + &altera_ps_ops, conf); 307 + return PTR_ERR_OR_ZERO(mgr); 311 308 } 312 309 313 310 static const struct spi_device_id altera_ps_spi_ids[] = {
+9 -13
drivers/fpga/dfl-fme-mgr.c
··· 276 276 static int fme_mgr_probe(struct platform_device *pdev) 277 277 { 278 278 struct dfl_fme_mgr_pdata *pdata = dev_get_platdata(&pdev->dev); 279 - struct fpga_compat_id *compat_id; 279 + struct fpga_manager_info info = { 0 }; 280 280 struct device *dev = &pdev->dev; 281 281 struct fme_mgr_priv *priv; 282 282 struct fpga_manager *mgr; ··· 296 296 return PTR_ERR(priv->ioaddr); 297 297 } 298 298 299 - compat_id = devm_kzalloc(dev, sizeof(*compat_id), GFP_KERNEL); 300 - if (!compat_id) 299 + info.name = "DFL FME FPGA Manager"; 300 + info.mops = &fme_mgr_ops; 301 + info.priv = priv; 302 + info.compat_id = devm_kzalloc(dev, sizeof(*info.compat_id), GFP_KERNEL); 303 + if (!info.compat_id) 301 304 return -ENOMEM; 302 305 303 - fme_mgr_get_compat_id(priv->ioaddr, compat_id); 304 - 305 - mgr = devm_fpga_mgr_create(dev, "DFL FME FPGA Manager", 306 - &fme_mgr_ops, priv); 307 - if (!mgr) 308 - return -ENOMEM; 309 - 310 - mgr->compat_id = compat_id; 311 - 312 - return devm_fpga_mgr_register(dev, mgr); 306 + fme_mgr_get_compat_id(priv->ioaddr, info.compat_id); 307 + mgr = devm_fpga_mgr_register_full(dev, &info); 308 + return PTR_ERR_OR_ZERO(mgr); 313 309 } 314 310 315 311 static struct platform_driver fme_mgr_driver = {
+100 -133
drivers/fpga/fpga-mgr.c
··· 592 592 EXPORT_SYMBOL_GPL(fpga_mgr_unlock); 593 593 594 594 /** 595 - * fpga_mgr_create - create and initialize an FPGA manager struct 595 + * fpga_mgr_register_full - create and register an FPGA Manager device 596 596 * @parent: fpga manager device from pdev 597 - * @name: fpga manager name 598 - * @mops: pointer to structure of fpga manager ops 599 - * @priv: fpga manager private data 597 + * @info: parameters for fpga manager 600 598 * 601 - * The caller of this function is responsible for freeing the struct with 602 - * fpga_mgr_free(). Using devm_fpga_mgr_create() instead is recommended. 599 + * The caller of this function is responsible for calling fpga_mgr_unregister(). 600 + * Using devm_fpga_mgr_register_full() instead is recommended. 603 601 * 604 - * Return: pointer to struct fpga_manager or NULL 602 + * Return: pointer to struct fpga_manager pointer or ERR_PTR() 605 603 */ 606 - struct fpga_manager *fpga_mgr_create(struct device *parent, const char *name, 607 - const struct fpga_manager_ops *mops, 608 - void *priv) 604 + struct fpga_manager * 605 + fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *info) 609 606 { 607 + const struct fpga_manager_ops *mops = info->mops; 610 608 struct fpga_manager *mgr; 611 609 int id, ret; 612 610 613 611 if (!mops) { 614 612 dev_err(parent, "Attempt to register without fpga_manager_ops\n"); 615 - return NULL; 613 + return ERR_PTR(-EINVAL); 616 614 } 617 615 618 - if (!name || !strlen(name)) { 616 + if (!info->name || !strlen(info->name)) { 619 617 dev_err(parent, "Attempt to register with no name!\n"); 620 - return NULL; 618 + return ERR_PTR(-EINVAL); 621 619 } 622 620 623 621 mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); 624 622 if (!mgr) 625 - return NULL; 623 + return ERR_PTR(-ENOMEM); 626 624 627 625 id = ida_simple_get(&fpga_mgr_ida, 0, 0, GFP_KERNEL); 628 - if (id < 0) 626 + if (id < 0) { 627 + ret = id; 629 628 goto error_kfree; 629 + } 630 630 631 631 mutex_init(&mgr->ref_mutex); 632 632 633 - mgr->name = name; 634 - mgr->mops = mops; 635 - mgr->priv = priv; 633 + mgr->name = info->name; 634 + mgr->mops = info->mops; 635 + mgr->priv = info->priv; 636 + mgr->compat_id = info->compat_id; 636 637 637 - device_initialize(&mgr->dev); 638 638 mgr->dev.class = fpga_mgr_class; 639 639 mgr->dev.groups = mops->groups; 640 640 mgr->dev.parent = parent; ··· 645 645 if (ret) 646 646 goto error_device; 647 647 648 - return mgr; 649 - 650 - error_device: 651 - ida_simple_remove(&fpga_mgr_ida, id); 652 - error_kfree: 653 - kfree(mgr); 654 - 655 - return NULL; 656 - } 657 - EXPORT_SYMBOL_GPL(fpga_mgr_create); 658 - 659 - /** 660 - * fpga_mgr_free - free an FPGA manager created with fpga_mgr_create() 661 - * @mgr: fpga manager struct 662 - */ 663 - void fpga_mgr_free(struct fpga_manager *mgr) 664 - { 665 - ida_simple_remove(&fpga_mgr_ida, mgr->dev.id); 666 - kfree(mgr); 667 - } 668 - EXPORT_SYMBOL_GPL(fpga_mgr_free); 669 - 670 - static void devm_fpga_mgr_release(struct device *dev, void *res) 671 - { 672 - struct fpga_mgr_devres *dr = res; 673 - 674 - fpga_mgr_free(dr->mgr); 675 - } 676 - 677 - /** 678 - * devm_fpga_mgr_create - create and initialize a managed FPGA manager struct 679 - * @parent: fpga manager device from pdev 680 - * @name: fpga manager name 681 - * @mops: pointer to structure of fpga manager ops 682 - * @priv: fpga manager private data 683 - * 684 - * This function is intended for use in an FPGA manager driver's probe function. 685 - * After the manager driver creates the manager struct with 686 - * devm_fpga_mgr_create(), it should register it with fpga_mgr_register(). The 687 - * manager driver's remove function should call fpga_mgr_unregister(). The 688 - * manager struct allocated with this function will be freed automatically on 689 - * driver detach. This includes the case of a probe function returning error 690 - * before calling fpga_mgr_register(), the struct will still get cleaned up. 691 - * 692 - * Return: pointer to struct fpga_manager or NULL 693 - */ 694 - struct fpga_manager *devm_fpga_mgr_create(struct device *parent, const char *name, 695 - const struct fpga_manager_ops *mops, 696 - void *priv) 697 - { 698 - struct fpga_mgr_devres *dr; 699 - 700 - dr = devres_alloc(devm_fpga_mgr_release, sizeof(*dr), GFP_KERNEL); 701 - if (!dr) 702 - return NULL; 703 - 704 - dr->mgr = fpga_mgr_create(parent, name, mops, priv); 705 - if (!dr->mgr) { 706 - devres_free(dr); 707 - return NULL; 708 - } 709 - 710 - devres_add(parent, dr); 711 - 712 - return dr->mgr; 713 - } 714 - EXPORT_SYMBOL_GPL(devm_fpga_mgr_create); 715 - 716 - /** 717 - * fpga_mgr_register - register an FPGA manager 718 - * @mgr: fpga manager struct 719 - * 720 - * Return: 0 on success, negative error code otherwise. 721 - */ 722 - int fpga_mgr_register(struct fpga_manager *mgr) 723 - { 724 - int ret; 725 - 726 648 /* 727 649 * Initialize framework state by requesting low level driver read state 728 650 * from device. FPGA may be in reset mode or may have been programmed ··· 652 730 */ 653 731 mgr->state = fpga_mgr_state(mgr); 654 732 655 - ret = device_add(&mgr->dev); 656 - if (ret) 657 - goto error_device; 733 + ret = device_register(&mgr->dev); 734 + if (ret) { 735 + put_device(&mgr->dev); 736 + return ERR_PTR(ret); 737 + } 658 738 659 - dev_info(&mgr->dev, "%s registered\n", mgr->name); 660 - 661 - return 0; 739 + return mgr; 662 740 663 741 error_device: 664 - ida_simple_remove(&fpga_mgr_ida, mgr->dev.id); 742 + ida_simple_remove(&fpga_mgr_ida, id); 743 + error_kfree: 744 + kfree(mgr); 665 745 666 - return ret; 746 + return ERR_PTR(ret); 747 + } 748 + EXPORT_SYMBOL_GPL(fpga_mgr_register_full); 749 + 750 + /** 751 + * fpga_mgr_register - create and register an FPGA Manager device 752 + * @parent: fpga manager device from pdev 753 + * @name: fpga manager name 754 + * @mops: pointer to structure of fpga manager ops 755 + * @priv: fpga manager private data 756 + * 757 + * The caller of this function is responsible for calling fpga_mgr_unregister(). 758 + * Using devm_fpga_mgr_register() instead is recommended. This simple 759 + * version of the register function should be sufficient for most users. The 760 + * fpga_mgr_register_full() function is available for users that need to pass 761 + * additional, optional parameters. 762 + * 763 + * Return: pointer to struct fpga_manager pointer or ERR_PTR() 764 + */ 765 + struct fpga_manager * 766 + fpga_mgr_register(struct device *parent, const char *name, 767 + const struct fpga_manager_ops *mops, void *priv) 768 + { 769 + struct fpga_manager_info info = { 0 }; 770 + 771 + info.name = name; 772 + info.mops = mops; 773 + info.priv = priv; 774 + 775 + return fpga_mgr_register_full(parent, &info); 667 776 } 668 777 EXPORT_SYMBOL_GPL(fpga_mgr_register); 669 778 ··· 718 765 } 719 766 EXPORT_SYMBOL_GPL(fpga_mgr_unregister); 720 767 721 - static int fpga_mgr_devres_match(struct device *dev, void *res, 722 - void *match_data) 723 - { 724 - struct fpga_mgr_devres *dr = res; 725 - 726 - return match_data == dr->mgr; 727 - } 728 - 729 768 static void devm_fpga_mgr_unregister(struct device *dev, void *res) 730 769 { 731 770 struct fpga_mgr_devres *dr = res; ··· 726 781 } 727 782 728 783 /** 729 - * devm_fpga_mgr_register - resource managed variant of fpga_mgr_register() 730 - * @dev: managing device for this FPGA manager 731 - * @mgr: fpga manager struct 784 + * devm_fpga_mgr_register_full - resource managed variant of fpga_mgr_register() 785 + * @parent: fpga manager device from pdev 786 + * @info: parameters for fpga manager 732 787 * 733 - * This is the devres variant of fpga_mgr_register() for which the unregister 788 + * This is the devres variant of fpga_mgr_register_full() for which the unregister 734 789 * function will be called automatically when the managing device is detached. 735 790 */ 736 - int devm_fpga_mgr_register(struct device *dev, struct fpga_manager *mgr) 791 + struct fpga_manager * 792 + devm_fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *info) 737 793 { 738 794 struct fpga_mgr_devres *dr; 739 - int ret; 740 - 741 - /* 742 - * Make sure that the struct fpga_manager * that is passed in is 743 - * managed itself. 744 - */ 745 - if (WARN_ON(!devres_find(dev, devm_fpga_mgr_release, 746 - fpga_mgr_devres_match, mgr))) 747 - return -EINVAL; 795 + struct fpga_manager *mgr; 748 796 749 797 dr = devres_alloc(devm_fpga_mgr_unregister, sizeof(*dr), GFP_KERNEL); 750 798 if (!dr) 751 - return -ENOMEM; 799 + return ERR_PTR(-ENOMEM); 752 800 753 - ret = fpga_mgr_register(mgr); 754 - if (ret) { 801 + mgr = fpga_mgr_register_full(parent, info); 802 + if (IS_ERR(mgr)) { 755 803 devres_free(dr); 756 - return ret; 804 + return mgr; 757 805 } 758 806 759 807 dr->mgr = mgr; 760 - devres_add(dev, dr); 808 + devres_add(parent, dr); 761 809 762 - return 0; 810 + return mgr; 811 + } 812 + EXPORT_SYMBOL_GPL(devm_fpga_mgr_register_full); 813 + 814 + /** 815 + * devm_fpga_mgr_register - resource managed variant of fpga_mgr_register() 816 + * @parent: fpga manager device from pdev 817 + * @name: fpga manager name 818 + * @mops: pointer to structure of fpga manager ops 819 + * @priv: fpga manager private data 820 + * 821 + * This is the devres variant of fpga_mgr_register() for which the 822 + * unregister function will be called automatically when the managing 823 + * device is detached. 824 + */ 825 + struct fpga_manager * 826 + devm_fpga_mgr_register(struct device *parent, const char *name, 827 + const struct fpga_manager_ops *mops, void *priv) 828 + { 829 + struct fpga_manager_info info = { 0 }; 830 + 831 + info.name = name; 832 + info.mops = mops; 833 + info.priv = priv; 834 + 835 + return devm_fpga_mgr_register_full(parent, &info); 763 836 } 764 837 EXPORT_SYMBOL_GPL(devm_fpga_mgr_register); 765 838 766 839 static void fpga_mgr_dev_release(struct device *dev) 767 840 { 841 + struct fpga_manager *mgr = to_fpga_manager(dev); 842 + 843 + ida_simple_remove(&fpga_mgr_ida, mgr->dev.id); 844 + kfree(mgr); 768 845 } 769 846 770 847 static int __init fpga_mgr_class_init(void)
+3 -6
drivers/fpga/ice40-spi.c
··· 178 178 return ret; 179 179 } 180 180 181 - mgr = devm_fpga_mgr_create(dev, "Lattice iCE40 FPGA Manager", 182 - &ice40_fpga_ops, priv); 183 - if (!mgr) 184 - return -ENOMEM; 185 - 186 - return devm_fpga_mgr_register(dev, mgr); 181 + mgr = devm_fpga_mgr_register(dev, "Lattice iCE40 FPGA Manager", 182 + &ice40_fpga_ops, priv); 183 + return PTR_ERR_OR_ZERO(mgr); 187 184 } 188 185 189 186 static const struct of_device_id ice40_fpga_of_match[] = {
+3 -6
drivers/fpga/machxo2-spi.c
··· 370 370 return -EINVAL; 371 371 } 372 372 373 - mgr = devm_fpga_mgr_create(dev, "Lattice MachXO2 SPI FPGA Manager", 374 - &machxo2_ops, spi); 375 - if (!mgr) 376 - return -ENOMEM; 377 - 378 - return devm_fpga_mgr_register(dev, mgr); 373 + mgr = devm_fpga_mgr_register(dev, "Lattice MachXO2 SPI FPGA Manager", 374 + &machxo2_ops, spi); 375 + return PTR_ERR_OR_ZERO(mgr); 379 376 } 380 377 381 378 #ifdef CONFIG_OF
+6 -10
drivers/fpga/socfpga-a10.c
··· 508 508 return -EBUSY; 509 509 } 510 510 511 - mgr = devm_fpga_mgr_create(dev, "SoCFPGA Arria10 FPGA Manager", 512 - &socfpga_a10_fpga_mgr_ops, priv); 513 - if (!mgr) 514 - return -ENOMEM; 511 + mgr = fpga_mgr_register(dev, "SoCFPGA Arria10 FPGA Manager", 512 + &socfpga_a10_fpga_mgr_ops, priv); 513 + if (IS_ERR(mgr)) { 514 + clk_disable_unprepare(priv->clk); 515 + return PTR_ERR(mgr); 516 + } 515 517 516 518 platform_set_drvdata(pdev, mgr); 517 - 518 - ret = fpga_mgr_register(mgr); 519 - if (ret) { 520 - clk_disable_unprepare(priv->clk); 521 - return ret; 522 - } 523 519 524 520 return 0; 525 521 }
+3 -6
drivers/fpga/socfpga.c
··· 571 571 if (ret) 572 572 return ret; 573 573 574 - mgr = devm_fpga_mgr_create(dev, "Altera SOCFPGA FPGA Manager", 575 - &socfpga_fpga_ops, priv); 576 - if (!mgr) 577 - return -ENOMEM; 578 - 579 - return devm_fpga_mgr_register(dev, mgr); 574 + mgr = devm_fpga_mgr_register(dev, "Altera SOCFPGA FPGA Manager", 575 + &socfpga_fpga_ops, priv); 576 + return PTR_ERR_OR_ZERO(mgr); 580 577 } 581 578 582 579 #ifdef CONFIG_OF
+4 -12
drivers/fpga/stratix10-soc.c
··· 419 419 420 420 init_completion(&priv->status_return_completion); 421 421 422 - mgr = fpga_mgr_create(dev, "Stratix10 SOC FPGA Manager", 423 - &s10_ops, priv); 424 - if (!mgr) { 425 - dev_err(dev, "unable to create FPGA manager\n"); 426 - ret = -ENOMEM; 427 - goto probe_err; 428 - } 429 - 430 - ret = fpga_mgr_register(mgr); 431 - if (ret) { 422 + mgr = fpga_mgr_register(dev, "Stratix10 SOC FPGA Manager", 423 + &s10_ops, priv); 424 + if (IS_ERR(mgr)) { 432 425 dev_err(dev, "unable to register FPGA manager\n"); 433 - fpga_mgr_free(mgr); 426 + ret = PTR_ERR(mgr); 434 427 goto probe_err; 435 428 } 436 429 ··· 441 448 struct s10_priv *priv = mgr->priv; 442 449 443 450 fpga_mgr_unregister(mgr); 444 - fpga_mgr_free(mgr); 445 451 stratix10_svc_free_channel(priv->chan); 446 452 447 453 return 0;
+3 -6
drivers/fpga/ts73xx-fpga.c
··· 116 116 if (IS_ERR(priv->io_base)) 117 117 return PTR_ERR(priv->io_base); 118 118 119 - mgr = devm_fpga_mgr_create(kdev, "TS-73xx FPGA Manager", 120 - &ts73xx_fpga_ops, priv); 121 - if (!mgr) 122 - return -ENOMEM; 123 - 124 - return devm_fpga_mgr_register(kdev, mgr); 119 + mgr = devm_fpga_mgr_register(kdev, "TS-73xx FPGA Manager", 120 + &ts73xx_fpga_ops, priv); 121 + return PTR_ERR_OR_ZERO(mgr); 125 122 } 126 123 127 124 static struct platform_driver ts73xx_fpga_driver = {
+3 -6
drivers/fpga/versal-fpga.c
··· 54 54 return ret; 55 55 } 56 56 57 - mgr = devm_fpga_mgr_create(dev, "Xilinx Versal FPGA Manager", 58 - &versal_fpga_ops, NULL); 59 - if (!mgr) 60 - return -ENOMEM; 61 - 62 - return devm_fpga_mgr_register(dev, mgr); 57 + mgr = devm_fpga_mgr_register(dev, "Xilinx Versal FPGA Manager", 58 + &versal_fpga_ops, NULL); 59 + return PTR_ERR_OR_ZERO(mgr); 63 60 } 64 61 65 62 static const struct of_device_id versal_fpga_of_match[] = {
+4 -7
drivers/fpga/xilinx-spi.c
··· 247 247 return dev_err_probe(&spi->dev, PTR_ERR(conf->done), 248 248 "Failed to get DONE gpio\n"); 249 249 250 - mgr = devm_fpga_mgr_create(&spi->dev, 251 - "Xilinx Slave Serial FPGA Manager", 252 - &xilinx_spi_ops, conf); 253 - if (!mgr) 254 - return -ENOMEM; 255 - 256 - return devm_fpga_mgr_register(&spi->dev, mgr); 250 + mgr = devm_fpga_mgr_register(&spi->dev, 251 + "Xilinx Slave Serial FPGA Manager", 252 + &xilinx_spi_ops, conf); 253 + return PTR_ERR_OR_ZERO(mgr); 257 254 } 258 255 259 256 #ifdef CONFIG_OF
+6 -10
drivers/fpga/zynq-fpga.c
··· 609 609 610 610 clk_disable(priv->clk); 611 611 612 - mgr = devm_fpga_mgr_create(dev, "Xilinx Zynq FPGA Manager", 613 - &zynq_fpga_ops, priv); 614 - if (!mgr) 615 - return -ENOMEM; 616 - 617 - platform_set_drvdata(pdev, mgr); 618 - 619 - err = fpga_mgr_register(mgr); 620 - if (err) { 612 + mgr = fpga_mgr_register(dev, "Xilinx Zynq FPGA Manager", 613 + &zynq_fpga_ops, priv); 614 + if (IS_ERR(mgr)) { 621 615 dev_err(dev, "unable to register FPGA manager\n"); 622 616 clk_unprepare(priv->clk); 623 - return err; 617 + return PTR_ERR(mgr); 624 618 } 619 + 620 + platform_set_drvdata(pdev, mgr); 625 621 626 622 return 0; 627 623 }
+3 -6
drivers/fpga/zynqmp-fpga.c
··· 95 95 96 96 priv->dev = dev; 97 97 98 - mgr = devm_fpga_mgr_create(dev, "Xilinx ZynqMP FPGA Manager", 99 - &zynqmp_fpga_ops, priv); 100 - if (!mgr) 101 - return -ENOMEM; 102 - 103 - return devm_fpga_mgr_register(dev, mgr); 98 + mgr = devm_fpga_mgr_register(dev, "Xilinx ZynqMP FPGA Manager", 99 + &zynqmp_fpga_ops, priv); 100 + return PTR_ERR_OR_ZERO(mgr); 104 101 } 105 102 106 103 #ifdef CONFIG_OF
+41 -21
include/linux/fpga/fpga-mgr.h
··· 106 106 }; 107 107 108 108 /** 109 + * struct fpga_compat_id - id for compatibility check 110 + * 111 + * @id_h: high 64bit of the compat_id 112 + * @id_l: low 64bit of the compat_id 113 + */ 114 + struct fpga_compat_id { 115 + u64 id_h; 116 + u64 id_l; 117 + }; 118 + 119 + /** 120 + * struct fpga_manager_info - collection of parameters for an FPGA Manager 121 + * @name: fpga manager name 122 + * @compat_id: FPGA manager id for compatibility check. 123 + * @mops: pointer to structure of fpga manager ops 124 + * @priv: fpga manager private data 125 + * 126 + * fpga_manager_info contains parameters for the register_full function. 127 + * These are separated into an info structure because they some are optional 128 + * others could be added to in the future. The info structure facilitates 129 + * maintaining a stable API. 130 + */ 131 + struct fpga_manager_info { 132 + const char *name; 133 + struct fpga_compat_id *compat_id; 134 + const struct fpga_manager_ops *mops; 135 + void *priv; 136 + }; 137 + 138 + /** 109 139 * struct fpga_manager_ops - ops for low level fpga manager drivers 110 140 * @initial_header_size: Maximum number of bytes that should be passed into write_init 111 141 * @state: returns an enum value of the FPGA's state ··· 174 144 #define FPGA_MGR_STATUS_FIFO_OVERFLOW_ERR BIT(4) 175 145 176 146 /** 177 - * struct fpga_compat_id - id for compatibility check 178 - * 179 - * @id_h: high 64bit of the compat_id 180 - * @id_l: low 64bit of the compat_id 181 - */ 182 - struct fpga_compat_id { 183 - u64 id_h; 184 - u64 id_l; 185 - }; 186 - 187 - /** 188 147 * struct fpga_manager - fpga manager structure 189 148 * @name: name of low level fpga manager 190 149 * @dev: fpga manager device ··· 210 191 211 192 void fpga_mgr_put(struct fpga_manager *mgr); 212 193 213 - struct fpga_manager *fpga_mgr_create(struct device *dev, const char *name, 214 - const struct fpga_manager_ops *mops, 215 - void *priv); 216 - void fpga_mgr_free(struct fpga_manager *mgr); 217 - int fpga_mgr_register(struct fpga_manager *mgr); 194 + struct fpga_manager * 195 + fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *info); 196 + 197 + struct fpga_manager * 198 + fpga_mgr_register(struct device *parent, const char *name, 199 + const struct fpga_manager_ops *mops, void *priv); 218 200 void fpga_mgr_unregister(struct fpga_manager *mgr); 219 201 220 - int devm_fpga_mgr_register(struct device *dev, struct fpga_manager *mgr); 221 - 222 - struct fpga_manager *devm_fpga_mgr_create(struct device *dev, const char *name, 223 - const struct fpga_manager_ops *mops, 224 - void *priv); 202 + struct fpga_manager * 203 + devm_fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *info); 204 + struct fpga_manager * 205 + devm_fpga_mgr_register(struct device *parent, const char *name, 206 + const struct fpga_manager_ops *mops, void *priv); 225 207 226 208 #endif /*_LINUX_FPGA_MGR_H */