// SPDX-License-Identifier: GPL-2.0-or-later /* Firmware attributes class helper module */ #include <linux/mutex.h> #include <linux/device/class.h> #include <linux/module.h> #include "firmware_attributes_class.h" static DEFINE_MUTEX(fw_attr_lock); static int fw_attr_inuse; static struct class firmware_attributes_class = { .name = "firmware-attributes", }; int fw_attributes_class_get(struct class **fw_attr_class) { int err; mutex_lock(&fw_attr_lock); if (!fw_attr_inuse) { /*first time class is being used*/ err = class_register(&firmware_attributes_class); if (err) { mutex_unlock(&fw_attr_lock); return err; } } fw_attr_inuse++; *fw_attr_class = &firmware_attributes_class; mutex_unlock(&fw_attr_lock); return 0; } EXPORT_SYMBOL_GPL(fw_attributes_class_get); int fw_attributes_class_put(void) { mutex_lock(&fw_attr_lock); if (!fw_attr_inuse) { mutex_unlock(&fw_attr_lock); return -EINVAL; } fw_attr_inuse--; if (!fw_attr_inuse) /* No more consumers */ class_unregister(&firmware_attributes_class); mutex_unlock(&fw_attr_lock); return 0; } EXPORT_SYMBOL_GPL(fw_attributes_class_put); MODULE_AUTHOR("Mark Pearson <markpearson@lenovo.com>"); MODULE_LICENSE("GPL"