aboutsummaryrefslogtreecommitdiff
path: root/drivers/zorro
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/zorro')
-rw-r--r--drivers/zorro/Kconfig18
-rw-r--r--drivers/zorro/Makefile21
-rw-r--r--drivers/zorro/gen-devlist.c107
-rw-r--r--drivers/zorro/names.c109
-rw-r--r--drivers/zorro/proc.c139
-rw-r--r--drivers/zorro/zorro-driver.c150
-rw-r--r--drivers/zorro/zorro-sysfs.c98
-rw-r--r--drivers/zorro/zorro.c193
-rw-r--r--drivers/zorro/zorro.h4
-rw-r--r--drivers/zorro/zorro.ids476
10 files changed, 1315 insertions, 0 deletions
diff --git a/drivers/zorro/Kconfig b/drivers/zorro/Kconfig
new file mode 100644
index 00000000000..19bc753a475
--- /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 00000000000..f6217260321
--- /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 00000000000..16fe206f999
--- /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 00000000000..0dd532d3a5d
--- /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 00000000000..1a409c2c320
--- /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 00000000000..ccba227676f
--- /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 00000000000..dad03fc33a4
--- /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 00000000000..d3c05dfe20d
--- /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 00000000000..5c91adac4df
--- /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 00000000000..5bd4b05d4c4
--- /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]