18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci#include <linux/kernel.h>
38c2ecf20Sopenharmony_ci#include <linux/stat.h>
48c2ecf20Sopenharmony_ci#include <asm/macio.h>
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_cistatic ssize_t
78c2ecf20Sopenharmony_cicompatible_show (struct device *dev, struct device_attribute *attr, char *buf)
88c2ecf20Sopenharmony_ci{
98c2ecf20Sopenharmony_ci	struct platform_device *of;
108c2ecf20Sopenharmony_ci	const char *compat;
118c2ecf20Sopenharmony_ci	int cplen;
128c2ecf20Sopenharmony_ci	int length = 0;
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci	of = &to_macio_device (dev)->ofdev;
158c2ecf20Sopenharmony_ci	compat = of_get_property(of->dev.of_node, "compatible", &cplen);
168c2ecf20Sopenharmony_ci	if (!compat) {
178c2ecf20Sopenharmony_ci		*buf = '\0';
188c2ecf20Sopenharmony_ci		return 0;
198c2ecf20Sopenharmony_ci	}
208c2ecf20Sopenharmony_ci	while (cplen > 0) {
218c2ecf20Sopenharmony_ci		int l;
228c2ecf20Sopenharmony_ci		length += sprintf (buf, "%s\n", compat);
238c2ecf20Sopenharmony_ci		buf += length;
248c2ecf20Sopenharmony_ci		l = strlen (compat) + 1;
258c2ecf20Sopenharmony_ci		compat += l;
268c2ecf20Sopenharmony_ci		cplen -= l;
278c2ecf20Sopenharmony_ci	}
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci	return length;
308c2ecf20Sopenharmony_ci}
318c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RO(compatible);
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_cistatic ssize_t modalias_show (struct device *dev, struct device_attribute *attr,
348c2ecf20Sopenharmony_ci			      char *buf)
358c2ecf20Sopenharmony_ci{
368c2ecf20Sopenharmony_ci	return of_device_modalias(dev, buf, PAGE_SIZE);
378c2ecf20Sopenharmony_ci}
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_cistatic ssize_t devspec_show(struct device *dev,
408c2ecf20Sopenharmony_ci				struct device_attribute *attr, char *buf)
418c2ecf20Sopenharmony_ci{
428c2ecf20Sopenharmony_ci	struct platform_device *ofdev;
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	ofdev = to_platform_device(dev);
458c2ecf20Sopenharmony_ci	return sprintf(buf, "%pOF\n", ofdev->dev.of_node);
468c2ecf20Sopenharmony_ci}
478c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RO(modalias);
488c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RO(devspec);
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_cistatic ssize_t name_show(struct device *dev,
518c2ecf20Sopenharmony_ci			 struct device_attribute *attr, char *buf)
528c2ecf20Sopenharmony_ci{
538c2ecf20Sopenharmony_ci	return sprintf(buf, "%pOFn\n", dev->of_node);
548c2ecf20Sopenharmony_ci}
558c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RO(name);
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_cistatic ssize_t type_show(struct device *dev,
588c2ecf20Sopenharmony_ci			 struct device_attribute *attr, char *buf)
598c2ecf20Sopenharmony_ci{
608c2ecf20Sopenharmony_ci	return sprintf(buf, "%s\n", of_node_get_device_type(dev->of_node));
618c2ecf20Sopenharmony_ci}
628c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RO(type);
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_cistatic struct attribute *macio_dev_attrs[] = {
658c2ecf20Sopenharmony_ci	&dev_attr_name.attr,
668c2ecf20Sopenharmony_ci	&dev_attr_type.attr,
678c2ecf20Sopenharmony_ci	&dev_attr_compatible.attr,
688c2ecf20Sopenharmony_ci	&dev_attr_modalias.attr,
698c2ecf20Sopenharmony_ci	&dev_attr_devspec.attr,
708c2ecf20Sopenharmony_ci	NULL,
718c2ecf20Sopenharmony_ci};
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_cistatic const struct attribute_group macio_dev_group = {
748c2ecf20Sopenharmony_ci	.attrs = macio_dev_attrs,
758c2ecf20Sopenharmony_ci};
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ciconst struct attribute_group *macio_dev_groups[] = {
788c2ecf20Sopenharmony_ci	&macio_dev_group,
798c2ecf20Sopenharmony_ci	NULL,
808c2ecf20Sopenharmony_ci};
81