From: dave.martin@linaro.org (Dave Martin)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 02/16] ARM: amba: Auto-generate AMBA driver module aliases during modpost
Date: Wed, 5 Oct 2011 17:04:53 +0100 [thread overview]
Message-ID: <1317830707-17517-3-git-send-email-dave.martin@linaro.org> (raw)
In-Reply-To: <1317830707-17517-1-git-send-email-dave.martin@linaro.org>
This patch adds the necessary support in file2alias.c to define
suitable aliases based on the amba_id table in AMBA driver modules.
This should be sufficient to allow such modules to be auto-loaded
via udev. The AMBA bus driver's uevent hotplug code is also
modified to pass an approriate MODALIAS string in the event.
For simplicity, the AMBA ID is treated an an opaque 32-bit numeber.
Module alises use patterns as appropriate to describe the value-
mask pairs described in the driver's amba_id list.
The proposed alias format is (extended regex):
^amba:d(HEX){8}$
Where HEX is a single upper-case HEX digit or a pattern (? or []
expression) matching a single upper-case HEX digit, as expected by
udev.
"d" is short for "device", following existing alias naming
conventions for other device types. This adds some flexibility for
unambiguously extending the alias format in the future by adding
additional leading and trailing fields, if this turns out to be
necessary.
Signed-off-by: Dave Martin <dave.martin@linaro.org>
---
drivers/amba/bus.c | 9 +++++-
scripts/mod/file2alias.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 80 insertions(+), 1 deletions(-)
diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c
index bd230e8..a8c598c 100644
--- a/drivers/amba/bus.c
+++ b/drivers/amba/bus.c
@@ -52,7 +52,14 @@ static int amba_uevent(struct device *dev, struct kobj_uevent_env *env)
int retval = 0;
retval = add_uevent_var(env, "AMBA_ID=%08x", pcdev->periphid);
- return retval;
+ if (retval)
+ return retval;
+
+ retval = add_uevent_var(env, "MODALIAS=amba:d%08X", pcdev->periphid);
+ if (retval)
+ return retval;
+
+ return 0;
}
#else
#define amba_uevent NULL
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index f936d1f..363ab46 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -880,6 +880,74 @@ static int do_isapnp_entry(const char *filename,
return 1;
}
+/*
+ * Append a match expression for a single masked hex digit.
+ * outp points to a pointer to the character at which to append.
+ * *outp is updated on return to point just after the appended text,
+ * to facilitate further appending.
+ */
+static void append_nibble_mask(char **outp,
+ unsigned int nibble, unsigned int mask)
+{
+ char *p = *outp;
+ unsigned int i;
+
+ switch (mask) {
+ case 0:
+ *p++ = '?';
+ break;
+
+ case 0xf:
+ p += sprintf(p, "%X", nibble);
+ break;
+
+ default:
+ /*
+ * Dumbly emit a match pattern for all possible matching
+ * digits. This could be improved in some cases using ranges,
+ * but it has the advantage of being trivially correct, and is
+ * often optimal.
+ */
+ *p++ = '[';
+ for (i = 0; i < 0x10; i++)
+ if ((i & mask) == nibble)
+ p += sprintf(p, "%X", i);
+ *p++ = ']';
+ }
+
+ /* Ensure that the string remains NUL-terminated: */
+ *p = '\0';
+
+ /* Advance the caller's end-of-string pointer: */
+ *outp = p;
+}
+
+/*
+ * looks like: "amba:dN"
+ *
+ * N is exactly 8 digits, where each is an upper-case hex digit, or
+ * a ? or [] pattern matching exactly one digit.
+ */
+static int do_amba_entry(const char *filename,
+ struct amba_id *id, char *alias)
+{
+ unsigned int digit;
+ char *p = alias;
+
+ if ((id->id & id->mask) != id->id)
+ fatal("%s: Masked-off bit(s) of AMBA device ID are non-zero: "
+ "id=0x%08X, mask=0x%08X. Please fix this driver.\n",
+ filename, id->id, id->mask);
+
+ p += sprintf(alias, "amba:d");
+ for (digit = 0; digit < 8; digit++)
+ append_nibble_mask(&p,
+ (id->id >> (4 * (7 - digit))) & 0xf,
+ (id->mask >> (4 * (7 - digit))) & 0xf);
+
+ return 1;
+}
+
/* Ignore any prefix, eg. some architectures prepend _ */
static inline int sym_is(const char *symbol, const char *name)
{
@@ -1047,6 +1115,10 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
do_table(symval, sym->st_size,
sizeof(struct isapnp_device_id), "isa",
do_isapnp_entry, mod);
+ else if (sym_is(symname, "__mod_amba_device_table"))
+ do_table(symval, sym->st_size,
+ sizeof(struct amba_id), "amba",
+ do_amba_entry, mod);
free(zeros);
}
--
1.7.4.1
next prev parent reply other threads:[~2011-10-05 16:04 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-05 16:04 [PATCH 00/16] ARM: amba: Enable module alias autogeneration for AMBA drivers Dave Martin
2011-10-05 16:04 ` [PATCH 01/16] ARM: amba: Move definition of struct amba_id to mod_devicetable.h Dave Martin
2011-10-05 16:04 ` Dave Martin [this message]
2011-10-05 17:37 ` [PATCH 02/16] ARM: amba: Auto-generate AMBA driver module aliases during modpost Pawel Moll
2011-10-05 16:04 ` [PATCH 03/16] hwrng: nomadik: Enable module alias autogeneration for AMBA drivers Dave Martin
2011-10-05 16:04 ` [PATCH 04/16] dmaengine: pl08x: " Dave Martin
2011-10-07 4:33 ` Vinod Koul
2011-10-05 16:04 ` [PATCH 05/16] dmaengine: pl330: " Dave Martin
2011-10-06 5:17 ` Jassi Brar
2011-10-07 4:32 ` Vinod Koul
2011-10-05 16:04 ` [PATCH 06/16] gpio: pl061: " Dave Martin
2011-10-05 16:39 ` Grant Likely
2011-10-05 16:04 ` [PATCH 07/16] input: ambakmi: " Dave Martin
2011-10-06 3:37 ` Dmitry Torokhov
2011-10-05 16:04 ` [PATCH 08/16] mmc: mmci: " Dave Martin
2011-10-05 16:05 ` [PATCH 09/16] rtc: pl030: " Dave Martin
2011-10-05 16:05 ` [PATCH 10/16] rtc: pl031: " Dave Martin
2011-10-05 16:05 ` [PATCH 11/16] spi: pl022: " Dave Martin
2011-10-05 16:39 ` Grant Likely
2011-10-06 17:13 ` Linus Walleij
2011-10-05 16:05 ` [PATCH 12/16] serial: pl010: " Dave Martin
2011-10-05 16:05 ` [PATCH 13/16] serial: pl011: " Dave Martin
2011-10-05 16:05 ` [PATCH 14/16] fbdev: amba: " Dave Martin
2011-10-05 16:05 ` [PATCH 15/16] watchdog: sp805: " Dave Martin
2011-10-05 16:05 ` [PATCH 16/16] sound: aaci: " Dave Martin
2011-10-13 16:54 ` [PATCH 00/16] ARM: amba: " Dave Martin
2011-10-13 17:24 ` Russell King - ARM Linux
2011-10-14 9:27 ` Dave Martin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1317830707-17517-3-git-send-email-dave.martin@linaro.org \
--to=dave.martin@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).