1 #include <linux/config.h>
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.node->field);	\
14 }
15 
16 static ssize_t
17 compatible_show (struct device *dev, struct device_attribute *attr, char *buf)
18 {
19 	struct of_device *of;
20 	char *compat;
21 	int cplen;
22 	int length = 0;
23 
24 	of = &to_macio_device (dev)->ofdev;
25 	compat = (char *) get_property(of->node, "compatible", &cplen);
26 	if (!compat) {
27 		*buf = '\0';
28 		return 0;
29 	}
30 	while (cplen > 0) {
31 		int l;
32 		length += sprintf (buf, "%s\n", compat);
33 		buf += length;
34 		l = strlen (compat) + 1;
35 		compat += l;
36 		cplen -= l;
37 	}
38 
39 	return length;
40 }
41 
42 static ssize_t modalias_show (struct device *dev, struct device_attribute *attr,
43 			      char *buf)
44 {
45 	struct of_device *of;
46 	char *compat;
47 	int cplen;
48 	int length;
49 
50 	of = &to_macio_device (dev)->ofdev;
51 	compat = (char *) get_property (of->node, "compatible", &cplen);
52 	if (!compat) compat = "", cplen = 1;
53 	length = sprintf (buf, "of:N%sT%s", of->node->name, of->node->type);
54 	buf += length;
55 	while (cplen > 0) {
56 		int l;
57 		length += sprintf (buf, "C%s", compat);
58 		buf += length;
59 		l = strlen (compat) + 1;
60 		compat += l;
61 		cplen -= l;
62 	}
63 
64 	return length;
65 }
66 
67 macio_config_of_attr (name, "%s\n");
68 macio_config_of_attr (type, "%s\n");
69 
70 struct device_attribute macio_dev_attrs[] = {
71 	__ATTR_RO(name),
72 	__ATTR_RO(type),
73 	__ATTR_RO(compatible),
74 	__ATTR_RO(modalias),
75 	__ATTR_NULL
76 };
77