| @@ -664,20 +664,16 @@ static struct attribute *fpga_mgr_attrs[] = { · 663 unmodified lines |
| 664 | 664 | }; |
| 665 | 665 | ATTRIBUTE_GROUPS(fpga_mgr); |
| 666 | 666 | |
| 667 | | −static struct fpga_manager *__fpga_mgr_get(struct device *dev) |
| 667 | +static struct fpga_manager *__fpga_mgr_get(struct device *mgr_dev) |
| 668 | 668 | { |
| 669 | 669 | struct fpga_manager *mgr; |
| 670 | 670 | |
| 671 | | − mgr = to_fpga_manager(dev); |
| 671 | + mgr = to_fpga_manager(mgr_dev); |
| 672 | 672 | |
| 673 | | − if (!try_module_get(dev->parent->driver->owner)) |
| 674 | | − goto err_dev; |
| 673 | + if (!try_module_get(mgr->mops_owner)) |
| 674 | + mgr = ERR_PTR(-ENODEV); |
| 675 | 675 | |
| 676 | 676 | return mgr; |
| 677 | | − |
| 678 | | −err_dev: |
| 679 | | − put_device(dev); |
| 680 | | − return ERR_PTR(-ENODEV); |
| 681 | 677 | } |
| 682 | 678 | |
| 683 | 679 | static int fpga_mgr_dev_match(struct device *dev, const void *data) |
| @@ -693,12 +689,18 @@ static int fpga_mgr_dev_match(struct device *dev, const void *data) · 9 unmodified lines |
| 693 | 689 | */ |
| 694 | 690 | struct fpga_manager *fpga_mgr_get(struct device *dev) |
| 695 | 691 | { |
| 696 | | − struct device *mgr_dev = class_find_device(&fpga_mgr_class, NULL, dev, |
| 697 | | − fpga_mgr_dev_match); |
| 692 | + struct fpga_manager *mgr; |
| 693 | + struct device *mgr_dev; |
| 694 | + |
| 695 | + mgr_dev = class_find_device(&fpga_mgr_class, NULL, dev, fpga_mgr_dev_match); |
| 698 | 696 | if (!mgr_dev) |
| 699 | 697 | return ERR_PTR(-ENODEV); |
| 700 | 698 | |
| 701 | | − return __fpga_mgr_get(mgr_dev); |
| 699 | + mgr = __fpga_mgr_get(mgr_dev); |
| 700 | + if (IS_ERR(mgr)) |
| 701 | + put_device(mgr_dev); |
| 702 | + |
| 703 | + return mgr; |
| 702 | 704 | } |
| 703 | 705 | EXPORT_SYMBOL_GPL(fpga_mgr_get); |
| 704 | 706 | |
| @@ -711,13 +713,18 @@ EXPORT_SYMBOL_GPL(fpga_mgr_get); · 6 unmodified lines |
| 711 | 713 | */ |
| 712 | 714 | struct fpga_manager *of_fpga_mgr_get(struct device_node *node) |
| 713 | 715 | { |
| 714 | | − struct device *dev; |
| 716 | + struct fpga_manager *mgr; |
| 717 | + struct device *mgr_dev; |
| 715 | 718 | |
| 716 | | − dev = class_find_device_by_of_node(&fpga_mgr_class, node); |
| 717 | | − if (!dev) |
| 719 | + mgr_dev = class_find_device_by_of_node(&fpga_mgr_class, node); |
| 720 | + if (!mgr_dev) |
| 718 | 721 | return ERR_PTR(-ENODEV); |
| 719 | 722 | |
| 720 | | − return __fpga_mgr_get(dev); |
| 723 | + mgr = __fpga_mgr_get(mgr_dev); |
| 724 | + if (IS_ERR(mgr)) |
| 725 | + put_device(mgr_dev); |
| 726 | + |
| 727 | + return mgr; |
| 721 | 728 | } |
| 722 | 729 | EXPORT_SYMBOL_GPL(of_fpga_mgr_get); |
| 723 | 730 | |
| @@ -727,7 +734,7 @@ EXPORT_SYMBOL_GPL(of_fpga_mgr_get); · 3 unmodified lines |
| 727 | 734 | */ |
| 728 | 735 | void fpga_mgr_put(struct fpga_manager *mgr) |
| 729 | 736 | { |
| 730 | | − module_put(mgr->dev.parent->driver->owner); |
| 737 | + module_put(mgr->mops_owner); |
| 731 | 738 | put_device(&mgr->dev); |
| 732 | 739 | } |
| 733 | 740 | EXPORT_SYMBOL_GPL(fpga_mgr_put); |
| @@ -766,9 +773,10 @@ void fpga_mgr_unlock(struct fpga_manager *mgr) · 32 unmodified lines |
| 766 | 773 | EXPORT_SYMBOL_GPL(fpga_mgr_unlock); |
| 767 | 774 | |
| 768 | 775 | /** |
| 769 | | − * fpga_mgr_register_full - create and register an FPGA Manager device |
| 776 | + * __fpga_mgr_register_full - create and register an FPGA Manager device |
| 770 | 777 | * @parent: fpga manager device from pdev |
| 771 | 778 | * @info: parameters for fpga manager |
| 779 | + * @owner: owner module containing the ops |
| 772 | 780 | * |
| 773 | 781 | * The caller of this function is responsible for calling fpga_mgr_unregister(). |
| 774 | 782 | * Using devm_fpga_mgr_register_full() instead is recommended. |
| @@ -776,7 +784,8 @@ EXPORT_SYMBOL_GPL(fpga_mgr_unlock); · 1 unmodified line |
| 776 | 784 | * Return: pointer to struct fpga_manager pointer or ERR_PTR() |
| 777 | 785 | */ |
| 778 | 786 | struct fpga_manager * |
| 779 | | −fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *info) |
| 787 | +__fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *info, |
| 788 | + struct module *owner) |
| 780 | 789 | { |
| 781 | 790 | const struct fpga_manager_ops *mops = info->mops; |
| 782 | 791 | struct fpga_manager *mgr; |
| @@ -804,6 +813,8 @@ fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *in · 21 unmodified lines |
| 804 | 813 | |
| 805 | 814 | mutex_init(&mgr->ref_mutex); |
| 806 | 815 | |
| 816 | + mgr->mops_owner = owner; |
| 817 | + |
| 807 | 818 | mgr->name = info->name; |
| 808 | 819 | mgr->mops = info->mops; |
| 809 | 820 | mgr->priv = info->priv; |
| @@ -841,14 +852,15 @@ error_kfree: · 31 unmodified lines |
| 841 | 852 | |
| 842 | 853 | return ERR_PTR(ret); |
| 843 | 854 | } |
| 844 | | −EXPORT_SYMBOL_GPL(fpga_mgr_register_full); |
| 855 | +EXPORT_SYMBOL_GPL(__fpga_mgr_register_full); |
| 845 | 856 | |
| 846 | 857 | /** |
| 847 | | − * fpga_mgr_register - create and register an FPGA Manager device |
| 858 | + * __fpga_mgr_register - create and register an FPGA Manager device |
| 848 | 859 | * @parent: fpga manager device from pdev |
| 849 | 860 | * @name: fpga manager name |
| 850 | 861 | * @mops: pointer to structure of fpga manager ops |
| 851 | 862 | * @priv: fpga manager private data |
| 863 | + * @owner: owner module containing the ops |
| 852 | 864 | * |
| 853 | 865 | * The caller of this function is responsible for calling fpga_mgr_unregister(). |
| 854 | 866 | * Using devm_fpga_mgr_register() instead is recommended. This simple |
| @@ -859,8 +871,8 @@ EXPORT_SYMBOL_GPL(fpga_mgr_register_full); · 4 unmodified lines |
| 859 | 871 | * Return: pointer to struct fpga_manager pointer or ERR_PTR() |
| 860 | 872 | */ |
| 861 | 873 | struct fpga_manager * |
| 862 | | −fpga_mgr_register(struct device *parent, const char *name, |
| 863 | | − const struct fpga_manager_ops *mops, void *priv) |
| 874 | +__fpga_mgr_register(struct device *parent, const char *name, |
| 875 | + const struct fpga_manager_ops *mops, void *priv, struct module *owner) |
| 864 | 876 | { |
| 865 | 877 | struct fpga_manager_info info = { 0 }; |
| 866 | 878 | |
| @@ -868,9 +880,9 @@ fpga_mgr_register(struct device *parent, const char *name, · 1 unmodified line |
| 868 | 880 | info.mops = mops; |
| 869 | 881 | info.priv = priv; |
| 870 | 882 | |
| 871 | | − return fpga_mgr_register_full(parent, &info); |
| 883 | + return __fpga_mgr_register_full(parent, &info, owner); |
| 872 | 884 | } |
| 873 | | −EXPORT_SYMBOL_GPL(fpga_mgr_register); |
| 885 | +EXPORT_SYMBOL_GPL(__fpga_mgr_register); |
| 874 | 886 | |
| 875 | 887 | /** |
| 876 | 888 | * fpga_mgr_unregister - unregister an FPGA manager |
| @@ -900,9 +912,10 @@ static void devm_fpga_mgr_unregister(struct device *dev, void *res) · 23 unmodified lines |
| 900 | 912 | } |
| 901 | 913 | |
| 902 | 914 | /** |
| 903 | | − * devm_fpga_mgr_register_full - resource managed variant of fpga_mgr_register() |
| 915 | + * __devm_fpga_mgr_register_full - resource managed variant of fpga_mgr_register() |
| 904 | 916 | * @parent: fpga manager device from pdev |
| 905 | 917 | * @info: parameters for fpga manager |
| 918 | + * @owner: owner module containing the ops |
| 906 | 919 | * |
| 907 | 920 | * Return: fpga manager pointer on success, negative error code otherwise. |
| 908 | 921 | * |
| @@ -910,7 +923,8 @@ static void devm_fpga_mgr_unregister(struct device *dev, void *res) · 1 unmodified line |
| 910 | 923 | * function will be called automatically when the managing device is detached. |
| 911 | 924 | */ |
| 912 | 925 | struct fpga_manager * |
| 913 | | −devm_fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *info) |
| 926 | +__devm_fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *info, |
| 927 | + struct module *owner) |
| 914 | 928 | { |
| 915 | 929 | struct fpga_mgr_devres *dr; |
| 916 | 930 | struct fpga_manager *mgr; |
| @@ -919,7 +933,7 @@ devm_fpga_mgr_register_full(struct device *parent, const struct fpga_manager_inf · 2 unmodified lines |
| 919 | 933 | if (!dr) |
| 920 | 934 | return ERR_PTR(-ENOMEM); |
| 921 | 935 | |
| 922 | | − mgr = fpga_mgr_register_full(parent, info); |
| 936 | + mgr = __fpga_mgr_register_full(parent, info, owner); |
| 923 | 937 | if (IS_ERR(mgr)) { |
| 924 | 938 | devres_free(dr); |
| 925 | 939 | return mgr; |
| @@ -930,14 +944,15 @@ devm_fpga_mgr_register_full(struct device *parent, const struct fpga_manager_inf · 4 unmodified lines |
| 930 | 944 | |
| 931 | 945 | return mgr; |
| 932 | 946 | } |
| 933 | | −EXPORT_SYMBOL_GPL(devm_fpga_mgr_register_full); |
| 947 | +EXPORT_SYMBOL_GPL(__devm_fpga_mgr_register_full); |
| 934 | 948 | |
| 935 | 949 | /** |
| 936 | | − * devm_fpga_mgr_register - resource managed variant of fpga_mgr_register() |
| 950 | + * __devm_fpga_mgr_register - resource managed variant of fpga_mgr_register() |
| 937 | 951 | * @parent: fpga manager device from pdev |
| 938 | 952 | * @name: fpga manager name |
| 939 | 953 | * @mops: pointer to structure of fpga manager ops |
| 940 | 954 | * @priv: fpga manager private data |
| 955 | + * @owner: owner module containing the ops |
| 941 | 956 | * |
| 942 | 957 | * Return: fpga manager pointer on success, negative error code otherwise. |
| 943 | 958 | * |
| @@ -946,8 +961,9 @@ EXPORT_SYMBOL_GPL(devm_fpga_mgr_register_full); · 2 unmodified lines |
| 946 | 961 | * device is detached. |
| 947 | 962 | */ |
| 948 | 963 | struct fpga_manager * |
| 949 | | −devm_fpga_mgr_register(struct device *parent, const char *name, |
| 950 | | − const struct fpga_manager_ops *mops, void *priv) |
| 964 | +__devm_fpga_mgr_register(struct device *parent, const char *name, |
| 965 | + const struct fpga_manager_ops *mops, void *priv, |
| 966 | + struct module *owner) |
| 951 | 967 | { |
| 952 | 968 | struct fpga_manager_info info = { 0 }; |
| 953 | 969 | |
| @@ -955,9 +971,9 @@ devm_fpga_mgr_register(struct device *parent, const char *name, · 1 unmodified line |
| 955 | 971 | info.mops = mops; |
| 956 | 972 | info.priv = priv; |
| 957 | 973 | |
| 958 | | − return devm_fpga_mgr_register_full(parent, &info); |
| 974 | + return __devm_fpga_mgr_register_full(parent, &info, owner); |
| 959 | 975 | } |
| 960 | | −EXPORT_SYMBOL_GPL(devm_fpga_mgr_register); |
| 976 | +EXPORT_SYMBOL_GPL(__devm_fpga_mgr_register); |
| 961 | 977 | |
| 962 | 978 | static void fpga_mgr_dev_release(struct device *dev) |
| 963 | 979 | { |