Blame view

scripts/mod/file2alias.c 40.8 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
  /* Simple code to turn various tables in an ELF file into alias definitions.
   * This deals with kernel datastructures where they should be
   * dealt with: in the kernel source.
   *
   * Copyright 2002-2003  Rusty Russell, IBM Corporation
   *           2003       Kai Germaschewski
   *
   *
   * This software may be used and distributed according to the terms
   * of the GNU General Public License, incorporated herein by reference.
   */
  
  #include "modpost.h"
6543becf2   Andreas Schwab   mod/file2alias: m...
14
  #include "devicetable-offsets.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
17
18
19
  
  /* We use the ELF typedefs for kernel_ulong_t but bite the bullet and
   * use either stdint.h or inttypes.h for the rest. */
  #if KERNEL_ELFCLASS == ELFCLASS32
  typedef Elf32_Addr	kernel_ulong_t;
1d8f430c1   Rusty Russell   [PATCH] Input: ad...
20
  #define BITS_PER_LONG 32
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
  #else
  typedef Elf64_Addr	kernel_ulong_t;
1d8f430c1   Rusty Russell   [PATCH] Input: ad...
23
  #define BITS_PER_LONG 64
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
28
29
  #endif
  #ifdef __sun__
  #include <inttypes.h>
  #else
  #include <stdint.h>
  #endif
5e6557722   Jeff Mahoney   [PATCH] openfirmw...
30
  #include <ctype.h>
626596e29   Rusty Russell   modpost: use a ta...
31
  #include <stdbool.h>
5e6557722   Jeff Mahoney   [PATCH] openfirmw...
32

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
34
35
  typedef uint32_t	__u32;
  typedef uint16_t	__u16;
  typedef unsigned char	__u8;
b144ce2d3   Greg Kroah-Hartman   mei: fix up uuid ...
36
37
38
  typedef struct {
  	__u8 b[16];
  } uuid_le;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
40
  
  /* Big exception to the "don't include kernel headers into userspace, which
62070fa42   Sam Ravnborg   kbuild: kill trai...
41
   * even potentially has different endianness and word sizes, since
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
43
   * we handle those differences explicitly below */
  #include "../../include/linux/mod_devicetable.h"
e49ce1415   Rusty Russell   modpost: use link...
44
45
  /* This array collects all instances that use the generic do_table */
  struct devtable {
21bdd17b2   Tom Gundersen   module: allow mul...
46
  	const char *device_id; /* name of table, __mod_<name>__*_device_table. */
e49ce1415   Rusty Russell   modpost: use link...
47
48
49
  	unsigned long id_size;
  	void *function;
  };
dd2a3acae   Andreas Bießmann   mod/file2alias: m...
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
  #define ___cat(a,b) a ## b
  #define __cat(a,b) ___cat(a,b)
  
  /* we need some special handling for this host tool running eventually on
   * Darwin. The Mach-O section handling is a bit different than ELF section
   * handling. The differnces in detail are:
   *  a) we have segments which have sections
   *  b) we need a API call to get the respective section symbols */
  #if defined(__MACH__)
  #include <mach-o/getsect.h>
  
  #define INIT_SECTION(name)  do {					\
  		unsigned long name ## _len;				\
  		char *__cat(pstart_,name) = getsectdata("__TEXT",	\
  			#name, &__cat(name,_len));			\
  		char *__cat(pstop_,name) = __cat(pstart_,name) +	\
  			__cat(name, _len);				\
  		__cat(__start_,name) = (void *)__cat(pstart_,name);	\
  		__cat(__stop_,name) = (void *)__cat(pstop_,name);	\
  	} while (0)
  #define SECTION(name)   __attribute__((section("__TEXT, " #name)))
  
  struct devtable **__start___devtable, **__stop___devtable;
  #else
  #define INIT_SECTION(name) /* no-op for ELF */
  #define SECTION(name)   __attribute__((section(#name)))
e49ce1415   Rusty Russell   modpost: use link...
76
77
78
  /* We construct a table of pointers in an ELF section (pointers generally
   * go unpadded by gcc).  ld creates boundary syms for us. */
  extern struct devtable *__start___devtable[], *__stop___devtable[];
dd2a3acae   Andreas Bießmann   mod/file2alias: m...
79
  #endif /* __MACH__ */
e49ce1415   Rusty Russell   modpost: use link...
80

04130cc97   Daniel Tang   Fix a build warni...
81
82
83
84
85
86
  #if !defined(__used)
  # if __GNUC__ == 3 && __GNUC_MINOR__ < 3
  #  define __used			__attribute__((__unused__))
  # else
  #  define __used			__attribute__((__used__))
  # endif
e49ce1415   Rusty Russell   modpost: use link...
87
  #endif
6543becf2   Andreas Schwab   mod/file2alias: m...
88
89
90
91
92
93
94
95
96
97
98
  /* Define a variable f that holds the value of field f of struct devid
   * based at address m.
   */
  #define DEF_FIELD(m, devid, f) \
  	typeof(((struct devid *)0)->f) f = TO_NATIVE(*(typeof(f) *)((m) + OFF_##devid##_##f))
  /* Define a variable f that holds the address of field f of struct devid
   * based at address m.  Due to the way typeof works, for a field of type
   * T[N] the variable has type T(*)[N], _not_ T*.
   */
  #define DEF_FIELD_ADDR(m, devid, f) \
  	typeof(((struct devid *)0)->f) *f = ((m) + OFF_##devid##_##f)
e49ce1415   Rusty Russell   modpost: use link...
99
100
101
102
  /* Add a table entry.  We test function type matches while we're here. */
  #define ADD_TO_DEVTABLE(device_id, type, function) \
  	static struct devtable __cat(devtable,__LINE__) = {	\
  		device_id + 0*sizeof((function)((const char *)NULL,	\
6543becf2   Andreas Schwab   mod/file2alias: m...
103
  						(void *)NULL,		\
e49ce1415   Rusty Russell   modpost: use link...
104
  						(char *)NULL)),		\
6543becf2   Andreas Schwab   mod/file2alias: m...
105
  		SIZE_##type, (function) };				\
dd2a3acae   Andreas Bießmann   mod/file2alias: m...
106
107
  	static struct devtable *SECTION(__devtable) __used \
  		__cat(devtable_ptr,__LINE__) = &__cat(devtable,__LINE__)
e49ce1415   Rusty Russell   modpost: use link...
108

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
109
110
111
112
113
114
115
116
117
118
119
120
  #define ADD(str, sep, cond, field)                              \
  do {                                                            \
          strcat(str, sep);                                       \
          if (cond)                                               \
                  sprintf(str + strlen(str),                      \
                          sizeof(field) == 1 ? "%02X" :           \
                          sizeof(field) == 2 ? "%04X" :           \
                          sizeof(field) == 4 ? "%08X" : "",       \
                          field);                                 \
          else                                                    \
                  sprintf(str + strlen(str), "*");                \
  } while(0)
2f632369a   Javier Martinez Canillas   modpost: don't ad...
121
  /* End in a wildcard, for future extension */
ac5518289   Jean Delvare   modpost: i2c alia...
122
123
124
125
126
127
128
  static inline void add_wildcard(char *str)
  {
  	int len = strlen(str);
  
  	if (str[len - 1] != '*')
  		strcat(str + len, "*");
  }
b144ce2d3   Greg Kroah-Hartman   mei: fix up uuid ...
129
  static inline void add_uuid(char *str, uuid_le uuid)
c93b76b34   Tomas Winkler   mei: bus: report ...
130
131
  {
  	int len = strlen(str);
c93b76b34   Tomas Winkler   mei: bus: report ...
132

59796edcf   Prarit Bhargava   mei: make modules...
133
134
135
136
137
  	sprintf(str + len, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
  		uuid.b[3], uuid.b[2], uuid.b[1], uuid.b[0],
  		uuid.b[5], uuid.b[4], uuid.b[7], uuid.b[6],
  		uuid.b[8], uuid.b[9], uuid.b[10], uuid.b[11],
  		uuid.b[12], uuid.b[13], uuid.b[14], uuid.b[15]);
c93b76b34   Tomas Winkler   mei: bus: report ...
138
  }
fb33d8161   Sam Ravnborg   kbuild: improve e...
139
140
141
142
  /**
   * Check that sizeof(device_id type) are consistent with size of section
   * in .o file. If in-consistent then userspace and kernel does not agree
   * on actual size which is a bug.
e00498258   Kees Cook   kbuild: make modp...
143
   * Also verify that the final entry in the table is all zeros.
4ce6efed4   Sam Ravnborg   kbuild: soften mo...
144
   * Ignore both checks if build host differ from target host and size differs.
fb33d8161   Sam Ravnborg   kbuild: improve e...
145
   **/
e00498258   Kees Cook   kbuild: make modp...
146
147
148
  static void device_id_check(const char *modname, const char *device_id,
  			    unsigned long size, unsigned long id_size,
  			    void *symval)
fb33d8161   Sam Ravnborg   kbuild: improve e...
149
  {
e00498258   Kees Cook   kbuild: make modp...
150
  	int i;
fb33d8161   Sam Ravnborg   kbuild: improve e...
151
152
  	if (size % id_size || size < id_size) {
  		fatal("%s: sizeof(struct %s_device_id)=%lu is not a modulo "
21bdd17b2   Tom Gundersen   module: allow mul...
153
154
155
  		      "of the size of "
  		      "section __mod_%s__<identifier>_device_table=%lu.
  "
fb33d8161   Sam Ravnborg   kbuild: improve e...
156
157
158
159
160
  		      "Fix definition of struct %s_device_id "
  		      "in mod_devicetable.h
  ",
  		      modname, device_id, id_size, device_id, size, device_id);
  	}
e00498258   Kees Cook   kbuild: make modp...
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
  	/* Verify last one is a terminator */
  	for (i = 0; i < id_size; i++ ) {
  		if (*(uint8_t*)(symval+size-id_size+i)) {
  			fprintf(stderr,"%s: struct %s_device_id is %lu bytes.  "
  				"The last of %lu is:
  ",
  				modname, device_id, id_size, size / id_size);
  			for (i = 0; i < id_size; i++ )
  				fprintf(stderr,"0x%02x ",
  					*(uint8_t*)(symval+size-id_size+i) );
  			fprintf(stderr,"
  ");
  			fatal("%s: struct %s_device_id is not terminated "
  				"with a NULL entry!
  ", modname, device_id);
  		}
  	}
fb33d8161   Sam Ravnborg   kbuild: improve e...
178
  }
b19dcd934   Roman Kagan   [PATCH] USB: scri...
179
  /* USB is special because the bcdDevice can be matched against a numeric range */
81df2d594   Bjørn Mork   USB: allow match ...
180
  /* Looks like "usb:vNpNdNdcNdscNdpNicNiscNipNinN" */
6543becf2   Andreas Schwab   mod/file2alias: m...
181
  static void do_usb_entry(void *symval,
b19dcd934   Roman Kagan   [PATCH] USB: scri...
182
183
  			 unsigned int bcdDevice_initial, int bcdDevice_initial_digits,
  			 unsigned char range_lo, unsigned char range_hi,
afe2dab4f   Nathaniel McCallum   USB: add hex/bcd ...
184
  			 unsigned char max, struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
185
  {
b19dcd934   Roman Kagan   [PATCH] USB: scri...
186
  	char alias[500];
6543becf2   Andreas Schwab   mod/file2alias: m...
187
188
189
190
191
192
193
194
195
196
197
  	DEF_FIELD(symval, usb_device_id, match_flags);
  	DEF_FIELD(symval, usb_device_id, idVendor);
  	DEF_FIELD(symval, usb_device_id, idProduct);
  	DEF_FIELD(symval, usb_device_id, bcdDevice_lo);
  	DEF_FIELD(symval, usb_device_id, bDeviceClass);
  	DEF_FIELD(symval, usb_device_id, bDeviceSubClass);
  	DEF_FIELD(symval, usb_device_id, bDeviceProtocol);
  	DEF_FIELD(symval, usb_device_id, bInterfaceClass);
  	DEF_FIELD(symval, usb_device_id, bInterfaceSubClass);
  	DEF_FIELD(symval, usb_device_id, bInterfaceProtocol);
  	DEF_FIELD(symval, usb_device_id, bInterfaceNumber);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
198
  	strcpy(alias, "usb:");
6543becf2   Andreas Schwab   mod/file2alias: m...
199
200
201
202
  	ADD(alias, "v", match_flags&USB_DEVICE_ID_MATCH_VENDOR,
  	    idVendor);
  	ADD(alias, "p", match_flags&USB_DEVICE_ID_MATCH_PRODUCT,
  	    idProduct);
b19dcd934   Roman Kagan   [PATCH] USB: scri...
203
204
205
206
207
208
  
  	strcat(alias, "d");
  	if (bcdDevice_initial_digits)
  		sprintf(alias + strlen(alias), "%0*X",
  			bcdDevice_initial_digits, bcdDevice_initial);
  	if (range_lo == range_hi)
afe2dab4f   Nathaniel McCallum   USB: add hex/bcd ...
209
210
211
212
213
214
215
216
217
218
219
220
  		sprintf(alias + strlen(alias), "%X", range_lo);
  	else if (range_lo > 0 || range_hi < max) {
  		if (range_lo > 0x9 || range_hi < 0xA)
  			sprintf(alias + strlen(alias),
  				"[%X-%X]",
  				range_lo,
  				range_hi);
  		else {
  			sprintf(alias + strlen(alias),
  				range_lo < 0x9 ? "[%X-9" : "[%X",
  				range_lo);
  			sprintf(alias + strlen(alias),
03b56329f   Jan Moskyto Matejka   Modpost: fixed US...
221
222
  				range_hi > 0xA ? "A-%X]" : "%X]",
  				range_hi);
afe2dab4f   Nathaniel McCallum   USB: add hex/bcd ...
223
224
  		}
  	}
6543becf2   Andreas Schwab   mod/file2alias: m...
225
  	if (bcdDevice_initial_digits < (sizeof(bcdDevice_lo) * 2 - 1))
b19dcd934   Roman Kagan   [PATCH] USB: scri...
226
  		strcat(alias, "*");
6543becf2   Andreas Schwab   mod/file2alias: m...
227
228
229
230
231
232
233
234
235
236
237
238
239
240
  	ADD(alias, "dc", match_flags&USB_DEVICE_ID_MATCH_DEV_CLASS,
  	    bDeviceClass);
  	ADD(alias, "dsc", match_flags&USB_DEVICE_ID_MATCH_DEV_SUBCLASS,
  	    bDeviceSubClass);
  	ADD(alias, "dp", match_flags&USB_DEVICE_ID_MATCH_DEV_PROTOCOL,
  	    bDeviceProtocol);
  	ADD(alias, "ic", match_flags&USB_DEVICE_ID_MATCH_INT_CLASS,
  	    bInterfaceClass);
  	ADD(alias, "isc", match_flags&USB_DEVICE_ID_MATCH_INT_SUBCLASS,
  	    bInterfaceSubClass);
  	ADD(alias, "ip", match_flags&USB_DEVICE_ID_MATCH_INT_PROTOCOL,
  	    bInterfaceProtocol);
  	ADD(alias, "in", match_flags&USB_DEVICE_ID_MATCH_INT_NUMBER,
  	    bInterfaceNumber);
b19dcd934   Roman Kagan   [PATCH] USB: scri...
241

ac5518289   Jean Delvare   modpost: i2c alia...
242
  	add_wildcard(alias);
b19dcd934   Roman Kagan   [PATCH] USB: scri...
243
244
245
246
  	buf_printf(&mod->dev_table_buf,
  		   "MODULE_ALIAS(\"%s\");
  ", alias);
  }
55f49f268   Nathaniel McCallum   USB: handle bcd i...
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
  /* Handles increment/decrement of BCD formatted integers */
  /* Returns the previous value, so it works like i++ or i-- */
  static unsigned int incbcd(unsigned int *bcd,
  			   int inc,
  			   unsigned char max,
  			   size_t chars)
  {
  	unsigned int init = *bcd, i, j;
  	unsigned long long c, dec = 0;
  
  	/* If bcd is not in BCD format, just increment */
  	if (max > 0x9) {
  		*bcd += inc;
  		return init;
  	}
  
  	/* Convert BCD to Decimal */
  	for (i=0 ; i < chars ; i++) {
  		c = (*bcd >> (i << 2)) & 0xf;
  		c = c > 9 ? 9 : c; /* force to bcd just in case */
  		for (j=0 ; j < i ; j++)
  			c = c * 10;
  		dec += c;
  	}
  
  	/* Do our increment/decrement */
  	dec += inc;
  	*bcd  = 0;
  
  	/* Convert back to BCD */
  	for (i=0 ; i < chars ; i++) {
  		for (c=1,j=0 ; j < i ; j++)
  			c = c * 10;
  		c = (dec / c) % 10;
  		*bcd += c << (i << 2);
  	}
  	return init;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
285
  static void do_usb_entry_multi(void *symval, struct module *mod)
b19dcd934   Roman Kagan   [PATCH] USB: scri...
286
287
  {
  	unsigned int devlo, devhi;
afe2dab4f   Nathaniel McCallum   USB: add hex/bcd ...
288
  	unsigned char chi, clo, max;
b19dcd934   Roman Kagan   [PATCH] USB: scri...
289
  	int ndigits;
6543becf2   Andreas Schwab   mod/file2alias: m...
290
291
292
293
294
295
296
  	DEF_FIELD(symval, usb_device_id, match_flags);
  	DEF_FIELD(symval, usb_device_id, idVendor);
  	DEF_FIELD(symval, usb_device_id, idProduct);
  	DEF_FIELD(symval, usb_device_id, bcdDevice_lo);
  	DEF_FIELD(symval, usb_device_id, bcdDevice_hi);
  	DEF_FIELD(symval, usb_device_id, bDeviceClass);
  	DEF_FIELD(symval, usb_device_id, bInterfaceClass);
b19dcd934   Roman Kagan   [PATCH] USB: scri...
297

6543becf2   Andreas Schwab   mod/file2alias: m...
298
299
300
301
  	devlo = match_flags & USB_DEVICE_ID_MATCH_DEV_LO ?
  		bcdDevice_lo : 0x0U;
  	devhi = match_flags & USB_DEVICE_ID_MATCH_DEV_HI ?
  		bcdDevice_hi : ~0x0U;
b19dcd934   Roman Kagan   [PATCH] USB: scri...
302

afe2dab4f   Nathaniel McCallum   USB: add hex/bcd ...
303
304
  	/* Figure out if this entry is in bcd or hex format */
  	max = 0x9; /* Default to decimal format */
6543becf2   Andreas Schwab   mod/file2alias: m...
305
  	for (ndigits = 0 ; ndigits < sizeof(bcdDevice_lo) * 2 ; ndigits++) {
afe2dab4f   Nathaniel McCallum   USB: add hex/bcd ...
306
307
308
309
310
311
312
  		clo = (devlo >> (ndigits << 2)) & 0xf;
  		chi = ((devhi > 0x9999 ? 0x9999 : devhi) >> (ndigits << 2)) & 0xf;
  		if (clo > max || chi > max) {
  			max = 0xf;
  			break;
  		}
  	}
b19dcd934   Roman Kagan   [PATCH] USB: scri...
313
314
315
316
  	/*
  	 * Some modules (visor) have empty slots as placeholder for
  	 * run-time specification that results in catch-all alias
  	 */
6543becf2   Andreas Schwab   mod/file2alias: m...
317
  	if (!(idVendor | idProduct | bDeviceClass | bInterfaceClass))
b19dcd934   Roman Kagan   [PATCH] USB: scri...
318
319
320
  		return;
  
  	/* Convert numeric bcdDevice range into fnmatch-able pattern(s) */
6543becf2   Andreas Schwab   mod/file2alias: m...
321
  	for (ndigits = sizeof(bcdDevice_lo) * 2 - 1; devlo <= devhi; ndigits--) {
b19dcd934   Roman Kagan   [PATCH] USB: scri...
322
323
  		clo = devlo & 0xf;
  		chi = devhi & 0xf;
afe2dab4f   Nathaniel McCallum   USB: add hex/bcd ...
324
325
  		if (chi > max)	/* If we are in bcd mode, truncate if necessary */
  			chi = max;
b19dcd934   Roman Kagan   [PATCH] USB: scri...
326
327
328
329
  		devlo >>= 4;
  		devhi >>= 4;
  
  		if (devlo == devhi || !ndigits) {
6543becf2   Andreas Schwab   mod/file2alias: m...
330
  			do_usb_entry(symval, devlo, ndigits, clo, chi, max, mod);
b19dcd934   Roman Kagan   [PATCH] USB: scri...
331
332
  			break;
  		}
afe2dab4f   Nathaniel McCallum   USB: add hex/bcd ...
333
  		if (clo > 0x0)
6543becf2   Andreas Schwab   mod/file2alias: m...
334
  			do_usb_entry(symval,
55f49f268   Nathaniel McCallum   USB: handle bcd i...
335
  				     incbcd(&devlo, 1, max,
6543becf2   Andreas Schwab   mod/file2alias: m...
336
  					    sizeof(bcdDevice_lo) * 2),
55f49f268   Nathaniel McCallum   USB: handle bcd i...
337
  				     ndigits, clo, max, max, mod);
b19dcd934   Roman Kagan   [PATCH] USB: scri...
338

afe2dab4f   Nathaniel McCallum   USB: add hex/bcd ...
339
  		if (chi < max)
6543becf2   Andreas Schwab   mod/file2alias: m...
340
  			do_usb_entry(symval,
55f49f268   Nathaniel McCallum   USB: handle bcd i...
341
  				     incbcd(&devhi, -1, max,
6543becf2   Andreas Schwab   mod/file2alias: m...
342
  					    sizeof(bcdDevice_lo) * 2),
55f49f268   Nathaniel McCallum   USB: handle bcd i...
343
  				     ndigits, 0x0, chi, max, mod);
b19dcd934   Roman Kagan   [PATCH] USB: scri...
344
345
346
347
348
349
350
  	}
  }
  
  static void do_usb_table(void *symval, unsigned long size,
  			 struct module *mod)
  {
  	unsigned int i;
6543becf2   Andreas Schwab   mod/file2alias: m...
351
  	const unsigned long id_size = SIZE_usb_device_id;
b19dcd934   Roman Kagan   [PATCH] USB: scri...
352

e00498258   Kees Cook   kbuild: make modp...
353
  	device_id_check(mod->name, "usb", size, id_size, symval);
fb33d8161   Sam Ravnborg   kbuild: improve e...
354

b19dcd934   Roman Kagan   [PATCH] USB: scri...
355
356
357
358
359
  	/* Leave last one: it's the terminator. */
  	size -= id_size;
  
  	for (i = 0; i < size; i += id_size)
  		do_usb_entry_multi(symval + i, mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
360
  }
acbef7b76   Philipp Zabel   modpost: fix modu...
361
362
363
364
365
366
367
368
369
370
371
372
  static void do_of_entry_multi(void *symval, struct module *mod)
  {
  	char alias[500];
  	int len;
  	char *tmp;
  
  	DEF_FIELD_ADDR(symval, of_device_id, name);
  	DEF_FIELD_ADDR(symval, of_device_id, type);
  	DEF_FIELD_ADDR(symval, of_device_id, compatible);
  
  	len = sprintf(alias, "of:N%sT%s", (*name)[0] ? *name : "*",
  		      (*type)[0] ? *type : "*");
b3c0a4dab   Wolfram Sang   of: fix autoloadi...
373
  	if ((*compatible)[0])
acbef7b76   Philipp Zabel   modpost: fix modu...
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
  		sprintf(&alias[len], "%sC%s", (*type)[0] ? "*" : "",
  			*compatible);
  
  	/* Replace all whitespace with underscores */
  	for (tmp = alias; tmp && *tmp; tmp++)
  		if (isspace(*tmp))
  			*tmp = '_';
  
  	buf_printf(&mod->dev_table_buf, "MODULE_ALIAS(\"%s\");
  ", alias);
  	strcat(alias, "C");
  	add_wildcard(alias);
  	buf_printf(&mod->dev_table_buf, "MODULE_ALIAS(\"%s\");
  ", alias);
  }
  
  static void do_of_table(void *symval, unsigned long size,
  			struct module *mod)
  {
  	unsigned int i;
  	const unsigned long id_size = SIZE_of_device_id;
  
  	device_id_check(mod->name, "of", size, id_size, symval);
  
  	/* Leave last one: it's the terminator. */
  	size -= id_size;
  
  	for (i = 0; i < size; i += id_size)
  		do_of_entry_multi(symval + i, mod);
  }
e8c84f9a5   Jiri Slaby   modpost: add supp...
404
405
  /* Looks like: hid:bNvNpN */
  static int do_hid_entry(const char *filename,
6543becf2   Andreas Schwab   mod/file2alias: m...
406
  			     void *symval, char *alias)
e8c84f9a5   Jiri Slaby   modpost: add supp...
407
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
408
409
410
411
  	DEF_FIELD(symval, hid_device_id, bus);
  	DEF_FIELD(symval, hid_device_id, group);
  	DEF_FIELD(symval, hid_device_id, vendor);
  	DEF_FIELD(symval, hid_device_id, product);
e8c84f9a5   Jiri Slaby   modpost: add supp...
412

7431fb767   Henrik Rydberg   HID: Allow bus wi...
413
  	sprintf(alias, "hid:");
6543becf2   Andreas Schwab   mod/file2alias: m...
414
415
416
417
  	ADD(alias, "b", bus != HID_BUS_ANY, bus);
  	ADD(alias, "g", group != HID_GROUP_ANY, group);
  	ADD(alias, "v", vendor != HID_ANY_ID, vendor);
  	ADD(alias, "p", product != HID_ANY_ID, product);
e8c84f9a5   Jiri Slaby   modpost: add supp...
418
419
420
  
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
421
  ADD_TO_DEVTABLE("hid", hid_device_id, do_hid_entry);
e8c84f9a5   Jiri Slaby   modpost: add supp...
422

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
423
424
  /* Looks like: ieee1394:venNmoNspNverN */
  static int do_ieee1394_entry(const char *filename,
6543becf2   Andreas Schwab   mod/file2alias: m...
425
  			     void *symval, char *alias)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
426
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
427
428
429
430
431
  	DEF_FIELD(symval, ieee1394_device_id, match_flags);
  	DEF_FIELD(symval, ieee1394_device_id, vendor_id);
  	DEF_FIELD(symval, ieee1394_device_id, model_id);
  	DEF_FIELD(symval, ieee1394_device_id, specifier_id);
  	DEF_FIELD(symval, ieee1394_device_id, version);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
432
433
  
  	strcpy(alias, "ieee1394:");
6543becf2   Andreas Schwab   mod/file2alias: m...
434
435
436
437
438
439
440
441
  	ADD(alias, "ven", match_flags & IEEE1394_MATCH_VENDOR_ID,
  	    vendor_id);
  	ADD(alias, "mo", match_flags & IEEE1394_MATCH_MODEL_ID,
  	    model_id);
  	ADD(alias, "sp", match_flags & IEEE1394_MATCH_SPECIFIER_ID,
  	    specifier_id);
  	ADD(alias, "ver", match_flags & IEEE1394_MATCH_VERSION,
  	    version);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
442

ac5518289   Jean Delvare   modpost: i2c alia...
443
  	add_wildcard(alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
444
445
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
446
  ADD_TO_DEVTABLE("ieee1394", ieee1394_device_id, do_ieee1394_entry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
447
448
449
  
  /* Looks like: pci:vNdNsvNsdNbcNscNiN. */
  static int do_pci_entry(const char *filename,
6543becf2   Andreas Schwab   mod/file2alias: m...
450
  			void *symval, char *alias)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
451
452
453
454
  {
  	/* Class field can be divided into these three. */
  	unsigned char baseclass, subclass, interface,
  		baseclass_mask, subclass_mask, interface_mask;
6543becf2   Andreas Schwab   mod/file2alias: m...
455
456
457
458
459
460
  	DEF_FIELD(symval, pci_device_id, vendor);
  	DEF_FIELD(symval, pci_device_id, device);
  	DEF_FIELD(symval, pci_device_id, subvendor);
  	DEF_FIELD(symval, pci_device_id, subdevice);
  	DEF_FIELD(symval, pci_device_id, class);
  	DEF_FIELD(symval, pci_device_id, class_mask);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
461
462
  
  	strcpy(alias, "pci:");
6543becf2   Andreas Schwab   mod/file2alias: m...
463
464
465
466
467
468
469
470
471
472
473
  	ADD(alias, "v", vendor != PCI_ANY_ID, vendor);
  	ADD(alias, "d", device != PCI_ANY_ID, device);
  	ADD(alias, "sv", subvendor != PCI_ANY_ID, subvendor);
  	ADD(alias, "sd", subdevice != PCI_ANY_ID, subdevice);
  
  	baseclass = (class) >> 16;
  	baseclass_mask = (class_mask) >> 16;
  	subclass = (class) >> 8;
  	subclass_mask = (class_mask) >> 8;
  	interface = class;
  	interface_mask = class_mask;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
474
475
476
477
  
  	if ((baseclass_mask != 0 && baseclass_mask != 0xFF)
  	    || (subclass_mask != 0 && subclass_mask != 0xFF)
  	    || (interface_mask != 0 && interface_mask != 0xFF)) {
cb80514d9   Sam Ravnborg   kbuild: use warn(...
478
479
  		warn("Can't handle masks in %s:%04X
  ",
6543becf2   Andreas Schwab   mod/file2alias: m...
480
  		     filename, class_mask);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
481
482
483
484
485
486
  		return 0;
  	}
  
  	ADD(alias, "bc", baseclass_mask == 0xFF, baseclass);
  	ADD(alias, "sc", subclass_mask == 0xFF, subclass);
  	ADD(alias, "i", interface_mask == 0xFF, interface);
ac5518289   Jean Delvare   modpost: i2c alia...
487
  	add_wildcard(alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
488
489
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
490
  ADD_TO_DEVTABLE("pci", pci_device_id, do_pci_entry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
491

62070fa42   Sam Ravnborg   kbuild: kill trai...
492
  /* looks like: "ccw:tNmNdtNdmN" */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
493
  static int do_ccw_entry(const char *filename,
6543becf2   Andreas Schwab   mod/file2alias: m...
494
  			void *symval, char *alias)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
495
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
496
497
498
499
500
  	DEF_FIELD(symval, ccw_device_id, match_flags);
  	DEF_FIELD(symval, ccw_device_id, cu_type);
  	DEF_FIELD(symval, ccw_device_id, cu_model);
  	DEF_FIELD(symval, ccw_device_id, dev_type);
  	DEF_FIELD(symval, ccw_device_id, dev_model);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
501
502
  
  	strcpy(alias, "ccw:");
6543becf2   Andreas Schwab   mod/file2alias: m...
503
504
505
506
507
508
509
510
  	ADD(alias, "t", match_flags&CCW_DEVICE_ID_MATCH_CU_TYPE,
  	    cu_type);
  	ADD(alias, "m", match_flags&CCW_DEVICE_ID_MATCH_CU_MODEL,
  	    cu_model);
  	ADD(alias, "dt", match_flags&CCW_DEVICE_ID_MATCH_DEVICE_TYPE,
  	    dev_type);
  	ADD(alias, "dm", match_flags&CCW_DEVICE_ID_MATCH_DEVICE_MODEL,
  	    dev_model);
ac5518289   Jean Delvare   modpost: i2c alia...
511
  	add_wildcard(alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
512
513
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
514
  ADD_TO_DEVTABLE("ccw", ccw_device_id, do_ccw_entry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
515

1534c3820   Martin Schwidefsky   [S390] zcrypt adj...
516
517
  /* looks like: "ap:tN" */
  static int do_ap_entry(const char *filename,
6543becf2   Andreas Schwab   mod/file2alias: m...
518
  		       void *symval, char *alias)
1534c3820   Martin Schwidefsky   [S390] zcrypt adj...
519
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
520
521
522
  	DEF_FIELD(symval, ap_device_id, dev_type);
  
  	sprintf(alias, "ap:t%02X*", dev_type);
1534c3820   Martin Schwidefsky   [S390] zcrypt adj...
523
524
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
525
  ADD_TO_DEVTABLE("ap", ap_device_id, do_ap_entry);
1534c3820   Martin Schwidefsky   [S390] zcrypt adj...
526

7e9db9eae   Cornelia Huck   [S390] cio: Intro...
527
528
  /* looks like: "css:tN" */
  static int do_css_entry(const char *filename,
6543becf2   Andreas Schwab   mod/file2alias: m...
529
  			void *symval, char *alias)
7e9db9eae   Cornelia Huck   [S390] cio: Intro...
530
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
531
532
533
  	DEF_FIELD(symval, css_device_id, type);
  
  	sprintf(alias, "css:t%01X", type);
7e9db9eae   Cornelia Huck   [S390] cio: Intro...
534
535
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
536
  ADD_TO_DEVTABLE("css", css_device_id, do_css_entry);
7e9db9eae   Cornelia Huck   [S390] cio: Intro...
537

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
538
539
  /* Looks like: "serio:tyNprNidNexN" */
  static int do_serio_entry(const char *filename,
6543becf2   Andreas Schwab   mod/file2alias: m...
540
  			  void *symval, char *alias)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
541
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
542
543
544
545
  	DEF_FIELD(symval, serio_device_id, type);
  	DEF_FIELD(symval, serio_device_id, proto);
  	DEF_FIELD(symval, serio_device_id, id);
  	DEF_FIELD(symval, serio_device_id, extra);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
546
547
  
  	strcpy(alias, "serio:");
6543becf2   Andreas Schwab   mod/file2alias: m...
548
549
550
551
  	ADD(alias, "ty", type != SERIO_ANY, type);
  	ADD(alias, "pr", proto != SERIO_ANY, proto);
  	ADD(alias, "id", id != SERIO_ANY, id);
  	ADD(alias, "ex", extra != SERIO_ANY, extra);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
552

ac5518289   Jean Delvare   modpost: i2c alia...
553
  	add_wildcard(alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
554
555
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
556
  ADD_TO_DEVTABLE("serio", serio_device_id, do_serio_entry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
557

26095a01d   Suthikulpanit, Suravee   ACPI / scan: Add ...
558
559
560
561
562
563
564
  /* looks like: "acpi:ACPI0003" or "acpi:PNP0C0B" or "acpi:LNXVIDEO" or
   *             "acpi:bbsspp" (bb=base-class, ss=sub-class, pp=prog-if)
   *
   * NOTE: Each driver should use one of the following : _HID, _CIDs
   *       or _CLS. Also, bb, ss, and pp can be substituted with ??
   *       as don't care byte.
   */
29b71a1ca   Thomas Renninger   ACPI: autoload mo...
565
  static int do_acpi_entry(const char *filename,
6543becf2   Andreas Schwab   mod/file2alias: m...
566
  			void *symval, char *alias)
29b71a1ca   Thomas Renninger   ACPI: autoload mo...
567
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
568
  	DEF_FIELD_ADDR(symval, acpi_device_id, id);
26095a01d   Suthikulpanit, Suravee   ACPI / scan: Add ...
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
  	DEF_FIELD_ADDR(symval, acpi_device_id, cls);
  	DEF_FIELD_ADDR(symval, acpi_device_id, cls_msk);
  
  	if (id && strlen((const char *)*id))
  		sprintf(alias, "acpi*:%s:*", *id);
  	else if (cls) {
  		int i, byte_shift, cnt = 0;
  		unsigned int msk;
  
  		sprintf(&alias[cnt], "acpi*:");
  		cnt = 6;
  		for (i = 1; i <= 3; i++) {
  			byte_shift = 8 * (3-i);
  			msk = (*cls_msk >> byte_shift) & 0xFF;
  			if (msk)
  				sprintf(&alias[cnt], "%02x",
  					(*cls >> byte_shift) & 0xFF);
  			else
  				sprintf(&alias[cnt], "??");
  			cnt += 2;
  		}
  		sprintf(&alias[cnt], ":*");
  	}
29b71a1ca   Thomas Renninger   ACPI: autoload mo...
592
593
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
594
  ADD_TO_DEVTABLE("acpi", acpi_device_id, do_acpi_entry);
29b71a1ca   Thomas Renninger   ACPI: autoload mo...
595

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
596
  /* looks like: "pnp:dD" */
22454cb99   Kay Sievers   pnp: add acpi:* m...
597
598
  static void do_pnp_device_entry(void *symval, unsigned long size,
  				struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
599
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
600
  	const unsigned long id_size = SIZE_pnp_device_id;
5e4c6564c   Kay Sievers   pnp: fix "add acp...
601
  	const unsigned int count = (size / id_size)-1;
5e4c6564c   Kay Sievers   pnp: fix "add acp...
602
  	unsigned int i;
22454cb99   Kay Sievers   pnp: add acpi:* m...
603
604
  
  	device_id_check(mod->name, "pnp", size, id_size, symval);
5e4c6564c   Kay Sievers   pnp: fix "add acp...
605
  	for (i = 0; i < count; i++) {
6543becf2   Andreas Schwab   mod/file2alias: m...
606
607
  		DEF_FIELD_ADDR(symval + i*id_size, pnp_device_id, id);
  		char acpi_id[sizeof(*id)];
72638f598   Kay Sievers   PNP: fix broken p...
608
  		int j;
5e4c6564c   Kay Sievers   pnp: fix "add acp...
609
610
  
  		buf_printf(&mod->dev_table_buf,
6543becf2   Andreas Schwab   mod/file2alias: m...
611
612
  			   "MODULE_ALIAS(\"pnp:d%s*\");
  ", *id);
72638f598   Kay Sievers   PNP: fix broken p...
613
614
615
  
  		/* fix broken pnp bus lowercasing */
  		for (j = 0; j < sizeof(acpi_id); j++)
6543becf2   Andreas Schwab   mod/file2alias: m...
616
  			acpi_id[j] = toupper((*id)[j]);
5e4c6564c   Kay Sievers   pnp: fix "add acp...
617
  		buf_printf(&mod->dev_table_buf,
72638f598   Kay Sievers   PNP: fix broken p...
618
619
  			   "MODULE_ALIAS(\"acpi*:%s:*\");
  ", acpi_id);
5e4c6564c   Kay Sievers   pnp: fix "add acp...
620
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
621
  }
0c81eed4b   Kay Sievers   PNP: add all PNP ...
622
623
624
  /* looks like: "pnp:dD" for every device of the card */
  static void do_pnp_card_entries(void *symval, unsigned long size,
  				struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
625
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
626
  	const unsigned long id_size = SIZE_pnp_card_device_id;
0c81eed4b   Kay Sievers   PNP: add all PNP ...
627
  	const unsigned int count = (size / id_size)-1;
0c81eed4b   Kay Sievers   PNP: add all PNP ...
628
  	unsigned int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
629

0c81eed4b   Kay Sievers   PNP: add all PNP ...
630
631
632
633
  	device_id_check(mod->name, "pnp", size, id_size, symval);
  
  	for (i = 0; i < count; i++) {
  		unsigned int j;
6543becf2   Andreas Schwab   mod/file2alias: m...
634
  		DEF_FIELD_ADDR(symval + i*id_size, pnp_card_device_id, devs);
0c81eed4b   Kay Sievers   PNP: add all PNP ...
635
636
  
  		for (j = 0; j < PNP_MAX_DEVICES; j++) {
6543becf2   Andreas Schwab   mod/file2alias: m...
637
  			const char *id = (char *)(*devs)[j].id;
0c81eed4b   Kay Sievers   PNP: add all PNP ...
638
639
640
641
642
643
644
645
  			int i2, j2;
  			int dup = 0;
  
  			if (!id[0])
  				break;
  
  			/* find duplicate, already added value */
  			for (i2 = 0; i2 < i && !dup; i2++) {
6543becf2   Andreas Schwab   mod/file2alias: m...
646
  				DEF_FIELD_ADDR(symval + i2*id_size, pnp_card_device_id, devs);
0c81eed4b   Kay Sievers   PNP: add all PNP ...
647
648
  
  				for (j2 = 0; j2 < PNP_MAX_DEVICES; j2++) {
6543becf2   Andreas Schwab   mod/file2alias: m...
649
  					const char *id2 = (char *)(*devs)[j2].id;
0c81eed4b   Kay Sievers   PNP: add all PNP ...
650
651
652
653
654
655
656
657
658
659
660
661
  
  					if (!id2[0])
  						break;
  
  					if (!strcmp(id, id2)) {
  						dup = 1;
  						break;
  					}
  				}
  			}
  
  			/* add an individual alias for every device entry */
22454cb99   Kay Sievers   pnp: add acpi:* m...
662
  			if (!dup) {
6543becf2   Andreas Schwab   mod/file2alias: m...
663
  				char acpi_id[PNP_ID_LEN];
72638f598   Kay Sievers   PNP: fix broken p...
664
  				int k;
0c81eed4b   Kay Sievers   PNP: add all PNP ...
665
666
667
  				buf_printf(&mod->dev_table_buf,
  					   "MODULE_ALIAS(\"pnp:d%s*\");
  ", id);
72638f598   Kay Sievers   PNP: fix broken p...
668
669
670
671
  
  				/* fix broken pnp bus lowercasing */
  				for (k = 0; k < sizeof(acpi_id); k++)
  					acpi_id[k] = toupper(id[k]);
22454cb99   Kay Sievers   pnp: add acpi:* m...
672
  				buf_printf(&mod->dev_table_buf,
72638f598   Kay Sievers   PNP: fix broken p...
673
674
  					   "MODULE_ALIAS(\"acpi*:%s:*\");
  ", acpi_id);
22454cb99   Kay Sievers   pnp: add acpi:* m...
675
  			}
0c81eed4b   Kay Sievers   PNP: add all PNP ...
676
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
677
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
678
  }
90829cfe1   Dominik Brodowski   [PATCH] pcmcia: f...
679
680
  /* Looks like: pcmcia:mNcNfNfnNpfnNvaNvbNvcNvdN. */
  static int do_pcmcia_entry(const char *filename,
6543becf2   Andreas Schwab   mod/file2alias: m...
681
  			   void *symval, char *alias)
90829cfe1   Dominik Brodowski   [PATCH] pcmcia: f...
682
683
  {
  	unsigned int i;
6543becf2   Andreas Schwab   mod/file2alias: m...
684
685
686
687
688
689
690
  	DEF_FIELD(symval, pcmcia_device_id, match_flags);
  	DEF_FIELD(symval, pcmcia_device_id, manf_id);
  	DEF_FIELD(symval, pcmcia_device_id, card_id);
  	DEF_FIELD(symval, pcmcia_device_id, func_id);
  	DEF_FIELD(symval, pcmcia_device_id, function);
  	DEF_FIELD(symval, pcmcia_device_id, device_no);
  	DEF_FIELD_ADDR(symval, pcmcia_device_id, prod_id_hash);
4fb7edce5   Kars de Jong   [PATCH] pcmcia: f...
691

90829cfe1   Dominik Brodowski   [PATCH] pcmcia: f...
692
  	for (i=0; i<4; i++) {
6543becf2   Andreas Schwab   mod/file2alias: m...
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
  		(*prod_id_hash)[i] = TO_NATIVE((*prod_id_hash)[i]);
  	}
  
  	strcpy(alias, "pcmcia:");
  	ADD(alias, "m", match_flags & PCMCIA_DEV_ID_MATCH_MANF_ID,
  	    manf_id);
  	ADD(alias, "c", match_flags & PCMCIA_DEV_ID_MATCH_CARD_ID,
  	    card_id);
  	ADD(alias, "f", match_flags & PCMCIA_DEV_ID_MATCH_FUNC_ID,
  	    func_id);
  	ADD(alias, "fn", match_flags & PCMCIA_DEV_ID_MATCH_FUNCTION,
  	    function);
  	ADD(alias, "pfn", match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO,
  	    device_no);
  	ADD(alias, "pa", match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID1, (*prod_id_hash)[0]);
  	ADD(alias, "pb", match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID2, (*prod_id_hash)[1]);
  	ADD(alias, "pc", match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID3, (*prod_id_hash)[2]);
  	ADD(alias, "pd", match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID4, (*prod_id_hash)[3]);
90829cfe1   Dominik Brodowski   [PATCH] pcmcia: f...
711

ac5518289   Jean Delvare   modpost: i2c alia...
712
  	add_wildcard(alias);
6543becf2   Andreas Schwab   mod/file2alias: m...
713
  	return 1;
90829cfe1   Dominik Brodowski   [PATCH] pcmcia: f...
714
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
715
  ADD_TO_DEVTABLE("pcmcia", pcmcia_device_id, do_pcmcia_entry);
90829cfe1   Dominik Brodowski   [PATCH] pcmcia: f...
716

6543becf2   Andreas Schwab   mod/file2alias: m...
717
  static int do_vio_entry(const char *filename, void *symval,
fb120da67   Stephen Rothwell   [PATCH] Make MODU...
718
719
720
  		char *alias)
  {
  	char *tmp;
6543becf2   Andreas Schwab   mod/file2alias: m...
721
722
  	DEF_FIELD_ADDR(symval, vio_device_id, type);
  	DEF_FIELD_ADDR(symval, vio_device_id, compat);
fb120da67   Stephen Rothwell   [PATCH] Make MODU...
723

6543becf2   Andreas Schwab   mod/file2alias: m...
724
725
  	sprintf(alias, "vio:T%sS%s", (*type)[0] ? *type : "*",
  			(*compat)[0] ? *compat : "*");
fb120da67   Stephen Rothwell   [PATCH] Make MODU...
726
727
728
729
730
  
  	/* Replace all whitespace with underscores */
  	for (tmp = alias; tmp && *tmp; tmp++)
  		if (isspace (*tmp))
  			*tmp = '_';
ac5518289   Jean Delvare   modpost: i2c alia...
731
  	add_wildcard(alias);
fb120da67   Stephen Rothwell   [PATCH] Make MODU...
732
733
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
734
  ADD_TO_DEVTABLE("vio", vio_device_id, do_vio_entry);
fb120da67   Stephen Rothwell   [PATCH] Make MODU...
735

1d8f430c1   Rusty Russell   [PATCH] Input: ad...
736
737
738
739
740
741
  #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
  
  static void do_input(char *alias,
  		     kernel_ulong_t *arr, unsigned int min, unsigned int max)
  {
  	unsigned int i;
ddc5d3414   Dmitry Torokhov   Input: move input...
742

6543becf2   Andreas Schwab   mod/file2alias: m...
743
744
  	for (i = min / BITS_PER_LONG; i < max / BITS_PER_LONG + 1; i++)
  		arr[i] = TO_NATIVE(arr[i]);
ddc5d3414   Dmitry Torokhov   Input: move input...
745
  	for (i = min; i < max; i++)
e0e926327   Hans de Goede   [PATCH] PATCH: 1 ...
746
  		if (arr[i / BITS_PER_LONG] & (1L << (i%BITS_PER_LONG)))
ddc5d3414   Dmitry Torokhov   Input: move input...
747
  			sprintf(alias + strlen(alias), "%X,*", i);
1d8f430c1   Rusty Russell   [PATCH] Input: ad...
748
749
750
  }
  
  /* input:b0v0p0e0-eXkXrXaXmXlXsXfXwX where X is comma-separated %02X. */
6543becf2   Andreas Schwab   mod/file2alias: m...
751
  static int do_input_entry(const char *filename, void *symval,
1d8f430c1   Rusty Russell   [PATCH] Input: ad...
752
753
  			  char *alias)
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
754
755
756
757
758
759
760
761
762
763
764
765
766
767
  	DEF_FIELD(symval, input_device_id, flags);
  	DEF_FIELD(symval, input_device_id, bustype);
  	DEF_FIELD(symval, input_device_id, vendor);
  	DEF_FIELD(symval, input_device_id, product);
  	DEF_FIELD(symval, input_device_id, version);
  	DEF_FIELD_ADDR(symval, input_device_id, evbit);
  	DEF_FIELD_ADDR(symval, input_device_id, keybit);
  	DEF_FIELD_ADDR(symval, input_device_id, relbit);
  	DEF_FIELD_ADDR(symval, input_device_id, absbit);
  	DEF_FIELD_ADDR(symval, input_device_id, mscbit);
  	DEF_FIELD_ADDR(symval, input_device_id, ledbit);
  	DEF_FIELD_ADDR(symval, input_device_id, sndbit);
  	DEF_FIELD_ADDR(symval, input_device_id, ffbit);
  	DEF_FIELD_ADDR(symval, input_device_id, swbit);
1d8f430c1   Rusty Russell   [PATCH] Input: ad...
768
  	sprintf(alias, "input:");
6543becf2   Andreas Schwab   mod/file2alias: m...
769
770
771
772
  	ADD(alias, "b", flags & INPUT_DEVICE_ID_MATCH_BUS, bustype);
  	ADD(alias, "v", flags & INPUT_DEVICE_ID_MATCH_VENDOR, vendor);
  	ADD(alias, "p", flags & INPUT_DEVICE_ID_MATCH_PRODUCT, product);
  	ADD(alias, "e", flags & INPUT_DEVICE_ID_MATCH_VERSION, version);
1d8f430c1   Rusty Russell   [PATCH] Input: ad...
773
774
  
  	sprintf(alias + strlen(alias), "-e*");
6543becf2   Andreas Schwab   mod/file2alias: m...
775
776
  	if (flags & INPUT_DEVICE_ID_MATCH_EVBIT)
  		do_input(alias, *evbit, 0, INPUT_DEVICE_ID_EV_MAX);
1d8f430c1   Rusty Russell   [PATCH] Input: ad...
777
  	sprintf(alias + strlen(alias), "k*");
6543becf2   Andreas Schwab   mod/file2alias: m...
778
779
  	if (flags & INPUT_DEVICE_ID_MATCH_KEYBIT)
  		do_input(alias, *keybit,
dc24f0e70   Sam Ravnborg   kbuild: remove de...
780
781
  			 INPUT_DEVICE_ID_KEY_MIN_INTERESTING,
  			 INPUT_DEVICE_ID_KEY_MAX);
1d8f430c1   Rusty Russell   [PATCH] Input: ad...
782
  	sprintf(alias + strlen(alias), "r*");
6543becf2   Andreas Schwab   mod/file2alias: m...
783
784
  	if (flags & INPUT_DEVICE_ID_MATCH_RELBIT)
  		do_input(alias, *relbit, 0, INPUT_DEVICE_ID_REL_MAX);
1d8f430c1   Rusty Russell   [PATCH] Input: ad...
785
  	sprintf(alias + strlen(alias), "a*");
6543becf2   Andreas Schwab   mod/file2alias: m...
786
787
  	if (flags & INPUT_DEVICE_ID_MATCH_ABSBIT)
  		do_input(alias, *absbit, 0, INPUT_DEVICE_ID_ABS_MAX);
1d8f430c1   Rusty Russell   [PATCH] Input: ad...
788
  	sprintf(alias + strlen(alias), "m*");
6543becf2   Andreas Schwab   mod/file2alias: m...
789
790
  	if (flags & INPUT_DEVICE_ID_MATCH_MSCIT)
  		do_input(alias, *mscbit, 0, INPUT_DEVICE_ID_MSC_MAX);
1d8f430c1   Rusty Russell   [PATCH] Input: ad...
791
  	sprintf(alias + strlen(alias), "l*");
6543becf2   Andreas Schwab   mod/file2alias: m...
792
793
  	if (flags & INPUT_DEVICE_ID_MATCH_LEDBIT)
  		do_input(alias, *ledbit, 0, INPUT_DEVICE_ID_LED_MAX);
1d8f430c1   Rusty Russell   [PATCH] Input: ad...
794
  	sprintf(alias + strlen(alias), "s*");
6543becf2   Andreas Schwab   mod/file2alias: m...
795
796
  	if (flags & INPUT_DEVICE_ID_MATCH_SNDBIT)
  		do_input(alias, *sndbit, 0, INPUT_DEVICE_ID_SND_MAX);
1d8f430c1   Rusty Russell   [PATCH] Input: ad...
797
  	sprintf(alias + strlen(alias), "f*");
6543becf2   Andreas Schwab   mod/file2alias: m...
798
799
  	if (flags & INPUT_DEVICE_ID_MATCH_FFBIT)
  		do_input(alias, *ffbit, 0, INPUT_DEVICE_ID_FF_MAX);
1d8f430c1   Rusty Russell   [PATCH] Input: ad...
800
  	sprintf(alias + strlen(alias), "w*");
6543becf2   Andreas Schwab   mod/file2alias: m...
801
802
  	if (flags & INPUT_DEVICE_ID_MATCH_SWBIT)
  		do_input(alias, *swbit, 0, INPUT_DEVICE_ID_SW_MAX);
1d8f430c1   Rusty Russell   [PATCH] Input: ad...
803
804
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
805
  ADD_TO_DEVTABLE("input", input_device_id, do_input_entry);
1d8f430c1   Rusty Russell   [PATCH] Input: ad...
806

6543becf2   Andreas Schwab   mod/file2alias: m...
807
  static int do_eisa_entry(const char *filename, void *symval,
07563c711   Michael Tokarev   [PATCH] EISA bus ...
808
809
  		char *alias)
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
810
811
812
  	DEF_FIELD_ADDR(symval, eisa_device_id, sig);
  	if (sig[0])
  		sprintf(alias, EISA_DEVICE_MODALIAS_FMT "*", *sig);
ac5518289   Jean Delvare   modpost: i2c alia...
813
814
  	else
  		strcat(alias, "*");
07563c711   Michael Tokarev   [PATCH] EISA bus ...
815
816
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
817
  ADD_TO_DEVTABLE("eisa", eisa_device_id, do_eisa_entry);
07563c711   Michael Tokarev   [PATCH] EISA bus ...
818

f3cf26733   Kyle McMartin   [PARISC] generate...
819
  /* Looks like: parisc:tNhvNrevNsvN */
6543becf2   Andreas Schwab   mod/file2alias: m...
820
  static int do_parisc_entry(const char *filename, void *symval,
f3cf26733   Kyle McMartin   [PARISC] generate...
821
822
  		char *alias)
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
823
824
825
826
  	DEF_FIELD(symval, parisc_device_id, hw_type);
  	DEF_FIELD(symval, parisc_device_id, hversion);
  	DEF_FIELD(symval, parisc_device_id, hversion_rev);
  	DEF_FIELD(symval, parisc_device_id, sversion);
f3cf26733   Kyle McMartin   [PARISC] generate...
827
828
  
  	strcpy(alias, "parisc:");
6543becf2   Andreas Schwab   mod/file2alias: m...
829
830
831
832
  	ADD(alias, "t", hw_type != PA_HWTYPE_ANY_ID, hw_type);
  	ADD(alias, "hv", hversion != PA_HVERSION_ANY_ID, hversion);
  	ADD(alias, "rev", hversion_rev != PA_HVERSION_REV_ANY_ID, hversion_rev);
  	ADD(alias, "sv", sversion != PA_SVERSION_ANY_ID, sversion);
f3cf26733   Kyle McMartin   [PARISC] generate...
833

ac5518289   Jean Delvare   modpost: i2c alia...
834
  	add_wildcard(alias);
f3cf26733   Kyle McMartin   [PARISC] generate...
835
836
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
837
  ADD_TO_DEVTABLE("parisc", parisc_device_id, do_parisc_entry);
f3cf26733   Kyle McMartin   [PARISC] generate...
838

d59b66c7a   Pierre Ossman   sdio: add modalia...
839
840
  /* Looks like: sdio:cNvNdN. */
  static int do_sdio_entry(const char *filename,
6543becf2   Andreas Schwab   mod/file2alias: m...
841
  			void *symval, char *alias)
d59b66c7a   Pierre Ossman   sdio: add modalia...
842
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
843
844
845
  	DEF_FIELD(symval, sdio_device_id, class);
  	DEF_FIELD(symval, sdio_device_id, vendor);
  	DEF_FIELD(symval, sdio_device_id, device);
d59b66c7a   Pierre Ossman   sdio: add modalia...
846
847
  
  	strcpy(alias, "sdio:");
6543becf2   Andreas Schwab   mod/file2alias: m...
848
849
850
  	ADD(alias, "c", class != (__u8)SDIO_ANY_ID, class);
  	ADD(alias, "v", vendor != (__u16)SDIO_ANY_ID, vendor);
  	ADD(alias, "d", device != (__u16)SDIO_ANY_ID, device);
ac5518289   Jean Delvare   modpost: i2c alia...
851
  	add_wildcard(alias);
038a5008b   Linus Torvalds   Merge branch 'mas...
852
853
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
854
  ADD_TO_DEVTABLE("sdio", sdio_device_id, do_sdio_entry);
038a5008b   Linus Torvalds   Merge branch 'mas...
855

61e115a56   Michael Buesch   [SSB]: add Sonics...
856
857
  /* Looks like: ssb:vNidNrevN. */
  static int do_ssb_entry(const char *filename,
6543becf2   Andreas Schwab   mod/file2alias: m...
858
  			void *symval, char *alias)
61e115a56   Michael Buesch   [SSB]: add Sonics...
859
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
860
861
862
  	DEF_FIELD(symval, ssb_device_id, vendor);
  	DEF_FIELD(symval, ssb_device_id, coreid);
  	DEF_FIELD(symval, ssb_device_id, revision);
d59b66c7a   Pierre Ossman   sdio: add modalia...
863

61e115a56   Michael Buesch   [SSB]: add Sonics...
864
  	strcpy(alias, "ssb:");
6543becf2   Andreas Schwab   mod/file2alias: m...
865
866
867
  	ADD(alias, "v", vendor != SSB_ANY_VENDOR, vendor);
  	ADD(alias, "id", coreid != SSB_ANY_ID, coreid);
  	ADD(alias, "rev", revision != SSB_ANY_REV, revision);
ac5518289   Jean Delvare   modpost: i2c alia...
868
  	add_wildcard(alias);
d59b66c7a   Pierre Ossman   sdio: add modalia...
869
870
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
871
  ADD_TO_DEVTABLE("ssb", ssb_device_id, do_ssb_entry);
d59b66c7a   Pierre Ossman   sdio: add modalia...
872

8369ae33b   Rafał Miłecki   bcma: add Broadco...
873
874
  /* Looks like: bcma:mNidNrevNclN. */
  static int do_bcma_entry(const char *filename,
6543becf2   Andreas Schwab   mod/file2alias: m...
875
  			 void *symval, char *alias)
8369ae33b   Rafał Miłecki   bcma: add Broadco...
876
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
877
878
879
880
  	DEF_FIELD(symval, bcma_device_id, manuf);
  	DEF_FIELD(symval, bcma_device_id, id);
  	DEF_FIELD(symval, bcma_device_id, rev);
  	DEF_FIELD(symval, bcma_device_id, class);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
881
882
  
  	strcpy(alias, "bcma:");
6543becf2   Andreas Schwab   mod/file2alias: m...
883
884
885
886
  	ADD(alias, "m", manuf != BCMA_ANY_MANUF, manuf);
  	ADD(alias, "id", id != BCMA_ANY_ID, id);
  	ADD(alias, "rev", rev != BCMA_ANY_REV, rev);
  	ADD(alias, "cl", class != BCMA_ANY_CLASS, class);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
887
888
889
  	add_wildcard(alias);
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
890
  ADD_TO_DEVTABLE("bcma", bcma_device_id, do_bcma_entry);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
891

b01d9f286   Rusty Russell   Module autoprobin...
892
  /* Looks like: virtio:dNvN */
6543becf2   Andreas Schwab   mod/file2alias: m...
893
  static int do_virtio_entry(const char *filename, void *symval,
b01d9f286   Rusty Russell   Module autoprobin...
894
895
  			   char *alias)
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
896
897
  	DEF_FIELD(symval, virtio_device_id, device);
  	DEF_FIELD(symval, virtio_device_id, vendor);
b01d9f286   Rusty Russell   Module autoprobin...
898
899
  
  	strcpy(alias, "virtio:");
6543becf2   Andreas Schwab   mod/file2alias: m...
900
901
  	ADD(alias, "d", device != VIRTIO_DEV_ANY_ID, device);
  	ADD(alias, "v", vendor != VIRTIO_DEV_ANY_ID, vendor);
b01d9f286   Rusty Russell   Module autoprobin...
902

ac5518289   Jean Delvare   modpost: i2c alia...
903
  	add_wildcard(alias);
b01d9f286   Rusty Russell   Module autoprobin...
904
905
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
906
  ADD_TO_DEVTABLE("virtio", virtio_device_id, do_virtio_entry);
b01d9f286   Rusty Russell   Module autoprobin...
907

d2ee52aaf   K. Y. Srinivasan   Staging: hv: Add ...
908
909
910
911
912
  /*
   * Looks like: vmbus:guid
   * Each byte of the guid will be represented by two hex characters
   * in the name.
   */
6543becf2   Andreas Schwab   mod/file2alias: m...
913
  static int do_vmbus_entry(const char *filename, void *symval,
d2ee52aaf   K. Y. Srinivasan   Staging: hv: Add ...
914
915
916
  			  char *alias)
  {
  	int i;
6543becf2   Andreas Schwab   mod/file2alias: m...
917
918
  	DEF_FIELD_ADDR(symval, hv_vmbus_device_id, guid);
  	char guid_name[(sizeof(*guid) + 1) * 2];
d2ee52aaf   K. Y. Srinivasan   Staging: hv: Add ...
919

6543becf2   Andreas Schwab   mod/file2alias: m...
920
  	for (i = 0; i < (sizeof(*guid) * 2); i += 2)
af3ff643e   K. Y. Srinivasan   Drivers: hv: vmbu...
921
  		sprintf(&guid_name[i], "%02x", TO_NATIVE((guid->b)[i/2]));
d2ee52aaf   K. Y. Srinivasan   Staging: hv: Add ...
922
923
924
925
926
927
  
  	strcpy(alias, "vmbus:");
  	strcat(alias, guid_name);
  
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
928
  ADD_TO_DEVTABLE("vmbus", hv_vmbus_device_id, do_vmbus_entry);
d2ee52aaf   K. Y. Srinivasan   Staging: hv: Add ...
929

d2653e927   Jean Delvare   i2c: Add support ...
930
  /* Looks like: i2c:S */
6543becf2   Andreas Schwab   mod/file2alias: m...
931
  static int do_i2c_entry(const char *filename, void *symval,
d2653e927   Jean Delvare   i2c: Add support ...
932
933
  			char *alias)
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
934
935
  	DEF_FIELD_ADDR(symval, i2c_device_id, name);
  	sprintf(alias, I2C_MODULE_PREFIX "%s", *name);
d2653e927   Jean Delvare   i2c: Add support ...
936
937
938
  
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
939
  ADD_TO_DEVTABLE("i2c", i2c_device_id, do_i2c_entry);
d2653e927   Jean Delvare   i2c: Add support ...
940

e0626e384   Anton Vorontsov   spi: prefix modal...
941
  /* Looks like: spi:S */
6543becf2   Andreas Schwab   mod/file2alias: m...
942
  static int do_spi_entry(const char *filename, void *symval,
75368bf6c   Anton Vorontsov   spi: add support ...
943
944
  			char *alias)
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
945
946
  	DEF_FIELD_ADDR(symval, spi_device_id, name);
  	sprintf(alias, SPI_MODULE_PREFIX "%s", *name);
75368bf6c   Anton Vorontsov   spi: add support ...
947
948
949
  
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
950
  ADD_TO_DEVTABLE("spi", spi_device_id, do_spi_entry);
75368bf6c   Anton Vorontsov   spi: add support ...
951

d945b697d   David Woodhouse   Automatic MODULE_...
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
  static const struct dmifield {
  	const char *prefix;
  	int field;
  } dmi_fields[] = {
  	{ "bvn", DMI_BIOS_VENDOR },
  	{ "bvr", DMI_BIOS_VERSION },
  	{ "bd",  DMI_BIOS_DATE },
  	{ "svn", DMI_SYS_VENDOR },
  	{ "pn",  DMI_PRODUCT_NAME },
  	{ "pvr", DMI_PRODUCT_VERSION },
  	{ "rvn", DMI_BOARD_VENDOR },
  	{ "rn",  DMI_BOARD_NAME },
  	{ "rvr", DMI_BOARD_VERSION },
  	{ "cvn", DMI_CHASSIS_VENDOR },
  	{ "ct",  DMI_CHASSIS_TYPE },
  	{ "cvr", DMI_CHASSIS_VERSION },
  	{ NULL,  DMI_NONE }
  };
  
  static void dmi_ascii_filter(char *d, const char *s)
  {
  	/* Filter out characters we don't want to see in the modalias string */
  	for (; *s; s++)
  		if (*s > ' ' && *s < 127 && *s != ':')
  			*(d++) = *s;
  
  	*d = 0;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
980
  static int do_dmi_entry(const char *filename, void *symval,
d945b697d   David Woodhouse   Automatic MODULE_...
981
982
983
  			char *alias)
  {
  	int i, j;
6543becf2   Andreas Schwab   mod/file2alias: m...
984
  	DEF_FIELD_ADDR(symval, dmi_system_id, matches);
d945b697d   David Woodhouse   Automatic MODULE_...
985
986
987
988
  	sprintf(alias, "dmi*");
  
  	for (i = 0; i < ARRAY_SIZE(dmi_fields); i++) {
  		for (j = 0; j < 4; j++) {
6543becf2   Andreas Schwab   mod/file2alias: m...
989
990
  			if ((*matches)[j].slot &&
  			    (*matches)[j].slot == dmi_fields[i].field) {
d945b697d   David Woodhouse   Automatic MODULE_...
991
992
993
  				sprintf(alias + strlen(alias), ":%s*",
  					dmi_fields[i].prefix);
  				dmi_ascii_filter(alias + strlen(alias),
6543becf2   Andreas Schwab   mod/file2alias: m...
994
  						 (*matches)[j].substr);
d945b697d   David Woodhouse   Automatic MODULE_...
995
996
997
998
999
1000
1001
1002
  				strcat(alias, "*");
  			}
  		}
  	}
  
  	strcat(alias, ":");
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
1003
  ADD_TO_DEVTABLE("dmi", dmi_system_id, do_dmi_entry);
57fee4a58   Eric Miao   platform: introdu...
1004
1005
  
  static int do_platform_entry(const char *filename,
6543becf2   Andreas Schwab   mod/file2alias: m...
1006
  			     void *symval, char *alias)
57fee4a58   Eric Miao   platform: introdu...
1007
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
1008
1009
  	DEF_FIELD_ADDR(symval, platform_device_id, name);
  	sprintf(alias, PLATFORM_MODULE_PREFIX "%s", *name);
57fee4a58   Eric Miao   platform: introdu...
1010
1011
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
1012
  ADD_TO_DEVTABLE("platform", platform_device_id, do_platform_entry);
57fee4a58   Eric Miao   platform: introdu...
1013

8626d3b43   David Woodhouse   phylib: Support p...
1014
  static int do_mdio_entry(const char *filename,
6543becf2   Andreas Schwab   mod/file2alias: m...
1015
  			 void *symval, char *alias)
8626d3b43   David Woodhouse   phylib: Support p...
1016
1017
  {
  	int i;
6543becf2   Andreas Schwab   mod/file2alias: m...
1018
1019
  	DEF_FIELD(symval, mdio_device_id, phy_id);
  	DEF_FIELD(symval, mdio_device_id, phy_id_mask);
8626d3b43   David Woodhouse   phylib: Support p...
1020
1021
1022
1023
  
  	alias += sprintf(alias, MDIO_MODULE_PREFIX);
  
  	for (i = 0; i < 32; i++) {
6543becf2   Andreas Schwab   mod/file2alias: m...
1024
  		if (!((phy_id_mask >> (31-i)) & 1))
8626d3b43   David Woodhouse   phylib: Support p...
1025
  			*(alias++) = '?';
6543becf2   Andreas Schwab   mod/file2alias: m...
1026
  		else if ((phy_id >> (31-i)) & 1)
8626d3b43   David Woodhouse   phylib: Support p...
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
  			*(alias++) = '1';
  		else
  			*(alias++) = '0';
  	}
  
  	/* Terminate the string */
  	*alias = 0;
  
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
1037
  ADD_TO_DEVTABLE("mdio", mdio_device_id, do_mdio_entry);
8626d3b43   David Woodhouse   phylib: Support p...
1038

bf54a2b3c   Geert Uytterhoeven   m68k: amiga - Zor...
1039
  /* Looks like: zorro:iN. */
6543becf2   Andreas Schwab   mod/file2alias: m...
1040
  static int do_zorro_entry(const char *filename, void *symval,
bf54a2b3c   Geert Uytterhoeven   m68k: amiga - Zor...
1041
1042
  			  char *alias)
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
1043
  	DEF_FIELD(symval, zorro_device_id, id);
bf54a2b3c   Geert Uytterhoeven   m68k: amiga - Zor...
1044
  	strcpy(alias, "zorro:");
6543becf2   Andreas Schwab   mod/file2alias: m...
1045
  	ADD(alias, "i", id != ZORRO_WILDCARD, id);
bf54a2b3c   Geert Uytterhoeven   m68k: amiga - Zor...
1046
1047
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
1048
  ADD_TO_DEVTABLE("zorro", zorro_device_id, do_zorro_entry);
bf54a2b3c   Geert Uytterhoeven   m68k: amiga - Zor...
1049

fedb3d27d   Ondrej Zary   MODULE_DEVICE_TAB...
1050
1051
  /* looks like: "pnp:dD" */
  static int do_isapnp_entry(const char *filename,
6543becf2   Andreas Schwab   mod/file2alias: m...
1052
  			   void *symval, char *alias)
fedb3d27d   Ondrej Zary   MODULE_DEVICE_TAB...
1053
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
1054
1055
  	DEF_FIELD(symval, isapnp_device_id, vendor);
  	DEF_FIELD(symval, isapnp_device_id, function);
fedb3d27d   Ondrej Zary   MODULE_DEVICE_TAB...
1056
  	sprintf(alias, "pnp:d%c%c%c%x%x%x%x*",
6543becf2   Andreas Schwab   mod/file2alias: m...
1057
1058
1059
1060
1061
  		'A' + ((vendor >> 2) & 0x3f) - 1,
  		'A' + (((vendor & 3) << 3) | ((vendor >> 13) & 7)) - 1,
  		'A' + ((vendor >> 8) & 0x1f) - 1,
  		(function >> 4) & 0x0f, function & 0x0f,
  		(function >> 12) & 0x0f, (function >> 8) & 0x0f);
fedb3d27d   Ondrej Zary   MODULE_DEVICE_TAB...
1062
1063
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
1064
  ADD_TO_DEVTABLE("isapnp", isapnp_device_id, do_isapnp_entry);
fedb3d27d   Ondrej Zary   MODULE_DEVICE_TAB...
1065

849e0ad25   Jens Taprogge   Staging: ipack: i...
1066
1067
  /* Looks like: "ipack:fNvNdN". */
  static int do_ipack_entry(const char *filename,
6543becf2   Andreas Schwab   mod/file2alias: m...
1068
  			  void *symval, char *alias)
849e0ad25   Jens Taprogge   Staging: ipack: i...
1069
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
1070
1071
1072
  	DEF_FIELD(symval, ipack_device_id, format);
  	DEF_FIELD(symval, ipack_device_id, vendor);
  	DEF_FIELD(symval, ipack_device_id, device);
849e0ad25   Jens Taprogge   Staging: ipack: i...
1073
  	strcpy(alias, "ipack:");
6543becf2   Andreas Schwab   mod/file2alias: m...
1074
1075
1076
  	ADD(alias, "f", format != IPACK_ANY_FORMAT, format);
  	ADD(alias, "v", vendor != IPACK_ANY_ID, vendor);
  	ADD(alias, "d", device != IPACK_ANY_ID, device);
849e0ad25   Jens Taprogge   Staging: ipack: i...
1077
1078
1079
  	add_wildcard(alias);
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
1080
  ADD_TO_DEVTABLE("ipack", ipack_device_id, do_ipack_entry);
849e0ad25   Jens Taprogge   Staging: ipack: i...
1081

523817bd2   Dave Martin   ARM: amba: Auto-g...
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
  /*
   * Append a match expression for a single masked hex digit.
   * outp points to a pointer to the character at which to append.
   *	*outp is updated on return to point just after the appended text,
   *	to facilitate further appending.
   */
  static void append_nibble_mask(char **outp,
  			       unsigned int nibble, unsigned int mask)
  {
  	char *p = *outp;
  	unsigned int i;
  
  	switch (mask) {
  	case 0:
  		*p++ = '?';
  		break;
  
  	case 0xf:
  		p += sprintf(p, "%X",  nibble);
  		break;
  
  	default:
  		/*
  		 * Dumbly emit a match pattern for all possible matching
  		 * digits.  This could be improved in some cases using ranges,
  		 * but it has the advantage of being trivially correct, and is
  		 * often optimal.
  		 */
  		*p++ = '[';
  		for (i = 0; i < 0x10; i++)
  			if ((i & mask) == nibble)
  				p += sprintf(p, "%X", i);
  		*p++ = ']';
  	}
  
  	/* Ensure that the string remains NUL-terminated: */
  	*p = '\0';
  
  	/* Advance the caller's end-of-string pointer: */
  	*outp = p;
  }
  
  /*
   * looks like: "amba:dN"
   *
   * N is exactly 8 digits, where each is an upper-case hex digit, or
   *	a ? or [] pattern matching exactly one digit.
   */
  static int do_amba_entry(const char *filename,
6543becf2   Andreas Schwab   mod/file2alias: m...
1131
  			 void *symval, char *alias)
523817bd2   Dave Martin   ARM: amba: Auto-g...
1132
1133
1134
  {
  	unsigned int digit;
  	char *p = alias;
6543becf2   Andreas Schwab   mod/file2alias: m...
1135
1136
  	DEF_FIELD(symval, amba_id, id);
  	DEF_FIELD(symval, amba_id, mask);
523817bd2   Dave Martin   ARM: amba: Auto-g...
1137

6543becf2   Andreas Schwab   mod/file2alias: m...
1138
  	if ((id & mask) != id)
523817bd2   Dave Martin   ARM: amba: Auto-g...
1139
1140
1141
  		fatal("%s: Masked-off bit(s) of AMBA device ID are non-zero: "
  		      "id=0x%08X, mask=0x%08X.  Please fix this driver.
  ",
6543becf2   Andreas Schwab   mod/file2alias: m...
1142
  		      filename, id, mask);
523817bd2   Dave Martin   ARM: amba: Auto-g...
1143
1144
1145
1146
  
  	p += sprintf(alias, "amba:d");
  	for (digit = 0; digit < 8; digit++)
  		append_nibble_mask(&p,
6543becf2   Andreas Schwab   mod/file2alias: m...
1147
1148
  				   (id >> (4 * (7 - digit))) & 0xf,
  				   (mask >> (4 * (7 - digit))) & 0xf);
523817bd2   Dave Martin   ARM: amba: Auto-g...
1149
1150
1151
  
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
1152
  ADD_TO_DEVTABLE("amba", amba_id, do_amba_entry);
523817bd2   Dave Martin   ARM: amba: Auto-g...
1153

8286ae033   James Hogan   MIPS: Add CDMM bu...
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
  /*
   * looks like: "mipscdmm:tN"
   *
   * N is exactly 2 digits, where each is an upper-case hex digit, or
   *	a ? or [] pattern matching exactly one digit.
   */
  static int do_mips_cdmm_entry(const char *filename,
  			      void *symval, char *alias)
  {
  	DEF_FIELD(symval, mips_cdmm_device_id, type);
  
  	sprintf(alias, "mipscdmm:t%02X*", type);
  	return 1;
  }
  ADD_TO_DEVTABLE("mipscdmm", mips_cdmm_device_id, do_mips_cdmm_entry);
2b9c1f032   Ard Biesheuvel   x86: align x86 ar...
1169
  /* LOOKS like cpu:type:x86,venVVVVfamFFFFmodMMMM:feature:*,FEAT,*
644e9cbbe   Andi Kleen   Add driver auto p...
1170
1171
1172
1173
   * All fields are numbers. It would be nicer to use strings for vendor
   * and feature, but getting those out of the build system here is too
   * complicated.
   */
6543becf2   Andreas Schwab   mod/file2alias: m...
1174
  static int do_x86cpu_entry(const char *filename, void *symval,
644e9cbbe   Andi Kleen   Add driver auto p...
1175
1176
  			   char *alias)
  {
6543becf2   Andreas Schwab   mod/file2alias: m...
1177
1178
1179
1180
  	DEF_FIELD(symval, x86_cpu_id, feature);
  	DEF_FIELD(symval, x86_cpu_id, family);
  	DEF_FIELD(symval, x86_cpu_id, model);
  	DEF_FIELD(symval, x86_cpu_id, vendor);
644e9cbbe   Andi Kleen   Add driver auto p...
1181

2b9c1f032   Ard Biesheuvel   x86: align x86 ar...
1182
1183
1184
1185
  	strcpy(alias, "cpu:type:x86,");
  	ADD(alias, "ven", vendor != X86_VENDOR_ANY, vendor);
  	ADD(alias, "fam", family != X86_FAMILY_ANY, family);
  	ADD(alias, "mod", model  != X86_MODEL_ANY,  model);
5467bdda4   Ben Hutchings   x86/cpu: Clean up...
1186
  	strcat(alias, ":feature:*");
6543becf2   Andreas Schwab   mod/file2alias: m...
1187
1188
  	if (feature != X86_FEATURE_ANY)
  		sprintf(alias + strlen(alias), "%04X*", feature);
644e9cbbe   Andi Kleen   Add driver auto p...
1189
1190
  	return 1;
  }
6543becf2   Andreas Schwab   mod/file2alias: m...
1191
  ADD_TO_DEVTABLE("x86cpu", x86_cpu_id, do_x86cpu_entry);
644e9cbbe   Andi Kleen   Add driver auto p...
1192

67bad2fdb   Ard Biesheuvel   cpu: add generic ...
1193
1194
1195
1196
1197
1198
1199
1200
1201
  /* LOOKS like cpu:type:*:feature:*FEAT* */
  static int do_cpu_entry(const char *filename, void *symval, char *alias)
  {
  	DEF_FIELD(symval, cpu_feature, feature);
  
  	sprintf(alias, "cpu:type:*:feature:*%04X*", feature);
  	return 1;
  }
  ADD_TO_DEVTABLE("cpu", cpu_feature, do_cpu_entry);
b26864cad   Tomas Winkler   mei: bus: add cli...
1202
  /* Looks like: mei:S:uuid:N:* */
e5354107e   Samuel Ortiz   mei: bus: Initial...
1203
1204
1205
1206
  static int do_mei_entry(const char *filename, void *symval,
  			char *alias)
  {
  	DEF_FIELD_ADDR(symval, mei_cl_device_id, name);
c93b76b34   Tomas Winkler   mei: bus: report ...
1207
  	DEF_FIELD_ADDR(symval, mei_cl_device_id, uuid);
b26864cad   Tomas Winkler   mei: bus: add cli...
1208
  	DEF_FIELD(symval, mei_cl_device_id, version);
c93b76b34   Tomas Winkler   mei: bus: report ...
1209
1210
1211
1212
  
  	sprintf(alias, MEI_CL_MODULE_PREFIX);
  	sprintf(alias + strlen(alias), "%s:",  (*name)[0]  ? *name : "*");
  	add_uuid(alias, *uuid);
b26864cad   Tomas Winkler   mei: bus: add cli...
1213
  	ADD(alias, ":", version != MEI_CL_VERSION_ANY, version);
e5354107e   Samuel Ortiz   mei: bus: Initial...
1214

c93b76b34   Tomas Winkler   mei: bus: report ...
1215
  	strcat(alias, ":*");
e5354107e   Samuel Ortiz   mei: bus: Initial...
1216
1217
1218
1219
  
  	return 1;
  }
  ADD_TO_DEVTABLE("mei", mei_cl_device_id, do_mei_entry);
3bdbb62fe   Alexandre Bounine   rapidio: add udev...
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
  /* Looks like: rapidio:vNdNavNadN */
  static int do_rio_entry(const char *filename,
  			void *symval, char *alias)
  {
  	DEF_FIELD(symval, rio_device_id, did);
  	DEF_FIELD(symval, rio_device_id, vid);
  	DEF_FIELD(symval, rio_device_id, asm_did);
  	DEF_FIELD(symval, rio_device_id, asm_vid);
  
  	strcpy(alias, "rapidio:");
  	ADD(alias, "v", vid != RIO_ANY_ID, vid);
  	ADD(alias, "d", did != RIO_ANY_ID, did);
  	ADD(alias, "av", asm_vid != RIO_ANY_ID, asm_vid);
  	ADD(alias, "ad", asm_did != RIO_ANY_ID, asm_did);
  
  	add_wildcard(alias);
  	return 1;
  }
  ADD_TO_DEVTABLE("rapidio", rio_device_id, do_rio_entry);
289fcff4b   Heikki Krogerus   usb: add bus type...
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
  /* Looks like: ulpi:vNpN */
  static int do_ulpi_entry(const char *filename, void *symval,
  			 char *alias)
  {
  	DEF_FIELD(symval, ulpi_device_id, vendor);
  	DEF_FIELD(symval, ulpi_device_id, product);
  
  	sprintf(alias, "ulpi:v%04xp%04x", vendor, product);
  
  	return 1;
  }
  ADD_TO_DEVTABLE("ulpi", ulpi_device_id, do_ulpi_entry);
da23ac1e4   Subhransu S. Prusty   ALSA: hda - Add h...
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
  /* Looks like: hdaudio:vNrNaN */
  static int do_hda_entry(const char *filename, void *symval, char *alias)
  {
  	DEF_FIELD(symval, hda_device_id, vendor_id);
  	DEF_FIELD(symval, hda_device_id, rev_id);
  	DEF_FIELD(symval, hda_device_id, api_version);
  
  	strcpy(alias, "hdaudio:");
  	ADD(alias, "v", vendor_id != 0, vendor_id);
  	ADD(alias, "r", rev_id != 0, rev_id);
  	ADD(alias, "a", api_version != 0, api_version);
  
  	add_wildcard(alias);
  	return 1;
  }
  ADD_TO_DEVTABLE("hdaudio", hda_device_id, do_hda_entry);
0afef4565   Stuart Yoder   staging: fsl-mc: ...
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
  /* Looks like: fsl-mc:vNdN */
  static int do_fsl_mc_entry(const char *filename, void *symval,
  			   char *alias)
  {
  	DEF_FIELD(symval, fsl_mc_device_id, vendor);
  	DEF_FIELD_ADDR(symval, fsl_mc_device_id, obj_type);
  
  	sprintf(alias, "fsl-mc:v%08Xd%s", vendor, *obj_type);
  	return 1;
  }
  ADD_TO_DEVTABLE("fslmc", fsl_mc_device_id, do_fsl_mc_entry);
626596e29   Rusty Russell   modpost: use a ta...
1278
1279
  /* Does namelen bytes of name exactly match the symbol? */
  static bool sym_is(const char *name, unsigned namelen, const char *symbol)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1280
  {
626596e29   Rusty Russell   modpost: use a ta...
1281
1282
  	if (namelen != strlen(symbol))
  		return false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1283

626596e29   Rusty Russell   modpost: use a ta...
1284
  	return memcmp(name, symbol, namelen) == 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1285
1286
1287
1288
  }
  
  static void do_table(void *symval, unsigned long size,
  		     unsigned long id_size,
fb33d8161   Sam Ravnborg   kbuild: improve e...
1289
  		     const char *device_id,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1290
1291
1292
1293
1294
1295
  		     void *function,
  		     struct module *mod)
  {
  	unsigned int i;
  	char alias[500];
  	int (*do_entry)(const char *, void *entry, char *alias) = function;
e00498258   Kees Cook   kbuild: make modp...
1296
  	device_id_check(mod->name, device_id, size, id_size, symval);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1297
1298
1299
1300
1301
  	/* Leave last one: it's the terminator. */
  	size -= id_size;
  
  	for (i = 0; i < size; i += id_size) {
  		if (do_entry(mod->name, symval+i, alias)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
  			buf_printf(&mod->dev_table_buf,
  				   "MODULE_ALIAS(\"%s\");
  ", alias);
  		}
  	}
  }
  
  /* Create MODULE_ALIAS() statements.
   * At this time, we cannot write the actual output C source yet,
   * so we write into the mod->dev_table_buf buffer. */
  void handle_moddevtable(struct module *mod, struct elf_info *info,
  			Elf_Sym *sym, const char *symname)
  {
  	void *symval;
e00498258   Kees Cook   kbuild: make modp...
1316
  	char *zeros = NULL;
21bdd17b2   Tom Gundersen   module: allow mul...
1317
  	const char *name, *identifier;
626596e29   Rusty Russell   modpost: use a ta...
1318
  	unsigned int namelen;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1319
1320
  
  	/* We're looking for a section relative symbol */
1ce53adf1   Denys Vlasenko   modpost: support ...
1321
  	if (!sym->st_shndx || get_secindex(info, sym) >= info->num_sections)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1322
  		return;
e88aa7bbb   David Miller   Fix modpost failu...
1323
1324
1325
  	/* We're looking for an object */
  	if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT)
  		return;
21bdd17b2   Tom Gundersen   module: allow mul...
1326
  	/* All our symbols are of form <prefix>__mod_<name>__<identifier>_device_table. */
626596e29   Rusty Russell   modpost: use a ta...
1327
1328
1329
1330
1331
1332
1333
1334
1335
  	name = strstr(symname, "__mod_");
  	if (!name)
  		return;
  	name += strlen("__mod_");
  	namelen = strlen(name);
  	if (namelen < strlen("_device_table"))
  		return;
  	if (strcmp(name + namelen - strlen("_device_table"), "_device_table"))
  		return;
21bdd17b2   Tom Gundersen   module: allow mul...
1336
1337
1338
1339
  	identifier = strstr(name, "__");
  	if (!identifier)
  		return;
  	namelen = identifier - name;
626596e29   Rusty Russell   modpost: use a ta...
1340

e00498258   Kees Cook   kbuild: make modp...
1341
  	/* Handle all-NULL symbols allocated into .bss */
1ce53adf1   Denys Vlasenko   modpost: support ...
1342
  	if (info->sechdrs[get_secindex(info, sym)].sh_type & SHT_NOBITS) {
e00498258   Kees Cook   kbuild: make modp...
1343
1344
1345
1346
  		zeros = calloc(1, sym->st_size);
  		symval = zeros;
  	} else {
  		symval = (void *)info->hdr
1ce53adf1   Denys Vlasenko   modpost: support ...
1347
  			+ info->sechdrs[get_secindex(info, sym)].sh_offset
e00498258   Kees Cook   kbuild: make modp...
1348
1349
  			+ sym->st_value;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1350

626596e29   Rusty Russell   modpost: use a ta...
1351
1352
  	/* First handle the "special" cases */
  	if (sym_is(name, namelen, "usb"))
b19dcd934   Roman Kagan   [PATCH] USB: scri...
1353
  		do_usb_table(symval, sym->st_size, mod);
acbef7b76   Philipp Zabel   modpost: fix modu...
1354
1355
  	if (sym_is(name, namelen, "of"))
  		do_of_table(symval, sym->st_size, mod);
626596e29   Rusty Russell   modpost: use a ta...
1356
  	else if (sym_is(name, namelen, "pnp"))
22454cb99   Kay Sievers   pnp: add acpi:* m...
1357
  		do_pnp_device_entry(symval, sym->st_size, mod);
626596e29   Rusty Russell   modpost: use a ta...
1358
  	else if (sym_is(name, namelen, "pnp_card"))
0c81eed4b   Kay Sievers   PNP: add all PNP ...
1359
  		do_pnp_card_entries(symval, sym->st_size, mod);
626596e29   Rusty Russell   modpost: use a ta...
1360
  	else {
e49ce1415   Rusty Russell   modpost: use link...
1361
  		struct devtable **p;
dd2a3acae   Andreas Bießmann   mod/file2alias: m...
1362
  		INIT_SECTION(__devtable);
626596e29   Rusty Russell   modpost: use a ta...
1363

e49ce1415   Rusty Russell   modpost: use link...
1364
1365
1366
1367
  		for (p = __start___devtable; p < __stop___devtable; p++) {
  			if (sym_is(name, namelen, (*p)->device_id)) {
  				do_table(symval, sym->st_size, (*p)->id_size,
  					 (*p)->device_id, (*p)->function, mod);
626596e29   Rusty Russell   modpost: use a ta...
1368
1369
1370
1371
  				break;
  			}
  		}
  	}
e00498258   Kees Cook   kbuild: make modp...
1372
  	free(zeros);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
  }
  
  /* Now add out buffered information to the generated C source */
  void add_moddevtable(struct buffer *buf, struct module *mod)
  {
  	buf_printf(buf, "
  ");
  	buf_write(buf, mod->dev_table_buf.p, mod->dev_table_buf.pos);
  	free(mod->dev_table_buf.p);
  }