diff options
Diffstat (limited to 'scripts/mod/file2alias.c')
-rw-r--r-- | scripts/mod/file2alias.c | 149 |
1 files changed, 51 insertions, 98 deletions
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 28a61665bb9c..a37af7d71973 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
@@ -47,49 +47,9 @@ typedef struct { | |||
47 | struct devtable { | 47 | struct devtable { |
48 | const char *device_id; /* name of table, __mod_<name>__*_device_table. */ | 48 | const char *device_id; /* name of table, __mod_<name>__*_device_table. */ |
49 | unsigned long id_size; | 49 | unsigned long id_size; |
50 | void *function; | 50 | int (*do_entry)(const char *filename, void *symval, char *alias); |
51 | }; | 51 | }; |
52 | 52 | ||
53 | #define ___cat(a,b) a ## b | ||
54 | #define __cat(a,b) ___cat(a,b) | ||
55 | |||
56 | /* we need some special handling for this host tool running eventually on | ||
57 | * Darwin. The Mach-O section handling is a bit different than ELF section | ||
58 | * handling. The differnces in detail are: | ||
59 | * a) we have segments which have sections | ||
60 | * b) we need a API call to get the respective section symbols */ | ||
61 | #if defined(__MACH__) | ||
62 | #include <mach-o/getsect.h> | ||
63 | |||
64 | #define INIT_SECTION(name) do { \ | ||
65 | unsigned long name ## _len; \ | ||
66 | char *__cat(pstart_,name) = getsectdata("__TEXT", \ | ||
67 | #name, &__cat(name,_len)); \ | ||
68 | char *__cat(pstop_,name) = __cat(pstart_,name) + \ | ||
69 | __cat(name, _len); \ | ||
70 | __cat(__start_,name) = (void *)__cat(pstart_,name); \ | ||
71 | __cat(__stop_,name) = (void *)__cat(pstop_,name); \ | ||
72 | } while (0) | ||
73 | #define SECTION(name) __attribute__((section("__TEXT, " #name))) | ||
74 | |||
75 | struct devtable **__start___devtable, **__stop___devtable; | ||
76 | #else | ||
77 | #define INIT_SECTION(name) /* no-op for ELF */ | ||
78 | #define SECTION(name) __attribute__((section(#name))) | ||
79 | |||
80 | /* We construct a table of pointers in an ELF section (pointers generally | ||
81 | * go unpadded by gcc). ld creates boundary syms for us. */ | ||
82 | extern struct devtable *__start___devtable[], *__stop___devtable[]; | ||
83 | #endif /* __MACH__ */ | ||
84 | |||
85 | #if !defined(__used) | ||
86 | # if __GNUC__ == 3 && __GNUC_MINOR__ < 3 | ||
87 | # define __used __attribute__((__unused__)) | ||
88 | # else | ||
89 | # define __used __attribute__((__used__)) | ||
90 | # endif | ||
91 | #endif | ||
92 | |||
93 | /* Define a variable f that holds the value of field f of struct devid | 53 | /* Define a variable f that holds the value of field f of struct devid |
94 | * based at address m. | 54 | * based at address m. |
95 | */ | 55 | */ |
@@ -110,16 +70,6 @@ extern struct devtable *__start___devtable[], *__stop___devtable[]; | |||
110 | #define DEF_FIELD_ADDR(m, devid, f) \ | 70 | #define DEF_FIELD_ADDR(m, devid, f) \ |
111 | DEF_FIELD_ADDR_VAR(m, devid, f, f) | 71 | DEF_FIELD_ADDR_VAR(m, devid, f, f) |
112 | 72 | ||
113 | /* Add a table entry. We test function type matches while we're here. */ | ||
114 | #define ADD_TO_DEVTABLE(device_id, type, function) \ | ||
115 | static struct devtable __cat(devtable,__LINE__) = { \ | ||
116 | device_id + 0*sizeof((function)((const char *)NULL, \ | ||
117 | (void *)NULL, \ | ||
118 | (char *)NULL)), \ | ||
119 | SIZE_##type, (function) }; \ | ||
120 | static struct devtable *SECTION(__devtable) __used \ | ||
121 | __cat(devtable_ptr,__LINE__) = &__cat(devtable,__LINE__) | ||
122 | |||
123 | #define ADD(str, sep, cond, field) \ | 73 | #define ADD(str, sep, cond, field) \ |
124 | do { \ | 74 | do { \ |
125 | strcat(str, sep); \ | 75 | strcat(str, sep); \ |
@@ -439,7 +389,6 @@ static int do_hid_entry(const char *filename, | |||
439 | 389 | ||
440 | return 1; | 390 | return 1; |
441 | } | 391 | } |
442 | ADD_TO_DEVTABLE("hid", hid_device_id, do_hid_entry); | ||
443 | 392 | ||
444 | /* Looks like: ieee1394:venNmoNspNverN */ | 393 | /* Looks like: ieee1394:venNmoNspNverN */ |
445 | static int do_ieee1394_entry(const char *filename, | 394 | static int do_ieee1394_entry(const char *filename, |
@@ -464,7 +413,6 @@ static int do_ieee1394_entry(const char *filename, | |||
464 | add_wildcard(alias); | 413 | add_wildcard(alias); |
465 | return 1; | 414 | return 1; |
466 | } | 415 | } |
467 | ADD_TO_DEVTABLE("ieee1394", ieee1394_device_id, do_ieee1394_entry); | ||
468 | 416 | ||
469 | /* Looks like: pci:vNdNsvNsdNbcNscNiN. */ | 417 | /* Looks like: pci:vNdNsvNsdNbcNscNiN. */ |
470 | static int do_pci_entry(const char *filename, | 418 | static int do_pci_entry(const char *filename, |
@@ -508,7 +456,6 @@ static int do_pci_entry(const char *filename, | |||
508 | add_wildcard(alias); | 456 | add_wildcard(alias); |
509 | return 1; | 457 | return 1; |
510 | } | 458 | } |
511 | ADD_TO_DEVTABLE("pci", pci_device_id, do_pci_entry); | ||
512 | 459 | ||
513 | /* looks like: "ccw:tNmNdtNdmN" */ | 460 | /* looks like: "ccw:tNmNdtNdmN" */ |
514 | static int do_ccw_entry(const char *filename, | 461 | static int do_ccw_entry(const char *filename, |
@@ -532,7 +479,6 @@ static int do_ccw_entry(const char *filename, | |||
532 | add_wildcard(alias); | 479 | add_wildcard(alias); |
533 | return 1; | 480 | return 1; |
534 | } | 481 | } |
535 | ADD_TO_DEVTABLE("ccw", ccw_device_id, do_ccw_entry); | ||
536 | 482 | ||
537 | /* looks like: "ap:tN" */ | 483 | /* looks like: "ap:tN" */ |
538 | static int do_ap_entry(const char *filename, | 484 | static int do_ap_entry(const char *filename, |
@@ -543,7 +489,6 @@ static int do_ap_entry(const char *filename, | |||
543 | sprintf(alias, "ap:t%02X*", dev_type); | 489 | sprintf(alias, "ap:t%02X*", dev_type); |
544 | return 1; | 490 | return 1; |
545 | } | 491 | } |
546 | ADD_TO_DEVTABLE("ap", ap_device_id, do_ap_entry); | ||
547 | 492 | ||
548 | /* looks like: "css:tN" */ | 493 | /* looks like: "css:tN" */ |
549 | static int do_css_entry(const char *filename, | 494 | static int do_css_entry(const char *filename, |
@@ -554,7 +499,6 @@ static int do_css_entry(const char *filename, | |||
554 | sprintf(alias, "css:t%01X", type); | 499 | sprintf(alias, "css:t%01X", type); |
555 | return 1; | 500 | return 1; |
556 | } | 501 | } |
557 | ADD_TO_DEVTABLE("css", css_device_id, do_css_entry); | ||
558 | 502 | ||
559 | /* Looks like: "serio:tyNprNidNexN" */ | 503 | /* Looks like: "serio:tyNprNidNexN" */ |
560 | static int do_serio_entry(const char *filename, | 504 | static int do_serio_entry(const char *filename, |
@@ -574,7 +518,6 @@ static int do_serio_entry(const char *filename, | |||
574 | add_wildcard(alias); | 518 | add_wildcard(alias); |
575 | return 1; | 519 | return 1; |
576 | } | 520 | } |
577 | ADD_TO_DEVTABLE("serio", serio_device_id, do_serio_entry); | ||
578 | 521 | ||
579 | /* looks like: "acpi:ACPI0003" or "acpi:PNP0C0B" or "acpi:LNXVIDEO" or | 522 | /* looks like: "acpi:ACPI0003" or "acpi:PNP0C0B" or "acpi:LNXVIDEO" or |
580 | * "acpi:bbsspp" (bb=base-class, ss=sub-class, pp=prog-if) | 523 | * "acpi:bbsspp" (bb=base-class, ss=sub-class, pp=prog-if) |
@@ -612,7 +555,6 @@ static int do_acpi_entry(const char *filename, | |||
612 | } | 555 | } |
613 | return 1; | 556 | return 1; |
614 | } | 557 | } |
615 | ADD_TO_DEVTABLE("acpi", acpi_device_id, do_acpi_entry); | ||
616 | 558 | ||
617 | /* looks like: "pnp:dD" */ | 559 | /* looks like: "pnp:dD" */ |
618 | static void do_pnp_device_entry(void *symval, unsigned long size, | 560 | static void do_pnp_device_entry(void *symval, unsigned long size, |
@@ -736,7 +678,6 @@ static int do_pcmcia_entry(const char *filename, | |||
736 | add_wildcard(alias); | 678 | add_wildcard(alias); |
737 | return 1; | 679 | return 1; |
738 | } | 680 | } |
739 | ADD_TO_DEVTABLE("pcmcia", pcmcia_device_id, do_pcmcia_entry); | ||
740 | 681 | ||
741 | static int do_vio_entry(const char *filename, void *symval, | 682 | static int do_vio_entry(const char *filename, void *symval, |
742 | char *alias) | 683 | char *alias) |
@@ -756,7 +697,6 @@ static int do_vio_entry(const char *filename, void *symval, | |||
756 | add_wildcard(alias); | 697 | add_wildcard(alias); |
757 | return 1; | 698 | return 1; |
758 | } | 699 | } |
759 | ADD_TO_DEVTABLE("vio", vio_device_id, do_vio_entry); | ||
760 | 700 | ||
761 | #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) | 701 | #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) |
762 | 702 | ||
@@ -829,7 +769,6 @@ static int do_input_entry(const char *filename, void *symval, | |||
829 | do_input(alias, *swbit, 0, INPUT_DEVICE_ID_SW_MAX); | 769 | do_input(alias, *swbit, 0, INPUT_DEVICE_ID_SW_MAX); |
830 | return 1; | 770 | return 1; |
831 | } | 771 | } |
832 | ADD_TO_DEVTABLE("input", input_device_id, do_input_entry); | ||
833 | 772 | ||
834 | static int do_eisa_entry(const char *filename, void *symval, | 773 | static int do_eisa_entry(const char *filename, void *symval, |
835 | char *alias) | 774 | char *alias) |
@@ -841,7 +780,6 @@ static int do_eisa_entry(const char *filename, void *symval, | |||
841 | strcat(alias, "*"); | 780 | strcat(alias, "*"); |
842 | return 1; | 781 | return 1; |
843 | } | 782 | } |
844 | ADD_TO_DEVTABLE("eisa", eisa_device_id, do_eisa_entry); | ||
845 | 783 | ||
846 | /* Looks like: parisc:tNhvNrevNsvN */ | 784 | /* Looks like: parisc:tNhvNrevNsvN */ |
847 | static int do_parisc_entry(const char *filename, void *symval, | 785 | static int do_parisc_entry(const char *filename, void *symval, |
@@ -861,7 +799,6 @@ static int do_parisc_entry(const char *filename, void *symval, | |||
861 | add_wildcard(alias); | 799 | add_wildcard(alias); |
862 | return 1; | 800 | return 1; |
863 | } | 801 | } |
864 | ADD_TO_DEVTABLE("parisc", parisc_device_id, do_parisc_entry); | ||
865 | 802 | ||
866 | /* Looks like: sdio:cNvNdN. */ | 803 | /* Looks like: sdio:cNvNdN. */ |
867 | static int do_sdio_entry(const char *filename, | 804 | static int do_sdio_entry(const char *filename, |
@@ -878,7 +815,6 @@ static int do_sdio_entry(const char *filename, | |||
878 | add_wildcard(alias); | 815 | add_wildcard(alias); |
879 | return 1; | 816 | return 1; |
880 | } | 817 | } |
881 | ADD_TO_DEVTABLE("sdio", sdio_device_id, do_sdio_entry); | ||
882 | 818 | ||
883 | /* Looks like: ssb:vNidNrevN. */ | 819 | /* Looks like: ssb:vNidNrevN. */ |
884 | static int do_ssb_entry(const char *filename, | 820 | static int do_ssb_entry(const char *filename, |
@@ -895,7 +831,6 @@ static int do_ssb_entry(const char *filename, | |||
895 | add_wildcard(alias); | 831 | add_wildcard(alias); |
896 | return 1; | 832 | return 1; |
897 | } | 833 | } |
898 | ADD_TO_DEVTABLE("ssb", ssb_device_id, do_ssb_entry); | ||
899 | 834 | ||
900 | /* Looks like: bcma:mNidNrevNclN. */ | 835 | /* Looks like: bcma:mNidNrevNclN. */ |
901 | static int do_bcma_entry(const char *filename, | 836 | static int do_bcma_entry(const char *filename, |
@@ -914,7 +849,6 @@ static int do_bcma_entry(const char *filename, | |||
914 | add_wildcard(alias); | 849 | add_wildcard(alias); |
915 | return 1; | 850 | return 1; |
916 | } | 851 | } |
917 | ADD_TO_DEVTABLE("bcma", bcma_device_id, do_bcma_entry); | ||
918 | 852 | ||
919 | /* Looks like: virtio:dNvN */ | 853 | /* Looks like: virtio:dNvN */ |
920 | static int do_virtio_entry(const char *filename, void *symval, | 854 | static int do_virtio_entry(const char *filename, void *symval, |
@@ -930,7 +864,6 @@ static int do_virtio_entry(const char *filename, void *symval, | |||
930 | add_wildcard(alias); | 864 | add_wildcard(alias); |
931 | return 1; | 865 | return 1; |
932 | } | 866 | } |
933 | ADD_TO_DEVTABLE("virtio", virtio_device_id, do_virtio_entry); | ||
934 | 867 | ||
935 | /* | 868 | /* |
936 | * Looks like: vmbus:guid | 869 | * Looks like: vmbus:guid |
@@ -953,7 +886,6 @@ static int do_vmbus_entry(const char *filename, void *symval, | |||
953 | 886 | ||
954 | return 1; | 887 | return 1; |
955 | } | 888 | } |
956 | ADD_TO_DEVTABLE("vmbus", hv_vmbus_device_id, do_vmbus_entry); | ||
957 | 889 | ||
958 | /* Looks like: rpmsg:S */ | 890 | /* Looks like: rpmsg:S */ |
959 | static int do_rpmsg_entry(const char *filename, void *symval, | 891 | static int do_rpmsg_entry(const char *filename, void *symval, |
@@ -964,7 +896,6 @@ static int do_rpmsg_entry(const char *filename, void *symval, | |||
964 | 896 | ||
965 | return 1; | 897 | return 1; |
966 | } | 898 | } |
967 | ADD_TO_DEVTABLE("rpmsg", rpmsg_device_id, do_rpmsg_entry); | ||
968 | 899 | ||
969 | /* Looks like: i2c:S */ | 900 | /* Looks like: i2c:S */ |
970 | static int do_i2c_entry(const char *filename, void *symval, | 901 | static int do_i2c_entry(const char *filename, void *symval, |
@@ -975,7 +906,6 @@ static int do_i2c_entry(const char *filename, void *symval, | |||
975 | 906 | ||
976 | return 1; | 907 | return 1; |
977 | } | 908 | } |
978 | ADD_TO_DEVTABLE("i2c", i2c_device_id, do_i2c_entry); | ||
979 | 909 | ||
980 | /* Looks like: spi:S */ | 910 | /* Looks like: spi:S */ |
981 | static int do_spi_entry(const char *filename, void *symval, | 911 | static int do_spi_entry(const char *filename, void *symval, |
@@ -986,7 +916,6 @@ static int do_spi_entry(const char *filename, void *symval, | |||
986 | 916 | ||
987 | return 1; | 917 | return 1; |
988 | } | 918 | } |
989 | ADD_TO_DEVTABLE("spi", spi_device_id, do_spi_entry); | ||
990 | 919 | ||
991 | static const struct dmifield { | 920 | static const struct dmifield { |
992 | const char *prefix; | 921 | const char *prefix; |
@@ -1041,7 +970,6 @@ static int do_dmi_entry(const char *filename, void *symval, | |||
1041 | strcat(alias, ":"); | 970 | strcat(alias, ":"); |
1042 | return 1; | 971 | return 1; |
1043 | } | 972 | } |
1044 | ADD_TO_DEVTABLE("dmi", dmi_system_id, do_dmi_entry); | ||
1045 | 973 | ||
1046 | static int do_platform_entry(const char *filename, | 974 | static int do_platform_entry(const char *filename, |
1047 | void *symval, char *alias) | 975 | void *symval, char *alias) |
@@ -1050,7 +978,6 @@ static int do_platform_entry(const char *filename, | |||
1050 | sprintf(alias, PLATFORM_MODULE_PREFIX "%s", *name); | 978 | sprintf(alias, PLATFORM_MODULE_PREFIX "%s", *name); |
1051 | return 1; | 979 | return 1; |
1052 | } | 980 | } |
1053 | ADD_TO_DEVTABLE("platform", platform_device_id, do_platform_entry); | ||
1054 | 981 | ||
1055 | static int do_mdio_entry(const char *filename, | 982 | static int do_mdio_entry(const char *filename, |
1056 | void *symval, char *alias) | 983 | void *symval, char *alias) |
@@ -1075,7 +1002,6 @@ static int do_mdio_entry(const char *filename, | |||
1075 | 1002 | ||
1076 | return 1; | 1003 | return 1; |
1077 | } | 1004 | } |
1078 | ADD_TO_DEVTABLE("mdio", mdio_device_id, do_mdio_entry); | ||
1079 | 1005 | ||
1080 | /* Looks like: zorro:iN. */ | 1006 | /* Looks like: zorro:iN. */ |
1081 | static int do_zorro_entry(const char *filename, void *symval, | 1007 | static int do_zorro_entry(const char *filename, void *symval, |
@@ -1086,7 +1012,6 @@ static int do_zorro_entry(const char *filename, void *symval, | |||
1086 | ADD(alias, "i", id != ZORRO_WILDCARD, id); | 1012 | ADD(alias, "i", id != ZORRO_WILDCARD, id); |
1087 | return 1; | 1013 | return 1; |
1088 | } | 1014 | } |
1089 | ADD_TO_DEVTABLE("zorro", zorro_device_id, do_zorro_entry); | ||
1090 | 1015 | ||
1091 | /* looks like: "pnp:dD" */ | 1016 | /* looks like: "pnp:dD" */ |
1092 | static int do_isapnp_entry(const char *filename, | 1017 | static int do_isapnp_entry(const char *filename, |
@@ -1102,7 +1027,6 @@ static int do_isapnp_entry(const char *filename, | |||
1102 | (function >> 12) & 0x0f, (function >> 8) & 0x0f); | 1027 | (function >> 12) & 0x0f, (function >> 8) & 0x0f); |
1103 | return 1; | 1028 | return 1; |
1104 | } | 1029 | } |
1105 | ADD_TO_DEVTABLE("isapnp", isapnp_device_id, do_isapnp_entry); | ||
1106 | 1030 | ||
1107 | /* Looks like: "ipack:fNvNdN". */ | 1031 | /* Looks like: "ipack:fNvNdN". */ |
1108 | static int do_ipack_entry(const char *filename, | 1032 | static int do_ipack_entry(const char *filename, |
@@ -1118,7 +1042,6 @@ static int do_ipack_entry(const char *filename, | |||
1118 | add_wildcard(alias); | 1042 | add_wildcard(alias); |
1119 | return 1; | 1043 | return 1; |
1120 | } | 1044 | } |
1121 | ADD_TO_DEVTABLE("ipack", ipack_device_id, do_ipack_entry); | ||
1122 | 1045 | ||
1123 | /* | 1046 | /* |
1124 | * Append a match expression for a single masked hex digit. | 1047 | * Append a match expression for a single masked hex digit. |
@@ -1189,7 +1112,6 @@ static int do_amba_entry(const char *filename, | |||
1189 | 1112 | ||
1190 | return 1; | 1113 | return 1; |
1191 | } | 1114 | } |
1192 | ADD_TO_DEVTABLE("amba", amba_id, do_amba_entry); | ||
1193 | 1115 | ||
1194 | /* | 1116 | /* |
1195 | * looks like: "mipscdmm:tN" | 1117 | * looks like: "mipscdmm:tN" |
@@ -1205,7 +1127,6 @@ static int do_mips_cdmm_entry(const char *filename, | |||
1205 | sprintf(alias, "mipscdmm:t%02X*", type); | 1127 | sprintf(alias, "mipscdmm:t%02X*", type); |
1206 | return 1; | 1128 | return 1; |
1207 | } | 1129 | } |
1208 | ADD_TO_DEVTABLE("mipscdmm", mips_cdmm_device_id, do_mips_cdmm_entry); | ||
1209 | 1130 | ||
1210 | /* LOOKS like cpu:type:x86,venVVVVfamFFFFmodMMMM:feature:*,FEAT,* | 1131 | /* LOOKS like cpu:type:x86,venVVVVfamFFFFmodMMMM:feature:*,FEAT,* |
1211 | * All fields are numbers. It would be nicer to use strings for vendor | 1132 | * All fields are numbers. It would be nicer to use strings for vendor |
@@ -1230,7 +1151,6 @@ static int do_x86cpu_entry(const char *filename, void *symval, | |||
1230 | sprintf(alias + strlen(alias), "%04X*", feature); | 1151 | sprintf(alias + strlen(alias), "%04X*", feature); |
1231 | return 1; | 1152 | return 1; |
1232 | } | 1153 | } |
1233 | ADD_TO_DEVTABLE("x86cpu", x86_cpu_id, do_x86cpu_entry); | ||
1234 | 1154 | ||
1235 | /* LOOKS like cpu:type:*:feature:*FEAT* */ | 1155 | /* LOOKS like cpu:type:*:feature:*FEAT* */ |
1236 | static int do_cpu_entry(const char *filename, void *symval, char *alias) | 1156 | static int do_cpu_entry(const char *filename, void *symval, char *alias) |
@@ -1240,7 +1160,6 @@ static int do_cpu_entry(const char *filename, void *symval, char *alias) | |||
1240 | sprintf(alias, "cpu:type:*:feature:*%04X*", feature); | 1160 | sprintf(alias, "cpu:type:*:feature:*%04X*", feature); |
1241 | return 1; | 1161 | return 1; |
1242 | } | 1162 | } |
1243 | ADD_TO_DEVTABLE("cpu", cpu_feature, do_cpu_entry); | ||
1244 | 1163 | ||
1245 | /* Looks like: mei:S:uuid:N:* */ | 1164 | /* Looks like: mei:S:uuid:N:* */ |
1246 | static int do_mei_entry(const char *filename, void *symval, | 1165 | static int do_mei_entry(const char *filename, void *symval, |
@@ -1259,7 +1178,6 @@ static int do_mei_entry(const char *filename, void *symval, | |||
1259 | 1178 | ||
1260 | return 1; | 1179 | return 1; |
1261 | } | 1180 | } |
1262 | ADD_TO_DEVTABLE("mei", mei_cl_device_id, do_mei_entry); | ||
1263 | 1181 | ||
1264 | /* Looks like: rapidio:vNdNavNadN */ | 1182 | /* Looks like: rapidio:vNdNavNadN */ |
1265 | static int do_rio_entry(const char *filename, | 1183 | static int do_rio_entry(const char *filename, |
@@ -1279,7 +1197,6 @@ static int do_rio_entry(const char *filename, | |||
1279 | add_wildcard(alias); | 1197 | add_wildcard(alias); |
1280 | return 1; | 1198 | return 1; |
1281 | } | 1199 | } |
1282 | ADD_TO_DEVTABLE("rapidio", rio_device_id, do_rio_entry); | ||
1283 | 1200 | ||
1284 | /* Looks like: ulpi:vNpN */ | 1201 | /* Looks like: ulpi:vNpN */ |
1285 | static int do_ulpi_entry(const char *filename, void *symval, | 1202 | static int do_ulpi_entry(const char *filename, void *symval, |
@@ -1292,7 +1209,6 @@ static int do_ulpi_entry(const char *filename, void *symval, | |||
1292 | 1209 | ||
1293 | return 1; | 1210 | return 1; |
1294 | } | 1211 | } |
1295 | ADD_TO_DEVTABLE("ulpi", ulpi_device_id, do_ulpi_entry); | ||
1296 | 1212 | ||
1297 | /* Looks like: hdaudio:vNrNaN */ | 1213 | /* Looks like: hdaudio:vNrNaN */ |
1298 | static int do_hda_entry(const char *filename, void *symval, char *alias) | 1214 | static int do_hda_entry(const char *filename, void *symval, char *alias) |
@@ -1309,7 +1225,6 @@ static int do_hda_entry(const char *filename, void *symval, char *alias) | |||
1309 | add_wildcard(alias); | 1225 | add_wildcard(alias); |
1310 | return 1; | 1226 | return 1; |
1311 | } | 1227 | } |
1312 | ADD_TO_DEVTABLE("hdaudio", hda_device_id, do_hda_entry); | ||
1313 | 1228 | ||
1314 | /* Looks like: sdw:mNpN */ | 1229 | /* Looks like: sdw:mNpN */ |
1315 | static int do_sdw_entry(const char *filename, void *symval, char *alias) | 1230 | static int do_sdw_entry(const char *filename, void *symval, char *alias) |
@@ -1324,7 +1239,6 @@ static int do_sdw_entry(const char *filename, void *symval, char *alias) | |||
1324 | add_wildcard(alias); | 1239 | add_wildcard(alias); |
1325 | return 1; | 1240 | return 1; |
1326 | } | 1241 | } |
1327 | ADD_TO_DEVTABLE("sdw", sdw_device_id, do_sdw_entry); | ||
1328 | 1242 | ||
1329 | /* Looks like: fsl-mc:vNdN */ | 1243 | /* Looks like: fsl-mc:vNdN */ |
1330 | static int do_fsl_mc_entry(const char *filename, void *symval, | 1244 | static int do_fsl_mc_entry(const char *filename, void *symval, |
@@ -1336,7 +1250,6 @@ static int do_fsl_mc_entry(const char *filename, void *symval, | |||
1336 | sprintf(alias, "fsl-mc:v%08Xd%s", vendor, *obj_type); | 1250 | sprintf(alias, "fsl-mc:v%08Xd%s", vendor, *obj_type); |
1337 | return 1; | 1251 | return 1; |
1338 | } | 1252 | } |
1339 | ADD_TO_DEVTABLE("fslmc", fsl_mc_device_id, do_fsl_mc_entry); | ||
1340 | 1253 | ||
1341 | /* Looks like: tbsvc:kSpNvNrN */ | 1254 | /* Looks like: tbsvc:kSpNvNrN */ |
1342 | static int do_tbsvc_entry(const char *filename, void *symval, char *alias) | 1255 | static int do_tbsvc_entry(const char *filename, void *symval, char *alias) |
@@ -1361,7 +1274,6 @@ static int do_tbsvc_entry(const char *filename, void *symval, char *alias) | |||
1361 | add_wildcard(alias); | 1274 | add_wildcard(alias); |
1362 | return 1; | 1275 | return 1; |
1363 | } | 1276 | } |
1364 | ADD_TO_DEVTABLE("tbsvc", tb_service_id, do_tbsvc_entry); | ||
1365 | 1277 | ||
1366 | /* Looks like: typec:idNmN */ | 1278 | /* Looks like: typec:idNmN */ |
1367 | static int do_typec_entry(const char *filename, void *symval, char *alias) | 1279 | static int do_typec_entry(const char *filename, void *symval, char *alias) |
@@ -1374,7 +1286,6 @@ static int do_typec_entry(const char *filename, void *symval, char *alias) | |||
1374 | 1286 | ||
1375 | return 1; | 1287 | return 1; |
1376 | } | 1288 | } |
1377 | ADD_TO_DEVTABLE("typec", typec_device_id, do_typec_entry); | ||
1378 | 1289 | ||
1379 | /* Does namelen bytes of name exactly match the symbol? */ | 1290 | /* Does namelen bytes of name exactly match the symbol? */ |
1380 | static bool sym_is(const char *name, unsigned namelen, const char *symbol) | 1291 | static bool sym_is(const char *name, unsigned namelen, const char *symbol) |
@@ -1388,12 +1299,11 @@ static bool sym_is(const char *name, unsigned namelen, const char *symbol) | |||
1388 | static void do_table(void *symval, unsigned long size, | 1299 | static void do_table(void *symval, unsigned long size, |
1389 | unsigned long id_size, | 1300 | unsigned long id_size, |
1390 | const char *device_id, | 1301 | const char *device_id, |
1391 | void *function, | 1302 | int (*do_entry)(const char *filename, void *symval, char *alias), |
1392 | struct module *mod) | 1303 | struct module *mod) |
1393 | { | 1304 | { |
1394 | unsigned int i; | 1305 | unsigned int i; |
1395 | char alias[500]; | 1306 | char alias[500]; |
1396 | int (*do_entry)(const char *, void *entry, char *alias) = function; | ||
1397 | 1307 | ||
1398 | device_id_check(mod->name, device_id, size, id_size, symval); | 1308 | device_id_check(mod->name, device_id, size, id_size, symval); |
1399 | /* Leave last one: it's the terminator. */ | 1309 | /* Leave last one: it's the terminator. */ |
@@ -1407,6 +1317,48 @@ static void do_table(void *symval, unsigned long size, | |||
1407 | } | 1317 | } |
1408 | } | 1318 | } |
1409 | 1319 | ||
1320 | static const struct devtable devtable[] = { | ||
1321 | {"hid", SIZE_hid_device_id, do_hid_entry}, | ||
1322 | {"ieee1394", SIZE_ieee1394_device_id, do_ieee1394_entry}, | ||
1323 | {"pci", SIZE_pci_device_id, do_pci_entry}, | ||
1324 | {"ccw", SIZE_ccw_device_id, do_ccw_entry}, | ||
1325 | {"ap", SIZE_ap_device_id, do_ap_entry}, | ||
1326 | {"css", SIZE_css_device_id, do_css_entry}, | ||
1327 | {"serio", SIZE_serio_device_id, do_serio_entry}, | ||
1328 | {"acpi", SIZE_acpi_device_id, do_acpi_entry}, | ||
1329 | {"pcmcia", SIZE_pcmcia_device_id, do_pcmcia_entry}, | ||
1330 | {"vio", SIZE_vio_device_id, do_vio_entry}, | ||
1331 | {"input", SIZE_input_device_id, do_input_entry}, | ||
1332 | {"eisa", SIZE_eisa_device_id, do_eisa_entry}, | ||
1333 | {"parisc", SIZE_parisc_device_id, do_parisc_entry}, | ||
1334 | {"sdio", SIZE_sdio_device_id, do_sdio_entry}, | ||
1335 | {"ssb", SIZE_ssb_device_id, do_ssb_entry}, | ||
1336 | {"bcma", SIZE_bcma_device_id, do_bcma_entry}, | ||
1337 | {"virtio", SIZE_virtio_device_id, do_virtio_entry}, | ||
1338 | {"vmbus", SIZE_hv_vmbus_device_id, do_vmbus_entry}, | ||
1339 | {"rpmsg", SIZE_rpmsg_device_id, do_rpmsg_entry}, | ||
1340 | {"i2c", SIZE_i2c_device_id, do_i2c_entry}, | ||
1341 | {"spi", SIZE_spi_device_id, do_spi_entry}, | ||
1342 | {"dmi", SIZE_dmi_system_id, do_dmi_entry}, | ||
1343 | {"platform", SIZE_platform_device_id, do_platform_entry}, | ||
1344 | {"mdio", SIZE_mdio_device_id, do_mdio_entry}, | ||
1345 | {"zorro", SIZE_zorro_device_id, do_zorro_entry}, | ||
1346 | {"isapnp", SIZE_isapnp_device_id, do_isapnp_entry}, | ||
1347 | {"ipack", SIZE_ipack_device_id, do_ipack_entry}, | ||
1348 | {"amba", SIZE_amba_id, do_amba_entry}, | ||
1349 | {"mipscdmm", SIZE_mips_cdmm_device_id, do_mips_cdmm_entry}, | ||
1350 | {"x86cpu", SIZE_x86_cpu_id, do_x86cpu_entry}, | ||
1351 | {"cpu", SIZE_cpu_feature, do_cpu_entry}, | ||
1352 | {"mei", SIZE_mei_cl_device_id, do_mei_entry}, | ||
1353 | {"rapidio", SIZE_rio_device_id, do_rio_entry}, | ||
1354 | {"ulpi", SIZE_ulpi_device_id, do_ulpi_entry}, | ||
1355 | {"hdaudio", SIZE_hda_device_id, do_hda_entry}, | ||
1356 | {"sdw", SIZE_sdw_device_id, do_sdw_entry}, | ||
1357 | {"fslmc", SIZE_fsl_mc_device_id, do_fsl_mc_entry}, | ||
1358 | {"tbsvc", SIZE_tb_service_id, do_tbsvc_entry}, | ||
1359 | {"typec", SIZE_typec_device_id, do_typec_entry}, | ||
1360 | }; | ||
1361 | |||
1410 | /* Create MODULE_ALIAS() statements. | 1362 | /* Create MODULE_ALIAS() statements. |
1411 | * At this time, we cannot write the actual output C source yet, | 1363 | * At this time, we cannot write the actual output C source yet, |
1412 | * so we write into the mod->dev_table_buf buffer. */ | 1364 | * so we write into the mod->dev_table_buf buffer. */ |
@@ -1460,13 +1412,14 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, | |||
1460 | else if (sym_is(name, namelen, "pnp_card")) | 1412 | else if (sym_is(name, namelen, "pnp_card")) |
1461 | do_pnp_card_entries(symval, sym->st_size, mod); | 1413 | do_pnp_card_entries(symval, sym->st_size, mod); |
1462 | else { | 1414 | else { |
1463 | struct devtable **p; | 1415 | int i; |
1464 | INIT_SECTION(__devtable); | 1416 | |
1417 | for (i = 0; i < ARRAY_SIZE(devtable); i++) { | ||
1418 | const struct devtable *p = &devtable[i]; | ||
1465 | 1419 | ||
1466 | for (p = __start___devtable; p < __stop___devtable; p++) { | 1420 | if (sym_is(name, namelen, p->device_id)) { |
1467 | if (sym_is(name, namelen, (*p)->device_id)) { | 1421 | do_table(symval, sym->st_size, p->id_size, |
1468 | do_table(symval, sym->st_size, (*p)->id_size, | 1422 | p->device_id, p->do_entry, mod); |
1469 | (*p)->device_id, (*p)->function, mod); | ||
1470 | break; | 1423 | break; |
1471 | } | 1424 | } |
1472 | } | 1425 | } |