18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci *  File Attributes for Zorro Devices
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci *  Copyright (C) 2003 Geert Uytterhoeven
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci *  Loosely based on drivers/pci/pci-sysfs.c
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci *  This file is subject to the terms and conditions of the GNU General Public
98c2ecf20Sopenharmony_ci *  License.  See the file COPYING in the main directory of this archive
108c2ecf20Sopenharmony_ci *  for more details.
118c2ecf20Sopenharmony_ci */
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <linux/kernel.h>
158c2ecf20Sopenharmony_ci#include <linux/zorro.h>
168c2ecf20Sopenharmony_ci#include <linux/stat.h>
178c2ecf20Sopenharmony_ci#include <linux/string.h>
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#include <asm/byteorder.h>
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#include "zorro.h"
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci/* show configuration fields */
258c2ecf20Sopenharmony_ci#define zorro_config_attr(name, field, format_string)			\
268c2ecf20Sopenharmony_cistatic ssize_t name##_show(struct device *dev,				\
278c2ecf20Sopenharmony_ci			   struct device_attribute *attr, char *buf)	\
288c2ecf20Sopenharmony_ci{									\
298c2ecf20Sopenharmony_ci	struct zorro_dev *z;						\
308c2ecf20Sopenharmony_ci									\
318c2ecf20Sopenharmony_ci	z = to_zorro_dev(dev);						\
328c2ecf20Sopenharmony_ci	return sprintf(buf, format_string, z->field);			\
338c2ecf20Sopenharmony_ci}									\
348c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RO(name);
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_cizorro_config_attr(id, id, "0x%08x\n");
378c2ecf20Sopenharmony_cizorro_config_attr(type, rom.er_Type, "0x%02x\n");
388c2ecf20Sopenharmony_cizorro_config_attr(slotaddr, slotaddr, "0x%04x\n");
398c2ecf20Sopenharmony_cizorro_config_attr(slotsize, slotsize, "0x%04x\n");
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_cistatic ssize_t serial_show(struct device *dev, struct device_attribute *attr,
428c2ecf20Sopenharmony_ci			   char *buf)
438c2ecf20Sopenharmony_ci{
448c2ecf20Sopenharmony_ci	struct zorro_dev *z;
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci	z = to_zorro_dev(dev);
478c2ecf20Sopenharmony_ci	return sprintf(buf, "0x%08x\n", be32_to_cpu(z->rom.er_SerialNumber));
488c2ecf20Sopenharmony_ci}
498c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RO(serial);
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cistatic ssize_t resource_show(struct device *dev, struct device_attribute *attr,
528c2ecf20Sopenharmony_ci			     char *buf)
538c2ecf20Sopenharmony_ci{
548c2ecf20Sopenharmony_ci	struct zorro_dev *z = to_zorro_dev(dev);
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	return sprintf(buf, "0x%08lx 0x%08lx 0x%08lx\n",
578c2ecf20Sopenharmony_ci		       (unsigned long)zorro_resource_start(z),
588c2ecf20Sopenharmony_ci		       (unsigned long)zorro_resource_end(z),
598c2ecf20Sopenharmony_ci		       zorro_resource_flags(z));
608c2ecf20Sopenharmony_ci}
618c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RO(resource);
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_cistatic ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
648c2ecf20Sopenharmony_ci			     char *buf)
658c2ecf20Sopenharmony_ci{
668c2ecf20Sopenharmony_ci	struct zorro_dev *z = to_zorro_dev(dev);
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci	return sprintf(buf, ZORRO_DEVICE_MODALIAS_FMT "\n", z->id);
698c2ecf20Sopenharmony_ci}
708c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RO(modalias);
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_cistatic struct attribute *zorro_device_attrs[] = {
738c2ecf20Sopenharmony_ci	&dev_attr_id.attr,
748c2ecf20Sopenharmony_ci	&dev_attr_type.attr,
758c2ecf20Sopenharmony_ci	&dev_attr_serial.attr,
768c2ecf20Sopenharmony_ci	&dev_attr_slotaddr.attr,
778c2ecf20Sopenharmony_ci	&dev_attr_slotsize.attr,
788c2ecf20Sopenharmony_ci	&dev_attr_resource.attr,
798c2ecf20Sopenharmony_ci	&dev_attr_modalias.attr,
808c2ecf20Sopenharmony_ci	NULL
818c2ecf20Sopenharmony_ci};
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_cistatic ssize_t zorro_read_config(struct file *filp, struct kobject *kobj,
848c2ecf20Sopenharmony_ci				 struct bin_attribute *bin_attr,
858c2ecf20Sopenharmony_ci				 char *buf, loff_t off, size_t count)
868c2ecf20Sopenharmony_ci{
878c2ecf20Sopenharmony_ci	struct zorro_dev *z = to_zorro_dev(kobj_to_dev(kobj));
888c2ecf20Sopenharmony_ci	struct ConfigDev cd;
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci	/* Construct a ConfigDev */
918c2ecf20Sopenharmony_ci	memset(&cd, 0, sizeof(cd));
928c2ecf20Sopenharmony_ci	cd.cd_Rom = z->rom;
938c2ecf20Sopenharmony_ci	cd.cd_SlotAddr = cpu_to_be16(z->slotaddr);
948c2ecf20Sopenharmony_ci	cd.cd_SlotSize = cpu_to_be16(z->slotsize);
958c2ecf20Sopenharmony_ci	cd.cd_BoardAddr = cpu_to_be32(zorro_resource_start(z));
968c2ecf20Sopenharmony_ci	cd.cd_BoardSize = cpu_to_be32(zorro_resource_len(z));
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci	return memory_read_from_buffer(buf, count, &off, &cd, sizeof(cd));
998c2ecf20Sopenharmony_ci}
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_cistatic struct bin_attribute zorro_config_attr = {
1028c2ecf20Sopenharmony_ci	.attr =	{
1038c2ecf20Sopenharmony_ci		.name = "config",
1048c2ecf20Sopenharmony_ci		.mode = S_IRUGO,
1058c2ecf20Sopenharmony_ci	},
1068c2ecf20Sopenharmony_ci	.size = sizeof(struct ConfigDev),
1078c2ecf20Sopenharmony_ci	.read = zorro_read_config,
1088c2ecf20Sopenharmony_ci};
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_cistatic struct bin_attribute *zorro_device_bin_attrs[] = {
1118c2ecf20Sopenharmony_ci	&zorro_config_attr,
1128c2ecf20Sopenharmony_ci	NULL
1138c2ecf20Sopenharmony_ci};
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_cistatic const struct attribute_group zorro_device_attr_group = {
1168c2ecf20Sopenharmony_ci	.attrs		= zorro_device_attrs,
1178c2ecf20Sopenharmony_ci	.bin_attrs	= zorro_device_bin_attrs,
1188c2ecf20Sopenharmony_ci};
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_ciconst struct attribute_group *zorro_device_attribute_groups[] = {
1218c2ecf20Sopenharmony_ci	&zorro_device_attr_group,
1228c2ecf20Sopenharmony_ci	NULL
1238c2ecf20Sopenharmony_ci};
124