162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci *  File Attributes for Zorro Devices
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci *  Copyright (C) 2003 Geert Uytterhoeven
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci *  Loosely based on drivers/pci/pci-sysfs.c
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci *  This file is subject to the terms and conditions of the GNU General Public
962306a36Sopenharmony_ci *  License.  See the file COPYING in the main directory of this archive
1062306a36Sopenharmony_ci *  for more details.
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <linux/kernel.h>
1562306a36Sopenharmony_ci#include <linux/zorro.h>
1662306a36Sopenharmony_ci#include <linux/stat.h>
1762306a36Sopenharmony_ci#include <linux/string.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#include <asm/byteorder.h>
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#include "zorro.h"
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/* show configuration fields */
2562306a36Sopenharmony_ci#define zorro_config_attr(name, field, format_string)			\
2662306a36Sopenharmony_cistatic ssize_t name##_show(struct device *dev,				\
2762306a36Sopenharmony_ci			   struct device_attribute *attr, char *buf)	\
2862306a36Sopenharmony_ci{									\
2962306a36Sopenharmony_ci	struct zorro_dev *z;						\
3062306a36Sopenharmony_ci									\
3162306a36Sopenharmony_ci	z = to_zorro_dev(dev);						\
3262306a36Sopenharmony_ci	return sprintf(buf, format_string, z->field);			\
3362306a36Sopenharmony_ci}									\
3462306a36Sopenharmony_cistatic DEVICE_ATTR_RO(name);
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_cizorro_config_attr(id, id, "0x%08x\n");
3762306a36Sopenharmony_cizorro_config_attr(type, rom.er_Type, "0x%02x\n");
3862306a36Sopenharmony_cizorro_config_attr(slotaddr, slotaddr, "0x%04x\n");
3962306a36Sopenharmony_cizorro_config_attr(slotsize, slotsize, "0x%04x\n");
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistatic ssize_t serial_show(struct device *dev, struct device_attribute *attr,
4262306a36Sopenharmony_ci			   char *buf)
4362306a36Sopenharmony_ci{
4462306a36Sopenharmony_ci	struct zorro_dev *z;
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	z = to_zorro_dev(dev);
4762306a36Sopenharmony_ci	return sprintf(buf, "0x%08x\n", be32_to_cpu(z->rom.er_SerialNumber));
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_cistatic DEVICE_ATTR_RO(serial);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistatic ssize_t resource_show(struct device *dev, struct device_attribute *attr,
5262306a36Sopenharmony_ci			     char *buf)
5362306a36Sopenharmony_ci{
5462306a36Sopenharmony_ci	struct zorro_dev *z = to_zorro_dev(dev);
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	return sprintf(buf, "0x%08lx 0x%08lx 0x%08lx\n",
5762306a36Sopenharmony_ci		       (unsigned long)zorro_resource_start(z),
5862306a36Sopenharmony_ci		       (unsigned long)zorro_resource_end(z),
5962306a36Sopenharmony_ci		       zorro_resource_flags(z));
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_cistatic DEVICE_ATTR_RO(resource);
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistatic ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
6462306a36Sopenharmony_ci			     char *buf)
6562306a36Sopenharmony_ci{
6662306a36Sopenharmony_ci	struct zorro_dev *z = to_zorro_dev(dev);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci	return sprintf(buf, ZORRO_DEVICE_MODALIAS_FMT "\n", z->id);
6962306a36Sopenharmony_ci}
7062306a36Sopenharmony_cistatic DEVICE_ATTR_RO(modalias);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistatic struct attribute *zorro_device_attrs[] = {
7362306a36Sopenharmony_ci	&dev_attr_id.attr,
7462306a36Sopenharmony_ci	&dev_attr_type.attr,
7562306a36Sopenharmony_ci	&dev_attr_serial.attr,
7662306a36Sopenharmony_ci	&dev_attr_slotaddr.attr,
7762306a36Sopenharmony_ci	&dev_attr_slotsize.attr,
7862306a36Sopenharmony_ci	&dev_attr_resource.attr,
7962306a36Sopenharmony_ci	&dev_attr_modalias.attr,
8062306a36Sopenharmony_ci	NULL
8162306a36Sopenharmony_ci};
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_cistatic ssize_t zorro_read_config(struct file *filp, struct kobject *kobj,
8462306a36Sopenharmony_ci				 struct bin_attribute *bin_attr,
8562306a36Sopenharmony_ci				 char *buf, loff_t off, size_t count)
8662306a36Sopenharmony_ci{
8762306a36Sopenharmony_ci	struct zorro_dev *z = to_zorro_dev(kobj_to_dev(kobj));
8862306a36Sopenharmony_ci	struct ConfigDev cd;
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	/* Construct a ConfigDev */
9162306a36Sopenharmony_ci	memset(&cd, 0, sizeof(cd));
9262306a36Sopenharmony_ci	cd.cd_Rom = z->rom;
9362306a36Sopenharmony_ci	cd.cd_SlotAddr = cpu_to_be16(z->slotaddr);
9462306a36Sopenharmony_ci	cd.cd_SlotSize = cpu_to_be16(z->slotsize);
9562306a36Sopenharmony_ci	cd.cd_BoardAddr = cpu_to_be32(zorro_resource_start(z));
9662306a36Sopenharmony_ci	cd.cd_BoardSize = cpu_to_be32(zorro_resource_len(z));
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	return memory_read_from_buffer(buf, count, &off, &cd, sizeof(cd));
9962306a36Sopenharmony_ci}
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_cistatic struct bin_attribute zorro_config_attr = {
10262306a36Sopenharmony_ci	.attr =	{
10362306a36Sopenharmony_ci		.name = "config",
10462306a36Sopenharmony_ci		.mode = S_IRUGO,
10562306a36Sopenharmony_ci	},
10662306a36Sopenharmony_ci	.size = sizeof(struct ConfigDev),
10762306a36Sopenharmony_ci	.read = zorro_read_config,
10862306a36Sopenharmony_ci};
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cistatic struct bin_attribute *zorro_device_bin_attrs[] = {
11162306a36Sopenharmony_ci	&zorro_config_attr,
11262306a36Sopenharmony_ci	NULL
11362306a36Sopenharmony_ci};
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_cistatic const struct attribute_group zorro_device_attr_group = {
11662306a36Sopenharmony_ci	.attrs		= zorro_device_attrs,
11762306a36Sopenharmony_ci	.bin_attrs	= zorro_device_bin_attrs,
11862306a36Sopenharmony_ci};
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ciconst struct attribute_group *zorro_device_attribute_groups[] = {
12162306a36Sopenharmony_ci	&zorro_device_attr_group,
12262306a36Sopenharmony_ci	NULL
12362306a36Sopenharmony_ci};
124