forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.3 KiB
98 lines
2.3 KiB
// SPDX-License-Identifier: GPL-2.0 |
|
/* |
|
* Zorro Device Name Tables |
|
* |
|
* Copyright (C) 1999--2000 Geert Uytterhoeven |
|
* |
|
* Based on the PCI version: |
|
* |
|
* Copyright 1992--1999 Drew Eckhardt, Frederic Potter, |
|
* David Mosberger-Tang, Martin Mares |
|
*/ |
|
|
|
#include <linux/init.h> |
|
#include <linux/kernel.h> |
|
#include <linux/types.h> |
|
#include <linux/zorro.h> |
|
|
|
|
|
struct zorro_prod_info { |
|
__u16 prod; |
|
unsigned short seen; |
|
const char *name; |
|
}; |
|
|
|
struct zorro_manuf_info { |
|
__u16 manuf; |
|
unsigned short nr; |
|
const char *name; |
|
struct zorro_prod_info *prods; |
|
}; |
|
|
|
/* |
|
* This is ridiculous, but we want the strings in |
|
* the .init section so that they don't take up |
|
* real memory.. Parse the same file multiple times |
|
* to get all the info. |
|
*/ |
|
#define MANUF( manuf, name ) static char __manufstr_##manuf[] __initdata = name; |
|
#define ENDMANUF() |
|
#define PRODUCT( manuf, prod, name ) static char __prodstr_##manuf##prod[] __initdata = name; |
|
#include "devlist.h" |
|
|
|
|
|
#define MANUF( manuf, name ) static struct zorro_prod_info __prods_##manuf[] __initdata = { |
|
#define ENDMANUF() }; |
|
#define PRODUCT( manuf, prod, name ) { 0x##prod, 0, __prodstr_##manuf##prod }, |
|
#include "devlist.h" |
|
|
|
static struct zorro_manuf_info __initdata zorro_manuf_list[] = { |
|
#define MANUF( manuf, name ) { 0x##manuf, ARRAY_SIZE(__prods_##manuf), __manufstr_##manuf, __prods_##manuf }, |
|
#define ENDMANUF() |
|
#define PRODUCT( manuf, prod, name ) |
|
#include "devlist.h" |
|
}; |
|
|
|
#define MANUFS ARRAY_SIZE(zorro_manuf_list) |
|
|
|
void __init zorro_name_device(struct zorro_dev *dev) |
|
{ |
|
const struct zorro_manuf_info *manuf_p = zorro_manuf_list; |
|
int i = MANUFS; |
|
char *name = dev->name; |
|
|
|
do { |
|
if (manuf_p->manuf == ZORRO_MANUF(dev->id)) |
|
goto match_manuf; |
|
manuf_p++; |
|
} while (--i); |
|
|
|
/* Couldn't find either the manufacturer nor the product */ |
|
return; |
|
|
|
match_manuf: { |
|
struct zorro_prod_info *prod_p = manuf_p->prods; |
|
int i = manuf_p->nr; |
|
|
|
while (i > 0) { |
|
if (prod_p->prod == |
|
((ZORRO_PROD(dev->id)<<8) | ZORRO_EPC(dev->id))) |
|
goto match_prod; |
|
prod_p++; |
|
i--; |
|
} |
|
|
|
/* Ok, found the manufacturer, but unknown product */ |
|
sprintf(name, "Zorro device %08x (%s)", dev->id, manuf_p->name); |
|
return; |
|
|
|
/* Full match */ |
|
match_prod: { |
|
char *n = name + sprintf(name, "%s %s", manuf_p->name, prod_p->name); |
|
int nr = prod_p->seen + 1; |
|
prod_p->seen = nr; |
|
if (nr > 1) |
|
sprintf(n, " (#%d)", nr); |
|
} |
|
} |
|
}
|
|
|