Commit f85ff3056cefdf4635ebf98b30e9a7d86521567f
1 parent
1ef4d4242d
Begin to consolidate of_device.c
This moves all the common parts for the Sparc, Sparc64 and PowerPC of_device.c files into drivers/of/device.c. Apart from the simple move, Sparc gains of_match_node() and a call to of_node_put in of_release_dev(). PowerPC gains better recovery if device_create_file() fails in of_device_register(). Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au> Acked-by: Paul Mackerras <paulus@samba.org> Acked-by: David S. Miller <davem@davemloft.net>
Showing 7 changed files with 142 additions and 340 deletions Side-by-side Diff
arch/powerpc/kernel/of_device.c
1 | 1 | #include <linux/string.h> |
2 | 2 | #include <linux/kernel.h> |
3 | +#include <linux/of.h> | |
3 | 4 | #include <linux/init.h> |
4 | 5 | #include <linux/module.h> |
5 | 6 | #include <linux/mod_devicetable.h> |
... | ... | @@ -8,118 +9,6 @@ |
8 | 9 | #include <asm/errno.h> |
9 | 10 | #include <asm/of_device.h> |
10 | 11 | |
11 | -/** | |
12 | - * of_match_node - Tell if an device_node has a matching of_match structure | |
13 | - * @ids: array of of device match structures to search in | |
14 | - * @node: the of device structure to match against | |
15 | - * | |
16 | - * Low level utility function used by device matching. | |
17 | - */ | |
18 | -const struct of_device_id *of_match_node(const struct of_device_id *matches, | |
19 | - const struct device_node *node) | |
20 | -{ | |
21 | - while (matches->name[0] || matches->type[0] || matches->compatible[0]) { | |
22 | - int match = 1; | |
23 | - if (matches->name[0]) | |
24 | - match &= node->name | |
25 | - && !strcmp(matches->name, node->name); | |
26 | - if (matches->type[0]) | |
27 | - match &= node->type | |
28 | - && !strcmp(matches->type, node->type); | |
29 | - if (matches->compatible[0]) | |
30 | - match &= of_device_is_compatible(node, | |
31 | - matches->compatible); | |
32 | - if (match) | |
33 | - return matches; | |
34 | - matches++; | |
35 | - } | |
36 | - return NULL; | |
37 | -} | |
38 | - | |
39 | -/** | |
40 | - * of_match_device - Tell if an of_device structure has a matching | |
41 | - * of_match structure | |
42 | - * @ids: array of of device match structures to search in | |
43 | - * @dev: the of device structure to match against | |
44 | - * | |
45 | - * Used by a driver to check whether an of_device present in the | |
46 | - * system is in its list of supported devices. | |
47 | - */ | |
48 | -const struct of_device_id *of_match_device(const struct of_device_id *matches, | |
49 | - const struct of_device *dev) | |
50 | -{ | |
51 | - if (!dev->node) | |
52 | - return NULL; | |
53 | - return of_match_node(matches, dev->node); | |
54 | -} | |
55 | - | |
56 | -struct of_device *of_dev_get(struct of_device *dev) | |
57 | -{ | |
58 | - struct device *tmp; | |
59 | - | |
60 | - if (!dev) | |
61 | - return NULL; | |
62 | - tmp = get_device(&dev->dev); | |
63 | - if (tmp) | |
64 | - return to_of_device(tmp); | |
65 | - else | |
66 | - return NULL; | |
67 | -} | |
68 | - | |
69 | -void of_dev_put(struct of_device *dev) | |
70 | -{ | |
71 | - if (dev) | |
72 | - put_device(&dev->dev); | |
73 | -} | |
74 | - | |
75 | -static ssize_t dev_show_devspec(struct device *dev, | |
76 | - struct device_attribute *attr, char *buf) | |
77 | -{ | |
78 | - struct of_device *ofdev; | |
79 | - | |
80 | - ofdev = to_of_device(dev); | |
81 | - return sprintf(buf, "%s", ofdev->node->full_name); | |
82 | -} | |
83 | - | |
84 | -static DEVICE_ATTR(devspec, S_IRUGO, dev_show_devspec, NULL); | |
85 | - | |
86 | -/** | |
87 | - * of_release_dev - free an of device structure when all users of it are finished. | |
88 | - * @dev: device that's been disconnected | |
89 | - * | |
90 | - * Will be called only by the device core when all users of this of device are | |
91 | - * done. | |
92 | - */ | |
93 | -void of_release_dev(struct device *dev) | |
94 | -{ | |
95 | - struct of_device *ofdev; | |
96 | - | |
97 | - ofdev = to_of_device(dev); | |
98 | - of_node_put(ofdev->node); | |
99 | - kfree(ofdev); | |
100 | -} | |
101 | - | |
102 | -int of_device_register(struct of_device *ofdev) | |
103 | -{ | |
104 | - int rc; | |
105 | - | |
106 | - BUG_ON(ofdev->node == NULL); | |
107 | - | |
108 | - rc = device_register(&ofdev->dev); | |
109 | - if (rc) | |
110 | - return rc; | |
111 | - | |
112 | - return device_create_file(&ofdev->dev, &dev_attr_devspec); | |
113 | -} | |
114 | - | |
115 | -void of_device_unregister(struct of_device *ofdev) | |
116 | -{ | |
117 | - device_remove_file(&ofdev->dev, &dev_attr_devspec); | |
118 | - | |
119 | - device_unregister(&ofdev->dev); | |
120 | -} | |
121 | - | |
122 | - | |
123 | 12 | ssize_t of_device_get_modalias(struct of_device *ofdev, |
124 | 13 | char *str, ssize_t len) |
125 | 14 | { |
... | ... | @@ -229,15 +118,6 @@ |
229 | 118 | |
230 | 119 | return 0; |
231 | 120 | } |
232 | - | |
233 | - | |
234 | -EXPORT_SYMBOL(of_match_node); | |
235 | -EXPORT_SYMBOL(of_match_device); | |
236 | -EXPORT_SYMBOL(of_device_register); | |
237 | -EXPORT_SYMBOL(of_device_unregister); | |
238 | -EXPORT_SYMBOL(of_dev_get); | |
239 | -EXPORT_SYMBOL(of_dev_put); | |
240 | -EXPORT_SYMBOL(of_release_dev); | |
241 | 121 | EXPORT_SYMBOL(of_device_uevent); |
242 | 122 | EXPORT_SYMBOL(of_device_get_modalias); |
arch/sparc/kernel/of_device.c
1 | 1 | #include <linux/string.h> |
2 | 2 | #include <linux/kernel.h> |
3 | +#include <linux/of.h> | |
3 | 4 | #include <linux/init.h> |
4 | 5 | #include <linux/module.h> |
5 | 6 | #include <linux/mod_devicetable.h> |
... | ... | @@ -8,38 +9,6 @@ |
8 | 9 | #include <asm/errno.h> |
9 | 10 | #include <asm/of_device.h> |
10 | 11 | |
11 | -/** | |
12 | - * of_match_device - Tell if an of_device structure has a matching | |
13 | - * of_match structure | |
14 | - * @ids: array of of device match structures to search in | |
15 | - * @dev: the of device structure to match against | |
16 | - * | |
17 | - * Used by a driver to check whether an of_device present in the | |
18 | - * system is in its list of supported devices. | |
19 | - */ | |
20 | -const struct of_device_id *of_match_device(const struct of_device_id *matches, | |
21 | - const struct of_device *dev) | |
22 | -{ | |
23 | - if (!dev->node) | |
24 | - return NULL; | |
25 | - while (matches->name[0] || matches->type[0] || matches->compatible[0]) { | |
26 | - int match = 1; | |
27 | - if (matches->name[0]) | |
28 | - match &= dev->node->name | |
29 | - && !strcmp(matches->name, dev->node->name); | |
30 | - if (matches->type[0]) | |
31 | - match &= dev->node->type | |
32 | - && !strcmp(matches->type, dev->node->type); | |
33 | - if (matches->compatible[0]) | |
34 | - match &= of_device_is_compatible(dev->node, | |
35 | - matches->compatible); | |
36 | - if (match) | |
37 | - return matches; | |
38 | - matches++; | |
39 | - } | |
40 | - return NULL; | |
41 | -} | |
42 | - | |
43 | 12 | static int of_platform_bus_match(struct device *dev, struct device_driver *drv) |
44 | 13 | { |
45 | 14 | struct of_device * of_dev = to_of_device(dev); |
... | ... | @@ -52,26 +21,6 @@ |
52 | 21 | return of_match_device(matches, of_dev) != NULL; |
53 | 22 | } |
54 | 23 | |
55 | -struct of_device *of_dev_get(struct of_device *dev) | |
56 | -{ | |
57 | - struct device *tmp; | |
58 | - | |
59 | - if (!dev) | |
60 | - return NULL; | |
61 | - tmp = get_device(&dev->dev); | |
62 | - if (tmp) | |
63 | - return to_of_device(tmp); | |
64 | - else | |
65 | - return NULL; | |
66 | -} | |
67 | - | |
68 | -void of_dev_put(struct of_device *dev) | |
69 | -{ | |
70 | - if (dev) | |
71 | - put_device(&dev->dev); | |
72 | -} | |
73 | - | |
74 | - | |
75 | 24 | static int of_device_probe(struct device *dev) |
76 | 25 | { |
77 | 26 | int error = -ENODEV; |
... | ... | @@ -735,56 +684,6 @@ |
735 | 684 | driver_unregister(&drv->driver); |
736 | 685 | } |
737 | 686 | |
738 | - | |
739 | -static ssize_t dev_show_devspec(struct device *dev, struct device_attribute *attr, char *buf) | |
740 | -{ | |
741 | - struct of_device *ofdev; | |
742 | - | |
743 | - ofdev = to_of_device(dev); | |
744 | - return sprintf(buf, "%s", ofdev->node->full_name); | |
745 | -} | |
746 | - | |
747 | -static DEVICE_ATTR(devspec, S_IRUGO, dev_show_devspec, NULL); | |
748 | - | |
749 | -/** | |
750 | - * of_release_dev - free an of device structure when all users of it are finished. | |
751 | - * @dev: device that's been disconnected | |
752 | - * | |
753 | - * Will be called only by the device core when all users of this of device are | |
754 | - * done. | |
755 | - */ | |
756 | -void of_release_dev(struct device *dev) | |
757 | -{ | |
758 | - struct of_device *ofdev; | |
759 | - | |
760 | - ofdev = to_of_device(dev); | |
761 | - | |
762 | - kfree(ofdev); | |
763 | -} | |
764 | - | |
765 | -int of_device_register(struct of_device *ofdev) | |
766 | -{ | |
767 | - int rc; | |
768 | - | |
769 | - BUG_ON(ofdev->node == NULL); | |
770 | - | |
771 | - rc = device_register(&ofdev->dev); | |
772 | - if (rc) | |
773 | - return rc; | |
774 | - | |
775 | - rc = device_create_file(&ofdev->dev, &dev_attr_devspec); | |
776 | - if (rc) | |
777 | - device_unregister(&ofdev->dev); | |
778 | - | |
779 | - return rc; | |
780 | -} | |
781 | - | |
782 | -void of_device_unregister(struct of_device *ofdev) | |
783 | -{ | |
784 | - device_remove_file(&ofdev->dev, &dev_attr_devspec); | |
785 | - device_unregister(&ofdev->dev); | |
786 | -} | |
787 | - | |
788 | 687 | struct of_device* of_platform_device_create(struct device_node *np, |
789 | 688 | const char *bus_id, |
790 | 689 | struct device *parent, |
791 | 690 | |
792 | 691 | |
... | ... | @@ -810,13 +709,7 @@ |
810 | 709 | return dev; |
811 | 710 | } |
812 | 711 | |
813 | -EXPORT_SYMBOL(of_match_device); | |
814 | 712 | EXPORT_SYMBOL(of_register_driver); |
815 | 713 | EXPORT_SYMBOL(of_unregister_driver); |
816 | -EXPORT_SYMBOL(of_device_register); | |
817 | -EXPORT_SYMBOL(of_device_unregister); | |
818 | -EXPORT_SYMBOL(of_dev_get); | |
819 | -EXPORT_SYMBOL(of_dev_put); | |
820 | 714 | EXPORT_SYMBOL(of_platform_device_create); |
821 | -EXPORT_SYMBOL(of_release_dev); |
arch/sparc64/kernel/of_device.c
1 | 1 | #include <linux/string.h> |
2 | 2 | #include <linux/kernel.h> |
3 | +#include <linux/of.h> | |
3 | 4 | #include <linux/init.h> |
4 | 5 | #include <linux/module.h> |
5 | 6 | #include <linux/mod_devicetable.h> |
... | ... | @@ -8,38 +9,6 @@ |
8 | 9 | #include <asm/errno.h> |
9 | 10 | #include <asm/of_device.h> |
10 | 11 | |
11 | -/** | |
12 | - * of_match_device - Tell if an of_device structure has a matching | |
13 | - * of_match structure | |
14 | - * @ids: array of of device match structures to search in | |
15 | - * @dev: the of device structure to match against | |
16 | - * | |
17 | - * Used by a driver to check whether an of_device present in the | |
18 | - * system is in its list of supported devices. | |
19 | - */ | |
20 | -const struct of_device_id *of_match_device(const struct of_device_id *matches, | |
21 | - const struct of_device *dev) | |
22 | -{ | |
23 | - if (!dev->node) | |
24 | - return NULL; | |
25 | - while (matches->name[0] || matches->type[0] || matches->compatible[0]) { | |
26 | - int match = 1; | |
27 | - if (matches->name[0]) | |
28 | - match &= dev->node->name | |
29 | - && !strcmp(matches->name, dev->node->name); | |
30 | - if (matches->type[0]) | |
31 | - match &= dev->node->type | |
32 | - && !strcmp(matches->type, dev->node->type); | |
33 | - if (matches->compatible[0]) | |
34 | - match &= of_device_is_compatible(dev->node, | |
35 | - matches->compatible); | |
36 | - if (match) | |
37 | - return matches; | |
38 | - matches++; | |
39 | - } | |
40 | - return NULL; | |
41 | -} | |
42 | - | |
43 | 12 | static int of_platform_bus_match(struct device *dev, struct device_driver *drv) |
44 | 13 | { |
45 | 14 | struct of_device * of_dev = to_of_device(dev); |
... | ... | @@ -52,26 +21,6 @@ |
52 | 21 | return of_match_device(matches, of_dev) != NULL; |
53 | 22 | } |
54 | 23 | |
55 | -struct of_device *of_dev_get(struct of_device *dev) | |
56 | -{ | |
57 | - struct device *tmp; | |
58 | - | |
59 | - if (!dev) | |
60 | - return NULL; | |
61 | - tmp = get_device(&dev->dev); | |
62 | - if (tmp) | |
63 | - return to_of_device(tmp); | |
64 | - else | |
65 | - return NULL; | |
66 | -} | |
67 | - | |
68 | -void of_dev_put(struct of_device *dev) | |
69 | -{ | |
70 | - if (dev) | |
71 | - put_device(&dev->dev); | |
72 | -} | |
73 | - | |
74 | - | |
75 | 24 | static int of_device_probe(struct device *dev) |
76 | 25 | { |
77 | 26 | int error = -ENODEV; |
78 | 27 | |
79 | 28 | |
... | ... | @@ -1020,62 +969,14 @@ |
1020 | 969 | /* register with core */ |
1021 | 970 | return driver_register(&drv->driver); |
1022 | 971 | } |
972 | +EXPORT_SYMBOL(of_register_driver); | |
1023 | 973 | |
1024 | 974 | void of_unregister_driver(struct of_platform_driver *drv) |
1025 | 975 | { |
1026 | 976 | driver_unregister(&drv->driver); |
1027 | 977 | } |
978 | +EXPORT_SYMBOL(of_unregister_driver); | |
1028 | 979 | |
1029 | - | |
1030 | -static ssize_t dev_show_devspec(struct device *dev, struct device_attribute *attr, char *buf) | |
1031 | -{ | |
1032 | - struct of_device *ofdev; | |
1033 | - | |
1034 | - ofdev = to_of_device(dev); | |
1035 | - return sprintf(buf, "%s", ofdev->node->full_name); | |
1036 | -} | |
1037 | - | |
1038 | -static DEVICE_ATTR(devspec, S_IRUGO, dev_show_devspec, NULL); | |
1039 | - | |
1040 | -/** | |
1041 | - * of_release_dev - free an of device structure when all users of it are finished. | |
1042 | - * @dev: device that's been disconnected | |
1043 | - * | |
1044 | - * Will be called only by the device core when all users of this of device are | |
1045 | - * done. | |
1046 | - */ | |
1047 | -void of_release_dev(struct device *dev) | |
1048 | -{ | |
1049 | - struct of_device *ofdev; | |
1050 | - | |
1051 | - ofdev = to_of_device(dev); | |
1052 | - | |
1053 | - kfree(ofdev); | |
1054 | -} | |
1055 | - | |
1056 | -int of_device_register(struct of_device *ofdev) | |
1057 | -{ | |
1058 | - int rc; | |
1059 | - | |
1060 | - BUG_ON(ofdev->node == NULL); | |
1061 | - | |
1062 | - rc = device_register(&ofdev->dev); | |
1063 | - if (rc) | |
1064 | - return rc; | |
1065 | - | |
1066 | - rc = device_create_file(&ofdev->dev, &dev_attr_devspec); | |
1067 | - if (rc) | |
1068 | - device_unregister(&ofdev->dev); | |
1069 | - | |
1070 | - return rc; | |
1071 | -} | |
1072 | - | |
1073 | -void of_device_unregister(struct of_device *ofdev) | |
1074 | -{ | |
1075 | - device_remove_file(&ofdev->dev, &dev_attr_devspec); | |
1076 | - device_unregister(&ofdev->dev); | |
1077 | -} | |
1078 | - | |
1079 | 980 | struct of_device* of_platform_device_create(struct device_node *np, |
1080 | 981 | const char *bus_id, |
1081 | 982 | struct device *parent, |
1082 | 983 | |
... | ... | @@ -1100,14 +1001,5 @@ |
1100 | 1001 | |
1101 | 1002 | return dev; |
1102 | 1003 | } |
1103 | - | |
1104 | -EXPORT_SYMBOL(of_match_device); | |
1105 | -EXPORT_SYMBOL(of_register_driver); | |
1106 | -EXPORT_SYMBOL(of_unregister_driver); | |
1107 | -EXPORT_SYMBOL(of_device_register); | |
1108 | -EXPORT_SYMBOL(of_device_unregister); | |
1109 | -EXPORT_SYMBOL(of_dev_get); | |
1110 | -EXPORT_SYMBOL(of_dev_put); | |
1111 | 1004 | EXPORT_SYMBOL(of_platform_device_create); |
1112 | -EXPORT_SYMBOL(of_release_dev); |
drivers/Kconfig
drivers/of/Kconfig
drivers/of/Makefile
drivers/of/device.c
1 | +#include <linux/string.h> | |
2 | +#include <linux/kernel.h> | |
3 | +#include <linux/of.h> | |
4 | +#include <linux/init.h> | |
5 | +#include <linux/module.h> | |
6 | +#include <linux/mod_devicetable.h> | |
7 | +#include <linux/slab.h> | |
8 | + | |
9 | +#include <asm/errno.h> | |
10 | +#include <asm/of_device.h> | |
11 | + | |
12 | +/** | |
13 | + * of_match_node - Tell if an device_node has a matching of_match structure | |
14 | + * @ids: array of of device match structures to search in | |
15 | + * @node: the of device structure to match against | |
16 | + * | |
17 | + * Low level utility function used by device matching. | |
18 | + */ | |
19 | +const struct of_device_id *of_match_node(const struct of_device_id *matches, | |
20 | + const struct device_node *node) | |
21 | +{ | |
22 | + while (matches->name[0] || matches->type[0] || matches->compatible[0]) { | |
23 | + int match = 1; | |
24 | + if (matches->name[0]) | |
25 | + match &= node->name | |
26 | + && !strcmp(matches->name, node->name); | |
27 | + if (matches->type[0]) | |
28 | + match &= node->type | |
29 | + && !strcmp(matches->type, node->type); | |
30 | + if (matches->compatible[0]) | |
31 | + match &= of_device_is_compatible(node, | |
32 | + matches->compatible); | |
33 | + if (match) | |
34 | + return matches; | |
35 | + matches++; | |
36 | + } | |
37 | + return NULL; | |
38 | +} | |
39 | +EXPORT_SYMBOL(of_match_node); | |
40 | + | |
41 | +/** | |
42 | + * of_match_device - Tell if an of_device structure has a matching | |
43 | + * of_match structure | |
44 | + * @ids: array of of device match structures to search in | |
45 | + * @dev: the of device structure to match against | |
46 | + * | |
47 | + * Used by a driver to check whether an of_device present in the | |
48 | + * system is in its list of supported devices. | |
49 | + */ | |
50 | +const struct of_device_id *of_match_device(const struct of_device_id *matches, | |
51 | + const struct of_device *dev) | |
52 | +{ | |
53 | + if (!dev->node) | |
54 | + return NULL; | |
55 | + return of_match_node(matches, dev->node); | |
56 | +} | |
57 | +EXPORT_SYMBOL(of_match_device); | |
58 | + | |
59 | +struct of_device *of_dev_get(struct of_device *dev) | |
60 | +{ | |
61 | + struct device *tmp; | |
62 | + | |
63 | + if (!dev) | |
64 | + return NULL; | |
65 | + tmp = get_device(&dev->dev); | |
66 | + if (tmp) | |
67 | + return to_of_device(tmp); | |
68 | + else | |
69 | + return NULL; | |
70 | +} | |
71 | +EXPORT_SYMBOL(of_dev_get); | |
72 | + | |
73 | +void of_dev_put(struct of_device *dev) | |
74 | +{ | |
75 | + if (dev) | |
76 | + put_device(&dev->dev); | |
77 | +} | |
78 | +EXPORT_SYMBOL(of_dev_put); | |
79 | + | |
80 | +static ssize_t dev_show_devspec(struct device *dev, | |
81 | + struct device_attribute *attr, char *buf) | |
82 | +{ | |
83 | + struct of_device *ofdev; | |
84 | + | |
85 | + ofdev = to_of_device(dev); | |
86 | + return sprintf(buf, "%s", ofdev->node->full_name); | |
87 | +} | |
88 | + | |
89 | +static DEVICE_ATTR(devspec, S_IRUGO, dev_show_devspec, NULL); | |
90 | + | |
91 | +/** | |
92 | + * of_release_dev - free an of device structure when all users of it are finished. | |
93 | + * @dev: device that's been disconnected | |
94 | + * | |
95 | + * Will be called only by the device core when all users of this of device are | |
96 | + * done. | |
97 | + */ | |
98 | +void of_release_dev(struct device *dev) | |
99 | +{ | |
100 | + struct of_device *ofdev; | |
101 | + | |
102 | + ofdev = to_of_device(dev); | |
103 | + of_node_put(ofdev->node); | |
104 | + kfree(ofdev); | |
105 | +} | |
106 | +EXPORT_SYMBOL(of_release_dev); | |
107 | + | |
108 | +int of_device_register(struct of_device *ofdev) | |
109 | +{ | |
110 | + int rc; | |
111 | + | |
112 | + BUG_ON(ofdev->node == NULL); | |
113 | + | |
114 | + rc = device_register(&ofdev->dev); | |
115 | + if (rc) | |
116 | + return rc; | |
117 | + | |
118 | + rc = device_create_file(&ofdev->dev, &dev_attr_devspec); | |
119 | + if (rc) | |
120 | + device_unregister(&ofdev->dev); | |
121 | + | |
122 | + return rc; | |
123 | +} | |
124 | +EXPORT_SYMBOL(of_device_register); | |
125 | + | |
126 | +void of_device_unregister(struct of_device *ofdev) | |
127 | +{ | |
128 | + device_remove_file(&ofdev->dev, &dev_attr_devspec); | |
129 | + device_unregister(&ofdev->dev); | |
130 | +} | |
131 | +EXPORT_SYMBOL(of_device_unregister); |