v4.19.13 snapshot.
diff --git a/drivers/zorro/.gitignore b/drivers/zorro/.gitignore
new file mode 100644
index 0000000..34f980b
--- /dev/null
+++ b/drivers/zorro/.gitignore
@@ -0,0 +1,2 @@
+devlist.h
+gen-devlist
diff --git a/drivers/zorro/Kconfig b/drivers/zorro/Kconfig
new file mode 100644
index 0000000..19bc753
--- /dev/null
+++ b/drivers/zorro/Kconfig
@@ -0,0 +1,18 @@
+#
+# Zorro configuration
+#
+config ZORRO_NAMES
+	bool "Zorro device name database"
+	depends on ZORRO
+	---help---
+	  By default, the kernel contains a database of all known Zorro device
+	  names to make the information in /proc/iomem comprehensible to the
+	  user. This database increases the size of the kernel image by about
+	  15KB, but it gets freed after the system boots up, so it doesn't
+	  take up kernel memory. Anyway, if you are building an installation
+	  floppy or kernel for an embedded system where kernel image size
+	  really matters, you can disable this feature and you'll get device
+	  ID numbers instead of names.
+
+	  When in doubt, say Y.
+
diff --git a/drivers/zorro/Makefile b/drivers/zorro/Makefile
new file mode 100644
index 0000000..b360ac4
--- /dev/null
+++ b/drivers/zorro/Makefile
@@ -0,0 +1,23 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# Makefile for the Zorro bus specific drivers.
+#
+
+obj-$(CONFIG_ZORRO)	+= zorro.o zorro-driver.o zorro-sysfs.o
+obj-$(CONFIG_PROC_FS)	+= proc.o
+obj-$(CONFIG_ZORRO_NAMES) +=  names.o
+
+hostprogs-y 		:= gen-devlist
+
+# Files generated that shall be removed upon make clean
+clean-files := devlist.h
+
+# Dependencies on generated files need to be listed explicitly
+$(obj)/names.o: $(obj)/devlist.h
+
+# And that's how to generate them
+quiet_cmd_devlist = DEVLIST $@
+      cmd_devlist = ( cd $(obj); ./gen-devlist ) < $<
+$(obj)/devlist.h: $(src)/zorro.ids $(obj)/gen-devlist
+	$(call cmd,devlist)
+
diff --git a/drivers/zorro/gen-devlist.c b/drivers/zorro/gen-devlist.c
new file mode 100644
index 0000000..e325c5c
--- /dev/null
+++ b/drivers/zorro/gen-devlist.c
@@ -0,0 +1,108 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *	Generate devlist.h from the Zorro ID file.
+ *
+ *	(c) 2000 Geert Uytterhoeven <geert@linux-m68k.org>
+ *
+ *	Based on the PCI version:
+ *
+ *	(c) 1999--2000 Martin Mares <mj@ucw.cz>
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#define MAX_NAME_SIZE 63
+
+static void
+pq(FILE *f, const char *c)
+{
+	while (*c) {
+		if (*c == '"')
+			fprintf(f, "\\\"");
+		else
+			fputc(*c, f);
+		c++;
+	}
+}
+
+int
+main(void)
+{
+	char line[1024], *c, *bra, manuf[8];
+	int manufs = 0;
+	int mode = 0;
+	int lino = 0;
+	int manuf_len = 0;
+	FILE *devf;
+
+	devf = fopen("devlist.h", "w");
+	if (!devf) {
+		fprintf(stderr, "Cannot create output file!\n");
+		return 1;
+	}
+
+	while (fgets(line, sizeof(line)-1, stdin)) {
+		lino++;
+		if ((c = strchr(line, '\n')))
+			*c = 0;
+		if (!line[0] || line[0] == '#')
+			continue;
+		if (line[0] == '\t') {
+			switch (mode) {
+			case 1:
+				if (strlen(line) > 5 && line[5] == ' ') {
+					c = line + 5;
+					while (*c == ' ')
+						*c++ = 0;
+					if (manuf_len + strlen(c) + 1 > MAX_NAME_SIZE) {
+						/* Too long, try cutting off long description */
+						bra = strchr(c, '[');
+						if (bra && bra > c && bra[-1] == ' ')
+							bra[-1] = 0;
+						if (manuf_len + strlen(c) + 1 > MAX_NAME_SIZE) {
+							fprintf(stderr, "Line %d: Product name too long\n", lino);
+							return 1;
+						}
+					}
+					fprintf(devf, "\tPRODUCT(%s,%s,\"", manuf, line+1);
+					pq(devf, c);
+					fputs("\")\n", devf);
+				} else goto err;
+				break;
+			default:
+				goto err;
+			}
+		} else if (strlen(line) > 4 && line[4] == ' ') {
+			c = line + 4;
+			while (*c == ' ')
+				*c++ = 0;
+			if (manufs)
+				fputs("ENDMANUF()\n\n", devf);
+			manufs++;
+			strcpy(manuf, line);
+			manuf_len = strlen(c);
+			if (manuf_len + 24 > MAX_NAME_SIZE) {
+				fprintf(stderr, "Line %d: manufacturer name too long\n", lino);
+				return 1;
+			}
+			fprintf(devf, "MANUF(%s,\"", manuf);
+			pq(devf, c);
+			fputs("\")\n", devf);
+			mode = 1;
+		} else {
+		err:
+			fprintf(stderr, "Line %d: Syntax error in mode %d: %s\n", lino, mode, line);
+			return 1;
+		}
+	}
+	fputs("ENDMANUF()\n\
+\n\
+#undef MANUF\n\
+#undef PRODUCT\n\
+#undef ENDMANUF\n", devf);
+
+	fclose(devf);
+
+	return 0;
+}
diff --git a/drivers/zorro/names.c b/drivers/zorro/names.c
new file mode 100644
index 0000000..fa3c83d
--- /dev/null
+++ b/drivers/zorro/names.c
@@ -0,0 +1,98 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *	Zorro Device Name Tables
+ *
+ *	Copyright (C) 1999--2000 Geert Uytterhoeven
+ *
+ *	Based on the PCI version:
+ *
+ *	Copyright 1992--1999 Drew Eckhardt, Frederic Potter,
+ *	David Mosberger-Tang, Martin Mares
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/zorro.h>
+
+
+struct zorro_prod_info {
+	__u16 prod;
+	unsigned short seen;
+	const char *name;
+};
+
+struct zorro_manuf_info {
+	__u16 manuf;
+	unsigned short nr;
+	const char *name;
+	struct zorro_prod_info *prods;
+};
+
+/*
+ * This is ridiculous, but we want the strings in
+ * the .init section so that they don't take up
+ * real memory.. Parse the same file multiple times
+ * to get all the info.
+ */
+#define MANUF( manuf, name )		static char __manufstr_##manuf[] __initdata = name;
+#define ENDMANUF()
+#define PRODUCT( manuf, prod, name ) 	static char __prodstr_##manuf##prod[] __initdata = name;
+#include "devlist.h"
+
+
+#define MANUF( manuf, name )		static struct zorro_prod_info __prods_##manuf[] __initdata = {
+#define ENDMANUF()			};
+#define PRODUCT( manuf, prod, name )	{ 0x##prod, 0, __prodstr_##manuf##prod },
+#include "devlist.h"
+
+static struct zorro_manuf_info __initdata zorro_manuf_list[] = {
+#define MANUF( manuf, name )		{ 0x##manuf, ARRAY_SIZE(__prods_##manuf), __manufstr_##manuf, __prods_##manuf },
+#define ENDMANUF()
+#define PRODUCT( manuf, prod, name )
+#include "devlist.h"
+};
+
+#define MANUFS ARRAY_SIZE(zorro_manuf_list)
+
+void __init zorro_name_device(struct zorro_dev *dev)
+{
+	const struct zorro_manuf_info *manuf_p = zorro_manuf_list;
+	int i = MANUFS;
+	char *name = dev->name;
+
+	do {
+		if (manuf_p->manuf == ZORRO_MANUF(dev->id))
+			goto match_manuf;
+		manuf_p++;
+	} while (--i);
+
+	/* Couldn't find either the manufacturer nor the product */
+	return;
+
+	match_manuf: {
+		struct zorro_prod_info *prod_p = manuf_p->prods;
+		int i = manuf_p->nr;
+
+		while (i > 0) {
+			if (prod_p->prod ==
+			    ((ZORRO_PROD(dev->id)<<8) | ZORRO_EPC(dev->id)))
+				goto match_prod;
+			prod_p++;
+			i--;
+		}
+
+		/* Ok, found the manufacturer, but unknown product */
+		sprintf(name, "Zorro device %08x (%s)", dev->id, manuf_p->name);
+		return;
+
+		/* Full match */
+		match_prod: {
+			char *n = name + sprintf(name, "%s %s", manuf_p->name, prod_p->name);
+			int nr = prod_p->seen + 1;
+			prod_p->seen = nr;
+			if (nr > 1)
+				sprintf(n, " (#%d)", nr);
+		}
+	}
+}
diff --git a/drivers/zorro/proc.c b/drivers/zorro/proc.c
new file mode 100644
index 0000000..2e4ca4d
--- /dev/null
+++ b/drivers/zorro/proc.c
@@ -0,0 +1,130 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *	Procfs interface for the Zorro bus.
+ *
+ *	Copyright (C) 1998-2003 Geert Uytterhoeven
+ *
+ *	Heavily based on the procfs interface for the PCI bus, which is
+ *
+ *	Copyright (C) 1997, 1998 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
+ */
+
+#include <linux/types.h>
+#include <linux/zorro.h>
+#include <linux/proc_fs.h>
+#include <linux/seq_file.h>
+#include <linux/init.h>
+#include <linux/export.h>
+
+#include <asm/byteorder.h>
+#include <linux/uaccess.h>
+#include <asm/amigahw.h>
+#include <asm/setup.h>
+
+static loff_t
+proc_bus_zorro_lseek(struct file *file, loff_t off, int whence)
+{
+	return fixed_size_llseek(file, off, whence, sizeof(struct ConfigDev));
+}
+
+static ssize_t
+proc_bus_zorro_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
+{
+	struct zorro_dev *z = PDE_DATA(file_inode(file));
+	struct ConfigDev cd;
+	loff_t pos = *ppos;
+
+	if (pos >= sizeof(struct ConfigDev))
+		return 0;
+	if (nbytes >= sizeof(struct ConfigDev))
+		nbytes = sizeof(struct ConfigDev);
+	if (pos + nbytes > sizeof(struct ConfigDev))
+		nbytes = sizeof(struct ConfigDev) - pos;
+
+	/* Construct a ConfigDev */
+	memset(&cd, 0, sizeof(cd));
+	cd.cd_Rom = z->rom;
+	cd.cd_SlotAddr = cpu_to_be16(z->slotaddr);
+	cd.cd_SlotSize = cpu_to_be16(z->slotsize);
+	cd.cd_BoardAddr = cpu_to_be32(zorro_resource_start(z));
+	cd.cd_BoardSize = cpu_to_be32(zorro_resource_len(z));
+
+	if (copy_to_user(buf, (void *)&cd + pos, nbytes))
+		return -EFAULT;
+	*ppos += nbytes;
+
+	return nbytes;
+}
+
+static const struct file_operations proc_bus_zorro_operations = {
+	.owner		= THIS_MODULE,
+	.llseek		= proc_bus_zorro_lseek,
+	.read		= proc_bus_zorro_read,
+};
+
+static void * zorro_seq_start(struct seq_file *m, loff_t *pos)
+{
+	return (*pos < zorro_num_autocon) ? pos : NULL;
+}
+
+static void * zorro_seq_next(struct seq_file *m, void *v, loff_t *pos)
+{
+	(*pos)++;
+	return (*pos < zorro_num_autocon) ? pos : NULL;
+}
+
+static void zorro_seq_stop(struct seq_file *m, void *v)
+{
+}
+
+static int zorro_seq_show(struct seq_file *m, void *v)
+{
+	unsigned int slot = *(loff_t *)v;
+	struct zorro_dev *z = &zorro_autocon[slot];
+
+	seq_printf(m, "%02x\t%08x\t%08lx\t%08lx\t%02x\n", slot, z->id,
+		   (unsigned long)zorro_resource_start(z),
+		   (unsigned long)zorro_resource_len(z),
+		   z->rom.er_Type);
+	return 0;
+}
+
+static const struct seq_operations zorro_devices_seq_ops = {
+	.start = zorro_seq_start,
+	.next  = zorro_seq_next,
+	.stop  = zorro_seq_stop,
+	.show  = zorro_seq_show,
+};
+
+static struct proc_dir_entry *proc_bus_zorro_dir;
+
+static int __init zorro_proc_attach_device(unsigned int slot)
+{
+	struct proc_dir_entry *entry;
+	char name[4];
+
+	sprintf(name, "%02x", slot);
+	entry = proc_create_data(name, 0, proc_bus_zorro_dir,
+				 &proc_bus_zorro_operations,
+				 &zorro_autocon[slot]);
+	if (!entry)
+		return -ENOMEM;
+	proc_set_size(entry, sizeof(struct zorro_dev));
+	return 0;
+}
+
+static int __init zorro_proc_init(void)
+{
+	unsigned int slot;
+
+	if (MACH_IS_AMIGA && AMIGAHW_PRESENT(ZORRO)) {
+		proc_bus_zorro_dir = proc_mkdir("bus/zorro", NULL);
+		proc_create_seq("devices", 0, proc_bus_zorro_dir,
+			    &zorro_devices_seq_ops);
+		for (slot = 0; slot < zorro_num_autocon; slot++)
+			zorro_proc_attach_device(slot);
+	}
+	return 0;
+}
+
+device_initcall(zorro_proc_init);
diff --git a/drivers/zorro/zorro-driver.c b/drivers/zorro/zorro-driver.c
new file mode 100644
index 0000000..fa23b73
--- /dev/null
+++ b/drivers/zorro/zorro-driver.c
@@ -0,0 +1,183 @@
+/*
+ *  Zorro Driver Services
+ *
+ *  Copyright (C) 2003 Geert Uytterhoeven
+ *
+ *  Loosely based on drivers/pci/pci-driver.c
+ *
+ *  This file is subject to the terms and conditions of the GNU General Public
+ *  License.  See the file COPYING in the main directory of this archive
+ *  for more details.
+ */
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/zorro.h>
+
+#include "zorro.h"
+
+
+    /**
+     *  zorro_match_device - Tell if a Zorro device structure has a matching
+     *                       Zorro device id structure
+     *  @ids: array of Zorro device id structures to search in
+     *  @dev: the Zorro device structure to match against
+     *
+     *  Used by a driver to check whether a Zorro device present in the
+     *  system is in its list of supported devices. Returns the matching
+     *  zorro_device_id structure or %NULL if there is no match.
+     */
+
+const struct zorro_device_id *
+zorro_match_device(const struct zorro_device_id *ids,
+		   const struct zorro_dev *z)
+{
+	while (ids->id) {
+		if (ids->id == ZORRO_WILDCARD || ids->id == z->id)
+			return ids;
+		ids++;
+	}
+	return NULL;
+}
+EXPORT_SYMBOL(zorro_match_device);
+
+
+static int zorro_device_probe(struct device *dev)
+{
+	int error = 0;
+	struct zorro_driver *drv = to_zorro_driver(dev->driver);
+	struct zorro_dev *z = to_zorro_dev(dev);
+
+	if (!z->driver && drv->probe) {
+		const struct zorro_device_id *id;
+
+		id = zorro_match_device(drv->id_table, z);
+		if (id)
+			error = drv->probe(z, id);
+		if (error >= 0) {
+			z->driver = drv;
+			error = 0;
+		}
+	}
+	return error;
+}
+
+
+static int zorro_device_remove(struct device *dev)
+{
+	struct zorro_dev *z = to_zorro_dev(dev);
+	struct zorro_driver *drv = to_zorro_driver(dev->driver);
+
+	if (drv) {
+		if (drv->remove)
+			drv->remove(z);
+		z->driver = NULL;
+	}
+	return 0;
+}
+
+
+    /**
+     *  zorro_register_driver - register a new Zorro driver
+     *  @drv: the driver structure to register
+     *
+     *  Adds the driver structure to the list of registered drivers
+     *  Returns zero or a negative error value.
+     */
+
+int zorro_register_driver(struct zorro_driver *drv)
+{
+	/* initialize common driver fields */
+	drv->driver.name = drv->name;
+	drv->driver.bus = &zorro_bus_type;
+
+	/* register with core */
+	return driver_register(&drv->driver);
+}
+EXPORT_SYMBOL(zorro_register_driver);
+
+
+    /**
+     *  zorro_unregister_driver - unregister a zorro driver
+     *  @drv: the driver structure to unregister
+     *
+     *  Deletes the driver structure from the list of registered Zorro drivers,
+     *  gives it a chance to clean up by calling its remove() function for
+     *  each device it was responsible for, and marks those devices as
+     *  driverless.
+     */
+
+void zorro_unregister_driver(struct zorro_driver *drv)
+{
+	driver_unregister(&drv->driver);
+}
+EXPORT_SYMBOL(zorro_unregister_driver);
+
+
+    /**
+     *  zorro_bus_match - Tell if a Zorro device structure has a matching Zorro
+     *                    device id structure
+     *  @ids: array of Zorro device id structures to search in
+     *  @dev: the Zorro device structure to match against
+     *
+     *  Used by a driver to check whether a Zorro device present in the
+     *  system is in its list of supported devices.Returns the matching
+     *  zorro_device_id structure or %NULL if there is no match.
+     */
+
+static int zorro_bus_match(struct device *dev, struct device_driver *drv)
+{
+	struct zorro_dev *z = to_zorro_dev(dev);
+	struct zorro_driver *zorro_drv = to_zorro_driver(drv);
+	const struct zorro_device_id *ids = zorro_drv->id_table;
+
+	if (!ids)
+		return 0;
+
+	while (ids->id) {
+		if (ids->id == ZORRO_WILDCARD || ids->id == z->id)
+			return 1;
+		ids++;
+	}
+	return 0;
+}
+
+static int zorro_uevent(struct device *dev, struct kobj_uevent_env *env)
+{
+	struct zorro_dev *z;
+
+	if (!dev)
+		return -ENODEV;
+
+	z = to_zorro_dev(dev);
+	if (!z)
+		return -ENODEV;
+
+	if (add_uevent_var(env, "ZORRO_ID=%08X", z->id) ||
+	    add_uevent_var(env, "ZORRO_SLOT_NAME=%s", dev_name(dev)) ||
+	    add_uevent_var(env, "ZORRO_SLOT_ADDR=%04X", z->slotaddr) ||
+	    add_uevent_var(env, "MODALIAS=" ZORRO_DEVICE_MODALIAS_FMT, z->id))
+		return -ENOMEM;
+
+	return 0;
+}
+
+struct bus_type zorro_bus_type = {
+	.name		= "zorro",
+	.dev_name	= "zorro",
+	.dev_groups	= zorro_device_attribute_groups,
+	.match		= zorro_bus_match,
+	.uevent		= zorro_uevent,
+	.probe		= zorro_device_probe,
+	.remove		= zorro_device_remove,
+};
+EXPORT_SYMBOL(zorro_bus_type);
+
+
+static int __init zorro_driver_init(void)
+{
+	return bus_register(&zorro_bus_type);
+}
+
+postcore_initcall(zorro_driver_init);
+
diff --git a/drivers/zorro/zorro-sysfs.c b/drivers/zorro/zorro-sysfs.c
new file mode 100644
index 0000000..3d34dba
--- /dev/null
+++ b/drivers/zorro/zorro-sysfs.c
@@ -0,0 +1,123 @@
+/*
+ *  File Attributes for Zorro Devices
+ *
+ *  Copyright (C) 2003 Geert Uytterhoeven
+ *
+ *  Loosely based on drivers/pci/pci-sysfs.c
+ *
+ *  This file is subject to the terms and conditions of the GNU General Public
+ *  License.  See the file COPYING in the main directory of this archive
+ *  for more details.
+ */
+
+
+#include <linux/kernel.h>
+#include <linux/zorro.h>
+#include <linux/stat.h>
+#include <linux/string.h>
+
+#include <asm/byteorder.h>
+
+#include "zorro.h"
+
+
+/* show configuration fields */
+#define zorro_config_attr(name, field, format_string)			\
+static ssize_t name##_show(struct device *dev,				\
+			   struct device_attribute *attr, char *buf)	\
+{									\
+	struct zorro_dev *z;						\
+									\
+	z = to_zorro_dev(dev);						\
+	return sprintf(buf, format_string, z->field);			\
+}									\
+static DEVICE_ATTR_RO(name);
+
+zorro_config_attr(id, id, "0x%08x\n");
+zorro_config_attr(type, rom.er_Type, "0x%02x\n");
+zorro_config_attr(slotaddr, slotaddr, "0x%04x\n");
+zorro_config_attr(slotsize, slotsize, "0x%04x\n");
+
+static ssize_t serial_show(struct device *dev, struct device_attribute *attr,
+			   char *buf)
+{
+	struct zorro_dev *z;
+
+	z = to_zorro_dev(dev);
+	return sprintf(buf, "0x%08x\n", be32_to_cpu(z->rom.er_SerialNumber));
+}
+static DEVICE_ATTR_RO(serial);
+
+static ssize_t resource_show(struct device *dev, struct device_attribute *attr,
+			     char *buf)
+{
+	struct zorro_dev *z = to_zorro_dev(dev);
+
+	return sprintf(buf, "0x%08lx 0x%08lx 0x%08lx\n",
+		       (unsigned long)zorro_resource_start(z),
+		       (unsigned long)zorro_resource_end(z),
+		       zorro_resource_flags(z));
+}
+static DEVICE_ATTR_RO(resource);
+
+static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
+			     char *buf)
+{
+	struct zorro_dev *z = to_zorro_dev(dev);
+
+	return sprintf(buf, ZORRO_DEVICE_MODALIAS_FMT "\n", z->id);
+}
+static DEVICE_ATTR_RO(modalias);
+
+static struct attribute *zorro_device_attrs[] = {
+	&dev_attr_id.attr,
+	&dev_attr_type.attr,
+	&dev_attr_serial.attr,
+	&dev_attr_slotaddr.attr,
+	&dev_attr_slotsize.attr,
+	&dev_attr_resource.attr,
+	&dev_attr_modalias.attr,
+	NULL
+};
+
+static ssize_t zorro_read_config(struct file *filp, struct kobject *kobj,
+				 struct bin_attribute *bin_attr,
+				 char *buf, loff_t off, size_t count)
+{
+	struct zorro_dev *z = to_zorro_dev(kobj_to_dev(kobj));
+	struct ConfigDev cd;
+
+	/* Construct a ConfigDev */
+	memset(&cd, 0, sizeof(cd));
+	cd.cd_Rom = z->rom;
+	cd.cd_SlotAddr = cpu_to_be16(z->slotaddr);
+	cd.cd_SlotSize = cpu_to_be16(z->slotsize);
+	cd.cd_BoardAddr = cpu_to_be32(zorro_resource_start(z));
+	cd.cd_BoardSize = cpu_to_be32(zorro_resource_len(z));
+
+	return memory_read_from_buffer(buf, count, &off, &cd, sizeof(cd));
+}
+
+static struct bin_attribute zorro_config_attr = {
+	.attr =	{
+		.name = "config",
+		.mode = S_IRUGO,
+	},
+	.size = sizeof(struct ConfigDev),
+	.read = zorro_read_config,
+};
+
+static struct bin_attribute *zorro_device_bin_attrs[] = {
+	&zorro_config_attr,
+	NULL
+};
+
+static const struct attribute_group zorro_device_attr_group = {
+	.attrs		= zorro_device_attrs,
+	.bin_attrs	= zorro_device_bin_attrs,
+};
+
+const struct attribute_group *zorro_device_attribute_groups[] = {
+	&zorro_device_attr_group,
+	NULL
+};
diff --git a/drivers/zorro/zorro.c b/drivers/zorro/zorro.c
new file mode 100644
index 0000000..8eeb84c
--- /dev/null
+++ b/drivers/zorro/zorro.c
@@ -0,0 +1,246 @@
+/*
+ *    Zorro Bus Services
+ *
+ *    Copyright (C) 1995-2003 Geert Uytterhoeven
+ *
+ *    This file is subject to the terms and conditions of the GNU General Public
+ *    License.  See the file COPYING in the main directory of this archive
+ *    for more details.
+ */
+
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/zorro.h>
+#include <linux/bitops.h>
+#include <linux/string.h>
+#include <linux/platform_device.h>
+#include <linux/dma-mapping.h>
+#include <linux/slab.h>
+
+#include <asm/byteorder.h>
+#include <asm/setup.h>
+#include <asm/amigahw.h>
+
+#include "zorro.h"
+
+
+    /*
+     *  Zorro Expansion Devices
+     */
+
+unsigned int zorro_num_autocon;
+struct zorro_dev_init zorro_autocon_init[ZORRO_NUM_AUTO] __initdata;
+struct zorro_dev *zorro_autocon;
+
+
+    /*
+     *  Zorro bus
+     */
+
+struct zorro_bus {
+	struct device dev;
+	struct zorro_dev devices[0];
+};
+
+
+    /*
+     *  Find Zorro Devices
+     */
+
+struct zorro_dev *zorro_find_device(zorro_id id, struct zorro_dev *from)
+{
+	struct zorro_dev *z;
+
+	if (!zorro_num_autocon)
+		return NULL;
+
+	for (z = from ? from+1 : &zorro_autocon[0];
+	     z < zorro_autocon+zorro_num_autocon;
+	     z++)
+		if (id == ZORRO_WILDCARD || id == z->id)
+			return z;
+	return NULL;
+}
+EXPORT_SYMBOL(zorro_find_device);
+
+
+    /*
+     *  Bitmask indicating portions of available Zorro II RAM that are unused
+     *  by the system. Every bit represents a 64K chunk, for a maximum of 8MB
+     *  (128 chunks, physical 0x00200000-0x009fffff).
+     *
+     *  If you want to use (= allocate) portions of this RAM, you should clear
+     *  the corresponding bits.
+     *
+     *  Possible uses:
+     *      - z2ram device
+     *      - SCSI DMA bounce buffers
+     *
+     *  FIXME: use the normal resource management
+     */
+
+DECLARE_BITMAP(zorro_unused_z2ram, 128);
+EXPORT_SYMBOL(zorro_unused_z2ram);
+
+
+static void __init mark_region(unsigned long start, unsigned long end,
+			       int flag)
+{
+	if (flag)
+		start += Z2RAM_CHUNKMASK;
+	else
+		end += Z2RAM_CHUNKMASK;
+	start &= ~Z2RAM_CHUNKMASK;
+	end &= ~Z2RAM_CHUNKMASK;
+
+	if (end <= Z2RAM_START || start >= Z2RAM_END)
+		return;
+	start = start < Z2RAM_START ? 0x00000000 : start-Z2RAM_START;
+	end = end > Z2RAM_END ? Z2RAM_SIZE : end-Z2RAM_START;
+	while (start < end) {
+		u32 chunk = start>>Z2RAM_CHUNKSHIFT;
+
+		if (flag)
+			set_bit(chunk, zorro_unused_z2ram);
+		else
+			clear_bit(chunk, zorro_unused_z2ram);
+		start += Z2RAM_CHUNKSIZE;
+	}
+}
+
+
+static struct resource __init *zorro_find_parent_resource(
+	struct platform_device *bridge, struct zorro_dev *z)
+{
+	int i;
+
+	for (i = 0; i < bridge->num_resources; i++) {
+		struct resource *r = &bridge->resource[i];
+
+		if (zorro_resource_start(z) >= r->start &&
+		    zorro_resource_end(z) <= r->end)
+			return r;
+	}
+	return &iomem_resource;
+}
+
+
+
+static int __init amiga_zorro_probe(struct platform_device *pdev)
+{
+	struct zorro_bus *bus;
+	struct zorro_dev_init *zi;
+	struct zorro_dev *z;
+	struct resource *r;
+	unsigned int i;
+	int error;
+
+	/* Initialize the Zorro bus */
+	bus = kzalloc(struct_size(bus, devices, zorro_num_autocon),
+		      GFP_KERNEL);
+	if (!bus)
+		return -ENOMEM;
+
+	zorro_autocon = bus->devices;
+	bus->dev.parent = &pdev->dev;
+	dev_set_name(&bus->dev, zorro_bus_type.name);
+	error = device_register(&bus->dev);
+	if (error) {
+		pr_err("Zorro: Error registering zorro_bus\n");
+		put_device(&bus->dev);
+		kfree(bus);
+		return error;
+	}
+	platform_set_drvdata(pdev, bus);
+
+	pr_info("Zorro: Probing AutoConfig expansion devices: %u device%s\n",
+		 zorro_num_autocon, zorro_num_autocon == 1 ? "" : "s");
+
+	/* First identify all devices ... */
+	for (i = 0; i < zorro_num_autocon; i++) {
+		zi = &zorro_autocon_init[i];
+		z = &zorro_autocon[i];
+
+		z->rom = zi->rom;
+		z->id = (be16_to_cpu(z->rom.er_Manufacturer) << 16) |
+			(z->rom.er_Product << 8);
+		if (z->id == ZORRO_PROD_GVP_EPC_BASE) {
+			/* GVP quirk */
+			unsigned long magic = zi->boardaddr + 0x8000;
+
+			z->id |= *(u16 *)ZTWO_VADDR(magic) & GVP_PRODMASK;
+		}
+		z->slotaddr = zi->slotaddr;
+		z->slotsize = zi->slotsize;
+		sprintf(z->name, "Zorro device %08x", z->id);
+		zorro_name_device(z);
+		z->resource.start = zi->boardaddr;
+		z->resource.end = zi->boardaddr + zi->boardsize - 1;
+		z->resource.name = z->name;
+		r = zorro_find_parent_resource(pdev, z);
+		error = request_resource(r, &z->resource);
+		if (error)
+			dev_err(&bus->dev,
+				"Address space collision on device %s %pR\n",
+				z->name, &z->resource);
+		z->dev.parent = &bus->dev;
+		z->dev.bus = &zorro_bus_type;
+		z->dev.id = i;
+		switch (z->rom.er_Type & ERT_TYPEMASK) {
+		case ERT_ZORROIII:
+			z->dev.coherent_dma_mask = DMA_BIT_MASK(32);
+			break;
+
+		case ERT_ZORROII:
+		default:
+			z->dev.coherent_dma_mask = DMA_BIT_MASK(24);
+			break;
+		}
+		z->dev.dma_mask = &z->dev.coherent_dma_mask;
+	}
+
+	/* ... then register them */
+	for (i = 0; i < zorro_num_autocon; i++) {
+		z = &zorro_autocon[i];
+		error = device_register(&z->dev);
+		if (error) {
+			dev_err(&bus->dev, "Error registering device %s\n",
+				z->name);
+			put_device(&z->dev);
+			continue;
+		}
+	}
+
+	/* Mark all available Zorro II memory */
+	zorro_for_each_dev(z) {
+		if (z->rom.er_Type & ERTF_MEMLIST)
+			mark_region(zorro_resource_start(z),
+				    zorro_resource_end(z)+1, 1);
+	}
+
+	/* Unmark all used Zorro II memory */
+	for (i = 0; i < m68k_num_memory; i++)
+		if (m68k_memory[i].addr < 16*1024*1024)
+			mark_region(m68k_memory[i].addr,
+				    m68k_memory[i].addr+m68k_memory[i].size,
+				    0);
+
+	return 0;
+}
+
+static struct platform_driver amiga_zorro_driver = {
+	.driver   = {
+		.name	= "amiga-zorro",
+	},
+};
+
+static int __init amiga_zorro_init(void)
+{
+	return platform_driver_probe(&amiga_zorro_driver, amiga_zorro_probe);
+}
+
+module_init(amiga_zorro_init);
+
+MODULE_LICENSE("GPL");
diff --git a/drivers/zorro/zorro.h b/drivers/zorro/zorro.h
new file mode 100644
index 0000000..ac0bab3
--- /dev/null
+++ b/drivers/zorro/zorro.h
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifdef CONFIG_ZORRO_NAMES
+extern void zorro_name_device(struct zorro_dev *z);
+#else
+static inline void zorro_name_device(struct zorro_dev *dev) { }
+#endif
+
+extern const struct attribute_group *zorro_device_attribute_groups[];
diff --git a/drivers/zorro/zorro.ids b/drivers/zorro/zorro.ids
new file mode 100644
index 0000000..119abea
--- /dev/null
+++ b/drivers/zorro/zorro.ids
@@ -0,0 +1,474 @@
+#
+#	List of Zorro IDs
+#
+#	Maintained by Geert Uytterhoeven <zorro@linux-m68k.org>
+#	If you have any new entries, please send them to the maintainer.
+#
+
+# Manufacturers and Products. Please keep sorted.
+
+# Syntax:
+# manufacturer  manufacturer_name
+#	product  product_name				<-- single tab
+
+00d3  Pacific Peripherals
+	0000  SE 2000 A500 [HD Controller]
+	0a00  [SCSI Host Adapter]
+00dd  Kupke
+	0000  Golem RAM Box 2MB [RAM Expansion]
+0100  MacroSystems USA
+# The Stormbringer is actually made by Memphis
+	0000  Stormbringer [Accelerator]
+	1300  Warp Engine [Accelerator, SCSI Host Adapter and RAM Expansion]
+0200  3-State
+	0200  Megamix 2000 [RAM Expansion]
+0201  Commodore Braunschweig
+	0100  A2088 XT/A2286 AT [ISA Bus Bridge]
+	0200  A2286 AT [ISA Bus Bridge]
+	5400  A4091 [SCSI Host Adapter]
+	6700  A2386-SX [ISA Bus Bridge]
+0202  Commodore West Chester
+	0100  A2090/A2090A [SCSI Host Adapter]
+	0200  A590/A2091 [SCSI Host Adapter]
+	0300  A590/A2091 [SCSI Host Adapter]
+	0400  A2090B 2090 Autoboot [SCSI Host Adapter]
+	0900  A2060 [ArcNet Card]
+	0a00  A590/A2052/A2058/A2091 [RAM Expansion]
+	2000  A560 [RAM Expansion]
+	4500  A2232 Prototype [Multi I/O]
+	4600  A2232 [Multi I/O]
+	5000  A2620 68020 [Accelerator and RAM Expansion]
+	5100  A2630 68030 [Accelerator and RAM Expansion]
+	5400  A4091 [SCSI Host Adapter]
+	5a00  A2065 [Ethernet Card]
+	6000  Romulator Card
+	6100  A3000 Test Fixture [Miscellaneous Expansion Card]
+	6700  A2386-SX [ISA Bus Bridge]
+	7000  A2065 [Ethernet Card]
+0203  Commodore West Chester
+	0300  A2090/A2090A Combitec/MacroSystem [SCSI Host Adapter]
+02f4  Progressive Peripherals & Systems
+	0200  EXP8000 [RAM Expansion]
+	6900  A2000 68040 [Accelerator]
+	9600  68040 [Accelerator]
+02ff  Kolff Computer Supplies
+	0000  KCS Power PC [ISA Bus Bridge]
+03ec  Cardco Ltd.
+	0400  Kronos 2000 [SCSI Host Adapter]
+	0c00  A1000 [SCSI Host Adapter]
+	0e00  Escort [SCSI Host Adapter]
+	f500  A2410 HiRes [Graphics Card]
+03ed  A-Squared
+	0100  Live! 2000 [Video Card]
+03ee  Comspec Communications
+	0100  AX2000 [RAM Expansion]
+03f1  Anakin Research
+	0100  Easyl Drawing Tablet Interface
+03f2  Microbotics
+	0000  StarBoard II [RAM Expansion]
+	0200  StarDrive [SCSI Host Adapter]
+	0300  8-Up (Rev A) [RAM Expansion]
+	0400  8-Up (Rev Z) [RAM Expansion]
+	2000  Delta [RAM Expansion]
+	4000  8-Star [RAM Expansion]
+	4100  8-Star [Miscellaneous Expansion Card]
+	4400  VXL RAM*32 [RAM Expansion]
+	4500  VXL-30 [Accelerator]
+	6000  Delta [Miscellaneous Expansion Card]
+	8100  MBX 1200/1200z [RAM Expansion]
+	9600  Hardframe 2000 [SCSI Host Adapter]
+	9e00  Hardframe 2000 [SCSI Host Adapter]
+	c100  MBX 1200/1200z [Miscellaneous Expansion Card]
+03f4  Access Associates Alegra
+03f6  Expansion Technologies/Pacific Cypress
+03ff  ASDG
+	0100  [RAM Expansion]
+	0200  [RAM Expansion]
+	fe00  EB-920 Lan Rover [Ethernet Card]
+	ff00  GPIB/Dual IEEE-488/Twin-X [Multi I/O]
+0404  Ronin/Imtronics
+	3900  Hurricane 2800 [Accelerator and RAM Expansion]
+	5700  Hurricane 2800 [Accelerator and RAM Expansion]
+0406  Commodore/University of Lowell
+	0000  A2410 HiRes [Graphics Card]
+041d  Ameristar
+	0100  A2065 [Ethernet Card]
+	0900  A560 [ArcNet Card]
+	0a00  A4066 [Ethernet Card]
+	2000  1600-GX [Graphics Card]
+0420  Supra
+	0100  SupraDrive 4x4 [SCSI Host Adapter]
+	0200  1000 [RAM Expansion]
+	0300  2000 DMA [SCSI Host Adapter]
+	0500  500 [SCSI Host Adapter and RAM Expansion]
+	0800  500 [SCSI Host Adapter]
+	0900  500XP/2000 [RAM Expansion]
+	0a00  500RX/2000 [RAM Expansion]
+	0b00  2400zi [Modem]
+	0c00  500XP/SupraDrive WordSync [SCSI Host Adapter]
+	0d00  SupraDrive WordSync II [SCSI Host Adapter]
+	1000  2400zi+ [Modem]
+0422  Computer Systems Associates
+	1100  Magnum 40 [Accelerator and SCSI Host Adapter]
+	1500  12 Gauge [SCSI Host Adapter]
+0439  Marc Michael Groth
+0502  M-Tech
+	0300  AT500 [RAM Expansion]
+06e1  Great Valley Products
+	0800  Impact Series I [SCSI Host Adapter and RAM Expansion]
+	2000  Impact Vision 24 [Graphics Card]
+07da  ByteBox
+	0000  A500
+07db  Hacker Test Board
+07dc  DKB/Power Computing
+	0900  SecureKey
+	0e00  DKM 3128 [RAM Expansion]
+	0f00  Rapid Fire [SCSI Host Adapter]
+	1000  DKM 1202 [FPU and RAM Expansion]
+	1200  Cobra/Viper II 68EC030 [Accelerator]
+	1700  WildFire 060 [Accelerator]
+	ff00  WildFire 060 [Accelerator]
+07e1  Great Valley Products
+	0100  Impact Series I (4K) [SCSI Host Adapter]
+	0200  Impact Series I (16K/2) [SCSI Host Adapter]
+	0300  Impact Series I (16K/2) [SCSI Host Adapter]
+	0800  Impact 3001 [IDE Interface]
+	0900  Impact 3001 [RAM Expansion]
+	0a00  Impact Series II [RAM Expansion]
+	0b20  GForce 040 [Accelerator]
+	0b30  GForce 040 [Accelerator and SCSI Host Adapter]
+	0b40  A1291 [SCSI Host Adapter]
+	0b60  Combo 030 R4 [Accelerator]
+	0b70  Combo 030 R4 [Accelerator and SCSI Host Adapter]
+	0b78  Phone Pak
+	0b98  IO-Extender [Multi I/O]
+	0ba0  GForce 030 [Accelerator]
+	0bb0  GForce 030 [Accelerator and SCSI Host Adapter]
+	0bc0  A530 [Accelerator]
+	0bd0  A530 [Accelerator and SCSI Host Adapter]
+	0be0  Combo 030 R3 [Accelerator]
+	0bf0  Combo 030 R3 [Accelerator and SCSI Host Adapter]
+	0bf8  Series-II [SCSI Host Adapter]
+	0d00  Impact 3001 [IDE Interface]
+	1600  GForce 040/060 [Accelerator and SCSI Host Adapter]
+	2000  Impact Vision 24 [Graphics Card]
+	4400  Rembrandt [Graphics Card]
+	ff00  GForce 040 [Accelerator]
+07e5  California Access/Synergy
+	0100  Malibu [SCSI Host Adapter]
+07e6  Xetec
+	0100  FastCard [SCSI Host Adapter]
+	0200  FastCard [RAM Expansion]
+	0300  FastCard Plus [SCSI Host Adapter]
+07ea  Progressive Peripherals & Systems
+	0000  Mercury [Accelerator]
+	0100  A3000 68040 [Accelerator]
+	6900  A2000 68040 [Accelerator]
+	9600  Zeus [Accelerator, SCSI Host Adapter and RAM Expansion]
+	bb00  A500 68040 [Accelerator]
+# The AteoBus and Pixel64 are actually made by Ateo Concepts
+	fc00  AteoBus [Expansion Bus Bridge]
+	fe00  Pixel64 [Graphics Card]
+	ff00  Pixel64 RAM [Graphics Card]
+07ec  Xebec
+07f2  Spirit Technology
+	0100  Insider IN1000 [RAM Expansion]
+	0200  Insider IN500 [RAM Expansion]
+	0300  SIN500 [RAM Expansion]
+	0400  HDA 506 [HD Controller]
+	0500  AX-S [Miscellaneous Expansion Card]
+	0600  OctaByte [RAM Expansion]
+	0800  Inmate [SCSI Host Adapter and RAM Expansion]
+07f3  Spirit Technology
+07fe  BSC/Alfadata
+	0300  ALF 3 [SCSI Host Adapter]
+0801  BSC/Alfadata
+	0100  ALF 2 [SCSI Host Adapter]
+	0200  ALF 2 [SCSI Host Adapter]
+	0300  ALF 3 [SCSI Host Adapter]
+	0400  Oktagon 500 [SCSI Host Adapter]
+	0600  Tandem AT-2008/508 [IDE Interface]
+	0800  Oktagon 2008 [RAM Expansion]
+	1000  MultiFace I [Multi I/O]
+	2000  FrameMaster II [Graphics Card]
+	4000  ISDN MasterCard [ISDN Interface]
+0802  Cardco Ltd.
+	0400  Kronos 2000 [SCSI Host Adapter]
+	0c00  A1000 [SCSI Host Adapter]
+0804  Jochheim
+	0100  [RAM Expansion]
+	2000  [RAM Expansion]
+0807  Checkpoint Technologies
+	0000  Serial Solution [Multi Serial]
+0810  Edotronik
+	0100  IEEE-488 Interface Card
+	0200  CBM-8032 Card
+	0300  [Multi Serial]
+	0400  24Bit Realtime Video Digitizer
+	0500  32Bit Parallel I/O Interface
+	0600  PIC Prototyping Card
+	0700  16 Channel ADC Interface
+	0800  VME-Bus Controller
+	0900  DSP96000 Realtime Data Acquisition DSP Card
+0813  NES Inc.
+	0000  [RAM Expansion]
+0817  ICD
+	0100  Advantage 2000 [SCSI Host Adapter]
+	0300  Advantage [IDE Interface]
+	0400  Advantage 2080 [RAM Expansion]
+0819  Kupke
+	0100  Omti [HD Controller]
+	0200  Golem SCSI-II [SCSI Host Adapter]
+	0300  Golem Box
+	0400  030/882 [Accelerator]
+	0500  Golem [SCSI Host Adapter]
+081d  Great Valley Products
+	0900  A2000-RAM8/2 [Miscellaneous Expansion Card]
+	0a00  Impact Series II [RAM Expansion]
+081e  Interworks Network
+0820  Hardital Synthesis
+	0100  Super Big Bang [Accelerator, SCSI Host Adapter and RAM Expansion]
+	1400  TQM 68030+68882 [Accelerator]
+0828  Applied Engineering
+	1000  DL2000 [Modem]
+	e000  RAM Works [RAM Expansion]
+082c  BSC/Alfadata
+	0400  Oktagon 500 [SCSI Host Adapter]
+	0500  Oktagon 2008 [SCSI Host Adapter]
+	0600  Tandem AT-2008/508 [IDE Interface]
+	0700  Alpha 1200 [RAM Expansion]
+	0800  Oktagon 2008 [RAM Expansion]
+	1000  MultiFace I [Multi I/O]
+	1100  MultiFace II [Multi I/O]
+	1200  MultiFace III [Multi I/O]
+	2000  FrameMaster II [Graphics Card]
+	2100  Graffiti RAM [Graphics Card]
+	2200  Graffiti [Graphics Card]
+	4000  ISDN MasterCard [ISDN Interface]
+	4100  ISDN MasterCard II [ISDN Interface]
+0835  Phoenix
+	2100  ST506 [HD Controller]
+	2200  [SCSI Host Adapter]
+	be00  [RAM Expansion]
+0836  Advanced Storage Systems
+	0100  Nexus [SCSI Host Adapter]
+	0800  Nexus [RAM Expansion]
+0838  Impulse
+	0000  FireCracker 24 (NTSC) [Graphics Card]
+	0100  FireCracker 24 (PAL) [Graphics Card]
+0840  IVS
+	0200  GrandSlam PIC 2 [RAM Expansion]
+	0400  GrandSlam PIC 1 [RAM Expansion]
+	1000  OverDrive [HD Controller]
+	3000  TrumpCard Classic [SCSI Host Adapter]
+	3400  TrumpCard Pro/GrandSlam [SCSI Host Adapter]
+	4000  Meta-4 [RAM Expansion]
+	bf00  Wavetools [Audio Card]
+	f300  Vector [SCSI Host Adapter]
+	f400  Vector [SCSI Host Adapter]
+0841  Vector
+	e300  Connection [Multi I/O]
+0845  XPert ProDev
+	0100  Visiona RAM [Graphics Card]
+	0200  Visiona [Graphics Card]
+	0300  Merlin RAM [Graphics Card]
+	0400  Merlin [Graphics Card]
+	c900  Merlin [Graphics Card]
+0849  Hydra Systems
+	0100  Amiganet [Ethernet Card]
+084f  Sunrize Industries
+	0100  AD1012 [Audio Card]
+	0200  AD516 [Audio Card]
+	0300  DD512 [Audio Card]
+0850  Triceratops
+	0100  [Multi I/O]
+0851  Applied Magic Inc.
+	0100  DMI Resolver [Graphics Card]
+	0200  Vivid 24 [Graphics Card]
+	0600  Digital Broadcaster [Video Card]
+085e  GFX-Base
+	0000  GDA-1 VRAM [Graphics Card]
+	0100  GDA-1 [Graphics Card]
+0860  RocTec
+	0100  RH 800C [HD Controller]
+	0200  RH 800C [RAM Expansion]
+0861  Kato
+# The Rainbow II and III are actually made by Ingenieurbüro Helfrich
+	2000  Rainbow II [Graphics Card]
+	2100  Rainbow III [Graphics Card]
+	8000  Melody MPEG [Audio Card]
+0862  Atlantis
+0864  Protar
+0865  ACS
+0866  Software Results Enterprises
+	0100  Golden Gate 2 Bus+ [ISA Bus Bridge]
+086a  Unknown
+	0100  Horizon [Graphics Card]
+	0200  Blackbox [Graphics Card]
+	0300  Voyager [Graphics Card]
+086d  Masoboshi
+	0300  MasterCard SC201 [RAM Expansion]
+	0400  MasterCard MC702 [SCSI Host Adapter and IDE Interface]
+	0700  MVD 819
+086f  Mainhattan-Data/A-Team
+	0100  [IDE Interface]
+0877  Village Tronic
+	0100  Domino RAM [Graphics Card]
+	0200  Domino [Graphics Card]
+	0300  Domino 16M Prototype [Graphics Card]
+	0b00  Picasso II/II+ RAM [Graphics Card]
+	0c00  Picasso II/II+ [Graphics Card]
+	0d00  Picasso II/II+ (Segmented Mode) [Graphics Card]
+	1500  Picasso IV Z2 RAM [Graphics Card]
+	1600  Picasso IV Z2 RAM [Graphics Card]
+	1700  Picasso IV Z2 [Graphics Card]
+	1800  Picasso IV Z3 [Graphics Card]
+	c900  Ariadne [Ethernet Card and Parallel Ports]
+	ca00  Ariadne II [Ethernet Card]
+087b  Utilities Unlimited
+	1500  Emplant Deluxe [Macintosh Emulator]
+	2000  Emplant Deluxe [Macintosh Emulator]
+0880  Amitrix
+	0100  [Multi I/O]
+	0200  CD-RAM [RAM Expansion]
+0885  ArMax
+	0000  OmniBus [Graphics Card]
+088d  ZEUS Electronic Development
+	0300  [ISDN Interface]
+	0400  Spider [Video Card]
+088f  NewTek
+	0000  VideoToaster [Video Card]
+0890  M-Tech Germany
+	0100  AT500 [IDE Interface]
+	0300  68030 [Accelerator]
+	0600  68020i [Accelerator]
+	2000  A1200 T68030 RTC [Accelerator]
+	2100  Viper Mk V/E-Matrix 530 [Accelerator and RAM Expansion]
+	2200  8MB [RAM Expansion]
+	2400  Viper Mk V/E-Matrix 530 [SCSI Host Adapter and IDE Interface]
+0891  Great Valley Products
+	0100  EGS 28/24 Spectrum RAM [Graphics Card]
+	0200  EGS 28/24 Spectrum [Graphics Card]
+0892  Apollo
+	0100  A1200 [FPU and RAM Expansion]
+0893  Ingenieurbüro Helfrich
+	0500  Piccolo RAM [Graphics Card]
+	0600  Piccolo [Graphics Card]
+	0700  PeggyPlus MPEG [Video Card]
+	0800  VideoCruncher [Video Card]
+	0a00  Piccolo SD64 RAM [Graphics Card]
+	0b00  Piccolo SD64 [Graphics Card]
+089b  MacroSystems USA
+	1300  Warp Engine 40xx [Accelerator, SCSI Host Adapter and RAM Expansion]
+089e  ElBox Computer
+	0600  1200/4 [RAM Expansion]
+	0800  FastATA 1200 [IDE Interface]
+	1200  FastATA 1200 [IDE Interface]
+	1300  FastATA 1200 [IDE Interface]
+	1800  FastATA 1200 [IDE Interface]
+	1900  FastATA 4000 [IDE Interface]
+	1d00  FastATA 4000 [IDE Interface]
+	1e00  FastATA ZIV [IDE Interface]
+0a00  Harms Professional
+	1000  030 Plus [Accelerator]
+	d000  3500 Professional [Accelerator and RAM Expansion]
+0a50  Micronik
+	0a00  RCA 120 [RAM Expansion]
+0f0f  Micronik
+	0100  Z3i A1200 [Zorro III Extender and SCSI Host Adapter]
+1000  MegaMicro
+	0300  SCRAM 500 [SCSI Host Adapter]
+	0400  SCRAM 500 [RAM Expansion]
+1028  Ronin/Imtronics
+	3900  Hurricane 2800 [Accelerator and RAM Expansion]
+	5700  Hurricane 2800 [Accelerator and RAM Expansion]
+102f  Ateo Concepts
+	fc00  AteoBus [Expansion Bus Bridge]
+	fe00  Pixel64 [Graphics Card]
+	ff00  Pixel64 RAM [Graphics Card]
+1212  Individual Computers
+	0000  Buddha [IDE Interface]
+	1700  X-Surf [Ethernet Card and IDE Interface]
+	2a00  Catweasel [IDE Interface and Floppy Controller]
+1248  Kupke
+	0100  Golem HD 3000 [HD Controller]
+1267  RBM-Computertechnik
+	0100  IOBlix [Multi I/O]
+1388  ITH
+	0100  ISDN-Master II [ISDN Interface]
+1389  VMC
+	0100  ISDN Blaster Z2 [ISDN Interface]
+	0200  HyperCom 4 [Multi I/O]
+	0600  HyperCom 4+ [Multi I/O]
+157c  Information
+	6400  ISDN Engine I [ISDN Interface]
+2017  Vortex
+	0700  Golden Gate 80386SX [ISA Bus Bridge]
+	0800  Golden Gate [RAM Expansion]
+	0900  Golden Gate 80486 [ISA Bus Bridge]
+2062  Expansion Systems
+	0100  DataFlyer 4000SX [SCSI Host Adapter]
+	0200  DataFlyer 4000SX [RAM Expansion]
+2100  ReadySoft
+	0100  AMax II/IV [Macintosh Emulator]
+2140  Phase 5
+	0100  Blizzard [RAM Expansion]
+	0200  Blizzard [Accelerator]
+	0600  Blizzard 1220-IV [Accelerator]
+	0a00  FastLane Z3 [RAM Expansion]
+	0b00  Blizzard 1230-II/Fastlane Z3/CyberSCSI/CyberStorm060 [Accelerator and/or SCSI Host Adapter]
+	0c00  Blizzard 1220/CyberStorm [Accelerator and SCSI Host Adapter]
+	0d00  Blizzard 1230 [Accelerator]
+	1100  Blizzard 1230-IV/1260 [Accelerator]
+	1800  Blizzard 2060 [Accelerator]
+	1900  CyberStorm Mk II [Flash ROM]
+	2200  CyberVision64 [Graphics Card]
+	3200  CyberVision64-3D Prototype [Graphics Card]
+	4300  CyberVision64-3D [Graphics Card]
+	6400  CyberStorm Mk III [Accelerator and SCSI Host Adapter]
+	6e00  Blizzard 603e+ [Accelerator and SCSI Host Adapter]
+2169  DPS
+	0100  Personal Animation Recorder [Video Card]
+2200  Apollo
+	0000  A620 68020 [Accelerator]
+	0100  A620 68020 [Accelerator]
+2222  Apollo
+	2200  AT-Apollo
+	2300  1230/1240/1260/2030/4040/4060 [Accelerator]
+38a5  Petsoff LP
+	0000  Delfina [Audio Card]
+	0100  Delfina Lite [Audio Card]
+	0200  Delfina Plus [Audio Card]
+3ff7  Uwe Gerlach
+	d400  RAM/ROM [Miscellaneous Expansion Card]
+4231  ACT
+	0100  Prelude [Audio Card]
+4754  MacroSystems Germany
+	0300  Maestro [Audio Card]
+	0400  VLab [Video Card]
+	0500  Maestro Pro [Audio Card]
+	0600  Retina [Graphics Card]
+	0800  MultiEvolution [SCSI Host Adapter]
+	0c00  Toccata [Audio Card]
+	0d00  Toccata Pro [Audio Card]
+	1000  Retina Z3 [Graphics Card]
+	1200  VLab Motion [Video Card]
+	1300  Altais [Graphics Card]
+	fd00  Falcon '040 [Accelerator]
+6766  Combitec
+8000  SKI Peripherals
+	0800  MAST Fireball [SCSI Host Adapter]
+	8000  [SCSI Host Adapter and Dual Serial Card]
+a9ad  Reis-Ware
+	1100  Scan King [Scanner Interface]
+aa01  Cameron
+	1000  Personal A4 [Scanner Interface]
+aa11  Reis-Ware
+	1100  Handyscanner [Scanner Interface]
+b5a8  Phoenix
+	2100  ST506 [HD Controller]
+	2200  [SCSI Host Adapter]
+	be00  [RAM Expansion]
+c008  Combitec
+	2a00  [HD Controller]
+	2b00  SRAM [RAM Expansion]