summaryrefslogtreecommitdiffstats
path: root/drivers/macintosh/adb.c
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1999-01-04 16:03:48 +0000
committerRalf Baechle <ralf@linux-mips.org>1999-01-04 16:03:48 +0000
commit78c388aed2b7184182c08428db1de6c872d815f5 (patch)
tree4b2003b1b4ceb241a17faa995da8dd1004bb8e45 /drivers/macintosh/adb.c
parenteb7a5bf93aaa4be1d7c6181100ab7639e74d67f7 (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.c26
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",