Blame view
scripts/mod/file2alias.c
40.8 KB
1da177e4c 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 mod/file2alias: m... |
14 |
#include "devicetable-offsets.h" |
1da177e4c 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 [PATCH] Input: ad... |
20 |
#define BITS_PER_LONG 32 |
1da177e4c Linux-2.6.12-rc2 |
21 22 |
#else typedef Elf64_Addr kernel_ulong_t; |
1d8f430c1 [PATCH] Input: ad... |
23 |
#define BITS_PER_LONG 64 |
1da177e4c Linux-2.6.12-rc2 |
24 25 26 27 28 29 |
#endif #ifdef __sun__ #include <inttypes.h> #else #include <stdint.h> #endif |
5e6557722 [PATCH] openfirmw... |
30 |
#include <ctype.h> |
626596e29 modpost: use a ta... |
31 |
#include <stdbool.h> |
5e6557722 [PATCH] openfirmw... |
32 |
|
1da177e4c Linux-2.6.12-rc2 |
33 34 35 |
typedef uint32_t __u32; typedef uint16_t __u16; typedef unsigned char __u8; |
b144ce2d3 mei: fix up uuid ... |
36 37 38 |
typedef struct { __u8 b[16]; } uuid_le; |
1da177e4c Linux-2.6.12-rc2 |
39 40 |
/* Big exception to the "don't include kernel headers into userspace, which |
62070fa42 kbuild: kill trai... |
41 |
* even potentially has different endianness and word sizes, since |
1da177e4c Linux-2.6.12-rc2 |
42 43 |
* we handle those differences explicitly below */ #include "../../include/linux/mod_devicetable.h" |
e49ce1415 modpost: use link... |
44 45 |
/* This array collects all instances that use the generic do_table */ struct devtable { |
21bdd17b2 module: allow mul... |
46 |
const char *device_id; /* name of table, __mod_<name>__*_device_table. */ |
e49ce1415 modpost: use link... |
47 48 49 |
unsigned long id_size; void *function; }; |
dd2a3acae 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 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 mod/file2alias: m... |
79 |
#endif /* __MACH__ */ |
e49ce1415 modpost: use link... |
80 |
|
04130cc97 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 modpost: use link... |
87 |
#endif |
6543becf2 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 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 mod/file2alias: m... |
103 |
(void *)NULL, \ |
e49ce1415 modpost: use link... |
104 |
(char *)NULL)), \ |
6543becf2 mod/file2alias: m... |
105 |
SIZE_##type, (function) }; \ |
dd2a3acae mod/file2alias: m... |
106 107 |
static struct devtable *SECTION(__devtable) __used \ __cat(devtable_ptr,__LINE__) = &__cat(devtable,__LINE__) |
e49ce1415 modpost: use link... |
108 |
|
1da177e4c 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 modpost: don't ad... |
121 |
/* End in a wildcard, for future extension */ |
ac5518289 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 mei: fix up uuid ... |
129 |
static inline void add_uuid(char *str, uuid_le uuid) |
c93b76b34 mei: bus: report ... |
130 131 |
{ int len = strlen(str); |
c93b76b34 mei: bus: report ... |
132 |
|
59796edcf 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 mei: bus: report ... |
138 |
} |
fb33d8161 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 kbuild: make modp... |
143 |
* Also verify that the final entry in the table is all zeros. |
4ce6efed4 kbuild: soften mo... |
144 |
* Ignore both checks if build host differ from target host and size differs. |
fb33d8161 kbuild: improve e... |
145 |
**/ |
e00498258 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 kbuild: improve e... |
149 |
{ |
e00498258 kbuild: make modp... |
150 |
int i; |
fb33d8161 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 module: allow mul... |
153 154 155 |
"of the size of " "section __mod_%s__<identifier>_device_table=%lu. " |
fb33d8161 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 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 kbuild: improve e... |
178 |
} |
b19dcd934 [PATCH] USB: scri... |
179 |
/* USB is special because the bcdDevice can be matched against a numeric range */ |
81df2d594 USB: allow match ... |
180 |
/* Looks like "usb:vNpNdNdcNdscNdpNicNiscNipNinN" */ |
6543becf2 mod/file2alias: m... |
181 |
static void do_usb_entry(void *symval, |
b19dcd934 [PATCH] USB: scri... |
182 183 |
unsigned int bcdDevice_initial, int bcdDevice_initial_digits, unsigned char range_lo, unsigned char range_hi, |
afe2dab4f USB: add hex/bcd ... |
184 |
unsigned char max, struct module *mod) |
1da177e4c Linux-2.6.12-rc2 |
185 |
{ |
b19dcd934 [PATCH] USB: scri... |
186 |
char alias[500]; |
6543becf2 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 Linux-2.6.12-rc2 |
198 |
strcpy(alias, "usb:"); |
6543becf2 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 [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 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 Modpost: fixed US... |
221 222 |
range_hi > 0xA ? "A-%X]" : "%X]", range_hi); |
afe2dab4f USB: add hex/bcd ... |
223 224 |
} } |
6543becf2 mod/file2alias: m... |
225 |
if (bcdDevice_initial_digits < (sizeof(bcdDevice_lo) * 2 - 1)) |
b19dcd934 [PATCH] USB: scri... |
226 |
strcat(alias, "*"); |
6543becf2 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 [PATCH] USB: scri... |
241 |
|
ac5518289 modpost: i2c alia... |
242 |
add_wildcard(alias); |
b19dcd934 [PATCH] USB: scri... |
243 244 245 246 |
buf_printf(&mod->dev_table_buf, "MODULE_ALIAS(\"%s\"); ", alias); } |
55f49f268 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 mod/file2alias: m... |
285 |
static void do_usb_entry_multi(void *symval, struct module *mod) |
b19dcd934 [PATCH] USB: scri... |
286 287 |
{ unsigned int devlo, devhi; |
afe2dab4f USB: add hex/bcd ... |
288 |
unsigned char chi, clo, max; |
b19dcd934 [PATCH] USB: scri... |
289 |
int ndigits; |
6543becf2 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 [PATCH] USB: scri... |
297 |
|
6543becf2 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 [PATCH] USB: scri... |
302 |
|
afe2dab4f USB: add hex/bcd ... |
303 304 |
/* Figure out if this entry is in bcd or hex format */ max = 0x9; /* Default to decimal format */ |
6543becf2 mod/file2alias: m... |
305 |
for (ndigits = 0 ; ndigits < sizeof(bcdDevice_lo) * 2 ; ndigits++) { |
afe2dab4f 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 [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 mod/file2alias: m... |
317 |
if (!(idVendor | idProduct | bDeviceClass | bInterfaceClass)) |
b19dcd934 [PATCH] USB: scri... |
318 319 320 |
return; /* Convert numeric bcdDevice range into fnmatch-able pattern(s) */ |
6543becf2 mod/file2alias: m... |
321 |
for (ndigits = sizeof(bcdDevice_lo) * 2 - 1; devlo <= devhi; ndigits--) { |
b19dcd934 [PATCH] USB: scri... |
322 323 |
clo = devlo & 0xf; chi = devhi & 0xf; |
afe2dab4f USB: add hex/bcd ... |
324 325 |
if (chi > max) /* If we are in bcd mode, truncate if necessary */ chi = max; |
b19dcd934 [PATCH] USB: scri... |
326 327 328 329 |
devlo >>= 4; devhi >>= 4; if (devlo == devhi || !ndigits) { |
6543becf2 mod/file2alias: m... |
330 |
do_usb_entry(symval, devlo, ndigits, clo, chi, max, mod); |
b19dcd934 [PATCH] USB: scri... |
331 332 |
break; } |
afe2dab4f USB: add hex/bcd ... |
333 |
if (clo > 0x0) |
6543becf2 mod/file2alias: m... |
334 |
do_usb_entry(symval, |
55f49f268 USB: handle bcd i... |
335 |
incbcd(&devlo, 1, max, |
6543becf2 mod/file2alias: m... |
336 |
sizeof(bcdDevice_lo) * 2), |
55f49f268 USB: handle bcd i... |
337 |
ndigits, clo, max, max, mod); |
b19dcd934 [PATCH] USB: scri... |
338 |
|
afe2dab4f USB: add hex/bcd ... |
339 |
if (chi < max) |
6543becf2 mod/file2alias: m... |
340 |
do_usb_entry(symval, |
55f49f268 USB: handle bcd i... |
341 |
incbcd(&devhi, -1, max, |
6543becf2 mod/file2alias: m... |
342 |
sizeof(bcdDevice_lo) * 2), |
55f49f268 USB: handle bcd i... |
343 |
ndigits, 0x0, chi, max, mod); |
b19dcd934 [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 mod/file2alias: m... |
351 |
const unsigned long id_size = SIZE_usb_device_id; |
b19dcd934 [PATCH] USB: scri... |
352 |
|
e00498258 kbuild: make modp... |
353 |
device_id_check(mod->name, "usb", size, id_size, symval); |
fb33d8161 kbuild: improve e... |
354 |
|
b19dcd934 [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 Linux-2.6.12-rc2 |
360 |
} |
acbef7b76 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 of: fix autoloadi... |
373 |
if ((*compatible)[0]) |
acbef7b76 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 modpost: add supp... |
404 405 |
/* Looks like: hid:bNvNpN */ static int do_hid_entry(const char *filename, |
6543becf2 mod/file2alias: m... |
406 |
void *symval, char *alias) |
e8c84f9a5 modpost: add supp... |
407 |
{ |
6543becf2 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 modpost: add supp... |
412 |
|
7431fb767 HID: Allow bus wi... |
413 |
sprintf(alias, "hid:"); |
6543becf2 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 modpost: add supp... |
418 419 420 |
return 1; } |
6543becf2 mod/file2alias: m... |
421 |
ADD_TO_DEVTABLE("hid", hid_device_id, do_hid_entry); |
e8c84f9a5 modpost: add supp... |
422 |
|
1da177e4c Linux-2.6.12-rc2 |
423 424 |
/* Looks like: ieee1394:venNmoNspNverN */ static int do_ieee1394_entry(const char *filename, |
6543becf2 mod/file2alias: m... |
425 |
void *symval, char *alias) |
1da177e4c Linux-2.6.12-rc2 |
426 |
{ |
6543becf2 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 Linux-2.6.12-rc2 |
432 433 |
strcpy(alias, "ieee1394:"); |
6543becf2 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 Linux-2.6.12-rc2 |
442 |
|
ac5518289 modpost: i2c alia... |
443 |
add_wildcard(alias); |
1da177e4c Linux-2.6.12-rc2 |
444 445 |
return 1; } |
6543becf2 mod/file2alias: m... |
446 |
ADD_TO_DEVTABLE("ieee1394", ieee1394_device_id, do_ieee1394_entry); |
1da177e4c Linux-2.6.12-rc2 |
447 448 449 |
/* Looks like: pci:vNdNsvNsdNbcNscNiN. */ static int do_pci_entry(const char *filename, |
6543becf2 mod/file2alias: m... |
450 |
void *symval, char *alias) |
1da177e4c 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 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 Linux-2.6.12-rc2 |
461 462 |
strcpy(alias, "pci:"); |
6543becf2 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 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 kbuild: use warn(... |
478 479 |
warn("Can't handle masks in %s:%04X ", |
6543becf2 mod/file2alias: m... |
480 |
filename, class_mask); |
1da177e4c 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 modpost: i2c alia... |
487 |
add_wildcard(alias); |
1da177e4c Linux-2.6.12-rc2 |
488 489 |
return 1; } |
6543becf2 mod/file2alias: m... |
490 |
ADD_TO_DEVTABLE("pci", pci_device_id, do_pci_entry); |
1da177e4c Linux-2.6.12-rc2 |
491 |
|
62070fa42 kbuild: kill trai... |
492 |
/* looks like: "ccw:tNmNdtNdmN" */ |
1da177e4c Linux-2.6.12-rc2 |
493 |
static int do_ccw_entry(const char *filename, |
6543becf2 mod/file2alias: m... |
494 |
void *symval, char *alias) |
1da177e4c Linux-2.6.12-rc2 |
495 |
{ |
6543becf2 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 Linux-2.6.12-rc2 |
501 502 |
strcpy(alias, "ccw:"); |
6543becf2 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 modpost: i2c alia... |
511 |
add_wildcard(alias); |
1da177e4c Linux-2.6.12-rc2 |
512 513 |
return 1; } |
6543becf2 mod/file2alias: m... |
514 |
ADD_TO_DEVTABLE("ccw", ccw_device_id, do_ccw_entry); |
1da177e4c Linux-2.6.12-rc2 |
515 |
|
1534c3820 [S390] zcrypt adj... |
516 517 |
/* looks like: "ap:tN" */ static int do_ap_entry(const char *filename, |
6543becf2 mod/file2alias: m... |
518 |
void *symval, char *alias) |
1534c3820 [S390] zcrypt adj... |
519 |
{ |
6543becf2 mod/file2alias: m... |
520 521 522 |
DEF_FIELD(symval, ap_device_id, dev_type); sprintf(alias, "ap:t%02X*", dev_type); |
1534c3820 [S390] zcrypt adj... |
523 524 |
return 1; } |
6543becf2 mod/file2alias: m... |
525 |
ADD_TO_DEVTABLE("ap", ap_device_id, do_ap_entry); |
1534c3820 [S390] zcrypt adj... |
526 |
|
7e9db9eae [S390] cio: Intro... |
527 528 |
/* looks like: "css:tN" */ static int do_css_entry(const char *filename, |
6543becf2 mod/file2alias: m... |
529 |
void *symval, char *alias) |
7e9db9eae [S390] cio: Intro... |
530 |
{ |
6543becf2 mod/file2alias: m... |
531 532 533 |
DEF_FIELD(symval, css_device_id, type); sprintf(alias, "css:t%01X", type); |
7e9db9eae [S390] cio: Intro... |
534 535 |
return 1; } |
6543becf2 mod/file2alias: m... |
536 |
ADD_TO_DEVTABLE("css", css_device_id, do_css_entry); |
7e9db9eae [S390] cio: Intro... |
537 |
|
1da177e4c Linux-2.6.12-rc2 |
538 539 |
/* Looks like: "serio:tyNprNidNexN" */ static int do_serio_entry(const char *filename, |
6543becf2 mod/file2alias: m... |
540 |
void *symval, char *alias) |
1da177e4c Linux-2.6.12-rc2 |
541 |
{ |
6543becf2 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 Linux-2.6.12-rc2 |
546 547 |
strcpy(alias, "serio:"); |
6543becf2 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 Linux-2.6.12-rc2 |
552 |
|
ac5518289 modpost: i2c alia... |
553 |
add_wildcard(alias); |
1da177e4c Linux-2.6.12-rc2 |
554 555 |
return 1; } |
6543becf2 mod/file2alias: m... |
556 |
ADD_TO_DEVTABLE("serio", serio_device_id, do_serio_entry); |
1da177e4c Linux-2.6.12-rc2 |
557 |
|
26095a01d 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 ACPI: autoload mo... |
565 |
static int do_acpi_entry(const char *filename, |
6543becf2 mod/file2alias: m... |
566 |
void *symval, char *alias) |
29b71a1ca ACPI: autoload mo... |
567 |
{ |
6543becf2 mod/file2alias: m... |
568 |
DEF_FIELD_ADDR(symval, acpi_device_id, id); |
26095a01d 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 ACPI: autoload mo... |
592 593 |
return 1; } |
6543becf2 mod/file2alias: m... |
594 |
ADD_TO_DEVTABLE("acpi", acpi_device_id, do_acpi_entry); |
29b71a1ca ACPI: autoload mo... |
595 |
|
1da177e4c Linux-2.6.12-rc2 |
596 |
/* looks like: "pnp:dD" */ |
22454cb99 pnp: add acpi:* m... |
597 598 |
static void do_pnp_device_entry(void *symval, unsigned long size, struct module *mod) |
1da177e4c Linux-2.6.12-rc2 |
599 |
{ |
6543becf2 mod/file2alias: m... |
600 |
const unsigned long id_size = SIZE_pnp_device_id; |
5e4c6564c pnp: fix "add acp... |
601 |
const unsigned int count = (size / id_size)-1; |
5e4c6564c pnp: fix "add acp... |
602 |
unsigned int i; |
22454cb99 pnp: add acpi:* m... |
603 604 |
device_id_check(mod->name, "pnp", size, id_size, symval); |
5e4c6564c pnp: fix "add acp... |
605 |
for (i = 0; i < count; i++) { |
6543becf2 mod/file2alias: m... |
606 607 |
DEF_FIELD_ADDR(symval + i*id_size, pnp_device_id, id); char acpi_id[sizeof(*id)]; |
72638f598 PNP: fix broken p... |
608 |
int j; |
5e4c6564c pnp: fix "add acp... |
609 610 |
buf_printf(&mod->dev_table_buf, |
6543becf2 mod/file2alias: m... |
611 612 |
"MODULE_ALIAS(\"pnp:d%s*\"); ", *id); |
72638f598 PNP: fix broken p... |
613 614 615 |
/* fix broken pnp bus lowercasing */ for (j = 0; j < sizeof(acpi_id); j++) |
6543becf2 mod/file2alias: m... |
616 |
acpi_id[j] = toupper((*id)[j]); |
5e4c6564c pnp: fix "add acp... |
617 |
buf_printf(&mod->dev_table_buf, |
72638f598 PNP: fix broken p... |
618 619 |
"MODULE_ALIAS(\"acpi*:%s:*\"); ", acpi_id); |
5e4c6564c pnp: fix "add acp... |
620 |
} |
1da177e4c Linux-2.6.12-rc2 |
621 |
} |
0c81eed4b 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 Linux-2.6.12-rc2 |
625 |
{ |
6543becf2 mod/file2alias: m... |
626 |
const unsigned long id_size = SIZE_pnp_card_device_id; |
0c81eed4b PNP: add all PNP ... |
627 |
const unsigned int count = (size / id_size)-1; |
0c81eed4b PNP: add all PNP ... |
628 |
unsigned int i; |
1da177e4c Linux-2.6.12-rc2 |
629 |
|
0c81eed4b 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 mod/file2alias: m... |
634 |
DEF_FIELD_ADDR(symval + i*id_size, pnp_card_device_id, devs); |
0c81eed4b PNP: add all PNP ... |
635 636 |
for (j = 0; j < PNP_MAX_DEVICES; j++) { |
6543becf2 mod/file2alias: m... |
637 |
const char *id = (char *)(*devs)[j].id; |
0c81eed4b 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 mod/file2alias: m... |
646 |
DEF_FIELD_ADDR(symval + i2*id_size, pnp_card_device_id, devs); |
0c81eed4b PNP: add all PNP ... |
647 648 |
for (j2 = 0; j2 < PNP_MAX_DEVICES; j2++) { |
6543becf2 mod/file2alias: m... |
649 |
const char *id2 = (char *)(*devs)[j2].id; |
0c81eed4b 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 pnp: add acpi:* m... |
662 |
if (!dup) { |
6543becf2 mod/file2alias: m... |
663 |
char acpi_id[PNP_ID_LEN]; |
72638f598 PNP: fix broken p... |
664 |
int k; |
0c81eed4b PNP: add all PNP ... |
665 666 667 |
buf_printf(&mod->dev_table_buf, "MODULE_ALIAS(\"pnp:d%s*\"); ", id); |
72638f598 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 pnp: add acpi:* m... |
672 |
buf_printf(&mod->dev_table_buf, |
72638f598 PNP: fix broken p... |
673 674 |
"MODULE_ALIAS(\"acpi*:%s:*\"); ", acpi_id); |
22454cb99 pnp: add acpi:* m... |
675 |
} |
0c81eed4b PNP: add all PNP ... |
676 |
} |
1da177e4c Linux-2.6.12-rc2 |
677 |
} |
1da177e4c Linux-2.6.12-rc2 |
678 |
} |
90829cfe1 [PATCH] pcmcia: f... |
679 680 |
/* Looks like: pcmcia:mNcNfNfnNpfnNvaNvbNvcNvdN. */ static int do_pcmcia_entry(const char *filename, |
6543becf2 mod/file2alias: m... |
681 |
void *symval, char *alias) |
90829cfe1 [PATCH] pcmcia: f... |
682 683 |
{ unsigned int i; |
6543becf2 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 [PATCH] pcmcia: f... |
691 |
|
90829cfe1 [PATCH] pcmcia: f... |
692 |
for (i=0; i<4; i++) { |
6543becf2 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 [PATCH] pcmcia: f... |
711 |
|
ac5518289 modpost: i2c alia... |
712 |
add_wildcard(alias); |
6543becf2 mod/file2alias: m... |
713 |
return 1; |
90829cfe1 [PATCH] pcmcia: f... |
714 |
} |
6543becf2 mod/file2alias: m... |
715 |
ADD_TO_DEVTABLE("pcmcia", pcmcia_device_id, do_pcmcia_entry); |
90829cfe1 [PATCH] pcmcia: f... |
716 |
|
6543becf2 mod/file2alias: m... |
717 |
static int do_vio_entry(const char *filename, void *symval, |
fb120da67 [PATCH] Make MODU... |
718 719 720 |
char *alias) { char *tmp; |
6543becf2 mod/file2alias: m... |
721 722 |
DEF_FIELD_ADDR(symval, vio_device_id, type); DEF_FIELD_ADDR(symval, vio_device_id, compat); |
fb120da67 [PATCH] Make MODU... |
723 |
|
6543becf2 mod/file2alias: m... |
724 725 |
sprintf(alias, "vio:T%sS%s", (*type)[0] ? *type : "*", (*compat)[0] ? *compat : "*"); |
fb120da67 [PATCH] Make MODU... |
726 727 728 729 730 |
/* Replace all whitespace with underscores */ for (tmp = alias; tmp && *tmp; tmp++) if (isspace (*tmp)) *tmp = '_'; |
ac5518289 modpost: i2c alia... |
731 |
add_wildcard(alias); |
fb120da67 [PATCH] Make MODU... |
732 733 |
return 1; } |
6543becf2 mod/file2alias: m... |
734 |
ADD_TO_DEVTABLE("vio", vio_device_id, do_vio_entry); |
fb120da67 [PATCH] Make MODU... |
735 |
|
1d8f430c1 [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 Input: move input... |
742 |
|
6543becf2 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 Input: move input... |
745 |
for (i = min; i < max; i++) |
e0e926327 [PATCH] PATCH: 1 ... |
746 |
if (arr[i / BITS_PER_LONG] & (1L << (i%BITS_PER_LONG))) |
ddc5d3414 Input: move input... |
747 |
sprintf(alias + strlen(alias), "%X,*", i); |
1d8f430c1 [PATCH] Input: ad... |
748 749 750 |
} /* input:b0v0p0e0-eXkXrXaXmXlXsXfXwX where X is comma-separated %02X. */ |
6543becf2 mod/file2alias: m... |
751 |
static int do_input_entry(const char *filename, void *symval, |
1d8f430c1 [PATCH] Input: ad... |
752 753 |
char *alias) { |
6543becf2 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 [PATCH] Input: ad... |
768 |
sprintf(alias, "input:"); |
6543becf2 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 [PATCH] Input: ad... |
773 774 |
sprintf(alias + strlen(alias), "-e*"); |
6543becf2 mod/file2alias: m... |
775 776 |
if (flags & INPUT_DEVICE_ID_MATCH_EVBIT) do_input(alias, *evbit, 0, INPUT_DEVICE_ID_EV_MAX); |
1d8f430c1 [PATCH] Input: ad... |
777 |
sprintf(alias + strlen(alias), "k*"); |
6543becf2 mod/file2alias: m... |
778 779 |
if (flags & INPUT_DEVICE_ID_MATCH_KEYBIT) do_input(alias, *keybit, |
dc24f0e70 kbuild: remove de... |
780 781 |
INPUT_DEVICE_ID_KEY_MIN_INTERESTING, INPUT_DEVICE_ID_KEY_MAX); |
1d8f430c1 [PATCH] Input: ad... |
782 |
sprintf(alias + strlen(alias), "r*"); |
6543becf2 mod/file2alias: m... |
783 784 |
if (flags & INPUT_DEVICE_ID_MATCH_RELBIT) do_input(alias, *relbit, 0, INPUT_DEVICE_ID_REL_MAX); |
1d8f430c1 [PATCH] Input: ad... |
785 |
sprintf(alias + strlen(alias), "a*"); |
6543becf2 mod/file2alias: m... |
786 787 |
if (flags & INPUT_DEVICE_ID_MATCH_ABSBIT) do_input(alias, *absbit, 0, INPUT_DEVICE_ID_ABS_MAX); |
1d8f430c1 [PATCH] Input: ad... |
788 |
sprintf(alias + strlen(alias), "m*"); |
6543becf2 mod/file2alias: m... |
789 790 |
if (flags & INPUT_DEVICE_ID_MATCH_MSCIT) do_input(alias, *mscbit, 0, INPUT_DEVICE_ID_MSC_MAX); |
1d8f430c1 [PATCH] Input: ad... |
791 |
sprintf(alias + strlen(alias), "l*"); |
6543becf2 mod/file2alias: m... |
792 793 |
if (flags & INPUT_DEVICE_ID_MATCH_LEDBIT) do_input(alias, *ledbit, 0, INPUT_DEVICE_ID_LED_MAX); |
1d8f430c1 [PATCH] Input: ad... |
794 |
sprintf(alias + strlen(alias), "s*"); |
6543becf2 mod/file2alias: m... |
795 796 |
if (flags & INPUT_DEVICE_ID_MATCH_SNDBIT) do_input(alias, *sndbit, 0, INPUT_DEVICE_ID_SND_MAX); |
1d8f430c1 [PATCH] Input: ad... |
797 |
sprintf(alias + strlen(alias), "f*"); |
6543becf2 mod/file2alias: m... |
798 799 |
if (flags & INPUT_DEVICE_ID_MATCH_FFBIT) do_input(alias, *ffbit, 0, INPUT_DEVICE_ID_FF_MAX); |
1d8f430c1 [PATCH] Input: ad... |
800 |
sprintf(alias + strlen(alias), "w*"); |
6543becf2 mod/file2alias: m... |
801 802 |
if (flags & INPUT_DEVICE_ID_MATCH_SWBIT) do_input(alias, *swbit, 0, INPUT_DEVICE_ID_SW_MAX); |
1d8f430c1 [PATCH] Input: ad... |
803 804 |
return 1; } |
6543becf2 mod/file2alias: m... |
805 |
ADD_TO_DEVTABLE("input", input_device_id, do_input_entry); |
1d8f430c1 [PATCH] Input: ad... |
806 |
|
6543becf2 mod/file2alias: m... |
807 |
static int do_eisa_entry(const char *filename, void *symval, |
07563c711 [PATCH] EISA bus ... |
808 809 |
char *alias) { |
6543becf2 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 modpost: i2c alia... |
813 814 |
else strcat(alias, "*"); |
07563c711 [PATCH] EISA bus ... |
815 816 |
return 1; } |
6543becf2 mod/file2alias: m... |
817 |
ADD_TO_DEVTABLE("eisa", eisa_device_id, do_eisa_entry); |
07563c711 [PATCH] EISA bus ... |
818 |
|
f3cf26733 [PARISC] generate... |
819 |
/* Looks like: parisc:tNhvNrevNsvN */ |
6543becf2 mod/file2alias: m... |
820 |
static int do_parisc_entry(const char *filename, void *symval, |
f3cf26733 [PARISC] generate... |
821 822 |
char *alias) { |
6543becf2 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 [PARISC] generate... |
827 828 |
strcpy(alias, "parisc:"); |
6543becf2 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 [PARISC] generate... |
833 |
|
ac5518289 modpost: i2c alia... |
834 |
add_wildcard(alias); |
f3cf26733 [PARISC] generate... |
835 836 |
return 1; } |
6543becf2 mod/file2alias: m... |
837 |
ADD_TO_DEVTABLE("parisc", parisc_device_id, do_parisc_entry); |
f3cf26733 [PARISC] generate... |
838 |
|
d59b66c7a sdio: add modalia... |
839 840 |
/* Looks like: sdio:cNvNdN. */ static int do_sdio_entry(const char *filename, |
6543becf2 mod/file2alias: m... |
841 |
void *symval, char *alias) |
d59b66c7a sdio: add modalia... |
842 |
{ |
6543becf2 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 sdio: add modalia... |
846 847 |
strcpy(alias, "sdio:"); |
6543becf2 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 modpost: i2c alia... |
851 |
add_wildcard(alias); |
038a5008b Merge branch 'mas... |
852 853 |
return 1; } |
6543becf2 mod/file2alias: m... |
854 |
ADD_TO_DEVTABLE("sdio", sdio_device_id, do_sdio_entry); |
038a5008b Merge branch 'mas... |
855 |
|
61e115a56 [SSB]: add Sonics... |
856 857 |
/* Looks like: ssb:vNidNrevN. */ static int do_ssb_entry(const char *filename, |
6543becf2 mod/file2alias: m... |
858 |
void *symval, char *alias) |
61e115a56 [SSB]: add Sonics... |
859 |
{ |
6543becf2 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 sdio: add modalia... |
863 |
|
61e115a56 [SSB]: add Sonics... |
864 |
strcpy(alias, "ssb:"); |
6543becf2 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 modpost: i2c alia... |
868 |
add_wildcard(alias); |
d59b66c7a sdio: add modalia... |
869 870 |
return 1; } |
6543becf2 mod/file2alias: m... |
871 |
ADD_TO_DEVTABLE("ssb", ssb_device_id, do_ssb_entry); |
d59b66c7a sdio: add modalia... |
872 |
|
8369ae33b bcma: add Broadco... |
873 874 |
/* Looks like: bcma:mNidNrevNclN. */ static int do_bcma_entry(const char *filename, |
6543becf2 mod/file2alias: m... |
875 |
void *symval, char *alias) |
8369ae33b bcma: add Broadco... |
876 |
{ |
6543becf2 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 bcma: add Broadco... |
881 882 |
strcpy(alias, "bcma:"); |
6543becf2 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 bcma: add Broadco... |
887 888 889 |
add_wildcard(alias); return 1; } |
6543becf2 mod/file2alias: m... |
890 |
ADD_TO_DEVTABLE("bcma", bcma_device_id, do_bcma_entry); |
8369ae33b bcma: add Broadco... |
891 |
|
b01d9f286 Module autoprobin... |
892 |
/* Looks like: virtio:dNvN */ |
6543becf2 mod/file2alias: m... |
893 |
static int do_virtio_entry(const char *filename, void *symval, |
b01d9f286 Module autoprobin... |
894 895 |
char *alias) { |
6543becf2 mod/file2alias: m... |
896 897 |
DEF_FIELD(symval, virtio_device_id, device); DEF_FIELD(symval, virtio_device_id, vendor); |
b01d9f286 Module autoprobin... |
898 899 |
strcpy(alias, "virtio:"); |
6543becf2 mod/file2alias: m... |
900 901 |
ADD(alias, "d", device != VIRTIO_DEV_ANY_ID, device); ADD(alias, "v", vendor != VIRTIO_DEV_ANY_ID, vendor); |
b01d9f286 Module autoprobin... |
902 |
|
ac5518289 modpost: i2c alia... |
903 |
add_wildcard(alias); |
b01d9f286 Module autoprobin... |
904 905 |
return 1; } |
6543becf2 mod/file2alias: m... |
906 |
ADD_TO_DEVTABLE("virtio", virtio_device_id, do_virtio_entry); |
b01d9f286 Module autoprobin... |
907 |
|
d2ee52aaf 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 mod/file2alias: m... |
913 |
static int do_vmbus_entry(const char *filename, void *symval, |
d2ee52aaf Staging: hv: Add ... |
914 915 916 |
char *alias) { int i; |
6543becf2 mod/file2alias: m... |
917 918 |
DEF_FIELD_ADDR(symval, hv_vmbus_device_id, guid); char guid_name[(sizeof(*guid) + 1) * 2]; |
d2ee52aaf Staging: hv: Add ... |
919 |
|
6543becf2 mod/file2alias: m... |
920 |
for (i = 0; i < (sizeof(*guid) * 2); i += 2) |
af3ff643e Drivers: hv: vmbu... |
921 |
sprintf(&guid_name[i], "%02x", TO_NATIVE((guid->b)[i/2])); |
d2ee52aaf Staging: hv: Add ... |
922 923 924 925 926 927 |
strcpy(alias, "vmbus:"); strcat(alias, guid_name); return 1; } |
6543becf2 mod/file2alias: m... |
928 |
ADD_TO_DEVTABLE("vmbus", hv_vmbus_device_id, do_vmbus_entry); |
d2ee52aaf Staging: hv: Add ... |
929 |
|
d2653e927 i2c: Add support ... |
930 |
/* Looks like: i2c:S */ |
6543becf2 mod/file2alias: m... |
931 |
static int do_i2c_entry(const char *filename, void *symval, |
d2653e927 i2c: Add support ... |
932 933 |
char *alias) { |
6543becf2 mod/file2alias: m... |
934 935 |
DEF_FIELD_ADDR(symval, i2c_device_id, name); sprintf(alias, I2C_MODULE_PREFIX "%s", *name); |
d2653e927 i2c: Add support ... |
936 937 938 |
return 1; } |
6543becf2 mod/file2alias: m... |
939 |
ADD_TO_DEVTABLE("i2c", i2c_device_id, do_i2c_entry); |
d2653e927 i2c: Add support ... |
940 |
|
e0626e384 spi: prefix modal... |
941 |
/* Looks like: spi:S */ |
6543becf2 mod/file2alias: m... |
942 |
static int do_spi_entry(const char *filename, void *symval, |
75368bf6c spi: add support ... |
943 944 |
char *alias) { |
6543becf2 mod/file2alias: m... |
945 946 |
DEF_FIELD_ADDR(symval, spi_device_id, name); sprintf(alias, SPI_MODULE_PREFIX "%s", *name); |
75368bf6c spi: add support ... |
947 948 949 |
return 1; } |
6543becf2 mod/file2alias: m... |
950 |
ADD_TO_DEVTABLE("spi", spi_device_id, do_spi_entry); |
75368bf6c spi: add support ... |
951 |
|
d945b697d 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 mod/file2alias: m... |
980 |
static int do_dmi_entry(const char *filename, void *symval, |
d945b697d Automatic MODULE_... |
981 982 983 |
char *alias) { int i, j; |
6543becf2 mod/file2alias: m... |
984 |
DEF_FIELD_ADDR(symval, dmi_system_id, matches); |
d945b697d 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 mod/file2alias: m... |
989 990 |
if ((*matches)[j].slot && (*matches)[j].slot == dmi_fields[i].field) { |
d945b697d Automatic MODULE_... |
991 992 993 |
sprintf(alias + strlen(alias), ":%s*", dmi_fields[i].prefix); dmi_ascii_filter(alias + strlen(alias), |
6543becf2 mod/file2alias: m... |
994 |
(*matches)[j].substr); |
d945b697d Automatic MODULE_... |
995 996 997 998 999 1000 1001 1002 |
strcat(alias, "*"); } } } strcat(alias, ":"); return 1; } |
6543becf2 mod/file2alias: m... |
1003 |
ADD_TO_DEVTABLE("dmi", dmi_system_id, do_dmi_entry); |
57fee4a58 platform: introdu... |
1004 1005 |
static int do_platform_entry(const char *filename, |
6543becf2 mod/file2alias: m... |
1006 |
void *symval, char *alias) |
57fee4a58 platform: introdu... |
1007 |
{ |
6543becf2 mod/file2alias: m... |
1008 1009 |
DEF_FIELD_ADDR(symval, platform_device_id, name); sprintf(alias, PLATFORM_MODULE_PREFIX "%s", *name); |
57fee4a58 platform: introdu... |
1010 1011 |
return 1; } |
6543becf2 mod/file2alias: m... |
1012 |
ADD_TO_DEVTABLE("platform", platform_device_id, do_platform_entry); |
57fee4a58 platform: introdu... |
1013 |
|
8626d3b43 phylib: Support p... |
1014 |
static int do_mdio_entry(const char *filename, |
6543becf2 mod/file2alias: m... |
1015 |
void *symval, char *alias) |
8626d3b43 phylib: Support p... |
1016 1017 |
{ int i; |
6543becf2 mod/file2alias: m... |
1018 1019 |
DEF_FIELD(symval, mdio_device_id, phy_id); DEF_FIELD(symval, mdio_device_id, phy_id_mask); |
8626d3b43 phylib: Support p... |
1020 1021 1022 1023 |
alias += sprintf(alias, MDIO_MODULE_PREFIX); for (i = 0; i < 32; i++) { |
6543becf2 mod/file2alias: m... |
1024 |
if (!((phy_id_mask >> (31-i)) & 1)) |
8626d3b43 phylib: Support p... |
1025 |
*(alias++) = '?'; |
6543becf2 mod/file2alias: m... |
1026 |
else if ((phy_id >> (31-i)) & 1) |
8626d3b43 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 mod/file2alias: m... |
1037 |
ADD_TO_DEVTABLE("mdio", mdio_device_id, do_mdio_entry); |
8626d3b43 phylib: Support p... |
1038 |
|
bf54a2b3c m68k: amiga - Zor... |
1039 |
/* Looks like: zorro:iN. */ |
6543becf2 mod/file2alias: m... |
1040 |
static int do_zorro_entry(const char *filename, void *symval, |
bf54a2b3c m68k: amiga - Zor... |
1041 1042 |
char *alias) { |
6543becf2 mod/file2alias: m... |
1043 |
DEF_FIELD(symval, zorro_device_id, id); |
bf54a2b3c m68k: amiga - Zor... |
1044 |
strcpy(alias, "zorro:"); |
6543becf2 mod/file2alias: m... |
1045 |
ADD(alias, "i", id != ZORRO_WILDCARD, id); |
bf54a2b3c m68k: amiga - Zor... |
1046 1047 |
return 1; } |
6543becf2 mod/file2alias: m... |
1048 |
ADD_TO_DEVTABLE("zorro", zorro_device_id, do_zorro_entry); |
bf54a2b3c m68k: amiga - Zor... |
1049 |
|
fedb3d27d MODULE_DEVICE_TAB... |
1050 1051 |
/* looks like: "pnp:dD" */ static int do_isapnp_entry(const char *filename, |
6543becf2 mod/file2alias: m... |
1052 |
void *symval, char *alias) |
fedb3d27d MODULE_DEVICE_TAB... |
1053 |
{ |
6543becf2 mod/file2alias: m... |
1054 1055 |
DEF_FIELD(symval, isapnp_device_id, vendor); DEF_FIELD(symval, isapnp_device_id, function); |
fedb3d27d MODULE_DEVICE_TAB... |
1056 |
sprintf(alias, "pnp:d%c%c%c%x%x%x%x*", |
6543becf2 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 MODULE_DEVICE_TAB... |
1062 1063 |
return 1; } |
6543becf2 mod/file2alias: m... |
1064 |
ADD_TO_DEVTABLE("isapnp", isapnp_device_id, do_isapnp_entry); |
fedb3d27d MODULE_DEVICE_TAB... |
1065 |
|
849e0ad25 Staging: ipack: i... |
1066 1067 |
/* Looks like: "ipack:fNvNdN". */ static int do_ipack_entry(const char *filename, |
6543becf2 mod/file2alias: m... |
1068 |
void *symval, char *alias) |
849e0ad25 Staging: ipack: i... |
1069 |
{ |
6543becf2 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 Staging: ipack: i... |
1073 |
strcpy(alias, "ipack:"); |
6543becf2 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 Staging: ipack: i... |
1077 1078 1079 |
add_wildcard(alias); return 1; } |
6543becf2 mod/file2alias: m... |
1080 |
ADD_TO_DEVTABLE("ipack", ipack_device_id, do_ipack_entry); |
849e0ad25 Staging: ipack: i... |
1081 |
|
523817bd2 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 mod/file2alias: m... |
1131 |
void *symval, char *alias) |
523817bd2 ARM: amba: Auto-g... |
1132 1133 1134 |
{ unsigned int digit; char *p = alias; |
6543becf2 mod/file2alias: m... |
1135 1136 |
DEF_FIELD(symval, amba_id, id); DEF_FIELD(symval, amba_id, mask); |
523817bd2 ARM: amba: Auto-g... |
1137 |
|
6543becf2 mod/file2alias: m... |
1138 |
if ((id & mask) != id) |
523817bd2 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 mod/file2alias: m... |
1142 |
filename, id, mask); |
523817bd2 ARM: amba: Auto-g... |
1143 1144 1145 1146 |
p += sprintf(alias, "amba:d"); for (digit = 0; digit < 8; digit++) append_nibble_mask(&p, |
6543becf2 mod/file2alias: m... |
1147 1148 |
(id >> (4 * (7 - digit))) & 0xf, (mask >> (4 * (7 - digit))) & 0xf); |
523817bd2 ARM: amba: Auto-g... |
1149 1150 1151 |
return 1; } |
6543becf2 mod/file2alias: m... |
1152 |
ADD_TO_DEVTABLE("amba", amba_id, do_amba_entry); |
523817bd2 ARM: amba: Auto-g... |
1153 |
|
8286ae033 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 x86: align x86 ar... |
1169 |
/* LOOKS like cpu:type:x86,venVVVVfamFFFFmodMMMM:feature:*,FEAT,* |
644e9cbbe 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 mod/file2alias: m... |
1174 |
static int do_x86cpu_entry(const char *filename, void *symval, |
644e9cbbe Add driver auto p... |
1175 1176 |
char *alias) { |
6543becf2 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 Add driver auto p... |
1181 |
|
2b9c1f032 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 x86/cpu: Clean up... |
1186 |
strcat(alias, ":feature:*"); |
6543becf2 mod/file2alias: m... |
1187 1188 |
if (feature != X86_FEATURE_ANY) sprintf(alias + strlen(alias), "%04X*", feature); |
644e9cbbe Add driver auto p... |
1189 1190 |
return 1; } |
6543becf2 mod/file2alias: m... |
1191 |
ADD_TO_DEVTABLE("x86cpu", x86_cpu_id, do_x86cpu_entry); |
644e9cbbe Add driver auto p... |
1192 |
|
67bad2fdb 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 mei: bus: add cli... |
1202 |
/* Looks like: mei:S:uuid:N:* */ |
e5354107e 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 mei: bus: report ... |
1207 |
DEF_FIELD_ADDR(symval, mei_cl_device_id, uuid); |
b26864cad mei: bus: add cli... |
1208 |
DEF_FIELD(symval, mei_cl_device_id, version); |
c93b76b34 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 mei: bus: add cli... |
1213 |
ADD(alias, ":", version != MEI_CL_VERSION_ANY, version); |
e5354107e mei: bus: Initial... |
1214 |
|
c93b76b34 mei: bus: report ... |
1215 |
strcat(alias, ":*"); |
e5354107e mei: bus: Initial... |
1216 1217 1218 1219 |
return 1; } ADD_TO_DEVTABLE("mei", mei_cl_device_id, do_mei_entry); |
3bdbb62fe 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 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 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 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 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 Linux-2.6.12-rc2 |
1280 |
{ |
626596e29 modpost: use a ta... |
1281 1282 |
if (namelen != strlen(symbol)) return false; |
1da177e4c Linux-2.6.12-rc2 |
1283 |
|
626596e29 modpost: use a ta... |
1284 |
return memcmp(name, symbol, namelen) == 0; |
1da177e4c Linux-2.6.12-rc2 |
1285 1286 1287 1288 |
} static void do_table(void *symval, unsigned long size, unsigned long id_size, |
fb33d8161 kbuild: improve e... |
1289 |
const char *device_id, |
1da177e4c 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 kbuild: make modp... |
1296 |
device_id_check(mod->name, device_id, size, id_size, symval); |
1da177e4c 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 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 kbuild: make modp... |
1316 |
char *zeros = NULL; |
21bdd17b2 module: allow mul... |
1317 |
const char *name, *identifier; |
626596e29 modpost: use a ta... |
1318 |
unsigned int namelen; |
1da177e4c Linux-2.6.12-rc2 |
1319 1320 |
/* We're looking for a section relative symbol */ |
1ce53adf1 modpost: support ... |
1321 |
if (!sym->st_shndx || get_secindex(info, sym) >= info->num_sections) |
1da177e4c Linux-2.6.12-rc2 |
1322 |
return; |
e88aa7bbb Fix modpost failu... |
1323 1324 1325 |
/* We're looking for an object */ if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT) return; |
21bdd17b2 module: allow mul... |
1326 |
/* All our symbols are of form <prefix>__mod_<name>__<identifier>_device_table. */ |
626596e29 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 module: allow mul... |
1336 1337 1338 1339 |
identifier = strstr(name, "__"); if (!identifier) return; namelen = identifier - name; |
626596e29 modpost: use a ta... |
1340 |
|
e00498258 kbuild: make modp... |
1341 |
/* Handle all-NULL symbols allocated into .bss */ |
1ce53adf1 modpost: support ... |
1342 |
if (info->sechdrs[get_secindex(info, sym)].sh_type & SHT_NOBITS) { |
e00498258 kbuild: make modp... |
1343 1344 1345 1346 |
zeros = calloc(1, sym->st_size); symval = zeros; } else { symval = (void *)info->hdr |
1ce53adf1 modpost: support ... |
1347 |
+ info->sechdrs[get_secindex(info, sym)].sh_offset |
e00498258 kbuild: make modp... |
1348 1349 |
+ sym->st_value; } |
1da177e4c Linux-2.6.12-rc2 |
1350 |
|
626596e29 modpost: use a ta... |
1351 1352 |
/* First handle the "special" cases */ if (sym_is(name, namelen, "usb")) |
b19dcd934 [PATCH] USB: scri... |
1353 |
do_usb_table(symval, sym->st_size, mod); |
acbef7b76 modpost: fix modu... |
1354 1355 |
if (sym_is(name, namelen, "of")) do_of_table(symval, sym->st_size, mod); |
626596e29 modpost: use a ta... |
1356 |
else if (sym_is(name, namelen, "pnp")) |
22454cb99 pnp: add acpi:* m... |
1357 |
do_pnp_device_entry(symval, sym->st_size, mod); |
626596e29 modpost: use a ta... |
1358 |
else if (sym_is(name, namelen, "pnp_card")) |
0c81eed4b PNP: add all PNP ... |
1359 |
do_pnp_card_entries(symval, sym->st_size, mod); |
626596e29 modpost: use a ta... |
1360 |
else { |
e49ce1415 modpost: use link... |
1361 |
struct devtable **p; |
dd2a3acae mod/file2alias: m... |
1362 |
INIT_SECTION(__devtable); |
626596e29 modpost: use a ta... |
1363 |
|
e49ce1415 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 modpost: use a ta... |
1368 1369 1370 1371 |
break; } } } |
e00498258 kbuild: make modp... |
1372 |
free(zeros); |
1da177e4c 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); } |