aboutsummaryrefslogtreecommitdiffstats
path: root/driver
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2005-12-08 17:29:33 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2005-12-08 17:29:33 -0800
commit968b59974e69c2e51804f27c43d625445dd48687 (patch)
tree7b73689f216d9f2a102bcbabcb7de6e9c4a18f31 /driver
parentb696389d003b5b2e21c004547c8ab4483635516d (diff)
downloadpatches-968b59974e69c2e51804f27c43d625445dd48687.tar.gz
more stuff
Diffstat (limited to 'driver')
-rw-r--r--driver/input-add-modalias-support.patch289
1 files changed, 289 insertions, 0 deletions
diff --git a/driver/input-add-modalias-support.patch b/driver/input-add-modalias-support.patch
new file mode 100644
index 0000000000000..1745486251186
--- /dev/null
+++ b/driver/input-add-modalias-support.patch
@@ -0,0 +1,289 @@
+From kay.sievers@vrfy.org Wed Dec 7 12:41:38 2005
+Date: Wed, 7 Dec 2005 21:40:34 +0100
+From: Kay Sievers <kay.sievers@vrfy.org>
+To: Greg KH <greg@kroah.com>
+Subject: Input: add modalias support
+Message-ID: <20051207204034.GA1777@vrfy.org>
+Content-Disposition: inline
+
+From: Rusty Russell <rusty@rustcorp.com.au>
+
+Here's the patch for modalias support for input classes. It uses
+comma-separated numbers, and doesn't describe all the potential keys (no
+module currently cares, and that would make the strings huge). The
+changes to input.h are to move the definitions needed by file2alias
+outside __KERNEL__. I chose not to move those definitions to
+mod_devicetable.h, because there are so many that it might break compile
+of something else in the kernel.
+
+The rest is fairly straightforward.
+
+Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
+CC: Kay Sievers <kay.sievers@vrfy.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+---
+ drivers/input/input.c | 39 +++++++++++++++++++++++
+ include/linux/input.h | 79 ++++++++++++++++++++++++-----------------------
+ scripts/mod/file2alias.c | 62 ++++++++++++++++++++++++++++++++++++
+ 3 files changed, 141 insertions(+), 39 deletions(-)
+
+--- gregkh-2.6.orig/drivers/input/input.c
++++ gregkh-2.6/drivers/input/input.c
+@@ -528,10 +528,49 @@ INPUT_DEV_STRING_ATTR_SHOW(name);
+ INPUT_DEV_STRING_ATTR_SHOW(phys);
+ INPUT_DEV_STRING_ATTR_SHOW(uniq);
+
++static int print_modalias_bits(char *buf, char prefix, unsigned long *arr,
++ unsigned int min, unsigned int max)
++{
++ int len, i;
++
++ len = sprintf(buf, "%c", prefix);
++ for (i = min; i < max; i++)
++ if (arr[LONG(i)] & BIT(i))
++ len += sprintf(buf+len, "%X,", i);
++ return len;
++}
++
++static ssize_t input_dev_show_modalias(struct class_device *dev, char *buf)
++{
++ struct input_dev *id = to_input_dev(dev);
++ ssize_t len = 0;
++
++ len += sprintf(buf+len, "input:b%04Xv%04Xp%04Xe%04X-",
++ id->id.bustype,
++ id->id.vendor,
++ id->id.product,
++ id->id.version);
++
++ len += print_modalias_bits(buf+len, 'e', id->evbit, 0, EV_MAX);
++ len += print_modalias_bits(buf+len, 'k', id->keybit,
++ KEY_MIN_INTERESTING, KEY_MAX);
++ len += print_modalias_bits(buf+len, 'r', id->relbit, 0, REL_MAX);
++ len += print_modalias_bits(buf+len, 'a', id->absbit, 0, ABS_MAX);
++ len += print_modalias_bits(buf+len, 'm', id->mscbit, 0, MSC_MAX);
++ len += print_modalias_bits(buf+len, 'l', id->ledbit, 0, LED_MAX);
++ len += print_modalias_bits(buf+len, 's', id->sndbit, 0, SND_MAX);
++ len += print_modalias_bits(buf+len, 'f', id->ffbit, 0, FF_MAX);
++ len += print_modalias_bits(buf+len, 'w', id->swbit, 0, SW_MAX);
++ len += sprintf(buf+len, "\n");
++ return len;
++}
++static CLASS_DEVICE_ATTR(modalias, S_IRUGO, input_dev_show_modalias, NULL);
++
+ static struct attribute *input_dev_attrs[] = {
+ &class_device_attr_name.attr,
+ &class_device_attr_phys.attr,
+ &class_device_attr_uniq.attr,
++ &class_device_attr_modalias.attr,
+ NULL
+ };
+
+--- gregkh-2.6.orig/include/linux/input.h
++++ gregkh-2.6/include/linux/input.h
+@@ -18,6 +18,7 @@
+ #include <sys/ioctl.h>
+ #include <asm/types.h>
+ #endif
++#include <linux/mod_devicetable.h>
+
+ /*
+ * The event structure itself
+@@ -511,6 +512,8 @@ struct input_absinfo {
+ #define KEY_FN_S 0x1e3
+ #define KEY_FN_B 0x1e4
+
++/* We avoid low common keys in module aliases so they don't get huge. */
++#define KEY_MIN_INTERESTING KEY_MUTE
+ #define KEY_MAX 0x1ff
+
+ /*
+@@ -793,6 +796,44 @@ struct ff_effect {
+
+ #define FF_MAX 0x7f
+
++struct input_device_id {
++
++ kernel_ulong_t flags;
++
++ struct input_id id;
++
++ kernel_ulong_t evbit[EV_MAX/BITS_PER_LONG+1];
++ kernel_ulong_t keybit[KEY_MAX/BITS_PER_LONG+1];
++ kernel_ulong_t relbit[REL_MAX/BITS_PER_LONG+1];
++ kernel_ulong_t absbit[ABS_MAX/BITS_PER_LONG+1];
++ kernel_ulong_t mscbit[MSC_MAX/BITS_PER_LONG+1];
++ kernel_ulong_t ledbit[LED_MAX/BITS_PER_LONG+1];
++ kernel_ulong_t sndbit[SND_MAX/BITS_PER_LONG+1];
++ kernel_ulong_t ffbit[FF_MAX/BITS_PER_LONG+1];
++ kernel_ulong_t swbit[SW_MAX/BITS_PER_LONG+1];
++
++ kernel_ulong_t driver_info;
++};
++
++/*
++ * Structure for hotplug & device<->driver matching.
++ */
++
++#define INPUT_DEVICE_ID_MATCH_BUS 1
++#define INPUT_DEVICE_ID_MATCH_VENDOR 2
++#define INPUT_DEVICE_ID_MATCH_PRODUCT 4
++#define INPUT_DEVICE_ID_MATCH_VERSION 8
++
++#define INPUT_DEVICE_ID_MATCH_EVBIT 0x010
++#define INPUT_DEVICE_ID_MATCH_KEYBIT 0x020
++#define INPUT_DEVICE_ID_MATCH_RELBIT 0x040
++#define INPUT_DEVICE_ID_MATCH_ABSBIT 0x080
++#define INPUT_DEVICE_ID_MATCH_MSCIT 0x100
++#define INPUT_DEVICE_ID_MATCH_LEDBIT 0x200
++#define INPUT_DEVICE_ID_MATCH_SNDBIT 0x400
++#define INPUT_DEVICE_ID_MATCH_FFBIT 0x800
++#define INPUT_DEVICE_ID_MATCH_SWBIT 0x1000
++
+ #ifdef __KERNEL__
+
+ /*
+@@ -901,49 +942,11 @@ struct input_dev {
+ };
+ #define to_input_dev(d) container_of(d, struct input_dev, cdev)
+
+-/*
+- * Structure for hotplug & device<->driver matching.
+- */
+-
+-#define INPUT_DEVICE_ID_MATCH_BUS 1
+-#define INPUT_DEVICE_ID_MATCH_VENDOR 2
+-#define INPUT_DEVICE_ID_MATCH_PRODUCT 4
+-#define INPUT_DEVICE_ID_MATCH_VERSION 8
+-
+-#define INPUT_DEVICE_ID_MATCH_EVBIT 0x010
+-#define INPUT_DEVICE_ID_MATCH_KEYBIT 0x020
+-#define INPUT_DEVICE_ID_MATCH_RELBIT 0x040
+-#define INPUT_DEVICE_ID_MATCH_ABSBIT 0x080
+-#define INPUT_DEVICE_ID_MATCH_MSCIT 0x100
+-#define INPUT_DEVICE_ID_MATCH_LEDBIT 0x200
+-#define INPUT_DEVICE_ID_MATCH_SNDBIT 0x400
+-#define INPUT_DEVICE_ID_MATCH_FFBIT 0x800
+-#define INPUT_DEVICE_ID_MATCH_SWBIT 0x1000
+-
+ #define INPUT_DEVICE_ID_MATCH_DEVICE\
+ (INPUT_DEVICE_ID_MATCH_BUS | INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT)
+ #define INPUT_DEVICE_ID_MATCH_DEVICE_AND_VERSION\
+ (INPUT_DEVICE_ID_MATCH_DEVICE | INPUT_DEVICE_ID_MATCH_VERSION)
+
+-struct input_device_id {
+-
+- unsigned long flags;
+-
+- struct input_id id;
+-
+- unsigned long evbit[NBITS(EV_MAX)];
+- unsigned long keybit[NBITS(KEY_MAX)];
+- unsigned long relbit[NBITS(REL_MAX)];
+- unsigned long absbit[NBITS(ABS_MAX)];
+- unsigned long mscbit[NBITS(MSC_MAX)];
+- unsigned long ledbit[NBITS(LED_MAX)];
+- unsigned long sndbit[NBITS(SND_MAX)];
+- unsigned long ffbit[NBITS(FF_MAX)];
+- unsigned long swbit[NBITS(SW_MAX)];
+-
+- unsigned long driver_info;
+-};
+-
+ struct input_handle;
+
+ struct input_handler {
+--- gregkh-2.6.orig/scripts/mod/file2alias.c
++++ gregkh-2.6/scripts/mod/file2alias.c
+@@ -16,8 +16,10 @@
+ * use either stdint.h or inttypes.h for the rest. */
+ #if KERNEL_ELFCLASS == ELFCLASS32
+ typedef Elf32_Addr kernel_ulong_t;
++#define BITS_PER_LONG 32
+ #else
+ typedef Elf64_Addr kernel_ulong_t;
++#define BITS_PER_LONG 64
+ #endif
+ #ifdef __sun__
+ #include <inttypes.h>
+@@ -35,6 +37,7 @@ typedef unsigned char __u8;
+ * even potentially has different endianness and word sizes, since
+ * we handle those differences explicitly below */
+ #include "../../include/linux/mod_devicetable.h"
++#include "../../include/linux/input.h"
+
+ #define ADD(str, sep, cond, field) \
+ do { \
+@@ -366,6 +369,61 @@ static int do_i2c_entry(const char *file
+ return 1;
+ }
+
++#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
++
++static void do_input(char *alias,
++ kernel_ulong_t *arr, unsigned int min, unsigned int max)
++{
++ unsigned int i;
++ for (i = min; i < max; i++) {
++ if (arr[i/BITS_PER_LONG] & (1 << (i%BITS_PER_LONG)))
++ sprintf(alias+strlen(alias), "%X,*", i);
++ }
++}
++
++/* input:b0v0p0e0-eXkXrXaXmXlXsXfXwX where X is comma-separated %02X. */
++static int do_input_entry(const char *filename, struct input_device_id *id,
++ char *alias)
++{
++ sprintf(alias, "input:");
++
++ ADD(alias, "b", id->flags&INPUT_DEVICE_ID_MATCH_BUS, id->id.bustype);
++ ADD(alias, "v", id->flags&INPUT_DEVICE_ID_MATCH_VENDOR, id->id.vendor);
++ ADD(alias, "p", id->flags&INPUT_DEVICE_ID_MATCH_PRODUCT,
++ id->id.product);
++ ADD(alias, "e", id->flags&INPUT_DEVICE_ID_MATCH_VERSION,
++ id->id.version);
++
++ sprintf(alias + strlen(alias), "-e*");
++ if (id->flags&INPUT_DEVICE_ID_MATCH_EVBIT)
++ do_input(alias, id->evbit, 0, EV_MAX);
++ sprintf(alias + strlen(alias), "k*");
++ if (id->flags&INPUT_DEVICE_ID_MATCH_KEYBIT)
++ do_input(alias, id->keybit, KEY_MIN_INTERESTING, KEY_MAX);
++ sprintf(alias + strlen(alias), "r*");
++ if (id->flags&INPUT_DEVICE_ID_MATCH_RELBIT)
++ do_input(alias, id->relbit, 0, REL_MAX);
++ sprintf(alias + strlen(alias), "a*");
++ if (id->flags&INPUT_DEVICE_ID_MATCH_ABSBIT)
++ do_input(alias, id->absbit, 0, ABS_MAX);
++ sprintf(alias + strlen(alias), "m*");
++ if (id->flags&INPUT_DEVICE_ID_MATCH_MSCIT)
++ do_input(alias, id->mscbit, 0, MSC_MAX);
++ sprintf(alias + strlen(alias), "l*");
++ if (id->flags&INPUT_DEVICE_ID_MATCH_LEDBIT)
++ do_input(alias, id->ledbit, 0, LED_MAX);
++ sprintf(alias + strlen(alias), "s*");
++ if (id->flags&INPUT_DEVICE_ID_MATCH_SNDBIT)
++ do_input(alias, id->sndbit, 0, SND_MAX);
++ sprintf(alias + strlen(alias), "f*");
++ if (id->flags&INPUT_DEVICE_ID_MATCH_FFBIT)
++ do_input(alias, id->ffbit, 0, SND_MAX);
++ sprintf(alias + strlen(alias), "w*");
++ if (id->flags&INPUT_DEVICE_ID_MATCH_SWBIT)
++ do_input(alias, id->swbit, 0, SW_MAX);
++ return 1;
++}
++
+ /* Ignore any prefix, eg. v850 prepends _ */
+ static inline int sym_is(const char *symbol, const char *name)
+ {
+@@ -453,7 +511,9 @@ void handle_moddevtable(struct module *m
+ else if (sym_is(symname, "__mod_i2c_device_table"))
+ do_table(symval, sym->st_size, sizeof(struct i2c_device_id),
+ do_i2c_entry, mod);
+-
++ else if (sym_is(symname, "__mod_input_device_table"))
++ do_table(symval, sym->st_size, sizeof(struct input_device_id),
++ do_input_entry, mod);
+ }
+
+ /* Now add out buffered information to the generated C source */