Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
[pandora-kernel.git] / drivers / base / attribute_container.c
index 2222073..3b43e8a 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/slab.h>
 #include <linux/list.h>
 #include <linux/module.h>
+#include <linux/mutex.h>
 
 #include "base.h"
 
@@ -60,9 +61,9 @@ attribute_container_classdev_to_container(struct class_device *classdev)
 }
 EXPORT_SYMBOL_GPL(attribute_container_classdev_to_container);
 
-static struct list_head attribute_container_list;
+static LIST_HEAD(attribute_container_list);
 
-static DECLARE_MUTEX(attribute_container_mutex);
+static DEFINE_MUTEX(attribute_container_mutex);
 
 /**
  * attribute_container_register - register an attribute container
@@ -77,9 +78,9 @@ attribute_container_register(struct attribute_container *cont)
        klist_init(&cont->containers,internal_container_klist_get,
                   internal_container_klist_put);
                
-       down(&attribute_container_mutex);
+       mutex_lock(&attribute_container_mutex);
        list_add_tail(&cont->node, &attribute_container_list);
-       up(&attribute_container_mutex);
+       mutex_unlock(&attribute_container_mutex);
 
        return 0;
 }
@@ -94,7 +95,7 @@ int
 attribute_container_unregister(struct attribute_container *cont)
 {
        int retval = -EBUSY;
-       down(&attribute_container_mutex);
+       mutex_lock(&attribute_container_mutex);
        spin_lock(&cont->containers.k_lock);
        if (!list_empty(&cont->containers.k_list))
                goto out;
@@ -102,7 +103,7 @@ attribute_container_unregister(struct attribute_container *cont)
        list_del(&cont->node);
  out:
        spin_unlock(&cont->containers.k_lock);
-       up(&attribute_container_mutex);
+       mutex_unlock(&attribute_container_mutex);
        return retval;
                
 }
@@ -145,7 +146,7 @@ attribute_container_add_device(struct device *dev,
 {
        struct attribute_container *cont;
 
-       down(&attribute_container_mutex);
+       mutex_lock(&attribute_container_mutex);
        list_for_each_entry(cont, &attribute_container_list, node) {
                struct internal_container *ic;
 
@@ -173,7 +174,7 @@ attribute_container_add_device(struct device *dev,
                        attribute_container_add_class_device(&ic->classdev);
                klist_add_tail(&ic->node, &cont->containers);
        }
-       up(&attribute_container_mutex);
+       mutex_unlock(&attribute_container_mutex);
 }
 
 /* FIXME: can't break out of this unless klist_iter_exit is also
@@ -211,7 +212,7 @@ attribute_container_remove_device(struct device *dev,
 {
        struct attribute_container *cont;
 
-       down(&attribute_container_mutex);
+       mutex_lock(&attribute_container_mutex);
        list_for_each_entry(cont, &attribute_container_list, node) {
                struct internal_container *ic;
                struct klist_iter iter;
@@ -234,7 +235,7 @@ attribute_container_remove_device(struct device *dev,
                        }
                }
        }
-       up(&attribute_container_mutex);
+       mutex_unlock(&attribute_container_mutex);
 }
 
 /**
@@ -255,7 +256,7 @@ attribute_container_device_trigger(struct device *dev,
 {
        struct attribute_container *cont;
 
-       down(&attribute_container_mutex);
+       mutex_lock(&attribute_container_mutex);
        list_for_each_entry(cont, &attribute_container_list, node) {
                struct internal_container *ic;
                struct klist_iter iter;
@@ -273,7 +274,7 @@ attribute_container_device_trigger(struct device *dev,
                                fn(cont, dev, &ic->classdev);
                }
        }
-       up(&attribute_container_mutex);
+       mutex_unlock(&attribute_container_mutex);
 }
 
 /**
@@ -295,12 +296,12 @@ attribute_container_trigger(struct device *dev,
 {
        struct attribute_container *cont;
 
-       down(&attribute_container_mutex);
+       mutex_lock(&attribute_container_mutex);
        list_for_each_entry(cont, &attribute_container_list, node) {
                if (cont->match(cont, dev))
                        fn(cont, dev);
        }
-       up(&attribute_container_mutex);
+       mutex_unlock(&attribute_container_mutex);
 }
 
 /**
@@ -319,9 +320,14 @@ attribute_container_add_attrs(struct class_device *classdev)
        struct class_device_attribute **attrs = cont->attrs;
        int i, error;
 
-       if (!attrs)
+       BUG_ON(attrs && cont->grp);
+
+       if (!attrs && !cont->grp)
                return 0;
 
+       if (cont->grp)
+               return sysfs_create_group(&classdev->kobj, cont->grp);
+
        for (i = 0; attrs[i]; i++) {
                error = class_device_create_file(classdev, attrs[i]);
                if (error)
@@ -377,9 +383,14 @@ attribute_container_remove_attrs(struct class_device *classdev)
        struct class_device_attribute **attrs = cont->attrs;
        int i;
 
-       if (!attrs)
+       if (!attrs && !cont->grp)
                return;
 
+       if (cont->grp) {
+               sysfs_remove_group(&classdev->kobj, cont->grp);
+               return ;
+       }
+
        for (i = 0; attrs[i]; i++)
                class_device_remove_file(classdev, attrs[i]);
 }
@@ -428,10 +439,3 @@ attribute_container_find_class_device(struct attribute_container *cont,
        return cdev;
 }
 EXPORT_SYMBOL_GPL(attribute_container_find_class_device);
-
-int __init
-attribute_container_init(void)
-{
-       INIT_LIST_HEAD(&attribute_container_list);
-       return 0;
-}