1b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney#include <linux/kernel.h>
2b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney#include <linux/stat.h>
3b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney#include <asm/macio.h>
4b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney
5b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney
6b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney#define macio_config_of_attr(field, format_string)			\
7b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoneystatic ssize_t								\
8b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoneyfield##_show (struct device *dev, struct device_attribute *attr,	\
9b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney              char *buf)						\
10b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney{									\
11b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney	struct macio_dev *mdev = to_macio_device (dev);			\
1261c7a080a5a061c976988fd4b844dfb468dda255Grant Likely	return sprintf (buf, format_string, mdev->ofdev.dev.of_node->field); \
13b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney}
14b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney
15b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoneystatic ssize_t
16b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoneycompatible_show (struct device *dev, struct device_attribute *attr, char *buf)
17b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney{
182dc11581376829303b98eadb2de253bee065a56aGrant Likely	struct platform_device *of;
19018a3d1db7cdb6127656c1622ee1d2302e16436dJeremy Kerr	const char *compat;
20b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney	int cplen;
21b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney	int length = 0;
22b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney
23b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney	of = &to_macio_device (dev)->ofdev;
2461c7a080a5a061c976988fd4b844dfb468dda255Grant Likely	compat = of_get_property(of->dev.of_node, "compatible", &cplen);
25b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney	if (!compat) {
26b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney		*buf = '\0';
27b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney		return 0;
28b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney	}
29b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney	while (cplen > 0) {
30b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney		int l;
31b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney		length += sprintf (buf, "%s\n", compat);
32b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney		buf += length;
33b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney		l = strlen (compat) + 1;
34b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney		compat += l;
35b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney		cplen -= l;
36b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney	}
37b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney
38b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney	return length;
39b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney}
40b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney
41dcb34abb4d9bae0588c5c11101ed6afcee71f895scwhab@suse.destatic ssize_t modalias_show (struct device *dev, struct device_attribute *attr,
42dcb34abb4d9bae0588c5c11101ed6afcee71f895scwhab@suse.de			      char *buf)
43dcb34abb4d9bae0588c5c11101ed6afcee71f895scwhab@suse.de{
4434a1c1e8c700f7cd849deb21193718a172722f8dGrant Likely	int len = of_device_get_modalias(dev, buf, PAGE_SIZE - 2);
45dcb34abb4d9bae0588c5c11101ed6afcee71f895scwhab@suse.de
4629aa0289b895a0ad1641a90f94638c277f9cf8ecSylvain Munaut	buf[len] = '\n';
4729aa0289b895a0ad1641a90f94638c277f9cf8ecSylvain Munaut	buf[len+1] = 0;
4829aa0289b895a0ad1641a90f94638c277f9cf8ecSylvain Munaut
4929aa0289b895a0ad1641a90f94638c277f9cf8ecSylvain Munaut	return len+1;
50dcb34abb4d9bae0588c5c11101ed6afcee71f895scwhab@suse.de}
51dcb34abb4d9bae0588c5c11101ed6afcee71f895scwhab@suse.de
52140b932f8cb6cced10b96860651a198b1b89cbb9Olaf Heringstatic ssize_t devspec_show(struct device *dev,
53140b932f8cb6cced10b96860651a198b1b89cbb9Olaf Hering				struct device_attribute *attr, char *buf)
54140b932f8cb6cced10b96860651a198b1b89cbb9Olaf Hering{
552dc11581376829303b98eadb2de253bee065a56aGrant Likely	struct platform_device *ofdev;
56140b932f8cb6cced10b96860651a198b1b89cbb9Olaf Hering
572dc11581376829303b98eadb2de253bee065a56aGrant Likely	ofdev = to_platform_device(dev);
5861c7a080a5a061c976988fd4b844dfb468dda255Grant Likely	return sprintf(buf, "%s\n", ofdev->dev.of_node->full_name);
59140b932f8cb6cced10b96860651a198b1b89cbb9Olaf Hering}
60140b932f8cb6cced10b96860651a198b1b89cbb9Olaf Hering
61b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoneymacio_config_of_attr (name, "%s\n");
62b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoneymacio_config_of_attr (type, "%s\n");
63b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney
64b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoneystruct device_attribute macio_dev_attrs[] = {
65b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney	__ATTR_RO(name),
66b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney	__ATTR_RO(type),
67b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney	__ATTR_RO(compatible),
68dcb34abb4d9bae0588c5c11101ed6afcee71f895scwhab@suse.de	__ATTR_RO(modalias),
69140b932f8cb6cced10b96860651a198b1b89cbb9Olaf Hering	__ATTR_RO(devspec),
70b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney	__ATTR_NULL
71b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney};
72