Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes
[pandora-kernel.git] / drivers / macintosh / macio-adb.c
index 797cef7..bd6da7a 100644 (file)
@@ -6,7 +6,6 @@
 #include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/delay.h>
-#include <linux/sched.h>
 #include <linux/spinlock.h>
 #include <linux/interrupt.h>
 #include <asm/prom.h>
@@ -83,7 +82,14 @@ struct adb_driver macio_adb_driver = {
 
 int macio_probe(void)
 {
-       return find_compatible_devices("adb", "chrp,adb0")? 0: -ENODEV;
+       struct device_node *np;
+
+       np = of_find_compatible_node(NULL, "adb", "chrp,adb0");
+       if (np) {
+               of_node_put(np);
+               return 0;
+       }
+       return -ENODEV;
 }
 
 int macio_init(void)
@@ -92,12 +98,14 @@ int macio_init(void)
        struct resource r;
        unsigned int irq;
 
-       adbs = find_compatible_devices("adb", "chrp,adb0");
+       adbs = of_find_compatible_node(NULL, "adb", "chrp,adb0");
        if (adbs == 0)
                return -ENXIO;
 
-       if (of_address_to_resource(adbs, 0, &r))
+       if (of_address_to_resource(adbs, 0, &r)) {
+               of_node_put(adbs);
                return -ENXIO;
+       }
        adb = ioremap(r.start, sizeof(struct adb_regs));
 
        out_8(&adb->ctrl.r, 0);
@@ -108,6 +116,7 @@ int macio_init(void)
        out_8(&adb->autopoll.r, APE);
 
        irq = irq_of_parse_and_map(adbs, 0);
+       of_node_put(adbs);
        if (request_irq(irq, macio_adb_interrupt, 0, "ADB", (void *)0)) {
                printk(KERN_ERR "ADB: can't get irq %d\n", irq);
                return -EAGAIN;
@@ -146,6 +155,7 @@ static int macio_adb_reset_bus(void)
        while ((in_8(&adb->ctrl.r) & ADB_RST) != 0) {
                if (--timeout == 0) {
                        out_8(&adb->ctrl.r, in_8(&adb->ctrl.r) & ~ADB_RST);
+                       spin_unlock_irqrestore(&macio_lock, flags);
                        return -1;
                }
        }