aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-01-06 21:03:30 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-01-06 21:03:30 -0500
commitd3d0b024348c040f0d6851e2e59fc961677d5169 (patch)
treeab018edaa027ad069c54beb9cb3d0c5b5efc2198 /scripts
parent6ed23fd6c08b3ffa17c1f841098d2fa2ab3a59dd (diff)
parent9d5c627323dcf0983d699d26dd486272fc98bef2 (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.c72
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 */
889static 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 */
931static 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 _ */
884static inline int sym_is(const char *symbol, const char *name) 952static 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