diff options
-rw-r--r-- | drivers/amba/bus.c | 4 | ||||
-rw-r--r-- | drivers/char/hw_random/nomadik-rng.c | 2 | ||||
-rw-r--r-- | drivers/dma/amba-pl08x.c | 2 | ||||
-rw-r--r-- | drivers/dma/pl330.c | 2 | ||||
-rw-r--r-- | drivers/gpio/gpio-pl061.c | 2 | ||||
-rw-r--r-- | drivers/input/serio/ambakmi.c | 2 | ||||
-rw-r--r-- | drivers/mmc/host/mmci.c | 2 | ||||
-rw-r--r-- | drivers/rtc/rtc-pl030.c | 2 | ||||
-rw-r--r-- | drivers/rtc/rtc-pl031.c | 2 | ||||
-rw-r--r-- | drivers/spi/spi-pl022.c | 2 | ||||
-rw-r--r-- | drivers/tty/serial/amba-pl010.c | 2 | ||||
-rw-r--r-- | drivers/tty/serial/amba-pl011.c | 2 | ||||
-rw-r--r-- | drivers/video/amba-clcd.c | 2 | ||||
-rw-r--r-- | drivers/watchdog/sp805_wdt.c | 2 | ||||
-rw-r--r-- | include/linux/amba/bus.h | 7 | ||||
-rw-r--r-- | include/linux/mod_devicetable.h | 18 | ||||
-rw-r--r-- | scripts/mod/file2alias.c | 72 | ||||
-rw-r--r-- | sound/arm/aaci.c | 2 |
18 files changed, 123 insertions, 6 deletions
diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c index bd230e801131..936c98cb2475 100644 --- a/drivers/amba/bus.c +++ b/drivers/amba/bus.c | |||
@@ -52,6 +52,10 @@ static int amba_uevent(struct device *dev, struct kobj_uevent_env *env) | |||
52 | int retval = 0; | 52 | int retval = 0; |
53 | 53 | ||
54 | retval = add_uevent_var(env, "AMBA_ID=%08x", pcdev->periphid); | 54 | retval = add_uevent_var(env, "AMBA_ID=%08x", pcdev->periphid); |
55 | if (retval) | ||
56 | return retval; | ||
57 | |||
58 | retval = add_uevent_var(env, "MODALIAS=amba:d%08X", pcdev->periphid); | ||
55 | return retval; | 59 | return retval; |
56 | } | 60 | } |
57 | #else | 61 | #else |
diff --git a/drivers/char/hw_random/nomadik-rng.c b/drivers/char/hw_random/nomadik-rng.c index 52e08ca3ccd7..3d3c1e6703b4 100644 --- a/drivers/char/hw_random/nomadik-rng.c +++ b/drivers/char/hw_random/nomadik-rng.c | |||
@@ -95,6 +95,8 @@ static struct amba_id nmk_rng_ids[] = { | |||
95 | {0, 0}, | 95 | {0, 0}, |
96 | }; | 96 | }; |
97 | 97 | ||
98 | MODULE_DEVICE_TABLE(amba, nmk_rng_ids); | ||
99 | |||
98 | static struct amba_driver nmk_rng_driver = { | 100 | static struct amba_driver nmk_rng_driver = { |
99 | .drv = { | 101 | .drv = { |
100 | .owner = THIS_MODULE, | 102 | .owner = THIS_MODULE, |
diff --git a/drivers/dma/amba-pl08x.c b/drivers/dma/amba-pl08x.c index b7cbd1ab1db1..0698695e8bf9 100644 --- a/drivers/dma/amba-pl08x.c +++ b/drivers/dma/amba-pl08x.c | |||
@@ -2054,6 +2054,8 @@ static struct amba_id pl08x_ids[] = { | |||
2054 | { 0, 0 }, | 2054 | { 0, 0 }, |
2055 | }; | 2055 | }; |
2056 | 2056 | ||
2057 | MODULE_DEVICE_TABLE(amba, pl08x_ids); | ||
2058 | |||
2057 | static struct amba_driver pl08x_amba_driver = { | 2059 | static struct amba_driver pl08x_amba_driver = { |
2058 | .drv.name = DRIVER_NAME, | 2060 | .drv.name = DRIVER_NAME, |
2059 | .id_table = pl08x_ids, | 2061 | .id_table = pl08x_ids, |
diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c index 571041477ab2..2d8d1b041d95 100644 --- a/drivers/dma/pl330.c +++ b/drivers/dma/pl330.c | |||
@@ -990,6 +990,8 @@ static struct amba_id pl330_ids[] = { | |||
990 | { 0, 0 }, | 990 | { 0, 0 }, |
991 | }; | 991 | }; |
992 | 992 | ||
993 | MODULE_DEVICE_TABLE(amba, pl330_ids); | ||
994 | |||
993 | #ifdef CONFIG_PM_RUNTIME | 995 | #ifdef CONFIG_PM_RUNTIME |
994 | static int pl330_runtime_suspend(struct device *dev) | 996 | static int pl330_runtime_suspend(struct device *dev) |
995 | { | 997 | { |
diff --git a/drivers/gpio/gpio-pl061.c b/drivers/gpio/gpio-pl061.c index 4102f63230fd..8f79c03049f3 100644 --- a/drivers/gpio/gpio-pl061.c +++ b/drivers/gpio/gpio-pl061.c | |||
@@ -346,6 +346,8 @@ static struct amba_id pl061_ids[] = { | |||
346 | { 0, 0 }, | 346 | { 0, 0 }, |
347 | }; | 347 | }; |
348 | 348 | ||
349 | MODULE_DEVICE_TABLE(amba, pl061_ids); | ||
350 | |||
349 | static struct amba_driver pl061_gpio_driver = { | 351 | static struct amba_driver pl061_gpio_driver = { |
350 | .drv = { | 352 | .drv = { |
351 | .name = "pl061_gpio", | 353 | .name = "pl061_gpio", |
diff --git a/drivers/input/serio/ambakmi.c b/drivers/input/serio/ambakmi.c index 12abc50508e5..8407d5b0ced8 100644 --- a/drivers/input/serio/ambakmi.c +++ b/drivers/input/serio/ambakmi.c | |||
@@ -195,6 +195,8 @@ static struct amba_id amba_kmi_idtable[] = { | |||
195 | { 0, 0 } | 195 | { 0, 0 } |
196 | }; | 196 | }; |
197 | 197 | ||
198 | MODULE_DEVICE_TABLE(amba, amba_kmi_idtable); | ||
199 | |||
198 | static struct amba_driver ambakmi_driver = { | 200 | static struct amba_driver ambakmi_driver = { |
199 | .drv = { | 201 | .drv = { |
200 | .name = "kmi-pl050", | 202 | .name = "kmi-pl050", |
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index 0726e59fd418..fa8dd2fda4b2 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c | |||
@@ -1502,6 +1502,8 @@ static struct amba_id mmci_ids[] = { | |||
1502 | { 0, 0 }, | 1502 | { 0, 0 }, |
1503 | }; | 1503 | }; |
1504 | 1504 | ||
1505 | MODULE_DEVICE_TABLE(amba, mmci_ids); | ||
1506 | |||
1505 | static struct amba_driver mmci_driver = { | 1507 | static struct amba_driver mmci_driver = { |
1506 | .drv = { | 1508 | .drv = { |
1507 | .name = DRIVER_NAME, | 1509 | .name = DRIVER_NAME, |
diff --git a/drivers/rtc/rtc-pl030.c b/drivers/rtc/rtc-pl030.c index 1d28d4451dae..02111fee077e 100644 --- a/drivers/rtc/rtc-pl030.c +++ b/drivers/rtc/rtc-pl030.c | |||
@@ -174,6 +174,8 @@ static struct amba_id pl030_ids[] = { | |||
174 | { 0, 0 }, | 174 | { 0, 0 }, |
175 | }; | 175 | }; |
176 | 176 | ||
177 | MODULE_DEVICE_TABLE(amba, pl030_ids); | ||
178 | |||
177 | static struct amba_driver pl030_driver = { | 179 | static struct amba_driver pl030_driver = { |
178 | .drv = { | 180 | .drv = { |
179 | .name = "rtc-pl030", | 181 | .name = "rtc-pl030", |
diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c index ff1b84bd9bb5..a952c8de1dd7 100644 --- a/drivers/rtc/rtc-pl031.c +++ b/drivers/rtc/rtc-pl031.c | |||
@@ -420,6 +420,8 @@ static struct amba_id pl031_ids[] = { | |||
420 | {0, 0}, | 420 | {0, 0}, |
421 | }; | 421 | }; |
422 | 422 | ||
423 | MODULE_DEVICE_TABLE(amba, pl031_ids); | ||
424 | |||
423 | static struct amba_driver pl031_driver = { | 425 | static struct amba_driver pl031_driver = { |
424 | .drv = { | 426 | .drv = { |
425 | .name = "rtc-pl031", | 427 | .name = "rtc-pl031", |
diff --git a/drivers/spi/spi-pl022.c b/drivers/spi/spi-pl022.c index 5559b2299198..7026af195683 100644 --- a/drivers/spi/spi-pl022.c +++ b/drivers/spi/spi-pl022.c | |||
@@ -2432,6 +2432,8 @@ static struct amba_id pl022_ids[] = { | |||
2432 | { 0, 0 }, | 2432 | { 0, 0 }, |
2433 | }; | 2433 | }; |
2434 | 2434 | ||
2435 | MODULE_DEVICE_TABLE(amba, pl022_ids); | ||
2436 | |||
2435 | static struct amba_driver pl022_driver = { | 2437 | static struct amba_driver pl022_driver = { |
2436 | .drv = { | 2438 | .drv = { |
2437 | .name = "ssp-pl022", | 2439 | .name = "ssp-pl022", |
diff --git a/drivers/tty/serial/amba-pl010.c b/drivers/tty/serial/amba-pl010.c index efdf92c3a352..0d91a540bf11 100644 --- a/drivers/tty/serial/amba-pl010.c +++ b/drivers/tty/serial/amba-pl010.c | |||
@@ -795,6 +795,8 @@ static struct amba_id pl010_ids[] = { | |||
795 | { 0, 0 }, | 795 | { 0, 0 }, |
796 | }; | 796 | }; |
797 | 797 | ||
798 | MODULE_DEVICE_TABLE(amba, pl010_ids); | ||
799 | |||
798 | static struct amba_driver pl010_driver = { | 800 | static struct amba_driver pl010_driver = { |
799 | .drv = { | 801 | .drv = { |
800 | .name = "uart-pl010", | 802 | .name = "uart-pl010", |
diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c index 00233af1acc4..6958594f2fc0 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c | |||
@@ -1994,6 +1994,8 @@ static struct amba_id pl011_ids[] = { | |||
1994 | { 0, 0 }, | 1994 | { 0, 0 }, |
1995 | }; | 1995 | }; |
1996 | 1996 | ||
1997 | MODULE_DEVICE_TABLE(amba, pl011_ids); | ||
1998 | |||
1997 | static struct amba_driver pl011_driver = { | 1999 | static struct amba_driver pl011_driver = { |
1998 | .drv = { | 2000 | .drv = { |
1999 | .name = "uart-pl011", | 2001 | .name = "uart-pl011", |
diff --git a/drivers/video/amba-clcd.c b/drivers/video/amba-clcd.c index 2cda6ba0939b..0a2cce7285be 100644 --- a/drivers/video/amba-clcd.c +++ b/drivers/video/amba-clcd.c | |||
@@ -621,6 +621,8 @@ static struct amba_id clcdfb_id_table[] = { | |||
621 | { 0, 0 }, | 621 | { 0, 0 }, |
622 | }; | 622 | }; |
623 | 623 | ||
624 | MODULE_DEVICE_TABLE(amba, clcdfb_id_table); | ||
625 | |||
624 | static struct amba_driver clcd_driver = { | 626 | static struct amba_driver clcd_driver = { |
625 | .drv = { | 627 | .drv = { |
626 | .name = "clcd-pl11x", | 628 | .name = "clcd-pl11x", |
diff --git a/drivers/watchdog/sp805_wdt.c b/drivers/watchdog/sp805_wdt.c index bfaf9bb1ee0d..eef1524ae52e 100644 --- a/drivers/watchdog/sp805_wdt.c +++ b/drivers/watchdog/sp805_wdt.c | |||
@@ -359,6 +359,8 @@ static struct amba_id sp805_wdt_ids[] = { | |||
359 | { 0, 0 }, | 359 | { 0, 0 }, |
360 | }; | 360 | }; |
361 | 361 | ||
362 | MODULE_DEVICE_TABLE(amba, sp805_wdt_ids); | ||
363 | |||
362 | static struct amba_driver sp805_wdt_driver = { | 364 | static struct amba_driver sp805_wdt_driver = { |
363 | .drv = { | 365 | .drv = { |
364 | .name = MODULE_NAME, | 366 | .name = MODULE_NAME, |
diff --git a/include/linux/amba/bus.h b/include/linux/amba/bus.h index fcbbe71a3cc1..724c69c40bb8 100644 --- a/include/linux/amba/bus.h +++ b/include/linux/amba/bus.h | |||
@@ -16,6 +16,7 @@ | |||
16 | 16 | ||
17 | #include <linux/clk.h> | 17 | #include <linux/clk.h> |
18 | #include <linux/device.h> | 18 | #include <linux/device.h> |
19 | #include <linux/mod_devicetable.h> | ||
19 | #include <linux/err.h> | 20 | #include <linux/err.h> |
20 | #include <linux/resource.h> | 21 | #include <linux/resource.h> |
21 | #include <linux/regulator/consumer.h> | 22 | #include <linux/regulator/consumer.h> |
@@ -35,12 +36,6 @@ struct amba_device { | |||
35 | unsigned int irq[AMBA_NR_IRQS]; | 36 | unsigned int irq[AMBA_NR_IRQS]; |
36 | }; | 37 | }; |
37 | 38 | ||
38 | struct amba_id { | ||
39 | unsigned int id; | ||
40 | unsigned int mask; | ||
41 | void *data; | ||
42 | }; | ||
43 | |||
44 | struct amba_driver { | 39 | struct amba_driver { |
45 | struct device_driver drv; | 40 | struct device_driver drv; |
46 | int (*probe)(struct amba_device *, const struct amba_id *); | 41 | int (*probe)(struct amba_device *, const struct amba_id *); |
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index 468819cdde87..83ac0713ed0a 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h | |||
@@ -542,4 +542,22 @@ struct isapnp_device_id { | |||
542 | kernel_ulong_t driver_data; /* data private to the driver */ | 542 | kernel_ulong_t driver_data; /* data private to the driver */ |
543 | }; | 543 | }; |
544 | 544 | ||
545 | /** | ||
546 | * struct amba_id - identifies a device on an AMBA bus | ||
547 | * @id: The significant bits if the hardware device ID | ||
548 | * @mask: Bitmask specifying which bits of the id field are significant when | ||
549 | * matching. A driver binds to a device when ((hardware device ID) & mask) | ||
550 | * == id. | ||
551 | * @data: Private data used by the driver. | ||
552 | */ | ||
553 | struct amba_id { | ||
554 | unsigned int id; | ||
555 | unsigned int mask; | ||
556 | #ifndef __KERNEL__ | ||
557 | kernel_ulong_t data; | ||
558 | #else | ||
559 | void *data; | ||
560 | #endif | ||
561 | }; | ||
562 | |||
545 | #endif /* LINUX_MOD_DEVICETABLE_H */ | 563 | #endif /* LINUX_MOD_DEVICETABLE_H */ |
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 | ||
diff --git a/sound/arm/aaci.c b/sound/arm/aaci.c index e518d38b1c74..b37b702a3a6a 100644 --- a/sound/arm/aaci.c +++ b/sound/arm/aaci.c | |||
@@ -1097,6 +1097,8 @@ static struct amba_id aaci_ids[] = { | |||
1097 | { 0, 0 }, | 1097 | { 0, 0 }, |
1098 | }; | 1098 | }; |
1099 | 1099 | ||
1100 | MODULE_DEVICE_TABLE(amba, aaci_ids); | ||
1101 | |||
1100 | static struct amba_driver aaci_driver = { | 1102 | static struct amba_driver aaci_driver = { |
1101 | .drv = { | 1103 | .drv = { |
1102 | .name = DRIVER_NAME, | 1104 | .name = DRIVER_NAME, |