netfilter: xtables: symmetric COMPAT_XT_ALIGN definition
[safe/jmp/linux-2.6] / drivers / w1 / w1_family.c
index 88c517a..4a09904 100644 (file)
 
 #include <linux/spinlock.h>
 #include <linux/list.h>
+#include <linux/sched.h>       /* schedule_timeout() */
 #include <linux/delay.h>
 
 #include "w1_family.h"
+#include "w1.h"
 
 DEFINE_SPINLOCK(w1_flock);
 static LIST_HEAD(w1_families);
-extern void w1_reconnect_slaves(struct w1_family *f);
 
 int w1_register_family(struct w1_family *newf)
 {
@@ -47,12 +48,12 @@ int w1_register_family(struct w1_family *newf)
 
        if (!ret) {
                atomic_set(&newf->refcnt, 0);
-               newf->need_exit = 0;
                list_add_tail(&newf->family_entry, &w1_families);
        }
        spin_unlock(&w1_flock);
 
-       w1_reconnect_slaves(newf);
+       /* check default devices against the new set of drivers */
+       w1_reconnect_slaves(newf, 1);
 
        return ret;
 }
@@ -71,11 +72,11 @@ void w1_unregister_family(struct w1_family *fent)
                        break;
                }
        }
-
-       fent->need_exit = 1;
-
        spin_unlock(&w1_flock);
 
+       /* deatch devices using this family code */
+       w1_reconnect_slaves(fent, 0);
+
        while (atomic_read(&fent->refcnt)) {
                printk(KERN_INFO "Waiting for family %u to become free: refcnt=%d.\n",
                                fent->fid, atomic_read(&fent->refcnt));
@@ -106,6 +107,11 @@ struct w1_family * w1_family_registered(u8 fid)
        return (ret) ? f : NULL;
 }
 
+static void __w1_family_put(struct w1_family *f)
+{
+       atomic_dec(&f->refcnt);
+}
+
 void w1_family_put(struct w1_family *f)
 {
        spin_lock(&w1_flock);
@@ -113,19 +119,14 @@ void w1_family_put(struct w1_family *f)
        spin_unlock(&w1_flock);
 }
 
-void __w1_family_put(struct w1_family *f)
-{
-       if (atomic_dec_and_test(&f->refcnt))
-               f->need_exit = 1;
-}
-
+#if 0
 void w1_family_get(struct w1_family *f)
 {
        spin_lock(&w1_flock);
        __w1_family_get(f);
        spin_unlock(&w1_flock);
-
 }
+#endif  /*  0  */
 
 void __w1_family_get(struct w1_family *f)
 {
@@ -134,8 +135,5 @@ void __w1_family_get(struct w1_family *f)
        smp_mb__after_atomic_inc();
 }
 
-EXPORT_SYMBOL(w1_family_get);
-EXPORT_SYMBOL(w1_family_put);
-EXPORT_SYMBOL(w1_family_registered);
 EXPORT_SYMBOL(w1_unregister_family);
 EXPORT_SYMBOL(w1_register_family);