diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1999-01-04 16:03:48 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1999-01-04 16:03:48 +0000 |
commit | 78c388aed2b7184182c08428db1de6c872d815f5 (patch) | |
tree | 4b2003b1b4ceb241a17faa995da8dd1004bb8e45 /drivers/macintosh/adb.c | |
parent | eb7a5bf93aaa4be1d7c6181100ab7639e74d67f7 (diff) |
Merge with Linux 2.1.131 and more MIPS goodies.
(Did I mention that CVS is buggy ...)
Diffstat (limited to 'drivers/macintosh/adb.c')
-rw-r--r-- | drivers/macintosh/adb.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/drivers/macintosh/adb.c b/drivers/macintosh/adb.c index 4c9a67cc0..4bcd1715b 100644 --- a/drivers/macintosh/adb.c +++ b/drivers/macintosh/adb.c @@ -8,6 +8,7 @@ #include <linux/errno.h> #include <linux/kernel.h> #include <linux/malloc.h> +#include <linux/module.h> #include <linux/fs.h> #include <linux/mm.h> #include <linux/sched.h> @@ -19,10 +20,13 @@ #include <asm/hydra.h> #include <asm/init.h> +EXPORT_SYMBOL(adb_hardware); + enum adb_hw adb_hardware = ADB_NONE; int (*adb_send_request)(struct adb_request *req, int sync); -int (*adb_autopoll)(int on); -static void adb_scan_bus(void); +int (*adb_autopoll)(int devs); +int (*adb_reset_bus)(void); +static int adb_scan_bus(void); static struct adb_handler { void (*handler)(unsigned char *, int, struct pt_regs *, int); @@ -50,13 +54,13 @@ static void printADBreply(struct adb_request *req) } #endif -static void adb_scan_bus(void) +static int adb_scan_bus(void) { int i, highFree=0, noMovement; + int devmask = 0; struct adb_request req; - /* reset ADB bus */ - /*adb_request(&req, NULL, ADBREQ_SYNC, 1, 0);*/ + adb_reset_bus(); /* reset ADB bus */ /* assumes adb_handler[] is all zeroes at this point */ for (i = 1; i < 16; i++) { @@ -134,24 +138,27 @@ static void adb_scan_bus(void) adb_handler[i].handler_id = req.reply[2]; printk(" [%d]: %d %x", i, adb_handler[i].original_address, adb_handler[i].handler_id); + devmask |= 1 << i; } printk("\n"); + return devmask; } void adb_init(void) { adb_send_request = (void *) adb_nodev; adb_autopoll = (void *) adb_nodev; + adb_reset_bus = adb_nodev; if ( (_machine != _MACH_chrp) && (_machine != _MACH_Pmac) ) - return; + return; via_cuda_init(); via_pmu_init(); macio_adb_init(); if (adb_hardware == ADB_NONE) printk(KERN_WARNING "Warning: no ADB interface detected\n"); else { - adb_scan_bus(); - adb_autopoll(1); + int devs = adb_scan_bus(); + adb_autopoll(devs); } } @@ -187,8 +194,7 @@ adb_register(int default_id, int handler_id, struct adb_ids *ids, ids->nids = 0; for (i = 1; i < 16; i++) { - if ((adb_handler[i].original_address == default_id) || - (adb_handler[i].handler_id == handler_id)) { + if (adb_handler[i].original_address == default_id) { if (adb_handler[i].handler != 0) { printk(KERN_ERR "Two handlers for ADB device %d\n", |