Linux-2.6.12-rc2

Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.

Let it rip!
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..f621726
--- /dev/null
+++ b/drivers/zorro/Makefile
@@ -0,0 +1,21 @@
+#
+# Makefile for the Zorro bus specific drivers.
+#
+
+obj-$(CONFIG_ZORRO)	+= zorro.o zorro-driver.o zorro-sysfs.o names.o
+obj-$(CONFIG_PROC_FS)	+= proc.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..16fe206
--- /dev/null
+++ b/drivers/zorro/gen-devlist.c
@@ -0,0 +1,107 @@
+/*
+ *	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..0dd532d
--- /dev/null
+++ b/drivers/zorro/names.c
@@ -0,0 +1,109 @@
+/*
+ *	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/config.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/zorro.h>
+
+
+#ifdef CONFIG_ZORRO_NAMES
+
+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, sizeof(__prods_##manuf) / sizeof(struct zorro_prod_info), __manufstr_##manuf, __prods_##manuf },
+#define ENDMANUF()
+#define PRODUCT( manuf, prod, name )
+#include "devlist.h"
+};
+
+#define MANUFS (sizeof(zorro_manuf_list)/sizeof(struct zorro_manuf_info))
+
+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 */
+	sprintf(name, "Zorro device %08x", dev->id);
+	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);
+		}
+	}
+}
+
+#else
+
+void __init zorro_name_device(struct zorro_dev *dev)
+{
+}
+
+#endif
diff --git a/drivers/zorro/proc.c b/drivers/zorro/proc.c
new file mode 100644
index 0000000..1a409c2
--- /dev/null
+++ b/drivers/zorro/proc.c
@@ -0,0 +1,139 @@
+/*
+ *	$Id: proc.c,v 1.1.2.1 1998/06/07 23:21:01 geert Exp $
+ *
+ *	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/init.h>
+#include <linux/smp_lock.h>
+#include <asm/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)
+{
+	loff_t new = -1;
+
+	lock_kernel();
+	switch (whence) {
+	case 0:
+		new = off;
+		break;
+	case 1:
+		new = file->f_pos + off;
+		break;
+	case 2:
+		new = sizeof(struct ConfigDev) + off;
+		break;
+	}
+	if (new < 0 || new > sizeof(struct ConfigDev)) {
+		unlock_kernel();
+		return -EINVAL;
+	}
+	unlock_kernel();
+	return (file->f_pos = new);
+}
+
+static ssize_t
+proc_bus_zorro_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos)
+{
+	struct inode *ino = file->f_dentry->d_inode;
+	struct proc_dir_entry *dp = PDE(ino);
+	struct zorro_dev *z = dp->data;
+	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 = z->slotaddr;
+	cd.cd_SlotSize = z->slotsize;
+	cd.cd_BoardAddr = (void *)zorro_resource_start(z);
+	cd.cd_BoardSize = zorro_resource_len(z);
+
+	if (copy_to_user(buf, &cd, nbytes))
+		return -EFAULT;
+	*ppos += nbytes;
+
+	return nbytes;
+}
+
+static struct file_operations proc_bus_zorro_operations = {
+	.llseek		= proc_bus_zorro_lseek,
+	.read		= proc_bus_zorro_read,
+};
+
+static int
+get_zorro_dev_info(char *buf, char **start, off_t pos, int count)
+{
+	u_int slot;
+	off_t at = 0;
+	int len, cnt;
+
+	for (slot = cnt = 0; slot < zorro_num_autocon && count > cnt; slot++) {
+		struct zorro_dev *z = &zorro_autocon[slot];
+		len = sprintf(buf, "%02x\t%08x\t%08lx\t%08lx\t%02x\n", slot,
+			      z->id, zorro_resource_start(z),
+			      zorro_resource_len(z), z->rom.er_Type);
+		at += len;
+		if (at >= pos) {
+			if (!*start) {
+				*start = buf + (pos - (at - len));
+				cnt = at - pos;
+			} else
+				cnt += len;
+			buf += len;
+		}
+	}
+	return (count > cnt) ? cnt : count;
+}
+
+static struct proc_dir_entry *proc_bus_zorro_dir;
+
+static int __init zorro_proc_attach_device(u_int slot)
+{
+	struct proc_dir_entry *entry;
+	char name[4];
+
+	sprintf(name, "%02x", slot);
+	entry = create_proc_entry(name, 0, proc_bus_zorro_dir);
+	if (!entry)
+		return -ENOMEM;
+	entry->proc_fops = &proc_bus_zorro_operations;
+	entry->data = &zorro_autocon[slot];
+	entry->size = sizeof(struct zorro_dev);
+	return 0;
+}
+
+static int __init zorro_proc_init(void)
+{
+	u_int slot;
+
+	if (MACH_IS_AMIGA && AMIGAHW_PRESENT(ZORRO)) {
+		proc_bus_zorro_dir = proc_mkdir("zorro", proc_bus);
+		create_proc_info_entry("devices", 0, proc_bus_zorro_dir,
+				       get_zorro_dev_info);
+		for (slot = 0; slot < zorro_num_autocon; slot++)
+			zorro_proc_attach_device(slot);
+	}
+	return 0;
+}
+
+__initcall(zorro_proc_init);
diff --git a/drivers/zorro/zorro-driver.c b/drivers/zorro/zorro-driver.c
new file mode 100644
index 0000000..ccba227
--- /dev/null
+++ b/drivers/zorro/zorro-driver.c
@@ -0,0 +1,150 @@
+/*
+ *  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>
+
+
+    /**
+     *  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;
+}
+
+
+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;
+}
+
+
+    /**
+     *  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 the number of Zorro devices which were claimed by the driver
+     *  during registration.  The driver remains registered even if the
+     *  return value is zero.
+     */
+
+int zorro_register_driver(struct zorro_driver *drv)
+{
+	int count = 0;
+
+	/* initialize common driver fields */
+	drv->driver.name = drv->name;
+	drv->driver.bus = &zorro_bus_type;
+	drv->driver.probe = zorro_device_probe;
+
+	/* register with core */
+	count = driver_register(&drv->driver);
+	return count ? count : 1;
+}
+
+
+    /**
+     *  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);
+}
+
+
+    /**
+     *  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;
+}
+
+
+struct bus_type zorro_bus_type = {
+	.name	= "zorro",
+	.match	= zorro_bus_match
+};
+
+
+static int __init zorro_driver_init(void)
+{
+	return bus_register(&zorro_bus_type);
+}
+
+postcore_initcall(zorro_driver_init);
+
+EXPORT_SYMBOL(zorro_match_device);
+EXPORT_SYMBOL(zorro_register_driver);
+EXPORT_SYMBOL(zorro_unregister_driver);
+EXPORT_SYMBOL(zorro_dev_driver);
+EXPORT_SYMBOL(zorro_bus_type);
diff --git a/drivers/zorro/zorro-sysfs.c b/drivers/zorro/zorro-sysfs.c
new file mode 100644
index 0000000..dad03fc
--- /dev/null
+++ b/drivers/zorro/zorro-sysfs.c
@@ -0,0 +1,98 @@
+/*
+ *  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 "zorro.h"
+
+
+/* show configuration fields */
+#define zorro_config_attr(name, field, format_string)			\
+static ssize_t								\
+show_##name(struct device *dev, char *buf)				\
+{									\
+	struct zorro_dev *z;						\
+									\
+	z = to_zorro_dev(dev);						\
+	return sprintf(buf, format_string, z->field);			\
+}									\
+static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL);
+
+zorro_config_attr(id, id, "0x%08x\n");
+zorro_config_attr(type, rom.er_Type, "0x%02x\n");
+zorro_config_attr(serial, rom.er_SerialNumber, "0x%08x\n");
+zorro_config_attr(slotaddr, slotaddr, "0x%04x\n");
+zorro_config_attr(slotsize, slotsize, "0x%04x\n");
+
+static ssize_t zorro_show_resource(struct device *dev, char *buf)
+{
+	struct zorro_dev *z = to_zorro_dev(dev);
+
+	return sprintf(buf, "0x%08lx 0x%08lx 0x%08lx\n",
+		       zorro_resource_start(z), zorro_resource_end(z),
+		       zorro_resource_flags(z));
+}
+
+static DEVICE_ATTR(resource, S_IRUGO, zorro_show_resource, NULL);
+
+static ssize_t zorro_read_config(struct kobject *kobj, char *buf, loff_t off,
+				 size_t count)
+{
+	struct zorro_dev *z = to_zorro_dev(container_of(kobj, struct device,
+					   kobj));
+	struct ConfigDev cd;
+	unsigned int size = sizeof(cd);
+
+	if (off > size)
+		return 0;
+	if (off+count > size)
+		count = size-off;
+
+	/* Construct a ConfigDev */
+	memset(&cd, 0, sizeof(cd));
+	cd.cd_Rom = z->rom;
+	cd.cd_SlotAddr = z->slotaddr;
+	cd.cd_SlotSize = z->slotsize;
+	cd.cd_BoardAddr = (void *)zorro_resource_start(z);
+	cd.cd_BoardSize = zorro_resource_len(z);
+
+	memcpy(buf, (void *)&cd+off, count);
+	return count;
+}
+
+static struct bin_attribute zorro_config_attr = {
+	.attr =	{
+		.name = "config",
+		.mode = S_IRUGO | S_IWUSR,
+		.owner = THIS_MODULE
+	},
+	.size = sizeof(struct ConfigDev),
+	.read = zorro_read_config,
+};
+
+void zorro_create_sysfs_dev_files(struct zorro_dev *z)
+{
+	struct device *dev = &z->dev;
+
+	/* current configuration's attributes */
+	device_create_file(dev, &dev_attr_id);
+	device_create_file(dev, &dev_attr_type);
+	device_create_file(dev, &dev_attr_serial);
+	device_create_file(dev, &dev_attr_slotaddr);
+	device_create_file(dev, &dev_attr_slotsize);
+	device_create_file(dev, &dev_attr_resource);
+	sysfs_create_bin_file(&dev->kobj, &zorro_config_attr);
+}
+
diff --git a/drivers/zorro/zorro.c b/drivers/zorro/zorro.c
new file mode 100644
index 0000000..d3c05df
--- /dev/null
+++ b/drivers/zorro/zorro.c
@@ -0,0 +1,193 @@
+/*
+ *    $Id: zorro.c,v 1.1.2.1 1998/06/07 23:21:02 geert Exp $
+ *
+ *    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 <asm/setup.h>
+#include <asm/amigahw.h>
+
+#include "zorro.h"
+
+
+    /*
+     *  Zorro Expansion Devices
+     */
+
+u_int zorro_num_autocon = 0;
+struct zorro_dev zorro_autocon[ZORRO_NUM_AUTO];
+
+
+    /*
+     *  Single Zorro bus
+     */
+
+struct zorro_bus zorro_bus = {\
+    .resources = {
+	/* Zorro II regions (on Zorro II/III) */
+	{ .name = "Zorro II exp", .start = 0x00e80000, .end = 0x00efffff },
+	{ .name = "Zorro II mem", .start = 0x00200000, .end = 0x009fffff },
+	/* Zorro III regions (on Zorro III only) */
+	{ .name = "Zorro III exp", .start = 0xff000000, .end = 0xffffffff },
+	{ .name = "Zorro III cfg", .start = 0x40000000, .end = 0x7fffffff }
+    },
+    .name = "Zorro bus"
+};
+
+
+    /*
+     *  Find Zorro Devices
+     */
+
+struct zorro_dev *zorro_find_device(zorro_id id, struct zorro_dev *from)
+{
+    struct zorro_dev *z;
+
+    if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO))
+	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;
+}
+
+
+    /*
+     *  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);
+
+
+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 zorro_dev *z)
+{
+    int i;
+
+    for (i = 0; i < zorro_bus.num_resources; i++)
+	if (zorro_resource_start(z) >= zorro_bus.resources[i].start &&
+	    zorro_resource_end(z) <= zorro_bus.resources[i].end)
+		return &zorro_bus.resources[i];
+    return &iomem_resource;
+}
+
+
+    /*
+     *  Initialization
+     */
+
+static int __init zorro_init(void)
+{
+    struct zorro_dev *z;
+    unsigned int i;
+
+    if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO))
+	return 0;
+
+    pr_info("Zorro: Probing AutoConfig expansion devices: %d device%s\n",
+	   zorro_num_autocon, zorro_num_autocon == 1 ? "" : "s");
+
+    /* Initialize the Zorro bus */
+    INIT_LIST_HEAD(&zorro_bus.devices);
+    strcpy(zorro_bus.dev.bus_id, "zorro");
+    device_register(&zorro_bus.dev);
+
+    /* Request the resources */
+    zorro_bus.num_resources = AMIGAHW_PRESENT(ZORRO3) ? 4 : 2;
+    for (i = 0; i < zorro_bus.num_resources; i++)
+	request_resource(&iomem_resource, &zorro_bus.resources[i]);
+
+    /* Register all devices */
+    for (i = 0; i < zorro_num_autocon; i++) {
+	z = &zorro_autocon[i];
+	z->id = (z->rom.er_Manufacturer<<16) | (z->rom.er_Product<<8);
+	if (z->id == ZORRO_PROD_GVP_EPC_BASE) {
+	    /* GVP quirk */
+	    unsigned long magic = zorro_resource_start(z)+0x8000;
+	    z->id |= *(u16 *)ZTWO_VADDR(magic) & GVP_PRODMASK;
+	}
+	sprintf(z->name, "Zorro device %08x", z->id);
+	zorro_name_device(z);
+	z->resource.name = z->name;
+	if (request_resource(zorro_find_parent_resource(z), &z->resource))
+	    printk(KERN_ERR "Zorro: Address space collision on device %s "
+		   "[%lx:%lx]\n",
+		   z->name, zorro_resource_start(z), zorro_resource_end(z));
+	sprintf(z->dev.bus_id, "%02x", i);
+	z->dev.parent = &zorro_bus.dev;
+	z->dev.bus = &zorro_bus_type;
+	device_register(&z->dev);
+	zorro_create_sysfs_dev_files(z);
+    }
+
+    /* 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;
+}
+
+subsys_initcall(zorro_init);
+
+EXPORT_SYMBOL(zorro_find_device);
+EXPORT_SYMBOL(zorro_unused_z2ram);
+
+MODULE_LICENSE("GPL");
diff --git a/drivers/zorro/zorro.h b/drivers/zorro/zorro.h
new file mode 100644
index 0000000..5c91ada
--- /dev/null
+++ b/drivers/zorro/zorro.h
@@ -0,0 +1,4 @@
+
+extern void zorro_name_device(struct zorro_dev *z);
+extern void zorro_create_sysfs_dev_files(struct zorro_dev *z);
+
diff --git a/drivers/zorro/zorro.ids b/drivers/zorro/zorro.ids
new file mode 100644
index 0000000..5bd4b05d
--- /dev/null
+++ b/drivers/zorro/zorro.ids
@@ -0,0 +1,476 @@
+#
+#	List of Zorro IDs
+#
+#	Maintained by Geert Uytterhoeven <zorro@linux-m68k.org>
+#	If you have any new entries, please send them to the maintainer.
+#
+#	$Id: zorro.ids,v 1.19 2002/10/14 13:08:58 geert Exp $
+#
+
+# 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 Assosiates
+	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]