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