18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Zorro Device Name Tables 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 1999--2000 Geert Uytterhoeven 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Based on the PCI version: 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * Copyright 1992--1999 Drew Eckhardt, Frederic Potter, 108c2ecf20Sopenharmony_ci * David Mosberger-Tang, Martin Mares 118c2ecf20Sopenharmony_ci */ 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include <linux/init.h> 148c2ecf20Sopenharmony_ci#include <linux/kernel.h> 158c2ecf20Sopenharmony_ci#include <linux/types.h> 168c2ecf20Sopenharmony_ci#include <linux/zorro.h> 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_cistruct zorro_prod_info { 208c2ecf20Sopenharmony_ci __u16 prod; 218c2ecf20Sopenharmony_ci unsigned short seen; 228c2ecf20Sopenharmony_ci const char *name; 238c2ecf20Sopenharmony_ci}; 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cistruct zorro_manuf_info { 268c2ecf20Sopenharmony_ci __u16 manuf; 278c2ecf20Sopenharmony_ci unsigned short nr; 288c2ecf20Sopenharmony_ci const char *name; 298c2ecf20Sopenharmony_ci struct zorro_prod_info *prods; 308c2ecf20Sopenharmony_ci}; 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci/* 338c2ecf20Sopenharmony_ci * This is ridiculous, but we want the strings in 348c2ecf20Sopenharmony_ci * the .init section so that they don't take up 358c2ecf20Sopenharmony_ci * real memory.. Parse the same file multiple times 368c2ecf20Sopenharmony_ci * to get all the info. 378c2ecf20Sopenharmony_ci */ 388c2ecf20Sopenharmony_ci#define MANUF( manuf, name ) static char __manufstr_##manuf[] __initdata = name; 398c2ecf20Sopenharmony_ci#define ENDMANUF() 408c2ecf20Sopenharmony_ci#define PRODUCT( manuf, prod, name ) static char __prodstr_##manuf##prod[] __initdata = name; 418c2ecf20Sopenharmony_ci#include "devlist.h" 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci#define MANUF( manuf, name ) static struct zorro_prod_info __prods_##manuf[] __initdata = { 458c2ecf20Sopenharmony_ci#define ENDMANUF() }; 468c2ecf20Sopenharmony_ci#define PRODUCT( manuf, prod, name ) { 0x##prod, 0, __prodstr_##manuf##prod }, 478c2ecf20Sopenharmony_ci#include "devlist.h" 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_cistatic struct zorro_manuf_info __initdata zorro_manuf_list[] = { 508c2ecf20Sopenharmony_ci#define MANUF( manuf, name ) { 0x##manuf, ARRAY_SIZE(__prods_##manuf), __manufstr_##manuf, __prods_##manuf }, 518c2ecf20Sopenharmony_ci#define ENDMANUF() 528c2ecf20Sopenharmony_ci#define PRODUCT( manuf, prod, name ) 538c2ecf20Sopenharmony_ci#include "devlist.h" 548c2ecf20Sopenharmony_ci}; 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci#define MANUFS ARRAY_SIZE(zorro_manuf_list) 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_civoid __init zorro_name_device(struct zorro_dev *dev) 598c2ecf20Sopenharmony_ci{ 608c2ecf20Sopenharmony_ci const struct zorro_manuf_info *manuf_p = zorro_manuf_list; 618c2ecf20Sopenharmony_ci int i = MANUFS; 628c2ecf20Sopenharmony_ci char *name = dev->name; 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci do { 658c2ecf20Sopenharmony_ci if (manuf_p->manuf == ZORRO_MANUF(dev->id)) 668c2ecf20Sopenharmony_ci goto match_manuf; 678c2ecf20Sopenharmony_ci manuf_p++; 688c2ecf20Sopenharmony_ci } while (--i); 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci /* Couldn't find either the manufacturer nor the product */ 718c2ecf20Sopenharmony_ci return; 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci match_manuf: { 748c2ecf20Sopenharmony_ci struct zorro_prod_info *prod_p = manuf_p->prods; 758c2ecf20Sopenharmony_ci int i = manuf_p->nr; 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci while (i > 0) { 788c2ecf20Sopenharmony_ci if (prod_p->prod == 798c2ecf20Sopenharmony_ci ((ZORRO_PROD(dev->id)<<8) | ZORRO_EPC(dev->id))) 808c2ecf20Sopenharmony_ci goto match_prod; 818c2ecf20Sopenharmony_ci prod_p++; 828c2ecf20Sopenharmony_ci i--; 838c2ecf20Sopenharmony_ci } 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci /* Ok, found the manufacturer, but unknown product */ 868c2ecf20Sopenharmony_ci sprintf(name, "Zorro device %08x (%s)", dev->id, manuf_p->name); 878c2ecf20Sopenharmony_ci return; 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci /* Full match */ 908c2ecf20Sopenharmony_ci match_prod: { 918c2ecf20Sopenharmony_ci char *n = name + sprintf(name, "%s %s", manuf_p->name, prod_p->name); 928c2ecf20Sopenharmony_ci int nr = prod_p->seen + 1; 938c2ecf20Sopenharmony_ci prod_p->seen = nr; 948c2ecf20Sopenharmony_ci if (nr > 1) 958c2ecf20Sopenharmony_ci sprintf(n, " (#%d)", nr); 968c2ecf20Sopenharmony_ci } 978c2ecf20Sopenharmony_ci } 988c2ecf20Sopenharmony_ci} 99