Commit | Line | Data |
---|---|---|
f85ff305 SR |
1 | #include <linux/string.h> |
2 | #include <linux/kernel.h> | |
3 | #include <linux/of.h> | |
f898f8db | 4 | #include <linux/of_device.h> |
f85ff305 SR |
5 | #include <linux/init.h> |
6 | #include <linux/module.h> | |
7 | #include <linux/mod_devicetable.h> | |
8 | #include <linux/slab.h> | |
9 | ||
10 | #include <asm/errno.h> | |
f85ff305 | 11 | |
f85ff305 SR |
12 | /** |
13 | * of_match_device - Tell if an of_device structure has a matching | |
14 | * of_match structure | |
15 | * @ids: array of of device match structures to search in | |
16 | * @dev: the of device structure to match against | |
17 | * | |
18 | * Used by a driver to check whether an of_device present in the | |
19 | * system is in its list of supported devices. | |
20 | */ | |
21 | const struct of_device_id *of_match_device(const struct of_device_id *matches, | |
22 | const struct of_device *dev) | |
23 | { | |
24 | if (!dev->node) | |
25 | return NULL; | |
26 | return of_match_node(matches, dev->node); | |
27 | } | |
28 | EXPORT_SYMBOL(of_match_device); | |
29 | ||
30 | struct of_device *of_dev_get(struct of_device *dev) | |
31 | { | |
32 | struct device *tmp; | |
33 | ||
34 | if (!dev) | |
35 | return NULL; | |
36 | tmp = get_device(&dev->dev); | |
37 | if (tmp) | |
38 | return to_of_device(tmp); | |
39 | else | |
40 | return NULL; | |
41 | } | |
42 | EXPORT_SYMBOL(of_dev_get); | |
43 | ||
44 | void of_dev_put(struct of_device *dev) | |
45 | { | |
46 | if (dev) | |
47 | put_device(&dev->dev); | |
48 | } | |
49 | EXPORT_SYMBOL(of_dev_put); | |
50 | ||
140b932f | 51 | static ssize_t devspec_show(struct device *dev, |
f85ff305 SR |
52 | struct device_attribute *attr, char *buf) |
53 | { | |
54 | struct of_device *ofdev; | |
55 | ||
56 | ofdev = to_of_device(dev); | |
140b932f | 57 | return sprintf(buf, "%s\n", ofdev->node->full_name); |
f85ff305 SR |
58 | } |
59 | ||
140b932f OH |
60 | static ssize_t modalias_show(struct device *dev, |
61 | struct device_attribute *attr, char *buf) | |
62 | { | |
63 | struct of_device *ofdev = to_of_device(dev); | |
64 | ssize_t len = 0; | |
65 | ||
66 | len = of_device_get_modalias(ofdev, buf, PAGE_SIZE - 2); | |
67 | buf[len] = '\n'; | |
68 | buf[len+1] = 0; | |
69 | return len+1; | |
70 | } | |
71 | ||
72 | struct device_attribute of_platform_device_attrs[] = { | |
73 | __ATTR_RO(devspec), | |
74 | __ATTR_RO(modalias), | |
75 | __ATTR_NULL | |
76 | }; | |
f85ff305 SR |
77 | |
78 | /** | |
79 | * of_release_dev - free an of device structure when all users of it are finished. | |
80 | * @dev: device that's been disconnected | |
81 | * | |
82 | * Will be called only by the device core when all users of this of device are | |
83 | * done. | |
84 | */ | |
85 | void of_release_dev(struct device *dev) | |
86 | { | |
87 | struct of_device *ofdev; | |
88 | ||
89 | ofdev = to_of_device(dev); | |
90 | of_node_put(ofdev->node); | |
91 | kfree(ofdev); | |
92 | } | |
93 | EXPORT_SYMBOL(of_release_dev); | |
94 | ||
95 | int of_device_register(struct of_device *ofdev) | |
96 | { | |
f85ff305 | 97 | BUG_ON(ofdev->node == NULL); |
140b932f | 98 | return device_register(&ofdev->dev); |
f85ff305 SR |
99 | } |
100 | EXPORT_SYMBOL(of_device_register); | |
101 | ||
102 | void of_device_unregister(struct of_device *ofdev) | |
103 | { | |
f85ff305 SR |
104 | device_unregister(&ofdev->dev); |
105 | } | |
106 | EXPORT_SYMBOL(of_device_unregister); |