| @@ -664,20 +664,16 @@ static struct attribute *fpga_mgr_attrs[] = { · 663 unmodified lines |
| 664 | }; | 664 | }; |
| 665 | ATTRIBUTE_GROUPS(fpga_mgr); | 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 | struct fpga_manager *mgr; | 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)) | 673 | if (!try_module_get(mgr->mops_owner)) |
| 674 | goto err_dev; | 674 | mgr = ERR_PTR(-ENODEV); |
| 675 | | 675 | |
| 676 | return mgr; | 676 | return mgr; |
| 677 | | | |
| 678 | err_dev: | | |
| 679 | put_device(dev); | | |
| 680 | return ERR_PTR(-ENODEV); | | |
| 681 | } | 677 | } |
| 682 | | 678 | |
| 683 | static int fpga_mgr_dev_match(struct device *dev, const void *data) | 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 | struct fpga_manager *fpga_mgr_get(struct device *dev) | 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, | 692 | struct fpga_manager *mgr; |
| 697 | fpga_mgr_dev_match); | 693 | struct device *mgr_dev; |
| | 694 | |
| | 695 | mgr_dev = class_find_device(&fpga_mgr_class, NULL, dev, fpga_mgr_dev_match); |
| 698 | if (!mgr_dev) | 696 | if (!mgr_dev) |
| 699 | return ERR_PTR(-ENODEV); | 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 | EXPORT_SYMBOL_GPL(fpga_mgr_get); | 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 | struct fpga_manager *of_fpga_mgr_get(struct device_node *node) | 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); | 719 | mgr_dev = class_find_device_by_of_node(&fpga_mgr_class, node); |
| 717 | if (!dev) | 720 | if (!mgr_dev) |
| 718 | return ERR_PTR(-ENODEV); | 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 | EXPORT_SYMBOL_GPL(of_fpga_mgr_get); | 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 | void fpga_mgr_put(struct fpga_manager *mgr) | 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 | put_device(&mgr->dev); | 738 | put_device(&mgr->dev); |
| 732 | } | 739 | } |
| 733 | EXPORT_SYMBOL_GPL(fpga_mgr_put); | 740 | EXPORT_SYMBOL_GPL(fpga_mgr_put); |
| @@ -766,9 +773,10 @@ void fpga_mgr_unlock(struct fpga_manager *mgr) · 32 unmodified lines |
| 766 | EXPORT_SYMBOL_GPL(fpga_mgr_unlock); | 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 | * @parent: fpga manager device from pdev | 777 | * @parent: fpga manager device from pdev |
| 771 | * @info: parameters for fpga manager | 778 | * @info: parameters for fpga manager |
| | 779 | * @owner: owner module containing the ops |
| 772 | * | 780 | * |
| 773 | * The caller of this function is responsible for calling fpga_mgr_unregister(). | 781 | * The caller of this function is responsible for calling fpga_mgr_unregister(). |
| 774 | * Using devm_fpga_mgr_register_full() instead is recommended. | 782 | * Using devm_fpga_mgr_register_full() instead is recommended. |
| @@ -776,7 +784,8 @@ EXPORT_SYMBOL_GPL(fpga_mgr_unlock); · 1 unmodified line |
| 776 | * Return: pointer to struct fpga_manager pointer or ERR_PTR() | 784 | * Return: pointer to struct fpga_manager pointer or ERR_PTR() |
| 777 | */ | 785 | */ |
| 778 | struct fpga_manager * | 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 | const struct fpga_manager_ops *mops = info->mops; | 790 | const struct fpga_manager_ops *mops = info->mops; |
| 782 | struct fpga_manager *mgr; | 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 | mutex_init(&mgr->ref_mutex); | 814 | mutex_init(&mgr->ref_mutex); |
| 806 | | 815 | |
| | 816 | mgr->mops_owner = owner; |
| | 817 | |
| 807 | mgr->name = info->name; | 818 | mgr->name = info->name; |
| 808 | mgr->mops = info->mops; | 819 | mgr->mops = info->mops; |
| 809 | mgr->priv = info->priv; | 820 | mgr->priv = info->priv; |
| @@ -841,14 +852,15 @@ error_kfree: · 31 unmodified lines |
| 841 | | 852 | |
| 842 | return ERR_PTR(ret); | 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 | * @parent: fpga manager device from pdev | 859 | * @parent: fpga manager device from pdev |
| 849 | * @name: fpga manager name | 860 | * @name: fpga manager name |
| 850 | * @mops: pointer to structure of fpga manager ops | 861 | * @mops: pointer to structure of fpga manager ops |
| 851 | * @priv: fpga manager private data | 862 | * @priv: fpga manager private data |
| | 863 | * @owner: owner module containing the ops |
| 852 | * | 864 | * |
| 853 | * The caller of this function is responsible for calling fpga_mgr_unregister(). | 865 | * The caller of this function is responsible for calling fpga_mgr_unregister(). |
| 854 | * Using devm_fpga_mgr_register() instead is recommended. This simple | 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 | * Return: pointer to struct fpga_manager pointer or ERR_PTR() | 871 | * Return: pointer to struct fpga_manager pointer or ERR_PTR() |
| 860 | */ | 872 | */ |
| 861 | struct fpga_manager * | 873 | struct fpga_manager * |
| 862 | fpga_mgr_register(struct device *parent, const char *name, | 874 | __fpga_mgr_register(struct device *parent, const char *name, |
| 863 | const struct fpga_manager_ops *mops, void *priv) | 875 | const struct fpga_manager_ops *mops, void *priv, struct module *owner) |
| 864 | { | 876 | { |
| 865 | struct fpga_manager_info info = { 0 }; | 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 | info.mops = mops; | 880 | info.mops = mops; |
| 869 | info.priv = priv; | 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 | * fpga_mgr_unregister - unregister an FPGA manager | 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 | * @parent: fpga manager device from pdev | 916 | * @parent: fpga manager device from pdev |
| 905 | * @info: parameters for fpga manager | 917 | * @info: parameters for fpga manager |
| | 918 | * @owner: owner module containing the ops |
| 906 | * | 919 | * |
| 907 | * Return: fpga manager pointer on success, negative error code otherwise. | 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 | * function will be called automatically when the managing device is detached. | 923 | * function will be called automatically when the managing device is detached. |
| 911 | */ | 924 | */ |
| 912 | struct fpga_manager * | 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 | struct fpga_mgr_devres *dr; | 929 | struct fpga_mgr_devres *dr; |
| 916 | struct fpga_manager *mgr; | 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 | if (!dr) | 933 | if (!dr) |
| 920 | return ERR_PTR(-ENOMEM); | 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 | if (IS_ERR(mgr)) { | 937 | if (IS_ERR(mgr)) { |
| 924 | devres_free(dr); | 938 | devres_free(dr); |
| 925 | return mgr; | 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 | return mgr; | 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 | * @parent: fpga manager device from pdev | 951 | * @parent: fpga manager device from pdev |
| 938 | * @name: fpga manager name | 952 | * @name: fpga manager name |
| 939 | * @mops: pointer to structure of fpga manager ops | 953 | * @mops: pointer to structure of fpga manager ops |
| 940 | * @priv: fpga manager private data | 954 | * @priv: fpga manager private data |
| | 955 | * @owner: owner module containing the ops |
| 941 | * | 956 | * |
| 942 | * Return: fpga manager pointer on success, negative error code otherwise. | 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 | * device is detached. | 961 | * device is detached. |
| 947 | */ | 962 | */ |
| 948 | struct fpga_manager * | 963 | struct fpga_manager * |
| 949 | devm_fpga_mgr_register(struct device *parent, const char *name, | 964 | __devm_fpga_mgr_register(struct device *parent, const char *name, |
| 950 | const struct fpga_manager_ops *mops, void *priv) | 965 | const struct fpga_manager_ops *mops, void *priv, |
| | 966 | struct module *owner) |
| 951 | { | 967 | { |
| 952 | struct fpga_manager_info info = { 0 }; | 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 | info.mops = mops; | 971 | info.mops = mops; |
| 956 | info.priv = priv; | 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 | static void fpga_mgr_dev_release(struct device *dev) | 978 | static void fpga_mgr_dev_release(struct device *dev) |
| 963 | { | 979 | { |