1 | // SPDX-License-Identifier: GPL-2.0 |
2 | #include <linux/kernel.h> |
3 | #include <linux/of.h> |
4 | #include <linux/of_device.h> |
5 | #include <linux/stat.h> |
6 | #include <asm/macio.h> |
7 | |
8 | static ssize_t |
9 | compatible_show (struct device *dev, struct device_attribute *attr, char *buf) |
10 | { |
11 | struct platform_device *of; |
12 | const char *compat; |
13 | int cplen; |
14 | int length = 0; |
15 | |
16 | of = &to_macio_device (dev)->ofdev; |
17 | compat = of_get_property(node: of->dev.of_node, name: "compatible" , lenp: &cplen); |
18 | if (!compat) { |
19 | *buf = '\0'; |
20 | return 0; |
21 | } |
22 | while (cplen > 0) { |
23 | int l; |
24 | length += sprintf (buf, fmt: "%s\n" , compat); |
25 | buf += length; |
26 | l = strlen (compat) + 1; |
27 | compat += l; |
28 | cplen -= l; |
29 | } |
30 | |
31 | return length; |
32 | } |
33 | static DEVICE_ATTR_RO(compatible); |
34 | |
35 | static ssize_t modalias_show (struct device *dev, struct device_attribute *attr, |
36 | char *buf) |
37 | { |
38 | return of_device_modalias(dev, str: buf, PAGE_SIZE); |
39 | } |
40 | |
41 | static ssize_t devspec_show(struct device *dev, |
42 | struct device_attribute *attr, char *buf) |
43 | { |
44 | struct platform_device *ofdev; |
45 | |
46 | ofdev = to_platform_device(dev); |
47 | return sprintf(buf, fmt: "%pOF\n" , ofdev->dev.of_node); |
48 | } |
49 | static DEVICE_ATTR_RO(modalias); |
50 | static DEVICE_ATTR_RO(devspec); |
51 | |
52 | static ssize_t name_show(struct device *dev, |
53 | struct device_attribute *attr, char *buf) |
54 | { |
55 | return sprintf(buf, fmt: "%pOFn\n" , dev->of_node); |
56 | } |
57 | static DEVICE_ATTR_RO(name); |
58 | |
59 | static ssize_t type_show(struct device *dev, |
60 | struct device_attribute *attr, char *buf) |
61 | { |
62 | return sprintf(buf, fmt: "%s\n" , of_node_get_device_type(np: dev->of_node)); |
63 | } |
64 | static DEVICE_ATTR_RO(type); |
65 | |
66 | static struct attribute *macio_dev_attrs[] = { |
67 | &dev_attr_name.attr, |
68 | &dev_attr_type.attr, |
69 | &dev_attr_compatible.attr, |
70 | &dev_attr_modalias.attr, |
71 | &dev_attr_devspec.attr, |
72 | NULL, |
73 | }; |
74 | |
75 | static const struct attribute_group macio_dev_group = { |
76 | .attrs = macio_dev_attrs, |
77 | }; |
78 | |
79 | const struct attribute_group *macio_dev_groups[] = { |
80 | &macio_dev_group, |
81 | NULL, |
82 | }; |
83 | |