162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Zorro Device Name Tables 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 1999--2000 Geert Uytterhoeven 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Based on the PCI version: 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * Copyright 1992--1999 Drew Eckhardt, Frederic Potter, 1062306a36Sopenharmony_ci * David Mosberger-Tang, Martin Mares 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/init.h> 1462306a36Sopenharmony_ci#include <linux/kernel.h> 1562306a36Sopenharmony_ci#include <linux/types.h> 1662306a36Sopenharmony_ci#include <linux/zorro.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include "zorro.h" 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistruct zorro_prod_info { 2162306a36Sopenharmony_ci __u16 prod; 2262306a36Sopenharmony_ci unsigned short seen; 2362306a36Sopenharmony_ci const char *name; 2462306a36Sopenharmony_ci}; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cistruct zorro_manuf_info { 2762306a36Sopenharmony_ci __u16 manuf; 2862306a36Sopenharmony_ci unsigned short nr; 2962306a36Sopenharmony_ci const char *name; 3062306a36Sopenharmony_ci struct zorro_prod_info *prods; 3162306a36Sopenharmony_ci}; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci/* 3462306a36Sopenharmony_ci * This is ridiculous, but we want the strings in 3562306a36Sopenharmony_ci * the .init section so that they don't take up 3662306a36Sopenharmony_ci * real memory.. Parse the same file multiple times 3762306a36Sopenharmony_ci * to get all the info. 3862306a36Sopenharmony_ci */ 3962306a36Sopenharmony_ci#define MANUF( manuf, name ) static char __manufstr_##manuf[] __initdata = name; 4062306a36Sopenharmony_ci#define ENDMANUF() 4162306a36Sopenharmony_ci#define PRODUCT( manuf, prod, name ) static char __prodstr_##manuf##prod[] __initdata = name; 4262306a36Sopenharmony_ci#include "devlist.h" 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#define MANUF( manuf, name ) static struct zorro_prod_info __prods_##manuf[] __initdata = { 4662306a36Sopenharmony_ci#define ENDMANUF() }; 4762306a36Sopenharmony_ci#define PRODUCT( manuf, prod, name ) { 0x##prod, 0, __prodstr_##manuf##prod }, 4862306a36Sopenharmony_ci#include "devlist.h" 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_cistatic struct zorro_manuf_info __initdata zorro_manuf_list[] = { 5162306a36Sopenharmony_ci#define MANUF( manuf, name ) { 0x##manuf, ARRAY_SIZE(__prods_##manuf), __manufstr_##manuf, __prods_##manuf }, 5262306a36Sopenharmony_ci#define ENDMANUF() 5362306a36Sopenharmony_ci#define PRODUCT( manuf, prod, name ) 5462306a36Sopenharmony_ci#include "devlist.h" 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#define MANUFS ARRAY_SIZE(zorro_manuf_list) 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_civoid __init zorro_name_device(struct zorro_dev *dev) 6062306a36Sopenharmony_ci{ 6162306a36Sopenharmony_ci const struct zorro_manuf_info *manuf_p = zorro_manuf_list; 6262306a36Sopenharmony_ci int i = MANUFS; 6362306a36Sopenharmony_ci char *name = dev->name; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci do { 6662306a36Sopenharmony_ci if (manuf_p->manuf == ZORRO_MANUF(dev->id)) 6762306a36Sopenharmony_ci goto match_manuf; 6862306a36Sopenharmony_ci manuf_p++; 6962306a36Sopenharmony_ci } while (--i); 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci /* Couldn't find either the manufacturer nor the product */ 7262306a36Sopenharmony_ci return; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci match_manuf: { 7562306a36Sopenharmony_ci struct zorro_prod_info *prod_p = manuf_p->prods; 7662306a36Sopenharmony_ci int i = manuf_p->nr; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci while (i > 0) { 7962306a36Sopenharmony_ci if (prod_p->prod == 8062306a36Sopenharmony_ci ((ZORRO_PROD(dev->id)<<8) | ZORRO_EPC(dev->id))) 8162306a36Sopenharmony_ci goto match_prod; 8262306a36Sopenharmony_ci prod_p++; 8362306a36Sopenharmony_ci i--; 8462306a36Sopenharmony_ci } 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci /* Ok, found the manufacturer, but unknown product */ 8762306a36Sopenharmony_ci sprintf(name, "Zorro device %08x (%s)", dev->id, manuf_p->name); 8862306a36Sopenharmony_ci return; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci /* Full match */ 9162306a36Sopenharmony_ci match_prod: { 9262306a36Sopenharmony_ci char *n = name + sprintf(name, "%s %s", manuf_p->name, prod_p->name); 9362306a36Sopenharmony_ci int nr = prod_p->seen + 1; 9462306a36Sopenharmony_ci prod_p->seen = nr; 9562306a36Sopenharmony_ci if (nr > 1) 9662306a36Sopenharmony_ci sprintf(n, " (#%d)", nr); 9762306a36Sopenharmony_ci } 9862306a36Sopenharmony_ci } 9962306a36Sopenharmony_ci} 100