Commit 17b707fe authored by Mark Pearson's avatar Mark Pearson Committed by Hans de Goede
Browse files

platform/x86: firmware_attributes_class: Create helper file for handling...


platform/x86: firmware_attributes_class: Create helper file for handling firmware-attributes class registration events

This offers shared code for registering the firmware_attributes_class,
which is used by the Dell and Lenovo WMI management drivers.

Reported-by: default avatarkernel test robot <lkp@intel.com>
Signed-off-by: default avatarMark Pearson <markpearson@lenovo.com>
Link: https://lore.kernel.org/r/20210530223111.25929-1-markpearson@lenovo.com


Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent 6cbaee2e
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1077,6 +1077,10 @@ config TOUCHSCREEN_DMI
	  the OS-image for the device. This option supplies the missing info.
	  Enable this for x86 tablets with Silead or Chipone touchscreens.

config FW_ATTR_CLASS
	tristate
	default n

config INTEL_IMR
	bool "Intel Isolated Memory Region support"
	depends on X86_INTEL_QUARK && IOSF_MBI
+1 −0
Original line number Diff line number Diff line
@@ -111,6 +111,7 @@ obj-$(CONFIG_SYSTEM76_ACPI) += system76_acpi.o
obj-$(CONFIG_TOPSTAR_LAPTOP)	+= topstar-laptop.o

# Platform drivers
obj-$(CONFIG_FW_ATTR_CLASS)		+= firmware_attributes_class.o
obj-$(CONFIG_I2C_MULTI_INSTANTIATE)	+= i2c-multi-instantiate.o
obj-$(CONFIG_MLX_PLATFORM)		+= mlx-platform.o
obj-$(CONFIG_TOUCHSCREEN_DMI)		+= touchscreen_dmi.o
+52 −0
Original line number Diff line number Diff line
// 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);
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");
+11 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */

/* Firmware attributes class helper module */

#ifndef FW_ATTR_CLASS_H
#define FW_ATTR_CLASS_H

int fw_attributes_class_get(struct class **fw_attr_class);
int fw_attributes_class_put(void);

#endif /* FW_ATTR_CLASS_H */