0001
0002
0003
0004
0005 #include <linux/mutex.h>
0006 #include <linux/device/class.h>
0007 #include <linux/module.h>
0008 #include "firmware_attributes_class.h"
0009
0010 static DEFINE_MUTEX(fw_attr_lock);
0011 static int fw_attr_inuse;
0012
0013 static struct class firmware_attributes_class = {
0014 .name = "firmware-attributes",
0015 };
0016
0017 int fw_attributes_class_get(struct class **fw_attr_class)
0018 {
0019 int err;
0020
0021 mutex_lock(&fw_attr_lock);
0022 if (!fw_attr_inuse) {
0023 err = class_register(&firmware_attributes_class);
0024 if (err) {
0025 mutex_unlock(&fw_attr_lock);
0026 return err;
0027 }
0028 }
0029 fw_attr_inuse++;
0030 *fw_attr_class = &firmware_attributes_class;
0031 mutex_unlock(&fw_attr_lock);
0032 return 0;
0033 }
0034 EXPORT_SYMBOL_GPL(fw_attributes_class_get);
0035
0036 int fw_attributes_class_put(void)
0037 {
0038 mutex_lock(&fw_attr_lock);
0039 if (!fw_attr_inuse) {
0040 mutex_unlock(&fw_attr_lock);
0041 return -EINVAL;
0042 }
0043 fw_attr_inuse--;
0044 if (!fw_attr_inuse)
0045 class_unregister(&firmware_attributes_class);
0046 mutex_unlock(&fw_attr_lock);
0047 return 0;
0048 }
0049 EXPORT_SYMBOL_GPL(fw_attributes_class_put);
0050
0051 MODULE_AUTHOR("Mark Pearson <markpearson@lenovo.com>");
0052 MODULE_LICENSE("GPL");