aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/amba/bus.c4
-rw-r--r--drivers/char/hw_random/nomadik-rng.c2
-rw-r--r--drivers/dma/amba-pl08x.c2
-rw-r--r--drivers/dma/pl330.c2
-rw-r--r--drivers/gpio/gpio-pl061.c2
-rw-r--r--drivers/input/serio/ambakmi.c2
-rw-r--r--drivers/mmc/host/mmci.c2
-rw-r--r--drivers/rtc/rtc-pl030.c2
-rw-r--r--drivers/rtc/rtc-pl031.c2
-rw-r--r--drivers/spi/spi-pl022.c2
-rw-r--r--drivers/tty/serial/amba-pl010.c2
-rw-r--r--drivers/tty/serial/amba-pl011.c2
-rw-r--r--drivers/video/amba-clcd.c2
-rw-r--r--drivers/watchdog/sp805_wdt.c2
-rw-r--r--include/linux/amba/bus.h7
-rw-r--r--include/linux/mod_devicetable.h18
-rw-r--r--scripts/mod/file2alias.c72
-rw-r--r--sound/arm/aaci.c2
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
98MODULE_DEVICE_TABLE(amba, nmk_rng_ids);
99
98static struct amba_driver nmk_rng_driver = { 100static 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
2057MODULE_DEVICE_TABLE(amba, pl08x_ids);
2058
2057static struct amba_driver pl08x_amba_driver = { 2059static 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
993MODULE_DEVICE_TABLE(amba, pl330_ids);
994
993#ifdef CONFIG_PM_RUNTIME 995#ifdef CONFIG_PM_RUNTIME
994static int pl330_runtime_suspend(struct device *dev) 996static 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
349MODULE_DEVICE_TABLE(amba, pl061_ids);
350
349static struct amba_driver pl061_gpio_driver = { 351static 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
198MODULE_DEVICE_TABLE(amba, amba_kmi_idtable);
199
198static struct amba_driver ambakmi_driver = { 200static 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
1505MODULE_DEVICE_TABLE(amba, mmci_ids);
1506
1505static struct amba_driver mmci_driver = { 1507static 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
177MODULE_DEVICE_TABLE(amba, pl030_ids);
178
177static struct amba_driver pl030_driver = { 179static 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
423MODULE_DEVICE_TABLE(amba, pl031_ids);
424
423static struct amba_driver pl031_driver = { 425static 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
2435MODULE_DEVICE_TABLE(amba, pl022_ids);
2436
2435static struct amba_driver pl022_driver = { 2437static 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
798MODULE_DEVICE_TABLE(amba, pl010_ids);
799
798static struct amba_driver pl010_driver = { 800static 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
1997MODULE_DEVICE_TABLE(amba, pl011_ids);
1998
1997static struct amba_driver pl011_driver = { 1999static 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
624MODULE_DEVICE_TABLE(amba, clcdfb_id_table);
625
624static struct amba_driver clcd_driver = { 626static 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
362MODULE_DEVICE_TABLE(amba, sp805_wdt_ids);
363
362static struct amba_driver sp805_wdt_driver = { 364static 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
38struct amba_id {
39 unsigned int id;
40 unsigned int mask;
41 void *data;
42};
43
44struct amba_driver { 39struct 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 */
553struct 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 */
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
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
1100MODULE_DEVICE_TABLE(amba, aaci_ids);
1101
1100static struct amba_driver aaci_driver = { 1102static struct amba_driver aaci_driver = {
1101 .drv = { 1103 .drv = {
1102 .name = DRIVER_NAME, 1104 .name = DRIVER_NAME,