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 | ||
