Blame view

drivers/zorro/names.c 2.5 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
  /*
   *	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
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
  #include <linux/init.h>
  #include <linux/kernel.h>
  #include <linux/types.h>
  #include <linux/zorro.h>
  
  
  #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