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