This patch adds a class device for each adb device that has a handler. The class device contents will be accessible by /sys/class/adb/<handler>N directory. This patch is needed in order to add an class device attribute to all keyboards that will determine the sysrq key for each keyboard.
Signed-of-by: Aristeu Rozanski <[EMAIL PROTECTED]> --- linus-2.6.orig/drivers/macintosh/adb.c 2007-05-11 10:09:13.000000000 -0400 +++ linus-2.6/drivers/macintosh/adb.c 2007-05-11 10:09:36.000000000 -0400 @@ -102,11 +102,21 @@ static void adbdev_init(void); static int try_handler_change(int, int); +static char *adb_device_id_string[] = { + [ADB_DONGLE] = "dongle", + [ADB_KEYBOARD] = "keyboard", + [ADB_MOUSE] = "mouse", + [ADB_TABLET] = "tablet", + [ADB_MODEM] = "modem", + [ADB_MISC] = "misc", +}; + static struct adb_handler { void (*handler)(unsigned char *, int, int); int original_address; int handler_id; int busy; + char name[16]; } adb_handler[16]; /* @@ -508,6 +518,9 @@ if ((adb_handler[i].original_address == default_id) && (!handler_id || (handler_id == adb_handler[i].handler_id) || try_handler_change(i, handler_id))) { + int rc; + struct class_device *cdev; + if (adb_handler[i].handler != 0) { printk(KERN_ERR "Two handlers for ADB device %d\n", @@ -517,7 +530,26 @@ write_lock_irq(&adb_handler_lock); adb_handler[i].handler = handler; write_unlock_irq(&adb_handler_lock); - ids->id[ids->nids++] = i; + + snprintf(adb_handler[i].name, + sizeof(adb_handler[i].name), "%s%i", + adb_device_id_string[default_id], ids->nids); + + cdev = &ids->id[ids->nids].cdev; + cdev->class = adb_dev_class; + class_device_initialize(cdev); + snprintf(cdev->class_id, sizeof(cdev->class_id), "%s", + adb_handler[i].name); + rc = class_device_add(cdev); + if (rc) { + printk(KERN_WARNING "adb: unable to add class " + "device\n"); + for (i = ids->nids - 1; i >= 0; i--) + class_device_del(&ids->id[i].cdev); + ids->nids = 0; + return 0; + } + ids->id[ids->nids++].id = i; } } up(&adb_handler_sem); @@ -525,9 +557,9 @@ } int -adb_unregister(int index) +adb_unregister(int index, struct adb_ids *ids) { - int ret = -ENODEV; + int i, ret = -ENODEV; down(&adb_handler_sem); write_lock_irq(&adb_handler_lock); @@ -539,6 +571,8 @@ } ret = 0; adb_handler[index].handler = NULL; + for (i = 0; i < ids->nids; i++) + class_device_del(&ids->id[i].cdev); } write_unlock_irq(&adb_handler_lock); up(&adb_handler_sem); --- linus-2.6.orig/include/linux/adb.h 2007-05-11 10:09:13.000000000 -0400 +++ linus-2.6/include/linux/adb.h 2007-05-11 10:09:36.000000000 -0400 @@ -3,6 +3,7 @@ */ #ifndef __ADB_H #define __ADB_H +#include <linux/device.h> /* ADB commands */ #define ADB_BUSRESET 0 @@ -57,7 +58,11 @@ struct adb_ids { int nids; - unsigned char id[16]; + struct adb_id { + unsigned char id; + struct class_device cdev; + void *priv; + } id[16]; }; /* Structure which encapsulates a low-level ADB driver */ @@ -91,7 +96,7 @@ int flags, int nbytes, ...); int adb_register(int default_id,int handler_id,struct adb_ids *ids, void (*handler)(unsigned char *, int, int)); -int adb_unregister(int index); +int adb_unregister(int index, struct adb_ids *ids); void adb_poll(void); void adb_input(unsigned char *, int, int); int adb_reset_bus(void); --- linus-2.6.orig/drivers/macintosh/adbhid.c 2007-05-11 10:09:19.000000000 -0400 +++ linus-2.6/drivers/macintosh/adbhid.c 2007-05-11 10:10:15.000000000 -0400 @@ -875,7 +875,7 @@ adb_register(ADB_MISC, 0, &buttons_ids, adbhid_buttons_input); for (i = 0; i < keyboard_ids.nids; i++) { - int id = keyboard_ids.id[i]; + int id = keyboard_ids.id[i].id; adb_get_infos(id, &default_id, &org_handler_id); @@ -902,7 +902,7 @@ } for (i = 0; i < buttons_ids.nids; i++) { - int id = buttons_ids.id[i]; + int id = buttons_ids.id[i].id; adb_get_infos(id, &default_id, &org_handler_id); reg |= adbhid_input_reregister(id, default_id, org_handler_id, @@ -912,7 +912,7 @@ /* Try to switch all mice to handler 4, or 2 for three-button mode and full resolution. */ for (i = 0; i < mouse_ids.nids; i++) { - int id = mouse_ids.id[i]; + int id = mouse_ids.id[i].id; int mouse_kind; adb_get_infos(id, &default_id, &org_handler_id); _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev