From 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sat, 16 Apr 2005 15:20:36 -0700 Subject: 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! --- drivers/zorro/Kconfig | 18 ++ drivers/zorro/Makefile | 21 ++ drivers/zorro/gen-devlist.c | 107 ++++++++++ drivers/zorro/names.c | 109 ++++++++++ drivers/zorro/proc.c | 139 +++++++++++++ drivers/zorro/zorro-driver.c | 150 ++++++++++++++ drivers/zorro/zorro-sysfs.c | 98 +++++++++ drivers/zorro/zorro.c | 193 ++++++++++++++++++ drivers/zorro/zorro.h | 4 + drivers/zorro/zorro.ids | 476 +++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 1315 insertions(+) create mode 100644 drivers/zorro/Kconfig create mode 100644 drivers/zorro/Makefile create mode 100644 drivers/zorro/gen-devlist.c create mode 100644 drivers/zorro/names.c create mode 100644 drivers/zorro/proc.c create mode 100644 drivers/zorro/zorro-driver.c create mode 100644 drivers/zorro/zorro-sysfs.c create mode 100644 drivers/zorro/zorro.c create mode 100644 drivers/zorro/zorro.h create mode 100644 drivers/zorro/zorro.ids (limited to 'drivers/zorro') diff --git a/drivers/zorro/Kconfig b/drivers/zorro/Kconfig new file mode 100644 index 000000000000..19bc753a4755 --- /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 000000000000..f62172603215 --- /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 000000000000..16fe206f9998 --- /dev/null +++ b/drivers/zorro/gen-devlist.c @@ -0,0 +1,107 @@ +/* + * Generate devlist.h from the Zorro ID file. + * + * (c) 2000 Geert Uytterhoeven + * + * Based on the PCI version: + * + * (c) 1999--2000 Martin Mares + */ + +#include +#include + +#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 000000000000..0dd532d3a5d6 --- /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 +#include +#include +#include +#include + + +#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 000000000000..1a409c2c320c --- /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 + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +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 000000000000..ccba227676f2 --- /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 +#include +#include + + + /** + * 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 000000000000..dad03fc33a44 --- /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 +#include +#include + +#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 000000000000..d3c05dfe20d2 --- /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 +#include +#include +#include +#include +#include +#include +#include + +#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 000000000000..5c91adac4df1 --- /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 000000000000..5bd4b05d4c45 --- /dev/null +++ b/drivers/zorro/zorro.ids @@ -0,0 +1,476 @@ +# +# List of Zorro IDs +# +# Maintained by Geert Uytterhoeven +# 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] -- cgit v1.2.3