root/drivers/zorro/names.c
// 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>

#include "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);
                }
        }
}