Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 
0003 /* Firmware attributes class helper module */
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) { /*first time class is being used*/
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) /* No more consumers */
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");