diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-06 21:03:30 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-06 21:03:30 -0500 |
commit | d3d0b024348c040f0d6851e2e59fc961677d5169 (patch) | |
tree | ab018edaa027ad069c54beb9cb3d0c5b5efc2198 /scripts | |
parent | 6ed23fd6c08b3ffa17c1f841098d2fa2ab3a59dd (diff) | |
parent | 9d5c627323dcf0983d699d26dd486272fc98bef2 (diff) |
Merge branch 'amba-modalias' of git://ftp.arm.linux.org.uk/pub/linux/arm/kernel/git-cur/linux-2.6-arm
* 'amba-modalias' of git://ftp.arm.linux.org.uk/pub/linux/arm/kernel/git-cur/linux-2.6-arm:
sound: aaci: Enable module alias autogeneration for AMBA drivers
watchdog: sp805: Enable module alias autogeneration for AMBA drivers
fbdev: amba: Enable module alias autogeneration for AMBA drivers
serial: pl011: Enable module alias autogeneration for AMBA drivers
serial: pl010: Enable module alias autogeneration for AMBA drivers
spi: pl022: Enable module alias autogeneration for AMBA drivers
rtc: pl031: Enable module alias autogeneration for AMBA drivers
rtc: pl030: Enable module alias autogeneration for AMBA drivers
mmc: mmci: Enable module alias autogeneration for AMBA drivers
input: ambakmi: Enable module alias autogeneration for AMBA drivers
gpio: pl061: Enable module alias autogeneration for AMBA drivers
dmaengine: pl330: Enable module alias autogeneration for AMBA drivers
dmaengine: pl08x: Enable module alias autogeneration for AMBA drivers
hwrng: nomadik: Enable module alias autogeneration for AMBA drivers
ARM: amba: Auto-generate AMBA driver module aliases during modpost
ARM: amba: Move definition of struct amba_id to mod_devicetable.h
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/mod/file2alias.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index f936d1fa969d..363ab4666b17 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
@@ -880,6 +880,74 @@ static int do_isapnp_entry(const char *filename, | |||
880 | return 1; | 880 | return 1; |
881 | } | 881 | } |
882 | 882 | ||
883 | /* | ||
884 | * Append a match expression for a single masked hex digit. | ||
885 | * outp points to a pointer to the character at which to append. | ||
886 | * *outp is updated on return to point just after the appended text, | ||
887 | * to facilitate further appending. | ||
888 | */ | ||
889 | static void append_nibble_mask(char **outp, | ||
890 | unsigned int nibble, unsigned int mask) | ||
891 | { | ||
892 | char *p = *outp; | ||
893 | unsigned int i; | ||
894 | |||
895 | switch (mask) { | ||
896 | case 0: | ||
897 | *p++ = '?'; | ||
898 | break; | ||
899 | |||
900 | case 0xf: | ||
901 | p += sprintf(p, "%X", nibble); | ||
902 | break; | ||
903 | |||
904 | default: | ||
905 | /* | ||
906 | * Dumbly emit a match pattern for all possible matching | ||
907 | * digits. This could be improved in some cases using ranges, | ||
908 | * but it has the advantage of being trivially correct, and is | ||
909 | * often optimal. | ||
910 | */ | ||
911 | *p++ = '['; | ||
912 | for (i = 0; i < 0x10; i++) | ||
913 | if ((i & mask) == nibble) | ||
914 | p += sprintf(p, "%X", i); | ||
915 | *p++ = ']'; | ||
916 | } | ||
917 | |||
918 | /* Ensure that the string remains NUL-terminated: */ | ||
919 | *p = '\0'; | ||
920 | |||
921 | /* Advance the caller's end-of-string pointer: */ | ||
922 | *outp = p; | ||
923 | } | ||
924 | |||
925 | /* | ||
926 | * looks like: "amba:dN" | ||
927 | * | ||
928 | * N is exactly 8 digits, where each is an upper-case hex digit, or | ||
929 | * a ? or [] pattern matching exactly one digit. | ||
930 | */ | ||
931 | static int do_amba_entry(const char *filename, | ||
932 | struct amba_id *id, char *alias) | ||
933 | { | ||
934 | unsigned int digit; | ||
935 | char *p = alias; | ||
936 | |||
937 | if ((id->id & id->mask) != id->id) | ||
938 | fatal("%s: Masked-off bit(s) of AMBA device ID are non-zero: " | ||
939 | "id=0x%08X, mask=0x%08X. Please fix this driver.\n", | ||
940 | filename, id->id, id->mask); | ||
941 | |||
942 | p += sprintf(alias, "amba:d"); | ||
943 | for (digit = 0; digit < 8; digit++) | ||
944 | append_nibble_mask(&p, | ||
945 | (id->id >> (4 * (7 - digit))) & 0xf, | ||
946 | (id->mask >> (4 * (7 - digit))) & 0xf); | ||
947 | |||
948 | return 1; | ||
949 | } | ||
950 | |||
883 | /* Ignore any prefix, eg. some architectures prepend _ */ | 951 | /* Ignore any prefix, eg. some architectures prepend _ */ |
884 | static inline int sym_is(const char *symbol, const char *name) | 952 | static inline int sym_is(const char *symbol, const char *name) |
885 | { | 953 | { |
@@ -1047,6 +1115,10 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, | |||
1047 | do_table(symval, sym->st_size, | 1115 | do_table(symval, sym->st_size, |
1048 | sizeof(struct isapnp_device_id), "isa", | 1116 | sizeof(struct isapnp_device_id), "isa", |
1049 | do_isapnp_entry, mod); | 1117 | do_isapnp_entry, mod); |
1118 | else if (sym_is(symname, "__mod_amba_device_table")) | ||
1119 | do_table(symval, sym->st_size, | ||
1120 | sizeof(struct amba_id), "amba", | ||
1121 | do_amba_entry, mod); | ||
1050 | free(zeros); | 1122 | free(zeros); |
1051 | } | 1123 | } |
1052 | 1124 | ||