diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-14 15:32:16 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-14 15:32:16 -0500 |
| commit | 0a80939b3e6af4b0dc93bf88ec02fd7e90a16f1b (patch) | |
| tree | a112335f2b2b2a51e90531c6c67e8a3b54dcf0ef /scripts/mod | |
| parent | 0b48d42235caf627121f440b57d376f48a9af8b6 (diff) | |
| parent | 72db395ffadb1d33233fd123c2bf87ba0198c6c1 (diff) | |
Merge tag 'for-linus' of git://github.com/rustyrussell/linux
Autogenerated GPG tag for Rusty D1ADB8F1: 15EE 8D6C AB0E 7F0C F999 BFCB D920 0E6C D1AD B8F1
* tag 'for-linus' of git://github.com/rustyrussell/linux:
module_param: check that bool parameters really are bool.
intelfbdrv.c: bailearly is an int module_param
paride/pcd: fix bool verbose module parameter.
module_param: make bool parameters really bool (drivers & misc)
module_param: make bool parameters really bool (arch)
module_param: make bool parameters really bool (core code)
kernel/async: remove redundant declaration.
printk: fix unnecessary module_param_name.
lirc_parallel: fix module parameter description.
module_param: avoid bool abuse, add bint for special cases.
module_param: check type correctness for module_param_array
modpost: use linker section to generate table.
modpost: use a table rather than a giant if/else statement.
modules: sysfs - export: taint, coresize, initsize
kernel/params: replace DEBUGP with pr_debug
module: replace DEBUGP with pr_debug
module: struct module_ref should contains long fields
module: Fix performance regression on modules with large symbol tables
module: Add comments describing how the "strmap" logic works
Fix up conflicts in scripts/mod/file2alias.c due to the new linker-
generated table approach to adding __mod_*_device_table entries. The
ARM sa11x0 mcp bus needed to be converted to that too.
Diffstat (limited to 'scripts/mod')
| -rw-r--r-- | scripts/mod/file2alias.c | 217 |
1 files changed, 92 insertions, 125 deletions
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 296f17ff751b..c0e14b3f2306 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
| @@ -28,6 +28,7 @@ typedef Elf64_Addr kernel_ulong_t; | |||
| 28 | #endif | 28 | #endif |
| 29 | 29 | ||
| 30 | #include <ctype.h> | 30 | #include <ctype.h> |
| 31 | #include <stdbool.h> | ||
| 31 | 32 | ||
| 32 | typedef uint32_t __u32; | 33 | typedef uint32_t __u32; |
| 33 | typedef uint16_t __u16; | 34 | typedef uint16_t __u16; |
| @@ -38,6 +39,35 @@ typedef unsigned char __u8; | |||
| 38 | * we handle those differences explicitly below */ | 39 | * we handle those differences explicitly below */ |
| 39 | #include "../../include/linux/mod_devicetable.h" | 40 | #include "../../include/linux/mod_devicetable.h" |
| 40 | 41 | ||
| 42 | /* This array collects all instances that use the generic do_table */ | ||
| 43 | struct devtable { | ||
| 44 | const char *device_id; /* name of table, __mod_<name>_device_table. */ | ||
| 45 | unsigned long id_size; | ||
| 46 | void *function; | ||
| 47 | }; | ||
| 48 | |||
| 49 | /* We construct a table of pointers in an ELF section (pointers generally | ||
| 50 | * go unpadded by gcc). ld creates boundary syms for us. */ | ||
| 51 | extern struct devtable *__start___devtable[], *__stop___devtable[]; | ||
| 52 | #define ___cat(a,b) a ## b | ||
| 53 | #define __cat(a,b) ___cat(a,b) | ||
| 54 | |||
| 55 | #if __GNUC__ == 3 && __GNUC_MINOR__ < 3 | ||
| 56 | # define __used __attribute__((__unused__)) | ||
| 57 | #else | ||
| 58 | # define __used __attribute__((__used__)) | ||
| 59 | #endif | ||
| 60 | |||
| 61 | /* Add a table entry. We test function type matches while we're here. */ | ||
| 62 | #define ADD_TO_DEVTABLE(device_id, type, function) \ | ||
| 63 | static struct devtable __cat(devtable,__LINE__) = { \ | ||
| 64 | device_id + 0*sizeof((function)((const char *)NULL, \ | ||
| 65 | (type *)NULL, \ | ||
| 66 | (char *)NULL)), \ | ||
| 67 | sizeof(type), (function) }; \ | ||
| 68 | static struct devtable *__attribute__((section("__devtable"))) \ | ||
| 69 | __used __cat(devtable_ptr,__LINE__) = &__cat(devtable,__LINE__) | ||
| 70 | |||
| 41 | #define ADD(str, sep, cond, field) \ | 71 | #define ADD(str, sep, cond, field) \ |
| 42 | do { \ | 72 | do { \ |
| 43 | strcat(str, sep); \ | 73 | strcat(str, sep); \ |
| @@ -289,6 +319,7 @@ static int do_hid_entry(const char *filename, | |||
| 289 | 319 | ||
| 290 | return 1; | 320 | return 1; |
| 291 | } | 321 | } |
| 322 | ADD_TO_DEVTABLE("hid", struct hid_device_id, do_hid_entry); | ||
| 292 | 323 | ||
| 293 | /* Looks like: ieee1394:venNmoNspNverN */ | 324 | /* Looks like: ieee1394:venNmoNspNverN */ |
| 294 | static int do_ieee1394_entry(const char *filename, | 325 | static int do_ieee1394_entry(const char *filename, |
| @@ -313,6 +344,7 @@ static int do_ieee1394_entry(const char *filename, | |||
| 313 | add_wildcard(alias); | 344 | add_wildcard(alias); |
| 314 | return 1; | 345 | return 1; |
| 315 | } | 346 | } |
| 347 | ADD_TO_DEVTABLE("ieee1394", struct ieee1394_device_id, do_ieee1394_entry); | ||
| 316 | 348 | ||
| 317 | /* Looks like: pci:vNdNsvNsdNbcNscNiN. */ | 349 | /* Looks like: pci:vNdNsvNsdNbcNscNiN. */ |
| 318 | static int do_pci_entry(const char *filename, | 350 | static int do_pci_entry(const char *filename, |
| @@ -356,6 +388,7 @@ static int do_pci_entry(const char *filename, | |||
| 356 | add_wildcard(alias); | 388 | add_wildcard(alias); |
| 357 | return 1; | 389 | return 1; |
| 358 | } | 390 | } |
| 391 | ADD_TO_DEVTABLE("pci", struct pci_device_id, do_pci_entry); | ||
| 359 | 392 | ||
| 360 | /* looks like: "ccw:tNmNdtNdmN" */ | 393 | /* looks like: "ccw:tNmNdtNdmN" */ |
| 361 | static int do_ccw_entry(const char *filename, | 394 | static int do_ccw_entry(const char *filename, |
| @@ -379,6 +412,7 @@ static int do_ccw_entry(const char *filename, | |||
| 379 | add_wildcard(alias); | 412 | add_wildcard(alias); |
| 380 | return 1; | 413 | return 1; |
| 381 | } | 414 | } |
| 415 | ADD_TO_DEVTABLE("ccw", struct ccw_device_id, do_ccw_entry); | ||
| 382 | 416 | ||
| 383 | /* looks like: "ap:tN" */ | 417 | /* looks like: "ap:tN" */ |
| 384 | static int do_ap_entry(const char *filename, | 418 | static int do_ap_entry(const char *filename, |
| @@ -387,6 +421,7 @@ static int do_ap_entry(const char *filename, | |||
| 387 | sprintf(alias, "ap:t%02X*", id->dev_type); | 421 | sprintf(alias, "ap:t%02X*", id->dev_type); |
| 388 | return 1; | 422 | return 1; |
| 389 | } | 423 | } |
| 424 | ADD_TO_DEVTABLE("ap", struct ap_device_id, do_ap_entry); | ||
| 390 | 425 | ||
| 391 | /* looks like: "css:tN" */ | 426 | /* looks like: "css:tN" */ |
| 392 | static int do_css_entry(const char *filename, | 427 | static int do_css_entry(const char *filename, |
| @@ -395,6 +430,7 @@ static int do_css_entry(const char *filename, | |||
| 395 | sprintf(alias, "css:t%01X", id->type); | 430 | sprintf(alias, "css:t%01X", id->type); |
| 396 | return 1; | 431 | return 1; |
| 397 | } | 432 | } |
| 433 | ADD_TO_DEVTABLE("css", struct css_device_id, do_css_entry); | ||
| 398 | 434 | ||
| 399 | /* Looks like: "serio:tyNprNidNexN" */ | 435 | /* Looks like: "serio:tyNprNidNexN" */ |
| 400 | static int do_serio_entry(const char *filename, | 436 | static int do_serio_entry(const char *filename, |
| @@ -414,6 +450,7 @@ static int do_serio_entry(const char *filename, | |||
| 414 | add_wildcard(alias); | 450 | add_wildcard(alias); |
| 415 | return 1; | 451 | return 1; |
| 416 | } | 452 | } |
| 453 | ADD_TO_DEVTABLE("serio", struct serio_device_id, do_serio_entry); | ||
| 417 | 454 | ||
| 418 | /* looks like: "acpi:ACPI0003 or acpi:PNP0C0B" or "acpi:LNXVIDEO" */ | 455 | /* looks like: "acpi:ACPI0003 or acpi:PNP0C0B" or "acpi:LNXVIDEO" */ |
| 419 | static int do_acpi_entry(const char *filename, | 456 | static int do_acpi_entry(const char *filename, |
| @@ -422,6 +459,7 @@ static int do_acpi_entry(const char *filename, | |||
| 422 | sprintf(alias, "acpi*:%s:*", id->id); | 459 | sprintf(alias, "acpi*:%s:*", id->id); |
| 423 | return 1; | 460 | return 1; |
| 424 | } | 461 | } |
| 462 | ADD_TO_DEVTABLE("acpi", struct acpi_device_id, do_acpi_entry); | ||
| 425 | 463 | ||
| 426 | /* looks like: "pnp:dD" */ | 464 | /* looks like: "pnp:dD" */ |
| 427 | static void do_pnp_device_entry(void *symval, unsigned long size, | 465 | static void do_pnp_device_entry(void *symval, unsigned long size, |
| @@ -544,8 +582,7 @@ static int do_pcmcia_entry(const char *filename, | |||
| 544 | add_wildcard(alias); | 582 | add_wildcard(alias); |
| 545 | return 1; | 583 | return 1; |
| 546 | } | 584 | } |
| 547 | 585 | ADD_TO_DEVTABLE("pcmcia", struct pcmcia_device_id, do_pcmcia_entry); | |
| 548 | |||
| 549 | 586 | ||
| 550 | static int do_of_entry (const char *filename, struct of_device_id *of, char *alias) | 587 | static int do_of_entry (const char *filename, struct of_device_id *of, char *alias) |
| 551 | { | 588 | { |
| @@ -568,6 +605,7 @@ static int do_of_entry (const char *filename, struct of_device_id *of, char *ali | |||
| 568 | add_wildcard(alias); | 605 | add_wildcard(alias); |
| 569 | return 1; | 606 | return 1; |
| 570 | } | 607 | } |
| 608 | ADD_TO_DEVTABLE("of", struct of_device_id, do_of_entry); | ||
| 571 | 609 | ||
| 572 | static int do_vio_entry(const char *filename, struct vio_device_id *vio, | 610 | static int do_vio_entry(const char *filename, struct vio_device_id *vio, |
| 573 | char *alias) | 611 | char *alias) |
| @@ -585,6 +623,7 @@ static int do_vio_entry(const char *filename, struct vio_device_id *vio, | |||
| 585 | add_wildcard(alias); | 623 | add_wildcard(alias); |
| 586 | return 1; | 624 | return 1; |
| 587 | } | 625 | } |
| 626 | ADD_TO_DEVTABLE("vio", struct vio_device_id, do_vio_entry); | ||
| 588 | 627 | ||
| 589 | #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) | 628 | #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) |
| 590 | 629 | ||
| @@ -640,6 +679,7 @@ static int do_input_entry(const char *filename, struct input_device_id *id, | |||
| 640 | do_input(alias, id->swbit, 0, INPUT_DEVICE_ID_SW_MAX); | 679 | do_input(alias, id->swbit, 0, INPUT_DEVICE_ID_SW_MAX); |
| 641 | return 1; | 680 | return 1; |
| 642 | } | 681 | } |
| 682 | ADD_TO_DEVTABLE("input", struct input_device_id, do_input_entry); | ||
| 643 | 683 | ||
| 644 | static int do_eisa_entry(const char *filename, struct eisa_device_id *eisa, | 684 | static int do_eisa_entry(const char *filename, struct eisa_device_id *eisa, |
| 645 | char *alias) | 685 | char *alias) |
| @@ -650,6 +690,7 @@ static int do_eisa_entry(const char *filename, struct eisa_device_id *eisa, | |||
| 650 | strcat(alias, "*"); | 690 | strcat(alias, "*"); |
| 651 | return 1; | 691 | return 1; |
| 652 | } | 692 | } |
| 693 | ADD_TO_DEVTABLE("eisa", struct eisa_device_id, do_eisa_entry); | ||
| 653 | 694 | ||
| 654 | /* Looks like: parisc:tNhvNrevNsvN */ | 695 | /* Looks like: parisc:tNhvNrevNsvN */ |
| 655 | static int do_parisc_entry(const char *filename, struct parisc_device_id *id, | 696 | static int do_parisc_entry(const char *filename, struct parisc_device_id *id, |
| @@ -669,6 +710,7 @@ static int do_parisc_entry(const char *filename, struct parisc_device_id *id, | |||
| 669 | add_wildcard(alias); | 710 | add_wildcard(alias); |
| 670 | return 1; | 711 | return 1; |
| 671 | } | 712 | } |
| 713 | ADD_TO_DEVTABLE("parisc", struct parisc_device_id, do_parisc_entry); | ||
| 672 | 714 | ||
| 673 | /* Looks like: sdio:cNvNdN. */ | 715 | /* Looks like: sdio:cNvNdN. */ |
| 674 | static int do_sdio_entry(const char *filename, | 716 | static int do_sdio_entry(const char *filename, |
| @@ -685,6 +727,7 @@ static int do_sdio_entry(const char *filename, | |||
| 685 | add_wildcard(alias); | 727 | add_wildcard(alias); |
| 686 | return 1; | 728 | return 1; |
